KiCad PCB EDA Suite
export_vrml.cpp File Reference
#include <cmath>
#include <exception>
#include <fstream>
#include <iomanip>
#include <vector>
#include <wx/dir.h>
#include "3d_cache/3d_cache.h"
#include "3d_cache/3d_info.h"
#include "class_board.h"
#include "class_edge_mod.h"
#include "class_module.h"
#include "class_pcb_text.h"
#include "class_track.h"
#include "class_zone.h"
#include "convert_to_biu.h"
#include "draw_graphic_text.h"
#include "macros.h"
#include "pgm_base.h"
#include "plugins/3dapi/ifsg_all.h"
#include "streamwrapper.h"
#include "vrml_layer.h"
#include "pcb_edit_frame.h"
#include "../../kicad/kicad.h"
#include <convert_basic_shapes_to_polygon.h>
#include <zone_filler.h>

Go to the source code of this file.

Classes

struct  VRML_COLOR
 
class  MODEL_VRML
 

Macros

#define MIN_VRML_LINEWIDTH   0.12
 
#define ART_OFFSET   0.025
 
#define PLATE_OFFSET   0.005
 

Enumerations

enum  VRML_COLOR_INDEX {
  VRML_COLOR_NONE = -1, VRML_COLOR_PCB = 0, VRML_COLOR_TRACK, VRML_COLOR_SILK,
  VRML_COLOR_TIN, VRML_COLOR_LAST
}
 

Functions

static bool GetLayer (MODEL_VRML &aModel, LAYER_NUM layer, VRML_LAYER **vlayer)
 
static void create_vrml_shell (IFSG_TRANSFORM &PcbOutput, VRML_COLOR_INDEX colorID, VRML_LAYER *layer, double top_z, double bottom_z)
 
static void create_vrml_plane (IFSG_TRANSFORM &PcbOutput, VRML_COLOR_INDEX colorID, VRML_LAYER *layer, double aHeight, bool aTopPlane)
 
static void write_triangle_bag (std::ostream &aOut_file, VRML_COLOR &aColor, VRML_LAYER *aLayer, bool aPlane, bool aTop, double aTop_z, double aBottom_z)
 
static void write_layers (MODEL_VRML &aModel, BOARD *aPcb, const char *aFileName, OSTREAM *aOutputFile)
 
static void compute_layer_Zs (MODEL_VRML &aModel, BOARD *pcb)
 
static void export_vrml_line (MODEL_VRML &aModel, LAYER_NUM layer, double startx, double starty, double endx, double endy, double width)
 
static void export_vrml_circle (MODEL_VRML &aModel, LAYER_NUM layer, double startx, double starty, double endx, double endy, double width)
 
static void export_vrml_arc (MODEL_VRML &aModel, LAYER_NUM layer, double centerx, double centery, double arc_startx, double arc_starty, double width, double arc_angle)
 
static void export_vrml_drawsegment (MODEL_VRML &aModel, DRAWSEGMENT *drawseg)
 
static void vrml_text_callback (int x0, int y0, int xf, int yf, void *aData)
 
static void export_vrml_pcbtext (MODEL_VRML &aModel, TEXTE_PCB *text)
 
static void export_vrml_drawings (MODEL_VRML &aModel, BOARD *pcb)
 
static void export_vrml_board (MODEL_VRML &aModel, BOARD *aPcb)
 
static void export_round_padstack (MODEL_VRML &aModel, BOARD *pcb, double x, double y, double r, LAYER_NUM bottom_layer, LAYER_NUM top_layer, double hole)
 
static void export_vrml_via (MODEL_VRML &aModel, BOARD *aPcb, const VIA *aVia)
 
static void export_vrml_tracks (MODEL_VRML &aModel, BOARD *pcb)
 
static void export_vrml_zones (MODEL_VRML &aModel, BOARD *aPcb)
 
static void export_vrml_text_module (TEXTE_MODULE *module)
 
static void export_vrml_edge_module (MODEL_VRML &aModel, EDGE_MODULE *aOutline, MODULE *aModule)
 
static void export_vrml_padshape (MODEL_VRML &aModel, VRML_LAYER *aTinLayer, D_PAD *aPad)
 
static void export_vrml_pad (MODEL_VRML &aModel, BOARD *aPcb, D_PAD *aPad)
 
static void build_quat (double x, double y, double z, double a, double q[4])
 
static void from_quat (double q[4], double rot[4])
 
static void compose_quat (double q1[4], double q2[4], double qr[4])
 
static void export_vrml_module (MODEL_VRML &aModel, BOARD *aPcb, MODULE *aModule, std::ostream *aOutputFile)
 
static SGNODEgetSGColor (VRML_COLOR_INDEX colorIdx)
 

Variables

static S3D_CACHEcache
 
static bool USE_INLINES
 
static bool USE_DEFS
 
static bool USE_RELPATH
 
static double WORLD_SCALE = 1.0
 
static double BOARD_SCALE
 
static const int PRECISION = 6
 
static wxString SUBDIR_3D
 
static wxString PROJ_DIR
 
static VRML_COLOR colors [VRML_COLOR_LAST]
 
static SGNODEsgmaterial [VRML_COLOR_LAST] = { NULL }
 
static MODEL_VRMLmodel_vrml
 

Macro Definition Documentation

#define ART_OFFSET   0.025

Definition at line 60 of file export_vrml.cpp.

Referenced by compute_layer_Zs(), and write_layers().

#define MIN_VRML_LINEWIDTH   0.12

Definition at line 57 of file export_vrml.cpp.

Referenced by MODEL_VRML::MODEL_VRML().

#define PLATE_OFFSET   0.005

Definition at line 62 of file export_vrml.cpp.

Referenced by export_vrml_pad().

Enumeration Type Documentation

Enumerator
VRML_COLOR_NONE 
VRML_COLOR_PCB 
VRML_COLOR_TRACK 
VRML_COLOR_SILK 
VRML_COLOR_TIN 
VRML_COLOR_LAST 

Definition at line 131 of file export_vrml.cpp.

Function Documentation

static void build_quat ( double  x,
double  y,
double  z,
double  a,
double  q[4] 
)
static

Definition at line 1329 of file export_vrml.cpp.

Referenced by export_vrml_module().

1330 {
1331  double sina = sin( a / 2 );
1332 
1333  q[0] = x * sina;
1334  q[1] = y * sina;
1335  q[2] = z * sina;
1336  q[3] = cos( a / 2 );
1337 }
static void compose_quat ( double  q1[4],
double  q2[4],
double  qr[4] 
)
static

Definition at line 1353 of file export_vrml.cpp.

Referenced by export_vrml_module().

1354 {
1355  double tmp[4];
1356 
1357  tmp[0] = q2[3] * q1[0] + q2[0] * q1[3] + q2[1] * q1[2] - q2[2] * q1[1];
1358  tmp[1] = q2[3] * q1[1] + q2[1] * q1[3] + q2[2] * q1[0] - q2[0] * q1[2];
1359  tmp[2] = q2[3] * q1[2] + q2[2] * q1[3] + q2[0] * q1[1] - q2[1] * q1[0];
1360  tmp[3] = q2[3] * q1[3] - q2[0] * q1[0] - q2[1] * q1[1] - q2[2] * q1[2];
1361 
1362  qr[0] = tmp[0];
1363  qr[1] = tmp[1];
1364  qr[2] = tmp[2];
1365  qr[3] = tmp[3];
1366 }
static void compute_layer_Zs ( MODEL_VRML aModel,
BOARD pcb 
)
static

Definition at line 563 of file export_vrml.cpp.

References LSET::AllCuMask(), ART_OFFSET, B_Adhes, B_Mask, B_Paste, B_SilkS, BOARD_SCALE, Cmts_User, Dwgs_User, Eco1_User, Eco2_User, Edge_Cuts, F_Adhes, F_Mask, F_Paste, F_SilkS, BOARD_DESIGN_SETTINGS::GetBoardThickness(), BOARD::GetCopperLayerCount(), BOARD::GetDesignSettings(), i, MODEL_VRML::m_brd_thickness, and MODEL_VRML::SetLayerZ().

Referenced by PCB_EDIT_FRAME::ExportVRML_File().

564 {
565  int copper_layers = pcb->GetCopperLayerCount();
566 
567  // We call it 'layer' thickness, but it's the whole board thickness!
569  double half_thickness = aModel.m_brd_thickness / 2;
570 
571  // Compute each layer's Z value, more or less like the 3d view
572  for( LSEQ seq = LSET::AllCuMask().Seq(); seq; ++seq )
573  {
574  PCB_LAYER_ID i = *seq;
575 
576  if( i < copper_layers )
577  aModel.SetLayerZ( i, half_thickness - aModel.m_brd_thickness * i / (copper_layers - 1) );
578  else
579  aModel.SetLayerZ( i, - half_thickness ); // bottom layer
580  }
581 
582  /* To avoid rounding interference, we apply an epsilon to each
583  * successive layer */
584  double epsilon_z = Millimeter2iu( ART_OFFSET ) * BOARD_SCALE;
585  aModel.SetLayerZ( B_Paste, -half_thickness - epsilon_z * 4 );
586  aModel.SetLayerZ( B_Adhes, -half_thickness - epsilon_z * 3 );
587  aModel.SetLayerZ( B_SilkS, -half_thickness - epsilon_z * 2 );
588  aModel.SetLayerZ( B_Mask, -half_thickness - epsilon_z );
589  aModel.SetLayerZ( F_Mask, half_thickness + epsilon_z );
590  aModel.SetLayerZ( F_SilkS, half_thickness + epsilon_z * 2 );
591  aModel.SetLayerZ( F_Adhes, half_thickness + epsilon_z * 3 );
592  aModel.SetLayerZ( F_Paste, half_thickness + epsilon_z * 4 );
593  aModel.SetLayerZ( Dwgs_User, half_thickness + epsilon_z * 5 );
594  aModel.SetLayerZ( Cmts_User, half_thickness + epsilon_z * 6 );
595  aModel.SetLayerZ( Eco1_User, half_thickness + epsilon_z * 7 );
596  aModel.SetLayerZ( Eco2_User, half_thickness + epsilon_z * 8 );
597  aModel.SetLayerZ( Edge_Cuts, 0 );
598 }
void SetLayerZ(LAYER_NUM aLayer, double aValue)
static LSET AllCuMask(int aCuLayerCount=MAX_CU_LAYERS)
Function AllCuMask returns a mask holding the requested number of Cu PCB_LAYER_IDs.
Definition: lset.cpp:673
static double BOARD_SCALE
Definition: export_vrml.cpp:69
int GetCopperLayerCount() const
Function GetCopperLayerCount.
PCB_LAYER_ID
A quick note on layer IDs:
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Function GetDesignSettings.
Definition: class_board.h:532
Class LSEQ is a sequence (and therefore also a set) of PCB_LAYER_IDs.
size_t i
Definition: json11.cpp:597
double m_brd_thickness
#define ART_OFFSET
Definition: export_vrml.cpp:60
static void create_vrml_plane ( IFSG_TRANSFORM PcbOutput,
VRML_COLOR_INDEX  colorID,
VRML_LAYER *  layer,
double  aHeight,
bool  aTopPlane 
)
static

Definition at line 1727 of file export_vrml.cpp.

References IFSG_NORMALS::AddNormal(), IFSG_NODE::GetRawPtr(), getSGColor(), S3D::GetSGNodeParent(), i, IFSG_COORDS::SetCoordsList(), and IFSG_INDEX::SetIndices().

Referenced by GetLayer(), and write_layers().

1729 {
1730  std::vector< double > vertices;
1731  std::vector< int > idxPlane;
1732  std::vector< int > idxSide;
1733 
1734  if( !(*layer).Get2DTriangles( vertices, idxPlane, top_z, aTopPlane ) )
1735  {
1736 #ifdef DEBUG
1737  do {
1738  std::ostringstream ostr;
1739  ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
1740  ostr << " * [INFO] no vertex data";
1741  wxLogDebug( "%s\n", ostr.str().c_str() );
1742  } while( 0 );
1743 #endif
1744 
1745  return;
1746  }
1747 
1748  if( ( idxPlane.size() % 3 ) || ( idxSide.size() % 3 ) )
1749  {
1750 #ifdef DEBUG
1751  do {
1752  std::ostringstream ostr;
1753  ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
1754  ostr << " * [BUG] index lists are not a multiple of 3 (not a triangle list)";
1755  wxLogDebug( "%s\n", ostr.str().c_str() );
1756  } while( 0 );
1757 #endif
1758 
1759  throw( std::runtime_error( "[BUG] index lists are not a multiple of 3 (not a triangle list)" ) );
1760  }
1761 
1762  std::vector< SGPOINT > vlist;
1763  size_t nvert = vertices.size() / 3;
1764  size_t j = 0;
1765 
1766  for( size_t i = 0; i < nvert; ++i, j+= 3 )
1767  vlist.push_back( SGPOINT( vertices[j], vertices[j+1], vertices[j+2] ) );
1768 
1769  // create the intermediate scenegraph
1770  IFSG_TRANSFORM tx0( PcbOutput.GetRawPtr() ); // tx0 = Transform for this outline
1771  IFSG_SHAPE shape( tx0 ); // shape will hold (a) all vertices and (b) a local list of normals
1772  IFSG_FACESET face( shape ); // this face shall represent the top and bottom planes
1773  IFSG_COORDS cp( face ); // coordinates for all faces
1774  cp.SetCoordsList( nvert, &vlist[0] );
1775  IFSG_COORDINDEX coordIdx( face ); // coordinate indices for top and bottom planes only
1776  coordIdx.SetIndices( idxPlane.size(), &idxPlane[0] );
1777  IFSG_NORMALS norms( face ); // normals for the top and bottom planes
1778 
1779  // set the normals
1780  if( aTopPlane )
1781  {
1782  for( size_t i = 0; i < nvert; ++i )
1783  norms.AddNormal( 0.0, 0.0, 1.0 );
1784  }
1785  else
1786  {
1787  for( size_t i = 0; i < nvert; ++i )
1788  norms.AddNormal( 0.0, 0.0, -1.0 );
1789  }
1790 
1791  // assign a color from the palette
1792  SGNODE* modelColor = getSGColor( colorID );
1793 
1794  if( NULL != modelColor )
1795  {
1796  if( NULL == S3D::GetSGNodeParent( modelColor ) )
1797  shape.AddChildNode( modelColor );
1798  else
1799  shape.AddRefNode( modelColor );
1800  }
1801 
1802  return;
1803 }
SGNODE * GetRawPtr(void)
Function GetRawPtr() returns the raw internal SGNODE pointer.
Definition: ifsg_node.cpp:66
Class IFSG_COORDS is the wrapper for SGCOORDS.
Definition: ifsg_coords.h:40
Class IFSG_COORDINDEX is the wrapper for SGCOORDINDEX.
SGLIB_API SGNODE * GetSGNodeParent(SGNODE *aNode)
Definition: ifsg_api.cpp:636
Class SGNODE represents the base class of all Scene Graph nodes.
Definition: sg_node.h:76
Class IFSG_NORMALS is the wrapper for the SGNORMALS class.
Definition: ifsg_normals.h:40
static SGNODE * getSGColor(VRML_COLOR_INDEX colorIdx)
Class IFSG_FACESET is the wrapper for the SGFACESET class.
Definition: ifsg_faceset.h:40
Class IFSG_TRANSFORM is the wrapper for the VRML compatible TRANSFORM block class SCENEGRAPH...
size_t i
Definition: json11.cpp:597
Class IFSG_SHAPE is the wrapper for the SGSHAPE class.
Definition: ifsg_shape.h:40
static void create_vrml_shell ( IFSG_TRANSFORM PcbOutput,
VRML_COLOR_INDEX  colorID,
VRML_LAYER *  layer,
double  top_z,
double  bottom_z 
)
static

Definition at line 1806 of file export_vrml.cpp.

References IFSG_COORDS::AddCoord(), IFSG_INDEX::AddIndex(), IFSG_NORMALS::AddNormal(), S3D::CalcTriNorm(), IFSG_NODE::GetRawPtr(), getSGColor(), S3D::GetSGNodeParent(), i, IFSG_COORDS::NewNode(), IFSG_FACESET::NewNode(), IFSG_NORMALS::NewNode(), IFSG_COORDINDEX::NewNode(), IFSG_COORDS::SetCoordsList(), IFSG_INDEX::SetIndices(), and SGVECTOR::SetVector().

Referenced by GetLayer(), and write_layers().

1808 {
1809  std::vector< double > vertices;
1810  std::vector< int > idxPlane;
1811  std::vector< int > idxSide;
1812 
1813  if( top_z < bottom_z )
1814  {
1815  double tmp = top_z;
1816  top_z = bottom_z;
1817  bottom_z = tmp;
1818  }
1819 
1820  if( !(*layer).Get3DTriangles( vertices, idxPlane, idxSide, top_z, bottom_z ) )
1821  {
1822 #ifdef DEBUG
1823  do {
1824  std::ostringstream ostr;
1825  ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
1826  ostr << " * [INFO] no vertex data";
1827  wxLogDebug( "%s\n", ostr.str().c_str() );
1828  } while( 0 );
1829 #endif
1830 
1831  return;
1832  }
1833 
1834  if( ( idxPlane.size() % 3 ) || ( idxSide.size() % 3 ) )
1835  {
1836 #ifdef DEBUG
1837  do {
1838  std::ostringstream ostr;
1839  ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
1840  ostr << " * [BUG] index lists are not a multiple of 3 (not a triangle list)";
1841  wxLogDebug( "%s\n", ostr.str().c_str() );
1842  } while( 0 );
1843 #endif
1844 
1845  throw( std::runtime_error( "[BUG] index lists are not a multiple of 3 (not a triangle list)" ) );
1846  }
1847 
1848  std::vector< SGPOINT > vlist;
1849  size_t nvert = vertices.size() / 3;
1850  size_t j = 0;
1851 
1852  for( size_t i = 0; i < nvert; ++i, j+= 3 )
1853  vlist.push_back( SGPOINT( vertices[j], vertices[j+1], vertices[j+2] ) );
1854 
1855  // create the intermediate scenegraph
1856  IFSG_TRANSFORM tx0( PcbOutput.GetRawPtr() ); // tx0 = Transform for this outline
1857  IFSG_SHAPE shape( tx0 ); // shape will hold (a) all vertices and (b) a local list of normals
1858  IFSG_FACESET face( shape ); // this face shall represent the top and bottom planes
1859  IFSG_COORDS cp( face ); // coordinates for all faces
1860  cp.SetCoordsList( nvert, &vlist[0] );
1861  IFSG_COORDINDEX coordIdx( face ); // coordinate indices for top and bottom planes only
1862  coordIdx.SetIndices( idxPlane.size(), &idxPlane[0] );
1863  IFSG_NORMALS norms( face ); // normals for the top and bottom planes
1864 
1865  // number of TOP (and bottom) vertices
1866  j = nvert / 2;
1867 
1868  // set the TOP normals
1869  for( size_t i = 0; i < j; ++i )
1870  norms.AddNormal( 0.0, 0.0, 1.0 );
1871 
1872  // set the BOTTOM normals
1873  for( size_t i = 0; i < j; ++i )
1874  norms.AddNormal( 0.0, 0.0, -1.0 );
1875 
1876  // assign a color from the palette
1877  SGNODE* modelColor = getSGColor( colorID );
1878 
1879  if( NULL != modelColor )
1880  {
1881  if( NULL == S3D::GetSGNodeParent( modelColor ) )
1882  shape.AddChildNode( modelColor );
1883  else
1884  shape.AddRefNode( modelColor );
1885  }
1886 
1887  // create a second shape describing the vertical walls of the extrusion
1888  // using per-vertex-per-face-normals
1889  shape.NewNode( tx0 );
1890  shape.AddRefNode( modelColor ); // set the color to be the same as the top/bottom
1891  face.NewNode( shape );
1892  cp.NewNode( face ); // new vertex list
1893  norms.NewNode( face ); // new normals list
1894  coordIdx.NewNode( face ); // new index list
1895 
1896  // populate the new per-face vertex list and its indices and normals
1897  std::vector< int >::iterator sI = idxSide.begin();
1898  std::vector< int >::iterator eI = idxSide.end();
1899 
1900  size_t sidx = 0; // index to the new coord set
1901  SGPOINT p1, p2, p3;
1902  SGVECTOR vnorm;
1903 
1904  while( sI != eI )
1905  {
1906  p1 = vlist[*sI];
1907  cp.AddCoord( p1 );
1908  ++sI;
1909 
1910  p2 = vlist[*sI];
1911  cp.AddCoord( p2 );
1912  ++sI;
1913 
1914  p3 = vlist[*sI];
1915  cp.AddCoord( p3 );
1916  ++sI;
1917 
1918  vnorm.SetVector( S3D::CalcTriNorm( p1, p2, p3 ) );
1919  norms.AddNormal( vnorm );
1920  norms.AddNormal( vnorm );
1921  norms.AddNormal( vnorm );
1922 
1923  coordIdx.AddIndex( (int)sidx );
1924  ++sidx;
1925  coordIdx.AddIndex( (int)sidx );
1926  ++sidx;
1927  coordIdx.AddIndex( (int)sidx );
1928  ++sidx;
1929  }
1930 }
SGNODE * GetRawPtr(void)
Function GetRawPtr() returns the raw internal SGNODE pointer.
Definition: ifsg_node.cpp:66
Class IFSG_COORDS is the wrapper for SGCOORDS.
Definition: ifsg_coords.h:40
Class IFSG_COORDINDEX is the wrapper for SGCOORDINDEX.
void SetVector(double aXVal, double aYVal, double aZVal)
Definition: sg_base.cpp:292
SGLIB_API SGNODE * GetSGNodeParent(SGNODE *aNode)
Definition: ifsg_api.cpp:636
Class SGNODE represents the base class of all Scene Graph nodes.
Definition: sg_node.h:76
Class IFSG_NORMALS is the wrapper for the SGNORMALS class.
Definition: ifsg_normals.h:40
static SGNODE * getSGColor(VRML_COLOR_INDEX colorIdx)
SGLIB_API SGVECTOR CalcTriNorm(const SGPOINT &p1, const SGPOINT &p2, const SGPOINT &p3)
Function CalcTriNorm returns the normal vector of a triangle described by vertices p1...
Definition: ifsg_api.cpp:606
Class IFSG_FACESET is the wrapper for the SGFACESET class.
Definition: ifsg_faceset.h:40
Class IFSG_TRANSFORM is the wrapper for the VRML compatible TRANSFORM block class SCENEGRAPH...
size_t i
Definition: json11.cpp:597
Class IFSG_SHAPE is the wrapper for the SGSHAPE class.
Definition: ifsg_shape.h:40
static void export_round_padstack ( MODEL_VRML aModel,
BOARD pcb,
double  x,
double  y,
double  r,
LAYER_NUM  bottom_layer,
LAYER_NUM  top_layer,
double  hole 
)
static

Definition at line 895 of file export_vrml.cpp.

References B_Cu, F_Cu, MODEL_VRML::m_bot_copper, MODEL_VRML::m_holes, MODEL_VRML::m_plainPCB, and MODEL_VRML::m_top_copper.

Referenced by export_vrml_via().

899 {
900  LAYER_NUM layer = top_layer;
901  bool thru = true;
902 
903  // if not a thru hole do not put a hole in the board
904  if( top_layer != F_Cu || bottom_layer != B_Cu )
905  thru = false;
906 
907  if( thru && hole > 0 )
908  aModel.m_holes.AddCircle( x, -y, hole, true );
909 
910  if( aModel.m_plainPCB )
911  return;
912 
913  while( 1 )
914  {
915  if( layer == B_Cu )
916  {
917  aModel.m_bot_copper.AddCircle( x, -y, r );
918 
919  if( hole > 0 && !thru )
920  aModel.m_bot_copper.AddCircle( x, -y, hole, true );
921 
922  }
923  else if( layer == F_Cu )
924  {
925  aModel.m_top_copper.AddCircle( x, -y, r );
926 
927  if( hole > 0 && !thru )
928  aModel.m_top_copper.AddCircle( x, -y, hole, true );
929 
930  }
931 
932  if( layer == bottom_layer )
933  break;
934 
935  layer = bottom_layer;
936  }
937 }
VRML_LAYER m_holes
VRML_LAYER m_bot_copper
int LAYER_NUM
Type LAYER_NUM can be replaced with int and removed.
VRML_LAYER m_top_copper
static void export_vrml_arc ( MODEL_VRML aModel,
LAYER_NUM  layer,
double  centerx,
double  centery,
double  arc_startx,
double  arc_starty,
double  width,
double  arc_angle 
)
static

Definition at line 657 of file export_vrml.cpp.

References GetLayer(), and MODEL_VRML::m_minLineWidth.

Referenced by export_vrml_drawsegment(), and export_vrml_edge_module().

661 {
662  VRML_LAYER* vlayer;
663 
664  if( !GetLayer( aModel, layer, &vlayer ) )
665  return;
666 
667  if( width < aModel.m_minLineWidth )
668  width = aModel.m_minLineWidth;
669 
670  centery = -centery;
671  arc_starty = -arc_starty;
672 
673  if( !vlayer->AddArc( centerx, centery, arc_startx, arc_starty, width, -arc_angle, false ) )
674  throw( std::runtime_error( vlayer->GetError() ) );
675 
676 }
static bool GetLayer(MODEL_VRML &aModel, LAYER_NUM layer, VRML_LAYER **vlayer)
double m_minLineWidth
static void export_vrml_board ( MODEL_VRML aModel,
BOARD aPcb 
)
static

Definition at line 837 of file export_vrml.cpp.

References BOARD_SCALE, SHAPE_POLY_SET::COutline(), SHAPE_LINE_CHAIN::CPoint(), BOARD::GetBoardPolygonOutlines(), SHAPE_POLY_SET::Hole(), SHAPE_POLY_SET::HoleCount(), MODEL_VRML::m_board, MODEL_VRML::m_holes, SHAPE_POLY_SET::OutlineCount(), SHAPE_LINE_CHAIN::PointCount(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by PCB_EDIT_FRAME::ExportVRML_File().

838 {
839  SHAPE_POLY_SET pcbOutlines; // stores the board main outlines
840  wxString msg;
841 
842  if( !aPcb->GetBoardPolygonOutlines( pcbOutlines, &msg ) )
843  {
844  msg << "\n\n" <<
845  _( "Unable to calculate the board outlines; fall back to using the board boundary box." );
846  wxMessageBox( msg );
847  }
848 
849  int seg;
850 
851  for( int cnt = 0; cnt < pcbOutlines.OutlineCount(); cnt++ )
852  {
853  const SHAPE_LINE_CHAIN& outline = pcbOutlines.COutline( cnt );
854 
855  seg = aModel.m_board.NewContour();
856 
857  for( int j = 0; j < outline.PointCount(); j++ )
858  {
859  aModel.m_board.AddVertex( seg, (double)outline.CPoint(j).x * BOARD_SCALE,
860  -((double)outline.CPoint(j).y * BOARD_SCALE ) );
861 
862  }
863 
864  aModel.m_board.EnsureWinding( seg, false );
865 
866  // Generate holes:
867  for( int ii = 0; ii < pcbOutlines.HoleCount( cnt ); ii++ )
868  {
869  const SHAPE_LINE_CHAIN& hole = pcbOutlines.Hole( cnt, ii );
870 
871  seg = aModel.m_holes.NewContour();
872 
873  if( seg < 0 )
874  {
875  msg << "\n\n" <<
876  _( "VRML Export Failed: Could not add holes to contours." );
877  wxMessageBox( msg );
878 
879  return;
880  }
881 
882  for( int j = 0; j < hole.PointCount(); j++ )
883  {
884  aModel.m_holes.AddVertex( seg, (double)hole.CPoint(j).x * BOARD_SCALE,
885  -((double)hole.CPoint(j).y * BOARD_SCALE ) );
886 
887  }
888 
889  aModel.m_holes.EnsureWinding( seg, true );
890  }
891  }
892 }
static double BOARD_SCALE
Definition: export_vrml.cpp:69
bool GetBoardPolygonOutlines(SHAPE_POLY_SET &aOutlines, wxString *aErrorText=NULL)
Function GetBoardPolygonOutlines Extracts the board outlines and build a closed polygon from lines...
int PointCount() const
Function PointCount()
VRML_LAYER m_holes
int HoleCount(int aOutline) const
Returns the number of holes in a given outline
SHAPE_LINE_CHAIN & Hole(int aOutline, int aHole)
Returns the reference to aHole-th hole in the aIndex-th outline
int OutlineCount() const
Returns the number of outlines in the set
Class SHAPE_POLY_SET.
VRML_LAYER m_board
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
Class SHAPE_LINE_CHAIN.
const VECTOR2I & CPoint(int aIndex) const
Function CPoint()
static void export_vrml_circle ( MODEL_VRML aModel,
LAYER_NUM  layer,
double  startx,
double  starty,
double  endx,
double  endy,
double  width 
)
static

Definition at line 626 of file export_vrml.cpp.

References Distance(), GetLayer(), and MODEL_VRML::m_minLineWidth.

Referenced by export_vrml_edge_module().

629 {
630  VRML_LAYER* vlayer;
631 
632  if( !GetLayer( aModel, layer, &vlayer ) )
633  return;
634 
635  if( width < aModel.m_minLineWidth )
636  width = aModel.m_minLineWidth;
637 
638  starty = -starty;
639  endy = -endy;
640 
641  double hole, radius;
642 
643  radius = Distance( startx, starty, endx, endy ) + ( width / 2);
644  hole = radius - width;
645 
646  if( !vlayer->AddCircle( startx, starty, radius, false ) )
647  throw( std::runtime_error( vlayer->GetError() ) );
648 
649  if( hole > 0.0001 )
650  {
651  if( !vlayer->AddCircle( startx, starty, hole, true ) )
652  throw( std::runtime_error( vlayer->GetError() ) );
653  }
654 }
static bool GetLayer(MODEL_VRML &aModel, LAYER_NUM layer, VRML_LAYER **vlayer)
double m_minLineWidth
double Distance(double x1, double y1, double x2, double y2)
static void export_vrml_drawings ( MODEL_VRML aModel,
BOARD pcb 
)
static

Definition at line 809 of file export_vrml.cpp.

References B_Cu, B_SilkS, BOARD::Drawings(), export_vrml_drawsegment(), export_vrml_pcbtext(), F_Cu, F_SilkS, PCB_LINE_T, and PCB_TEXT_T.

Referenced by PCB_EDIT_FRAME::ExportVRML_File().

810 {
811  // draw graphic items
812  for( auto drawing : pcb->Drawings() )
813  {
814  PCB_LAYER_ID layer = drawing->GetLayer();
815 
816  if( layer != F_Cu && layer != B_Cu && layer != B_SilkS && layer != F_SilkS )
817  continue;
818 
819  switch( drawing->Type() )
820  {
821  case PCB_LINE_T:
822  export_vrml_drawsegment( aModel, (DRAWSEGMENT*) drawing );
823  break;
824 
825  case PCB_TEXT_T:
826  export_vrml_pcbtext( aModel, (TEXTE_PCB*) drawing );
827  break;
828 
829  default:
830  break;
831  }
832  }
833 }
class TEXTE_PCB, text on a layer
Definition: typeinfo.h:92
PCB_LAYER_ID
A quick note on layer IDs:
static void export_vrml_drawsegment(MODEL_VRML &aModel, DRAWSEGMENT *drawseg)
static void export_vrml_pcbtext(MODEL_VRML &aModel, TEXTE_PCB *text)
class DRAWSEGMENT, a segment not on copper layers
Definition: typeinfo.h:91
DLIST_ITERATOR_WRAPPER< BOARD_ITEM > Drawings()
Definition: class_board.h:251
static void export_vrml_drawsegment ( MODEL_VRML aModel,
DRAWSEGMENT drawseg 
)
static

Definition at line 679 of file export_vrml.cpp.

References BOARD_SCALE, SHAPE_POLY_SET::COutline(), SHAPE_LINE_CHAIN::CPoint(), Edge_Cuts, export_vrml_arc(), export_vrml_line(), SHAPE_POLY_SET::Fracture(), DRAWSEGMENT::GetAngle(), DRAWSEGMENT::GetArcStart(), DRAWSEGMENT::GetCenter(), DRAWSEGMENT::GetEnd(), BOARD_ITEM::GetLayer(), GetLayer(), DRAWSEGMENT::GetPolyShape(), DRAWSEGMENT::GetShape(), DRAWSEGMENT::GetStart(), DRAWSEGMENT::GetWidth(), SHAPE_POLY_SET::Inflate(), DRAWSEGMENT::IsPolyShapeValid(), SHAPE_POLY_SET::PM_STRICTLY_SIMPLE, SHAPE_LINE_CHAIN::PointCount(), S_ARC, S_CIRCLE, S_POLYGON, wxPoint::x, VECTOR2< T >::x, wxPoint::y, and VECTOR2< T >::y.

Referenced by export_vrml_drawings().

680 {
681  LAYER_NUM layer = drawseg->GetLayer();
682  double w = drawseg->GetWidth() * BOARD_SCALE;
683  double x = drawseg->GetStart().x * BOARD_SCALE;
684  double y = drawseg->GetStart().y * BOARD_SCALE;
685  double xf = drawseg->GetEnd().x * BOARD_SCALE;
686  double yf = drawseg->GetEnd().y * BOARD_SCALE;
687  double r = sqrt( pow( x - xf, 2 ) + pow( y - yf, 2 ) );
688 
689  // Items on the edge layer are handled elsewhere; just return
690  if( layer == Edge_Cuts )
691  return;
692 
693  switch( drawseg->GetShape() )
694  {
695  case S_ARC:
696  export_vrml_arc( aModel, layer,
697  (double) drawseg->GetCenter().x * BOARD_SCALE,
698  (double) drawseg->GetCenter().y * BOARD_SCALE,
699  (double) drawseg->GetArcStart().x * BOARD_SCALE,
700  (double) drawseg->GetArcStart().y * BOARD_SCALE,
701  w, drawseg->GetAngle() / 10 );
702  break;
703 
704  case S_CIRCLE:
705  // Break circles into two 180 arcs to prevent the vrml hole from obscuring objects
706  // within the hole area of the circle.
707  export_vrml_arc( aModel, layer, x, y, x, y-r, w, 180.0 );
708  export_vrml_arc( aModel, layer, x, y, x, y+r, w, 180.0 );
709  break;
710 
711  case S_POLYGON:
712  if( drawseg->IsPolyShapeValid() )
713  {
714  VRML_LAYER* vlayer;
715 
716  if( !GetLayer( aModel, layer, &vlayer ) )
717  break;
718 
719  SHAPE_POLY_SET shape = drawseg->GetPolyShape();
720 
721  const int circleSegmentsCount = 16;
722 
723  if( drawseg->GetWidth() )
724  {
725  shape.Inflate( drawseg->GetWidth()/2, circleSegmentsCount );
727  }
728 
729  const SHAPE_LINE_CHAIN& outline = shape.COutline( 0 );
730 
731  int seg = vlayer->NewContour();
732 
733  for( int j = 0; j < outline.PointCount(); j++ )
734  {
735  if( !vlayer->AddVertex( seg, (double)outline.CPoint( j ).x * BOARD_SCALE,
736  -((double)outline.CPoint( j ).y * BOARD_SCALE ) ) )
737  throw( std::runtime_error( vlayer->GetError() ) );
738 
739  }
740 
741  vlayer->EnsureWinding( seg, false );
742  }
743  break;
744 
745  default:
746  export_vrml_line( aModel, layer, x, y, xf, yf, w );
747  break;
748  }
749 }
static double BOARD_SCALE
Definition: export_vrml.cpp:69
const wxPoint GetCenter() const override
Function GetCenter()
virtual PCB_LAYER_ID GetLayer() const
Function GetLayer returns the primary layer this item is on.
int PointCount() const
Function PointCount()
polygon (not yet used for tracks, but could be in microwave apps)
bool IsPolyShapeValid() const
const wxPoint & GetArcStart() const
STROKE_T GetShape() const
const wxPoint & GetEnd() const
Function GetEnd returns the ending point of the graphic.
void Inflate(int aFactor, int aCircleSegmentsCount)
Performs outline inflation/deflation, using round corners.
Class SHAPE_POLY_SET.
Arcs (with rounded ends)
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
static void export_vrml_arc(MODEL_VRML &aModel, LAYER_NUM layer, double centerx, double centery, double arc_startx, double arc_starty, double width, double arc_angle)
SHAPE_POLY_SET & GetPolyShape()
void Fracture(POLYGON_MODE aFastMode)
Converts a set of polygons with holes to a singe outline with "slits"/"fractures" connecting the oute...
int LAYER_NUM
Type LAYER_NUM can be replaced with int and removed.
double GetAngle() const
Class SHAPE_LINE_CHAIN.
int GetWidth() const
static bool GetLayer(MODEL_VRML &aModel, LAYER_NUM layer, VRML_LAYER **vlayer)
static void export_vrml_line(MODEL_VRML &aModel, LAYER_NUM layer, double startx, double starty, double endx, double endy, double width)
const wxPoint & GetStart() const
Function GetStart returns the starting point of the graphic.
const VECTOR2I & CPoint(int aIndex) const
Function CPoint()
static void export_vrml_edge_module ( MODEL_VRML aModel,
EDGE_MODULE aOutline,
MODULE aModule 
)
static

Definition at line 1045 of file export_vrml.cpp.

References BOARD_SCALE, SHAPE_POLY_SET::COutline(), SHAPE_LINE_CHAIN::CPoint(), export_vrml_arc(), export_vrml_circle(), export_vrml_line(), SHAPE_POLY_SET::Fracture(), DRAWSEGMENT::GetAngle(), DRAWSEGMENT::GetEnd(), BOARD_ITEM::GetLayer(), GetLayer(), MODULE::GetOrientationRadians(), DRAWSEGMENT::GetPolyShape(), MODULE::GetPosition(), DRAWSEGMENT::GetShape(), DRAWSEGMENT::GetStart(), DRAWSEGMENT::GetWidth(), i, SHAPE_POLY_SET::Inflate(), DRAWSEGMENT::IsPolyShapeValid(), SHAPE_POLY_SET::Move(), SHAPE_POLY_SET::PM_STRICTLY_SIMPLE, SHAPE_LINE_CHAIN::PointCount(), SHAPE_POLY_SET::Rotate(), S_ARC, S_CIRCLE, S_POLYGON, S_SEGMENT, wxPoint::x, VECTOR2< T >::x, wxPoint::y, and VECTOR2< T >::y.

Referenced by export_vrml_module().

1047 {
1048  LAYER_NUM layer = aOutline->GetLayer();
1049  double x = aOutline->GetStart().x * BOARD_SCALE;
1050  double y = aOutline->GetStart().y * BOARD_SCALE;
1051  double xf = aOutline->GetEnd().x * BOARD_SCALE;
1052  double yf = aOutline->GetEnd().y * BOARD_SCALE;
1053  double w = aOutline->GetWidth() * BOARD_SCALE;
1054 
1055  switch( aOutline->GetShape() )
1056  {
1057  case S_SEGMENT:
1058  export_vrml_line( aModel, layer, x, y, xf, yf, w );
1059  break;
1060 
1061  case S_ARC:
1062  export_vrml_arc( aModel, layer, x, y, xf, yf, w, aOutline->GetAngle() / 10 );
1063  break;
1064 
1065  case S_CIRCLE:
1066  export_vrml_circle( aModel, layer, x, y, xf, yf, w );
1067  break;
1068 
1069  case S_POLYGON:
1070  if( aOutline->IsPolyShapeValid() )
1071  {
1072  VRML_LAYER* vl;
1073 
1074  if( !GetLayer( aModel, layer, &vl ) )
1075  break;
1076 
1077  SHAPE_POLY_SET shape = aOutline->GetPolyShape();
1078 
1079  const int circleSegmentsCount = 16;
1080 
1081  if( aOutline->GetWidth() )
1082  {
1083  shape.Inflate( aOutline->GetWidth()/2, circleSegmentsCount );
1085  }
1086 
1087  shape.Rotate( -aModule->GetOrientationRadians(), VECTOR2I( 0, 0 ) );
1088  shape.Move( aModule->GetPosition() );
1089 
1090  const SHAPE_LINE_CHAIN& outline = shape.COutline( 0 );
1091 
1092  int nvert = outline.PointCount() - 1;
1093  int i = 0;
1094 
1095  if( nvert < 3 ) break;
1096 
1097  int seg = vl->NewContour();
1098 
1099  if( seg < 0 )
1100  break;
1101 
1102  while( i < nvert )
1103  {
1104  x = outline.CPoint( i ).x * BOARD_SCALE;
1105  y = - ( outline.CPoint( i ).y * BOARD_SCALE );
1106 
1107  if( !vl->AddVertex( seg, x, y ) )
1108  throw( std::runtime_error( vl->GetError() ) );
1109 
1110  ++i;
1111  }
1112  vl->EnsureWinding( seg, false );
1113  }
1114  break;
1115 
1116  default:
1117  break;
1118  }
1119 }
static double BOARD_SCALE
Definition: export_vrml.cpp:69
virtual PCB_LAYER_ID GetLayer() const
Function GetLayer returns the primary layer this item is on.
int PointCount() const
Function PointCount()
polygon (not yet used for tracks, but could be in microwave apps)
usual segment : line with rounded ends
bool IsPolyShapeValid() const
VECTOR2< int > VECTOR2I
Definition: vector2d.h:589
static void export_vrml_circle(MODEL_VRML &aModel, LAYER_NUM layer, double startx, double starty, double endx, double endy, double width)
STROKE_T GetShape() const
const wxPoint & GetEnd() const
Function GetEnd returns the ending point of the graphic.
void Inflate(int aFactor, int aCircleSegmentsCount)
Performs outline inflation/deflation, using round corners.
void Move(const VECTOR2I &aVector) override
Class SHAPE_POLY_SET.
Arcs (with rounded ends)
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
static void export_vrml_arc(MODEL_VRML &aModel, LAYER_NUM layer, double centerx, double centery, double arc_startx, double arc_starty, double width, double arc_angle)
SHAPE_POLY_SET & GetPolyShape()
double GetOrientationRadians() const
Definition: class_module.h:189
void Fracture(POLYGON_MODE aFastMode)
Converts a set of polygons with holes to a singe outline with "slits"/"fractures" connecting the oute...
int LAYER_NUM
Type LAYER_NUM can be replaced with int and removed.
double GetAngle() const
Class SHAPE_LINE_CHAIN.
size_t i
Definition: json11.cpp:597
int GetWidth() const
static bool GetLayer(MODEL_VRML &aModel, LAYER_NUM layer, VRML_LAYER **vlayer)
static void export_vrml_line(MODEL_VRML &aModel, LAYER_NUM layer, double startx, double starty, double endx, double endy, double width)
const wxPoint & GetStart() const
Function GetStart returns the starting point of the graphic.
void Rotate(double aAngle, const VECTOR2I &aCenter)
Function Rotate rotates all vertices by a given angle.
const VECTOR2I & CPoint(int aIndex) const
Function CPoint()
const wxPoint GetPosition() const override
Definition: class_module.h:182
static void export_vrml_line ( MODEL_VRML aModel,
LAYER_NUM  layer,
double  startx,
double  starty,
double  endx,
double  endy,
double  width 
)
static

Definition at line 601 of file export_vrml.cpp.

References PNS::angle(), Distance(), GetLayer(), and MODEL_VRML::m_minLineWidth.

Referenced by export_vrml_drawsegment(), export_vrml_edge_module(), export_vrml_tracks(), and vrml_text_callback().

604 {
605  VRML_LAYER* vlayer;
606 
607  if( !GetLayer( aModel, layer, &vlayer ) )
608  return;
609 
610  if( width < aModel.m_minLineWidth)
611  width = aModel.m_minLineWidth;
612 
613  starty = -starty;
614  endy = -endy;
615 
616  double angle = atan2( endy - starty, endx - startx ) * 180.0 / M_PI;
617  double length = Distance( startx, starty, endx, endy ) + width;
618  double cx = ( startx + endx ) / 2.0;
619  double cy = ( starty + endy ) / 2.0;
620 
621  if( !vlayer->AddSlot( cx, cy, length, width, angle, false ) )
622  throw( std::runtime_error( vlayer->GetError() ) );
623 }
static DIRECTION_45::AngleType angle(const VECTOR2I &a, const VECTOR2I &b)
static bool GetLayer(MODEL_VRML &aModel, LAYER_NUM layer, VRML_LAYER **vlayer)
double m_minLineWidth
double Distance(double x1, double y1, double x2, double y2)
static void export_vrml_module ( MODEL_VRML aModel,
BOARD aPcb,
MODULE aModule,
std::ostream *  aOutputFile 
)
static

Definition at line 1369 of file export_vrml.cpp.

References abs, IFSG_NODE::AddChildNode(), IFSG_NODE::AddRefNode(), B_Cu, BOARD_SCALE, build_quat(), compose_quat(), DECIDEG2RAD(), DEG2RAD(), export_vrml_edge_module(), export_vrml_pad(), export_vrml_text_module(), from_quat(), GetChars(), BOARD_ITEM::GetLayer(), MODEL_VRML::GetLayerZ(), MODULE::GetOrientation(), MODULE::GetPosition(), IFSG_NODE::GetRawPtr(), S3D_CACHE::GetResolver(), S3D::GetSGNodeParent(), MODULE::GraphicalItemsList(), EDA_TEXT::IsVisible(), S3D_CACHE::Load(), MODEL_VRML::m_components, MODEL_VRML::m_OutputPCB, MODEL_VRML::m_plainPCB, MODEL_VRML::m_tx, MODEL_VRML::m_ty, MODULE::Models(), BOARD_ITEM::Next(), D_PAD::Next(), MODULE::PadsList(), PCB_MODULE_EDGE_T, PCB_MODULE_TEXT_T, PRECISION, MODULE::Reference(), S3D_FILENAME_RESOLVER::ResolvePath(), RotatePoint(), IFSG_TRANSFORM::SetRotation(), IFSG_TRANSFORM::SetScale(), IFSG_TRANSFORM::SetTranslation(), SUBDIR_3D, TO_UTF8, USE_DEFS, USE_INLINES, USE_RELPATH, MODULE::Value(), S3D::WriteVRML(), wxPoint::x, SGPOINT::x, and wxPoint::y.

Referenced by PCB_EDIT_FRAME::ExportVRML_File().

1371 {
1372  if( !aModel.m_plainPCB )
1373  {
1374  // Reference and value
1375  if( aModule->Reference().IsVisible() )
1376  export_vrml_text_module( &aModule->Reference() );
1377 
1378  if( aModule->Value().IsVisible() )
1379  export_vrml_text_module( &aModule->Value() );
1380 
1381  // Export module edges
1382  for( EDA_ITEM* item = aModule->GraphicalItemsList(); item; item = item->Next() )
1383  {
1384  switch( item->Type() )
1385  {
1386  case PCB_MODULE_TEXT_T:
1387  export_vrml_text_module( static_cast<TEXTE_MODULE*>( item ) );
1388  break;
1389 
1390  case PCB_MODULE_EDGE_T:
1391  export_vrml_edge_module( aModel, static_cast<EDGE_MODULE*>( item ),
1392  aModule );
1393  break;
1394 
1395  default:
1396  break;
1397  }
1398  }
1399  }
1400 
1401  // Export pads
1402  for( D_PAD* pad = aModule->PadsList(); pad; pad = pad->Next() )
1403  export_vrml_pad( aModel, aPcb, pad );
1404 
1405  bool isFlipped = aModule->GetLayer() == B_Cu;
1406 
1407  // Export the object VRML model(s)
1408  auto sM = aModule->Models().begin();
1409  auto eM = aModule->Models().end();
1410 
1411  wxFileName subdir( SUBDIR_3D, "" );
1412 
1413  while( sM != eM )
1414  {
1415  SGNODE* mod3d = (SGNODE*) cache->Load( sM->m_Filename );
1416 
1417  if( NULL == mod3d )
1418  {
1419  ++sM;
1420  continue;
1421  }
1422 
1423  /* Calculate 3D shape rotation:
1424  * this is the rotation parameters, with an additional 180 deg rotation
1425  * for footprints that are flipped
1426  * When flipped, axis rotation is the horizontal axis (X axis)
1427  */
1428  double rotx = -sM->m_Rotation.x;
1429  double roty = -sM->m_Rotation.y;
1430  double rotz = -sM->m_Rotation.z;
1431 
1432  if( isFlipped )
1433  {
1434  rotx += 180.0;
1435  roty = -roty;
1436  rotz = -rotz;
1437  }
1438 
1439  // Do some quaternion munching
1440  double q1[4], q2[4], rot[4];
1441  build_quat( 1, 0, 0, DEG2RAD( rotx ), q1 );
1442  build_quat( 0, 1, 0, DEG2RAD( roty ), q2 );
1443  compose_quat( q1, q2, q1 );
1444  build_quat( 0, 0, 1, DEG2RAD( rotz ), q2 );
1445  compose_quat( q1, q2, q1 );
1446 
1447  // Note here aModule->GetOrientation() is in 0.1 degrees,
1448  // so module rotation has to be converted to radians
1449  build_quat( 0, 0, 1, DECIDEG2RAD( aModule->GetOrientation() ), q2 );
1450  compose_quat( q1, q2, q1 );
1451  from_quat( q1, rot );
1452 
1453  double offsetFactor = 1000.0f * IU_PER_MILS / 25.4f;
1454 
1455  // adjust 3D shape local offset position
1456  // they are given in mm, so they are converted in board IU.
1457  double offsetx = sM->m_Offset.x * offsetFactor;
1458  double offsety = sM->m_Offset.y * offsetFactor;
1459  double offsetz = sM->m_Offset.z * offsetFactor;
1460 
1461  if( isFlipped )
1462  offsetz = -offsetz;
1463  else // In normal mode, Y axis is reversed in Pcbnew.
1464  offsety = -offsety;
1465 
1466  RotatePoint( &offsetx, &offsety, aModule->GetOrientation() );
1467 
1468  SGPOINT trans;
1469  trans.x = ( offsetx + aModule->GetPosition().x ) * BOARD_SCALE + aModel.m_tx;
1470  trans.y = -(offsety + aModule->GetPosition().y) * BOARD_SCALE - aModel.m_ty;
1471  trans.z = (offsetz * BOARD_SCALE ) + aModel.GetLayerZ( aModule->GetLayer() );
1472 
1473  if( USE_INLINES )
1474  {
1475  wxFileName srcFile = cache->GetResolver()->ResolvePath( sM->m_Filename );
1476  wxFileName dstFile;
1477  dstFile.SetPath( SUBDIR_3D );
1478  dstFile.SetName( srcFile.GetName() );
1479  dstFile.SetExt( "wrl" );
1480 
1481  // copy the file if necessary
1482  wxDateTime srcModTime = srcFile.GetModificationTime();
1483  wxDateTime destModTime = srcModTime;
1484 
1485  destModTime.SetToCurrent();
1486 
1487  if( dstFile.FileExists() )
1488  destModTime = dstFile.GetModificationTime();
1489 
1490  if( srcModTime != destModTime )
1491  {
1492  wxLogDebug( "Copying 3D model %s to %s.",
1493  GetChars( srcFile.GetFullPath() ),
1494  GetChars( dstFile.GetFullPath() ) );
1495 
1496  wxString fileExt = srcFile.GetExt();
1497  fileExt.LowerCase();
1498 
1499  // copy VRML models and use the scenegraph library to
1500  // translate other model types
1501  if( fileExt == "wrl" )
1502  {
1503  if( !wxCopyFile( srcFile.GetFullPath(), dstFile.GetFullPath() ) )
1504  continue;
1505  }
1506  else
1507  {
1508  if( !S3D::WriteVRML( dstFile.GetFullPath().ToUTF8(), true, mod3d, USE_DEFS, true ) )
1509  continue;
1510  }
1511  }
1512 
1513  (*aOutputFile) << "Transform {\n";
1514 
1515  // only write a rotation if it is >= 0.1 deg
1516  if( std::abs( rot[3] ) > 0.0001745 )
1517  {
1518  (*aOutputFile) << " rotation " << std::setprecision( 5 );
1519  (*aOutputFile) << rot[0] << " " << rot[1] << " " << rot[2] << " " << rot[3] << "\n";
1520  }
1521 
1522  (*aOutputFile) << " translation " << std::setprecision( PRECISION );
1523  (*aOutputFile) << trans.x << " ";
1524  (*aOutputFile) << trans.y << " ";
1525  (*aOutputFile) << trans.z << "\n";
1526 
1527  (*aOutputFile) << " scale ";
1528  (*aOutputFile) << sM->m_Scale.x << " ";
1529  (*aOutputFile) << sM->m_Scale.y << " ";
1530  (*aOutputFile) << sM->m_Scale.z << "\n";
1531 
1532  (*aOutputFile) << " children [\n Inline {\n url \"";
1533 
1534  if( USE_RELPATH )
1535  {
1536  wxFileName tmp = dstFile;
1537  tmp.SetExt( "" );
1538  tmp.SetName( "" );
1539  tmp.RemoveLastDir();
1540  dstFile.MakeRelativeTo( tmp.GetPath() );
1541  }
1542 
1543  wxString fn = dstFile.GetFullPath();
1544  fn.Replace( "\\", "/" );
1545  (*aOutputFile) << TO_UTF8( fn ) << "\"\n } ]\n";
1546  (*aOutputFile) << " }\n";
1547  }
1548  else
1549  {
1550  IFSG_TRANSFORM* modelShape = new IFSG_TRANSFORM( aModel.m_OutputPCB.GetRawPtr() );
1551 
1552  // only write a rotation if it is >= 0.1 deg
1553  if( std::abs( rot[3] ) > 0.0001745 )
1554  modelShape->SetRotation( SGVECTOR( rot[0], rot[1], rot[2] ), rot[3] );
1555 
1556  modelShape->SetTranslation( trans );
1557  modelShape->SetScale( SGPOINT( sM->m_Scale.x, sM->m_Scale.y, sM->m_Scale.z ) );
1558 
1559  if( NULL == S3D::GetSGNodeParent( mod3d ) )
1560  {
1561  aModel.m_components.push_back( mod3d );
1562  modelShape->AddChildNode( mod3d );
1563  }
1564  else
1565  {
1566  modelShape->AddRefNode( mod3d );
1567  }
1568 
1569  }
1570 
1571  ++sM;
1572  }
1573 }
bool SetTranslation(const SGPOINT &aTranslation)
static double BOARD_SCALE
Definition: export_vrml.cpp:69
static void export_vrml_pad(MODEL_VRML &aModel, BOARD *aPcb, D_PAD *aPad)
SGNODE * GetRawPtr(void)
Function GetRawPtr() returns the raw internal SGNODE pointer.
Definition: ifsg_node.cpp:66
TEXTE_MODULE & Reference()
Definition: class_module.h:502
static S3D_CACHE * cache
Definition: export_vrml.cpp:64
double x
Definition: sg_base.h:70
static void compose_quat(double q1[4], double q2[4], double qr[4])
static bool USE_INLINES
Definition: export_vrml.cpp:65
virtual PCB_LAYER_ID GetLayer() const
Function GetLayer returns the primary layer this item is on.
bool AddRefNode(SGNODE *aNode)
Function AddRefNode adds a reference to an existing node which is not owned by (not a child of) this ...
Definition: ifsg_node.cpp:199
SGLIB_API SGNODE * GetSGNodeParent(SGNODE *aNode)
Definition: ifsg_api.cpp:636
void RotatePoint(int *pX, int *pY, double angle)
Definition: trigo.cpp:216
Class SGNODE represents the base class of all Scene Graph nodes.
Definition: sg_node.h:76
bool SetScale(const SGPOINT &aScale)
IFSG_TRANSFORM m_OutputPCB
#define abs(a)
Definition: auxiliary.h:84
class EDGE_MODULE, a footprint edge
Definition: typeinfo.h:94
static void export_vrml_text_module(TEXTE_MODULE *module)
bool AddChildNode(SGNODE *aNode)
Function AddChildNode adds a node as a child owned by this node.
Definition: ifsg_node.cpp:249
SGLIB_API bool WriteVRML(const char *filename, bool overwrite, SGNODE *aTopNode, bool reuse, bool renameNodes)
Function WriteVRML writes out the given node and its subnodes to a VRML2 file.
Definition: ifsg_api.cpp:81
static void build_quat(double x, double y, double z, double a, double q[4])
BOARD_ITEM * Next() const
#define TO_UTF8(wxstring)
Macro TO_UTF8 converts a wxString to a UTF8 encoded C string for all wxWidgets build modes...
Definition: macros.h:47
double GetOrientation() const
Definition: class_module.h:187
TEXTE_MODULE & Value()
read/write accessors:
Definition: class_module.h:501
D_PAD * Next() const
Definition: class_pad.h:160
static bool USE_RELPATH
Definition: export_vrml.cpp:67
bool SetRotation(const SGVECTOR &aRotationAxis, double aAngle)
static wxString SUBDIR_3D
Definition: export_vrml.cpp:71
S3D_FILENAME_RESOLVER * GetResolver(void)
Definition: 3d_cache.cpp:739
std::list< SGNODE * > m_components
class TEXTE_MODULE, text in a footprint
Definition: typeinfo.h:93
std::list< MODULE_3D_SETTINGS > & Models()
Definition: class_module.h:177
static const wxChar * GetChars(const wxString &s)
Function GetChars returns a wxChar* to the actual wxChar* data within a wxString, and is helpful for ...
Definition: macros.h:92
double DEG2RAD(double deg)
Definition: trigo.h:199
wxString ResolvePath(const wxString &aFileName)
Function ResolvePath determines the full path of the given file name.
bool IsVisible() const
Definition: eda_text.h:174
Class IFSG_TRANSFORM is the wrapper for the VRML compatible TRANSFORM block class SCENEGRAPH...
double DECIDEG2RAD(double deg)
Definition: trigo.h:203
static void from_quat(double q[4], double rot[4])
Class EDA_ITEM is a base class for most all the KiCad significant classes, used in schematics and boa...
Definition: base_struct.h:162
static const int PRECISION
Definition: export_vrml.cpp:70
static bool USE_DEFS
Definition: export_vrml.cpp:66
DLIST< BOARD_ITEM > & GraphicalItemsList()
Definition: class_module.h:164
DLIST< D_PAD > & PadsList()
Definition: class_module.h:161
static void export_vrml_edge_module(MODEL_VRML &aModel, EDGE_MODULE *aOutline, MODULE *aModule)
SCENEGRAPH * Load(const wxString &aModelFile)
Function Load attempts to load the scene data for a model; it will consult the internal cache list an...
Definition: 3d_cache.cpp:271
const wxPoint GetPosition() const override
Definition: class_module.h:182
double GetLayerZ(LAYER_NUM aLayer)
static void export_vrml_pad ( MODEL_VRML aModel,
BOARD aPcb,
D_PAD aPad 
)
static

Definition at line 1255 of file export_vrml.cpp.

References B_Cu, BOARD_SCALE, export_vrml_padshape(), F_Cu, D_PAD::GetAttribute(), D_PAD::GetDrillShape(), D_PAD::GetDrillSize(), D_PAD::GetLayerSet(), D_PAD::GetOrientation(), D_PAD::GetPosition(), MODEL_VRML::m_bot_tin, MODEL_VRML::m_holes, MODEL_VRML::m_plainPCB, MODEL_VRML::m_plated_holes, MODEL_VRML::m_top_tin, min, PAD_ATTRIB_HOLE_NOT_PLATED, PAD_DRILL_SHAPE_OBLONG, PLATE_OFFSET, wxPoint::x, and wxPoint::y.

Referenced by export_vrml_module().

1256 {
1257  double hole_drill_w = (double) aPad->GetDrillSize().x * BOARD_SCALE / 2.0;
1258  double hole_drill_h = (double) aPad->GetDrillSize().y * BOARD_SCALE / 2.0;
1259  double hole_drill = std::min( hole_drill_w, hole_drill_h );
1260  double hole_x = aPad->GetPosition().x * BOARD_SCALE;
1261  double hole_y = aPad->GetPosition().y * BOARD_SCALE;
1262 
1263  // Export the hole on the edge layer
1264  if( hole_drill > 0 )
1265  {
1266  bool pth = false;
1267 
1268  if( ( aPad->GetAttribute() != PAD_ATTRIB_HOLE_NOT_PLATED )
1269  && !aModel.m_plainPCB )
1270  pth = true;
1271 
1272  if( aPad->GetDrillShape() == PAD_DRILL_SHAPE_OBLONG )
1273  {
1274  // Oblong hole (slot)
1275 
1276  if( pth )
1277  {
1278  aModel.m_holes.AddSlot( hole_x, -hole_y, hole_drill_w * 2.0 + PLATE_OFFSET,
1279  hole_drill_h * 2.0 + PLATE_OFFSET,
1280  aPad->GetOrientation()/10.0, true, true );
1281 
1282  aModel.m_plated_holes.AddSlot( hole_x, -hole_y,
1283  hole_drill_w * 2.0, hole_drill_h * 2.0,
1284  aPad->GetOrientation()/10.0, true, false );
1285  }
1286  else
1287  {
1288  aModel.m_holes.AddSlot( hole_x, -hole_y, hole_drill_w * 2.0, hole_drill_h * 2.0,
1289  aPad->GetOrientation()/10.0, true, false );
1290 
1291  }
1292  }
1293  else
1294  {
1295  // Drill a round hole
1296 
1297  if( pth )
1298  {
1299  aModel.m_holes.AddCircle( hole_x, -hole_y, hole_drill + PLATE_OFFSET, true, true );
1300  aModel.m_plated_holes.AddCircle( hole_x, -hole_y, hole_drill, true, false );
1301  }
1302  else
1303  {
1304  aModel.m_holes.AddCircle( hole_x, -hole_y, hole_drill, true, false );
1305  }
1306 
1307  }
1308  }
1309 
1310  if( aModel.m_plainPCB )
1311  return;
1312 
1313  // The pad proper, on the selected layers
1314  LSET layer_mask = aPad->GetLayerSet();
1315 
1316  if( layer_mask[B_Cu] )
1317  {
1318  export_vrml_padshape( aModel, &aModel.m_bot_tin, aPad );
1319  }
1320 
1321  if( layer_mask[F_Cu] )
1322  {
1323  export_vrml_padshape( aModel, &aModel.m_top_tin, aPad );
1324  }
1325 }
static double BOARD_SCALE
Definition: export_vrml.cpp:69
PAD_ATTR_T GetAttribute() const
Definition: class_pad.h:405
like PAD_STANDARD, but not plated mechanical use only, no connection allowed
Definition: pad_shapes.h:65
VRML_LAYER m_bot_tin
VRML_LAYER m_plated_holes
VRML_LAYER m_holes
PAD_DRILL_SHAPE_T GetDrillShape() const
Definition: class_pad.h:388
const wxSize & GetDrillSize() const
Definition: class_pad.h:275
static void export_vrml_padshape(MODEL_VRML &aModel, VRML_LAYER *aTinLayer, D_PAD *aPad)
Class LSET is a set of PCB_LAYER_IDs.
LSET GetLayerSet() const override
Function GetLayerSet returns a "layer mask", which is a bitmap of all layers on which the TRACK segme...
Definition: class_pad.h:402
double GetOrientation() const
Function GetOrientation returns the rotation angle of the pad in tenths of degrees, but soon degrees.
Definition: class_pad.h:382
#define PLATE_OFFSET
Definition: export_vrml.cpp:62
const wxPoint GetPosition() const override
Definition: class_pad.h:220
VRML_LAYER m_top_tin
#define min(a, b)
Definition: auxiliary.h:85
static void export_vrml_padshape ( MODEL_VRML aModel,
VRML_LAYER *  aTinLayer,
D_PAD aPad 
)
static

Definition at line 1122 of file export_vrml.cpp.

References BOARD_SCALE, D_PAD::GetDelta(), D_PAD::GetOrientation(), D_PAD::GetRoundRectCornerRadius(), D_PAD::GetShape(), D_PAD::GetSize(), i, D_PAD::MergePrimitivesAsPolygon(), SHAPE_POLY_SET::Outline(), SHAPE_POLY_SET::OutlineCount(), PAD_SHAPE_CIRCLE, PAD_SHAPE_CUSTOM, PAD_SHAPE_OVAL, PAD_SHAPE_RECT, PAD_SHAPE_ROUNDRECT, PAD_SHAPE_TRAPEZOID, SHAPE_LINE_CHAIN::Point(), SHAPE_LINE_CHAIN::PointCount(), RotatePoint(), D_PAD::ShapePos(), TransformRoundRectToPolygon(), wxPoint::x, VECTOR2< T >::x, wxPoint::y, and VECTOR2< T >::y.

Referenced by export_vrml_pad().

1123 {
1124  // The (maybe offset) pad position
1125  wxPoint pad_pos = aPad->ShapePos();
1126  double pad_x = pad_pos.x * BOARD_SCALE;
1127  double pad_y = pad_pos.y * BOARD_SCALE;
1128  wxSize pad_delta = aPad->GetDelta();
1129 
1130  double pad_dx = pad_delta.x * BOARD_SCALE / 2.0;
1131  double pad_dy = pad_delta.y * BOARD_SCALE / 2.0;
1132 
1133  double pad_w = aPad->GetSize().x * BOARD_SCALE / 2.0;
1134  double pad_h = aPad->GetSize().y * BOARD_SCALE / 2.0;
1135 
1136  switch( aPad->GetShape() )
1137  {
1138  case PAD_SHAPE_CIRCLE:
1139 
1140  if( !aTinLayer->AddCircle( pad_x, -pad_y, pad_w, false ) )
1141  throw( std::runtime_error( aTinLayer->GetError() ) );
1142 
1143  break;
1144 
1145  case PAD_SHAPE_OVAL:
1146 
1147  if( !aTinLayer->AddSlot( pad_x, -pad_y, pad_w * 2.0, pad_h * 2.0,
1148  aPad->GetOrientation()/10.0, false ) )
1149  throw( std::runtime_error( aTinLayer->GetError() ) );
1150 
1151  break;
1152 
1153  case PAD_SHAPE_ROUNDRECT:
1154  {
1155  SHAPE_POLY_SET polySet;
1156  int segmentToCircleCount = 32;
1157  const int corner_radius = aPad->GetRoundRectCornerRadius( aPad->GetSize() );
1158  TransformRoundRectToPolygon( polySet, wxPoint( 0, 0 ), aPad->GetSize(),
1159  0.0, corner_radius, segmentToCircleCount );
1160  std::vector< wxRealPoint > cornerList;
1161  // TransformRoundRectToPolygon creates only one convex polygon
1162  SHAPE_LINE_CHAIN poly( polySet.Outline( 0 ) );
1163 
1164  for( int ii = 0; ii < poly.PointCount(); ++ii )
1165  cornerList.push_back( wxRealPoint( poly.Point( ii ).x * BOARD_SCALE,
1166  -poly.Point( ii ).y * BOARD_SCALE ) );
1167 
1168  // Close polygon
1169  cornerList.push_back( cornerList[0] );
1170  if( !aTinLayer->AddPolygon( cornerList, pad_x, -pad_y, aPad->GetOrientation() ) )
1171  throw( std::runtime_error( aTinLayer->GetError() ) );
1172 
1173  break;
1174  }
1175 
1176  case PAD_SHAPE_CUSTOM:
1177  {
1178  SHAPE_POLY_SET polySet;
1179  int segmentToCircleCount = 32;
1180  std::vector< wxRealPoint > cornerList;
1181  aPad->MergePrimitivesAsPolygon( &polySet, segmentToCircleCount );
1182 
1183  for( int cnt = 0; cnt < polySet.OutlineCount(); ++cnt )
1184  {
1185  SHAPE_LINE_CHAIN& poly = polySet.Outline( cnt );
1186  cornerList.clear();
1187 
1188  for( int ii = 0; ii < poly.PointCount(); ++ii )
1189  cornerList.push_back( wxRealPoint( poly.Point( ii ).x * BOARD_SCALE,
1190  -poly.Point( ii ).y * BOARD_SCALE ) );
1191 
1192  // Close polygon
1193  cornerList.push_back( cornerList[0] );
1194 
1195  if( !aTinLayer->AddPolygon( cornerList, pad_x, -pad_y, aPad->GetOrientation() ) )
1196  throw( std::runtime_error( aTinLayer->GetError() ) );
1197  }
1198 
1199  break;
1200  }
1201 
1202  case PAD_SHAPE_RECT:
1203  // Just to be sure :D
1204  pad_dx = 0;
1205  pad_dy = 0;
1206 
1207  case PAD_SHAPE_TRAPEZOID:
1208  {
1209  double coord[8] =
1210  {
1211  -pad_w + pad_dy, -pad_h - pad_dx,
1212  -pad_w - pad_dy, pad_h + pad_dx,
1213  +pad_w - pad_dy, -pad_h + pad_dx,
1214  +pad_w + pad_dy, pad_h - pad_dx
1215  };
1216 
1217  for( int i = 0; i < 4; i++ )
1218  {
1219  RotatePoint( &coord[i * 2], &coord[i * 2 + 1], aPad->GetOrientation() );
1220  coord[i * 2] += pad_x;
1221  coord[i * 2 + 1] += pad_y;
1222  }
1223 
1224  int lines;
1225 
1226  lines = aTinLayer->NewContour();
1227 
1228  if( lines < 0 )
1229  throw( std::runtime_error( aTinLayer->GetError() ) );
1230 
1231  if( !aTinLayer->AddVertex( lines, coord[0], -coord[1] ) )
1232  throw( std::runtime_error( aTinLayer->GetError() ) );
1233 
1234  if( !aTinLayer->AddVertex( lines, coord[4], -coord[5] ) )
1235  throw( std::runtime_error( aTinLayer->GetError() ) );
1236 
1237  if( !aTinLayer->AddVertex( lines, coord[6], -coord[7] ) )
1238  throw( std::runtime_error( aTinLayer->GetError() ) );
1239 
1240  if( !aTinLayer->AddVertex( lines, coord[2], -coord[3] ) )
1241  throw( std::runtime_error( aTinLayer->GetError() ) );
1242 
1243  if( !aTinLayer->EnsureWinding( lines, false ) )
1244  throw( std::runtime_error( aTinLayer->GetError() ) );
1245 
1246  break;
1247  }
1248 
1249  default:
1250  break;
1251  }
1252 }
bool MergePrimitivesAsPolygon(SHAPE_POLY_SET *aMergedPolygon=NULL, int aCircleToSegmentsCount=32)
Merge all basic shapes, converted to a polygon in one polygon, in m_customShapeAsPolygon.
static double BOARD_SCALE
Definition: export_vrml.cpp:69
int PointCount() const
Function PointCount()
void TransformRoundRectToPolygon(SHAPE_POLY_SET &aCornerBuffer, const wxPoint &aPosition, const wxSize &aSize, double aRotation, int aCornerRadius, int aCircleToSegmentsCount)
Function TransformRoundRectToPolygon convert a rectangle with rounded corners to a polygon Convert ar...
int GetRoundRectCornerRadius() const
Function GetRoundRectCornerRadius Has meaning only for rounded rect pads.
Definition: class_pad.h:518
void RotatePoint(int *pX, int *pY, double angle)
Definition: trigo.cpp:216
int OutlineCount() const
Returns the number of outlines in the set
PAD_SHAPE_T GetShape() const
Function GetShape.
Definition: class_pad.h:216
Class SHAPE_POLY_SET.
SHAPE_LINE_CHAIN & Outline(int aIndex)
Returns the reference to aIndex-th outline in the set
const wxSize & GetSize() const
Definition: class_pad.h:269
Class SHAPE_LINE_CHAIN.
size_t i
Definition: json11.cpp:597
double GetOrientation() const
Function GetOrientation returns the rotation angle of the pad in tenths of degrees, but soon degrees.
Definition: class_pad.h:382
const wxSize & GetDelta() const
Definition: class_pad.h:272
wxPoint ShapePos() const
Definition: class_pad.cpp:500
VECTOR2I & Point(int aIndex)
Function Point()
static void export_vrml_pcbtext ( MODEL_VRML aModel,
TEXTE_PCB text 
)
static

Definition at line 766 of file export_vrml.cpp.

References BLACK, color, DrawGraphicText(), EDA_TEXT::GetHorizJustify(), BOARD_ITEM::GetLayer(), EDA_TEXT::GetPositionsOfLinesOfMultilineText(), EDA_TEXT::GetShownText(), EDA_TEXT::GetTextAngle(), EDA_TEXT::GetTextPos(), EDA_TEXT::GetTextSize(), EDA_TEXT::GetThickness(), EDA_TEXT::GetVertJustify(), EDA_TEXT::IsItalic(), EDA_TEXT::IsMirrored(), EDA_TEXT::IsMultilineAllowed(), MODEL_VRML::m_text_layer, MODEL_VRML::m_text_width, vrml_text_callback(), and wxStringSplit().

Referenced by export_vrml_drawings().

767 {
768  model_vrml->m_text_layer = text->GetLayer();
770 
771  wxSize size = text->GetTextSize();
772 
773  if( text->IsMirrored() )
774  size.x = -size.x;
775 
776  COLOR4D color = COLOR4D::BLACK; // not actually used, but needed by DrawGraphicText
777 
778  if( text->IsMultilineAllowed() )
779  {
780  wxArrayString strings_list;
781  wxStringSplit( text->GetShownText(), strings_list, '\n' );
782  std::vector<wxPoint> positions;
783  positions.reserve( strings_list.Count() );
784  text->GetPositionsOfLinesOfMultilineText( positions, strings_list.Count() );
785 
786  for( unsigned ii = 0; ii < strings_list.Count(); ii++ )
787  {
788  wxString& txt = strings_list.Item( ii );
789  DrawGraphicText( NULL, NULL, positions[ii], color,
790  txt, text->GetTextAngle(), size,
791  text->GetHorizJustify(), text->GetVertJustify(),
792  text->GetThickness(), text->IsItalic(),
793  true,
795  }
796  }
797  else
798  {
799  DrawGraphicText( NULL, NULL, text->GetTextPos(), color,
800  text->GetShownText(), text->GetTextAngle(), size,
801  text->GetHorizJustify(), text->GetVertJustify(),
802  text->GetThickness(), text->IsItalic(),
803  true,
805  }
806 }
void wxStringSplit(const wxString &aText, wxArrayString &aStrings, wxChar aSplitter)
Function wxStringSplit splits aString to a string list separated at aSplitter.
Definition: common.cpp:138
static void vrml_text_callback(int x0, int y0, int xf, int yf, void *aData)
bool IsMultilineAllowed() const
Definition: eda_text.h:186
const wxPoint & GetTextPos() const
Definition: eda_text.h:222
bool IsItalic() const
Definition: eda_text.h:168
virtual PCB_LAYER_ID GetLayer() const
Function GetLayer returns the primary layer this item is on.
int color
Definition: DXF_plotter.cpp:62
static MODEL_VRML * model_vrml
EDA_TEXT_HJUSTIFY_T GetHorizJustify() const
Definition: eda_text.h:188
void DrawGraphicText(EDA_RECT *aClipBox, wxDC *aDC, const wxPoint &aPos, COLOR4D aColor, const wxString &aText, double aOrient, const wxSize &aSize, enum EDA_TEXT_HJUSTIFY_T aH_justify, enum EDA_TEXT_VJUSTIFY_T aV_justify, int aWidth, bool aItalic, bool aBold, void(*aCallback)(int x0, int y0, int xf, int yf, void *aData), void *aCallbackData, PLOTTER *aPlotter)
Function DrawGraphicText Draw a graphic text (like module texts)
double GetTextAngle() const
Definition: eda_text.h:162
int GetThickness() const
Function GetThickness returns pen width.
Definition: eda_text.h:152
virtual wxString GetShownText() const
Returns the string actually shown after processing of the base text.
Definition: eda_text.h:133
void GetPositionsOfLinesOfMultilineText(std::vector< wxPoint > &aPositions, int aLineCount) const
Function GetPositionsOfLinesOfMultilineText Populates aPositions with the position of each line of a ...
Definition: eda_text.cpp:314
LAYER_NUM m_text_layer
EDA_TEXT_VJUSTIFY_T GetVertJustify() const
Definition: eda_text.h:189
bool IsMirrored() const
Definition: eda_text.h:177
Definition: colors.h:45
const wxSize & GetTextSize() const
Definition: eda_text.h:213
Class COLOR4D is the color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:39
static void export_vrml_text_module ( TEXTE_MODULE module)
static

Definition at line 1023 of file export_vrml.cpp.

References BLACK, DrawGraphicText(), TEXTE_MODULE::GetDrawRotation(), EDA_TEXT::GetHorizJustify(), BOARD_ITEM::GetLayer(), TEXTE_MODULE::GetShownText(), EDA_TEXT::GetTextPos(), EDA_TEXT::GetTextSize(), EDA_TEXT::GetThickness(), EDA_TEXT::GetVertJustify(), EDA_TEXT::IsItalic(), EDA_TEXT::IsMirrored(), EDA_TEXT::IsVisible(), MODEL_VRML::m_text_layer, MODEL_VRML::m_text_width, and vrml_text_callback().

Referenced by export_vrml_module().

1024 {
1025  if( module->IsVisible() )
1026  {
1027  wxSize size = module->GetTextSize();
1028 
1029  if( module->IsMirrored() )
1030  size.x = -size.x; // Text is mirrored
1031 
1032  model_vrml->m_text_layer = module->GetLayer();
1033  model_vrml->m_text_width = module->GetThickness();
1034 
1035  DrawGraphicText( NULL, NULL, module->GetTextPos(), BLACK,
1036  module->GetShownText(), module->GetDrawRotation(), size,
1037  module->GetHorizJustify(), module->GetVertJustify(),
1038  module->GetThickness(), module->IsItalic(),
1039  true,
1041  }
1042 }
static void vrml_text_callback(int x0, int y0, int xf, int yf, void *aData)
double GetDrawRotation() const
const wxPoint & GetTextPos() const
Definition: eda_text.h:222
bool IsItalic() const
Definition: eda_text.h:168
virtual PCB_LAYER_ID GetLayer() const
Function GetLayer returns the primary layer this item is on.
static MODEL_VRML * model_vrml
virtual wxString GetShownText() const override
Returns the string actually shown after processing of the base text.
EDA_TEXT_HJUSTIFY_T GetHorizJustify() const
Definition: eda_text.h:188
void DrawGraphicText(EDA_RECT *aClipBox, wxDC *aDC, const wxPoint &aPos, COLOR4D aColor, const wxString &aText, double aOrient, const wxSize &aSize, enum EDA_TEXT_HJUSTIFY_T aH_justify, enum EDA_TEXT_VJUSTIFY_T aV_justify, int aWidth, bool aItalic, bool aBold, void(*aCallback)(int x0, int y0, int xf, int yf, void *aData), void *aCallbackData, PLOTTER *aPlotter)
Function DrawGraphicText Draw a graphic text (like module texts)
int GetThickness() const
Function GetThickness returns pen width.
Definition: eda_text.h:152
LAYER_NUM m_text_layer
EDA_TEXT_VJUSTIFY_T GetVertJustify() const
Definition: eda_text.h:189
bool IsMirrored() const
Definition: eda_text.h:177
bool IsVisible() const
Definition: eda_text.h:174
Definition: colors.h:45
const wxSize & GetTextSize() const
Definition: eda_text.h:213
static void export_vrml_tracks ( MODEL_VRML aModel,
BOARD pcb 
)
static

Definition at line 960 of file export_vrml.cpp.

References B_Cu, BOARD_SCALE, export_vrml_line(), export_vrml_via(), F_Cu, MODEL_VRML::m_plainPCB, BOARD::m_Track, TRACK::Next(), and PCB_VIA_T.

Referenced by PCB_EDIT_FRAME::ExportVRML_File().

961 {
962  for( TRACK* track = pcb->m_Track; track; track = track->Next() )
963  {
964  if( track->Type() == PCB_VIA_T )
965  {
966  export_vrml_via( aModel, pcb, (const VIA*) track );
967  }
968  else if( ( track->GetLayer() == B_Cu || track->GetLayer() == F_Cu )
969  && !aModel.m_plainPCB )
970  export_vrml_line( aModel, track->GetLayer(),
971  track->GetStart().x * BOARD_SCALE,
972  track->GetStart().y * BOARD_SCALE,
973  track->GetEnd().x * BOARD_SCALE,
974  track->GetEnd().y * BOARD_SCALE,
975  track->GetWidth() * BOARD_SCALE );
976  }
977 }
static double BOARD_SCALE
Definition: export_vrml.cpp:69
TRACK * Next() const
Definition: class_track.h:99
class VIA, a via (like a track segment on a copper layer)
Definition: typeinfo.h:96
static void export_vrml_via(MODEL_VRML &aModel, BOARD *aPcb, const VIA *aVia)
DLIST< TRACK > m_Track
Definition: class_board.h:246
static void export_vrml_line(MODEL_VRML &aModel, LAYER_NUM layer, double startx, double starty, double endx, double endy, double width)
static void export_vrml_via ( MODEL_VRML aModel,
BOARD aPcb,
const VIA aVia 
)
static

Definition at line 940 of file export_vrml.cpp.

References B_Cu, BOARD_SCALE, export_round_padstack(), F_Cu, VIA::GetDrillValue(), TRACK::GetStart(), TRACK::GetWidth(), VIA::LayerPair(), wxPoint::x, and wxPoint::y.

Referenced by export_vrml_tracks().

941 {
942  double x, y, r, hole;
943  PCB_LAYER_ID top_layer, bottom_layer;
944 
945  hole = aVia->GetDrillValue() * BOARD_SCALE / 2.0;
946  r = aVia->GetWidth() * BOARD_SCALE / 2.0;
947  x = aVia->GetStart().x * BOARD_SCALE;
948  y = aVia->GetStart().y * BOARD_SCALE;
949  aVia->LayerPair( &top_layer, &bottom_layer );
950 
951  // do not render a buried via
952  if( top_layer != F_Cu && bottom_layer != B_Cu )
953  return;
954 
955  // Export the via padstack
956  export_round_padstack( aModel, aPcb, x, y, r, bottom_layer, top_layer, hole );
957 }
static double BOARD_SCALE
Definition: export_vrml.cpp:69
PCB_LAYER_ID
A quick note on layer IDs:
const wxPoint & GetStart() const
Definition: class_track.h:122
static void export_round_padstack(MODEL_VRML &aModel, BOARD *pcb, double x, double y, double r, LAYER_NUM bottom_layer, LAYER_NUM top_layer, double hole)
void LayerPair(PCB_LAYER_ID *top_layer, PCB_LAYER_ID *bottom_layer) const
Function LayerPair Return the 2 layers used by the via (the via actually uses all layers between thes...
int GetDrillValue() const
Function GetDrillValue "calculates" the drill value for vias (m-Drill if > 0, or default drill value ...
int GetWidth() const
Definition: class_track.h:116
static void export_vrml_zones ( MODEL_VRML aModel,
BOARD aPcb 
)
static

Definition at line 980 of file export_vrml.cpp.

References BOARD_SCALE, SHAPE_POLY_SET::COutline(), SHAPE_LINE_CHAIN::CPoint(), ZONE_FILLER::Fill(), BOARD::GetArea(), BOARD::GetAreaCount(), ZONE_CONTAINER::GetFilledPolysList(), ZONE_CONTAINER::GetLayer(), GetLayer(), i, ZONE_CONTAINER::IsFilled(), SHAPE_POLY_SET::OutlineCount(), SHAPE_LINE_CHAIN::PointCount(), ZONE_CONTAINER::SetFillMode(), VECTOR2< T >::x, VECTOR2< T >::y, and ZFM_POLYGONS.

Referenced by PCB_EDIT_FRAME::ExportVRML_File().

981 {
982 
983  for( int ii = 0; ii < aPcb->GetAreaCount(); ii++ )
984  {
985  ZONE_CONTAINER* zone = aPcb->GetArea( ii );
986 
987  VRML_LAYER* vl;
988 
989  if( !GetLayer( aModel, zone->GetLayer(), &vl ) )
990  continue;
991 
992  // fixme: this modifies the board where it shouldn't, but I don't have the time
993  // to clean this up - TW
994  if( !zone->IsFilled() )
995  {
996  ZONE_FILLER filler( aPcb );
997  zone->SetFillMode( ZFM_POLYGONS ); // use filled polygons
998  filler.Fill( { zone } );
999  }
1000 
1001  const SHAPE_POLY_SET& poly = zone->GetFilledPolysList();
1002 
1003  for( int i = 0; i < poly.OutlineCount(); i++ )
1004  {
1005  const SHAPE_LINE_CHAIN& outline = poly.COutline( i );
1006 
1007  int seg = vl->NewContour();
1008 
1009  for( int j = 0; j < outline.PointCount(); j++ )
1010  {
1011  if( !vl->AddVertex( seg, (double)outline.CPoint( j ).x * BOARD_SCALE,
1012  -((double)outline.CPoint( j ).y * BOARD_SCALE ) ) )
1013  throw( std::runtime_error( vl->GetError() ) );
1014 
1015  }
1016 
1017  vl->EnsureWinding( seg, false );
1018  }
1019  }
1020 }
static double BOARD_SCALE
Definition: export_vrml.cpp:69
Class ZONE_CONTAINER handles a list of polygons defining a copper zone.
Definition: class_zone.h:60
int PointCount() const
Function PointCount()
bool IsFilled() const
Definition: class_zone.h:189
virtual PCB_LAYER_ID GetLayer() const override
Function GetLayer returns the primary layer this item is on.
Definition: class_zone.cpp:175
int OutlineCount() const
Returns the number of outlines in the set
Class SHAPE_POLY_SET.
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
int GetAreaCount() const
Function GetAreaCount.
Definition: class_board.h:1011
const SHAPE_POLY_SET & GetFilledPolysList() const
Function GetFilledPolysList returns a reference to the list of filled polygons.
Definition: class_zone.h:534
void SetFillMode(ZONE_FILL_MODE aFillMode)
Definition: class_zone.h:174
ZONE_CONTAINER * GetArea(int index) const
Function GetArea returns the Area (Zone Container) at a given index.
Definition: class_board.h:982
Class SHAPE_LINE_CHAIN.
size_t i
Definition: json11.cpp:597
static bool GetLayer(MODEL_VRML &aModel, LAYER_NUM layer, VRML_LAYER **vlayer)
const VECTOR2I & CPoint(int aIndex) const
Function CPoint()
static void from_quat ( double  q[4],
double  rot[4] 
)
static

Definition at line 1341 of file export_vrml.cpp.

References i.

Referenced by export_vrml_module().

1342 {
1343  rot[3] = acos( q[3] ) * 2;
1344 
1345  for( int i = 0; i < 3; i++ )
1346  {
1347  rot[i] = q[i] / sin( rot[3] / 2 );
1348  }
1349 }
size_t i
Definition: json11.cpp:597
static bool GetLayer ( MODEL_VRML aModel,
LAYER_NUM  layer,
VRML_LAYER **  vlayer 
)
static

Definition at line 289 of file export_vrml.cpp.

References B_Cu, B_SilkS, create_vrml_plane(), create_vrml_shell(), F_Cu, F_SilkS, MODEL_VRML::m_bot_copper, MODEL_VRML::m_bot_silk, MODEL_VRML::m_top_copper, and MODEL_VRML::m_top_silk.

Referenced by BuildBoardPolygonOutlines(), export_vrml_arc(), export_vrml_circle(), export_vrml_drawsegment(), export_vrml_edge_module(), export_vrml_line(), export_vrml_zones(), GERBER_DRAW_ITEM::GetNetAttributes(), mpWindow::GetPopupMenu(), SCH_COLLECTOR::IsCorner(), MODULE::IsFlipped(), mpWindow::IsLayerVisible(), DRAWING_TOOL::PlaceDXF(), PCB_EDIT_FRAME::Process_Special_Functions(), GERBVIEW_SELECTION_TOOL::selectVisually(), mpWindow::SetLayerVisible(), MODULE::TransformGraphicShapesWithClearanceToPolygonSet(), and MODULE::TransformGraphicTextWithClearanceToPolygonSet().

290 {
291  switch( layer )
292  {
293  case B_Cu:
294  *vlayer = &aModel.m_bot_copper;
295  break;
296 
297  case F_Cu:
298  *vlayer = &aModel.m_top_copper;
299  break;
300 
301  case B_SilkS:
302  *vlayer = &aModel.m_bot_silk;
303  break;
304 
305  case F_SilkS:
306  *vlayer = &aModel.m_top_silk;
307  break;
308 
309  default:
310  return false;
311  }
312 
313  return true;
314 }
VRML_LAYER m_bot_silk
VRML_LAYER m_top_silk
VRML_LAYER m_bot_copper
VRML_LAYER m_top_copper
static SGNODE* getSGColor ( VRML_COLOR_INDEX  colorIdx)
static

Definition at line 1700 of file export_vrml.cpp.

References VRML_COLOR::ambient, VRML_COLOR::diffuse_blu, VRML_COLOR::diffuse_grn, VRML_COLOR::diffuse_red, IFSG_NODE::GetRawPtr(), IFSG_APPEARANCE::SetAmbient(), IFSG_APPEARANCE::SetDiffuse(), IFSG_APPEARANCE::SetShininess(), IFSG_APPEARANCE::SetSpecular(), IFSG_APPEARANCE::SetTransparency(), VRML_COLOR::shiny, VRML_COLOR::spec_blu, VRML_COLOR::spec_grn, VRML_COLOR::spec_red, VRML_COLOR::transp, VRML_COLOR_LAST, and VRML_COLOR_PCB.

Referenced by create_vrml_plane(), and create_vrml_shell().

1701 {
1702  if( colorIdx == -1 )
1703  colorIdx = VRML_COLOR_PCB;
1704  else if( colorIdx == VRML_COLOR_LAST )
1705  return NULL;
1706 
1707  if( sgmaterial[colorIdx] )
1708  return sgmaterial[colorIdx];
1709 
1710  IFSG_APPEARANCE vcolor( (SGNODE*) NULL );
1711  VRML_COLOR* cp = &colors[colorIdx];
1712 
1713  vcolor.SetSpecular( cp->spec_red, cp->spec_grn, cp->spec_blu );
1714  vcolor.SetDiffuse( cp->diffuse_red, cp->diffuse_grn, cp->diffuse_blu );
1715  vcolor.SetShininess( cp->shiny );
1716  // NOTE: XXX - replace with a better equation; using this definition
1717  // of ambient will not yield the best results
1718  vcolor.SetAmbient( cp->ambient, cp->ambient, cp->ambient );
1719  vcolor.SetTransparency( cp->transp );
1720 
1721  sgmaterial[colorIdx] = vcolor.GetRawPtr();
1722 
1723  return sgmaterial[colorIdx];
1724 }
float transp
Definition: export_vrml.cpp:89
static SGNODE * sgmaterial[VRML_COLOR_LAST]
Class SGNODE represents the base class of all Scene Graph nodes.
Definition: sg_node.h:76
float spec_blu
Definition: export_vrml.cpp:82
float ambient
Definition: export_vrml.cpp:88
float diffuse_grn
Definition: export_vrml.cpp:77
float spec_red
Definition: export_vrml.cpp:80
float spec_grn
Definition: export_vrml.cpp:81
float diffuse_red
Definition: export_vrml.cpp:76
float diffuse_blu
Definition: export_vrml.cpp:78
static VRML_COLOR colors[VRML_COLOR_LAST]
static void vrml_text_callback ( int  x0,
int  y0,
int  xf,
int  yf,
void *  aData 
)
static

Definition at line 754 of file export_vrml.cpp.

References BOARD_SCALE, export_vrml_line(), MODEL_VRML::m_text_layer, and MODEL_VRML::m_text_width.

Referenced by export_vrml_pcbtext(), and export_vrml_text_module().

755 {
756  LAYER_NUM m_text_layer = model_vrml->m_text_layer;
757  int m_text_width = model_vrml->m_text_width;
758 
759  export_vrml_line( *model_vrml, m_text_layer,
760  x0 * BOARD_SCALE, y0 * BOARD_SCALE,
761  xf * BOARD_SCALE, yf * BOARD_SCALE,
762  m_text_width * BOARD_SCALE );
763 }
static double BOARD_SCALE
Definition: export_vrml.cpp:69
static MODEL_VRML * model_vrml
int LAYER_NUM
Type LAYER_NUM can be replaced with int and removed.
LAYER_NUM m_text_layer
static void export_vrml_line(MODEL_VRML &aModel, LAYER_NUM layer, double startx, double starty, double endx, double endy, double width)
static void write_layers ( MODEL_VRML aModel,
BOARD aPcb,
const char *  aFileName,
OSTREAM aOutputFile 
)
static

Definition at line 422 of file export_vrml.cpp.

References ART_OFFSET, B_Cu, B_SilkS, BOARD_SCALE, create_vrml_plane(), create_vrml_shell(), F_Cu, F_SilkS, MODEL_VRML::GetColor(), MODEL_VRML::GetLayerZ(), IFSG_NODE::GetRawPtr(), MODEL_VRML::m_board, MODEL_VRML::m_bot_copper, MODEL_VRML::m_bot_silk, MODEL_VRML::m_bot_tin, MODEL_VRML::m_brd_thickness, MODEL_VRML::m_holes, MODEL_VRML::m_OutputPCB, MODEL_VRML::m_plainPCB, MODEL_VRML::m_plated_holes, MODEL_VRML::m_top_copper, MODEL_VRML::m_top_silk, MODEL_VRML::m_top_tin, USE_DEFS, USE_INLINES, VRML_COLOR_PCB, VRML_COLOR_SILK, VRML_COLOR_TIN, VRML_COLOR_TRACK, write_triangle_bag(), and S3D::WriteVRML().

Referenced by PCB_EDIT_FRAME::ExportVRML_File().

424 {
425  // VRML_LAYER board;
426  aModel.m_board.Tesselate( &aModel.m_holes );
427  double brdz = aModel.m_brd_thickness / 2.0
428  - ( Millimeter2iu( ART_OFFSET / 2.0 ) ) * BOARD_SCALE;
429 
430  if( USE_INLINES )
431  {
432  write_triangle_bag( *aOutputFile, aModel.GetColor( VRML_COLOR_PCB ),
433  &aModel.m_board, false, false, brdz, -brdz );
434  }
435  else
436  {
437  create_vrml_shell( aModel.m_OutputPCB, VRML_COLOR_PCB, &aModel.m_board, brdz, -brdz );
438  }
439 
440  if( aModel.m_plainPCB )
441  {
442  if( !USE_INLINES )
443  S3D::WriteVRML( aFileName, true, aModel.m_OutputPCB.GetRawPtr(), USE_DEFS, true );
444 
445  return;
446  }
447 
448  // VRML_LAYER m_top_copper;
449  aModel.m_top_copper.Tesselate( &aModel.m_holes );
450 
451  if( USE_INLINES )
452  {
453  write_triangle_bag( *aOutputFile, aModel.GetColor( VRML_COLOR_TRACK ),
454  &aModel.m_top_copper, true, true,
455  aModel.GetLayerZ( F_Cu ), 0 );
456  }
457  else
458  {
460  aModel.GetLayerZ( F_Cu ), true );
461  }
462 
463  // VRML_LAYER m_top_tin;
464  aModel.m_top_tin.Tesselate( &aModel.m_holes );
465 
466  if( USE_INLINES )
467  {
468  write_triangle_bag( *aOutputFile, aModel.GetColor( VRML_COLOR_TIN ),
469  &aModel.m_top_tin, true, true,
470  aModel.GetLayerZ( F_Cu ) + Millimeter2iu( ART_OFFSET / 2.0 ) * BOARD_SCALE,
471  0 );
472  }
473  else
474  {
476  aModel.GetLayerZ( F_Cu ) + Millimeter2iu( ART_OFFSET / 2.0 ) * BOARD_SCALE,
477  true );
478  }
479 
480  // VRML_LAYER m_bot_copper;
481  aModel.m_bot_copper.Tesselate( &aModel.m_holes );
482 
483  if( USE_INLINES )
484  {
485  write_triangle_bag( *aOutputFile, aModel.GetColor( VRML_COLOR_TRACK ),
486  &aModel.m_bot_copper, true, false,
487  aModel.GetLayerZ( B_Cu ), 0 );
488  }
489  else
490  {
492  aModel.GetLayerZ( B_Cu ), false );
493  }
494 
495  // VRML_LAYER m_bot_tin;
496  aModel.m_bot_tin.Tesselate( &aModel.m_holes );
497 
498  if( USE_INLINES )
499  {
500  write_triangle_bag( *aOutputFile, aModel.GetColor( VRML_COLOR_TIN ),
501  &aModel.m_bot_tin, true, false,
502  aModel.GetLayerZ( B_Cu )
503  - Millimeter2iu( ART_OFFSET / 2.0 ) * BOARD_SCALE,
504  0 );
505  }
506  else
507  {
509  aModel.GetLayerZ( B_Cu ) - Millimeter2iu( ART_OFFSET / 2.0 ) * BOARD_SCALE,
510  false );
511  }
512 
513  // VRML_LAYER PTH;
514  aModel.m_plated_holes.Tesselate( NULL, true );
515 
516  if( USE_INLINES )
517  {
518  write_triangle_bag( *aOutputFile, aModel.GetColor( VRML_COLOR_TIN ),
519  &aModel.m_plated_holes, false, false,
520  aModel.GetLayerZ( F_Cu ) + Millimeter2iu( ART_OFFSET / 2.0 ) * BOARD_SCALE,
521  aModel.GetLayerZ( B_Cu ) - Millimeter2iu( ART_OFFSET / 2.0 ) * BOARD_SCALE );
522  }
523  else
524  {
526  aModel.GetLayerZ( F_Cu ) + Millimeter2iu( ART_OFFSET / 2.0 ) * BOARD_SCALE,
527  aModel.GetLayerZ( B_Cu ) - Millimeter2iu( ART_OFFSET / 2.0 ) * BOARD_SCALE );
528  }
529 
530  // VRML_LAYER m_top_silk;
531  aModel.m_top_silk.Tesselate( &aModel.m_holes );
532 
533  if( USE_INLINES )
534  {
535  write_triangle_bag( *aOutputFile, aModel.GetColor( VRML_COLOR_SILK ), &aModel.m_top_silk,
536  true, true, aModel.GetLayerZ( F_SilkS ), 0 );
537  }
538  else
539  {
541  aModel.GetLayerZ( F_SilkS ), true );
542  }
543 
544  // VRML_LAYER m_bot_silk;
545  aModel.m_bot_silk.Tesselate( &aModel.m_holes );
546 
547  if( USE_INLINES )
548  {
549  write_triangle_bag( *aOutputFile, aModel.GetColor( VRML_COLOR_SILK ), &aModel.m_bot_silk,
550  true, false, aModel.GetLayerZ( B_SilkS ), 0 );
551  }
552  else
553  {
555  aModel.GetLayerZ( B_SilkS ), false );
556  }
557 
558  if( !USE_INLINES )
559  S3D::WriteVRML( aFileName, true, aModel.m_OutputPCB.GetRawPtr(), true, true );
560 }
static double BOARD_SCALE
Definition: export_vrml.cpp:69
SGNODE * GetRawPtr(void)
Function GetRawPtr() returns the raw internal SGNODE pointer.
Definition: ifsg_node.cpp:66
static bool USE_INLINES
Definition: export_vrml.cpp:65
VRML_LAYER m_bot_tin
VRML_LAYER m_plated_holes
VRML_LAYER m_holes
static void create_vrml_plane(IFSG_TRANSFORM &PcbOutput, VRML_COLOR_INDEX colorID, VRML_LAYER *layer, double aHeight, bool aTopPlane)
static void write_triangle_bag(std::ostream &aOut_file, VRML_COLOR &aColor, VRML_LAYER *aLayer, bool aPlane, bool aTop, double aTop_z, double aBottom_z)
IFSG_TRANSFORM m_OutputPCB
SGLIB_API bool WriteVRML(const char *filename, bool overwrite, SGNODE *aTopNode, bool reuse, bool renameNodes)
Function WriteVRML writes out the given node and its subnodes to a VRML2 file.
Definition: ifsg_api.cpp:81
VRML_LAYER m_bot_silk
VRML_LAYER m_top_silk
VRML_LAYER m_board
VRML_LAYER m_bot_copper
static void create_vrml_shell(IFSG_TRANSFORM &PcbOutput, VRML_COLOR_INDEX colorID, VRML_LAYER *layer, double top_z, double bottom_z)
double m_brd_thickness
static bool USE_DEFS
Definition: export_vrml.cpp:66
VRML_LAYER m_top_copper
VRML_LAYER m_top_tin
VRML_COLOR & GetColor(VRML_COLOR_INDEX aIndex)
double GetLayerZ(LAYER_NUM aLayer)
#define ART_OFFSET
Definition: export_vrml.cpp:60
static void write_triangle_bag ( std::ostream &  aOut_file,
VRML_COLOR aColor,
VRML_LAYER *  aLayer,
bool  aPlane,
bool  aTop,
double  aTop_z,
double  aBottom_z 
)
static

Definition at line 322 of file export_vrml.cpp.

References VRML_COLOR::ambient, VRML_COLOR::diffuse_blu, VRML_COLOR::diffuse_grn, VRML_COLOR::diffuse_red, VRML_COLOR::emit_blu, VRML_COLOR::emit_grn, VRML_COLOR::emit_red, PRECISION, VRML_COLOR::shiny, VRML_COLOR::spec_blu, VRML_COLOR::spec_grn, VRML_COLOR::spec_red, and VRML_COLOR::transp.

Referenced by write_layers().

325 {
326  /* A lot of nodes are not required, but blender sometimes chokes
327  * without them */
328  static const char* shape_boiler[] =
329  {
330  "Transform {\n",
331  " children [\n",
332  " Group {\n",
333  " children [\n",
334  " Shape {\n",
335  " appearance Appearance {\n",
336  " material Material {\n",
337  0, // Material marker
338  " }\n",
339  " }\n",
340  " geometry IndexedFaceSet {\n",
341  " solid TRUE\n",
342  " coord Coordinate {\n",
343  " point [\n",
344  0, // Coordinates marker
345  " ]\n",
346  " }\n",
347  " coordIndex [\n",
348  0, // Index marker
349  " ]\n",
350  " }\n",
351  " }\n",
352  " ]\n",
353  " }\n",
354  " ]\n",
355  "}\n",
356  0 // End marker
357  };
358 
359  int marker_found = 0, lineno = 0;
360 
361  while( marker_found < 4 )
362  {
363  if( shape_boiler[lineno] )
364  aOut_file << shape_boiler[lineno];
365  else
366  {
367  marker_found++;
368 
369  switch( marker_found )
370  {
371  case 1: // Material marker
372  aOut_file << " diffuseColor " << std::setprecision(3);
373  aOut_file << aColor.diffuse_red << " ";
374  aOut_file << aColor.diffuse_grn << " ";
375  aOut_file << aColor.diffuse_blu << "\n";
376 
377  aOut_file << " specularColor ";
378  aOut_file << aColor.spec_red << " ";
379  aOut_file << aColor.spec_grn << " ";
380  aOut_file << aColor.spec_blu << "\n";
381 
382  aOut_file << " emissiveColor ";
383  aOut_file << aColor.emit_red << " ";
384  aOut_file << aColor.emit_grn << " ";
385  aOut_file << aColor.emit_blu << "\n";
386 
387  aOut_file << " ambientIntensity " << aColor.ambient << "\n";
388  aOut_file << " transparency " << aColor.transp << "\n";
389  aOut_file << " shininess " << aColor.shiny << "\n";
390  break;
391 
392  case 2:
393 
394  if( aPlane )
395  aLayer->WriteVertices( aTop_z, aOut_file, PRECISION );
396  else
397  aLayer->Write3DVertices( aTop_z, aBottom_z, aOut_file, PRECISION );
398 
399  aOut_file << "\n";
400  break;
401 
402  case 3:
403 
404  if( aPlane )
405  aLayer->WriteIndices( aTop, aOut_file );
406  else
407  aLayer->Write3DIndices( aOut_file );
408 
409  aOut_file << "\n";
410  break;
411 
412  default:
413  break;
414  }
415  }
416 
417  lineno++;
418  }
419 }
float transp
Definition: export_vrml.cpp:89
float spec_blu
Definition: export_vrml.cpp:82
float ambient
Definition: export_vrml.cpp:88
float diffuse_grn
Definition: export_vrml.cpp:77
float spec_red
Definition: export_vrml.cpp:80
float spec_grn
Definition: export_vrml.cpp:81
float emit_grn
Definition: export_vrml.cpp:85
float emit_blu
Definition: export_vrml.cpp:86
float diffuse_red
Definition: export_vrml.cpp:76
static const int PRECISION
Definition: export_vrml.cpp:70
float emit_red
Definition: export_vrml.cpp:84
float diffuse_blu
Definition: export_vrml.cpp:78

Variable Documentation

MODEL_VRML* model_vrml
static

Definition at line 284 of file export_vrml.cpp.

const int PRECISION = 6
static
wxString PROJ_DIR
static

Definition at line 72 of file export_vrml.cpp.

Referenced by PCB_EDIT_FRAME::ExportVRML_File().

SGNODE* sgmaterial[VRML_COLOR_LAST] = { NULL }
static

Definition at line 142 of file export_vrml.cpp.

wxString SUBDIR_3D
static

Definition at line 71 of file export_vrml.cpp.

Referenced by export_vrml_module(), and PCB_EDIT_FRAME::ExportVRML_File().

bool USE_DEFS
static
bool USE_INLINES
static
bool USE_RELPATH
static

Definition at line 67 of file export_vrml.cpp.

Referenced by export_vrml_module(), and PCB_EDIT_FRAME::ExportVRML_File().

double WORLD_SCALE = 1.0
static

Definition at line 68 of file export_vrml.cpp.

Referenced by PCB_EDIT_FRAME::ExportVRML_File(), and MODEL_VRML::SetScale().