29#include <wx/wfstream.h>
30#include <wx/zstream.h>
46#include "vrml_layer.h"
62 const wxString& aFullFileName,
double aMMtoWRMLunit,
63 bool aIncludeUnspecified,
bool aIncludeDNP,
64 bool aExport3DFiles,
bool aUseRelativePaths,
65 const wxString& a3D_Subdir,
66 double aXRef,
double aYRef )
68 return pcb_exporter->ExportVRML_File( aProject, aMessages,
69 aFullFileName, aMMtoWRMLunit,
70 aIncludeUnspecified, aIncludeDNP,
71 aExport3DFiles, aUseRelativePaths,
72 a3D_Subdir, aXRef, aYRef );
83#define ERR_APPROX_MAX_MM 0.005
130 COLOR4D boardBody( 0, 0, 0, 0 );
138 if( aColorName.StartsWith( wxT(
"#" ) ) )
146 if(
color.m_ColorName == aColorName )
147 return color.m_Color;
156 wxString colorName = stackupItem->GetColor();
158 switch( stackupItem->GetType() )
161 if( stackupItem->GetBrdLayerId() ==
F_SilkS )
168 if( stackupItem->GetBrdLayerId() ==
F_Mask )
179 if( boardBody ==
COLOR4D( 0, 0, 0, 0 ) )
180 boardBody = layerColor;
182 boardBody = boardBody.
Mix( layerColor, 1.0 - layerColor.
a );
184 boardBody.
a += ( 1.0 - boardBody.
a ) * layerColor.
a / 2;
193 if( boardBody ==
COLOR4D( 0, 0, 0, 0 ) )
198 if( finishName.EndsWith( wxT(
"OSP" ) ) )
202 else if( finishName.EndsWith( wxT(
"IG" ) )
203 || finishName.EndsWith( wxT(
"gold" ) ) )
207 else if( finishName.StartsWith( wxT(
"HAL" ) )
208 || finishName.StartsWith( wxT(
"HASL" ) )
209 || finishName.EndsWith( wxT(
"tin" ) )
210 || finishName.EndsWith( wxT(
"nickel" ) ) )
214 else if( finishName.EndsWith( wxT(
"silver" ) ) )
220 [](
const COLOR4D& aColor,
double aSpecular,
double aAmbient,
double aShiny )
226 spec.
r, spec.
g, spec.
b,
227 aAmbient, 1.0 - aColor.
a, aShiny );
275#define ADD_COLOR( list, r, g, b, a, name ) \
276 list.emplace_back( r/255.0, g/255.0, b/255.0, a, name )
337 if( aWorldScale < 0.001 || aWorldScale > 10.0 )
338 throw( std::runtime_error(
"WorldScale out of range (valid range is 0.001 to 10.0)" ) );
352 m_holes.SetVertexOffsets( aXoff, aYoff );
380 default:
return false;
393 for(
int lcnt = 0; lcnt < 2; lcnt++ )
398 m_board->ConvertBrdLayerToPolygonalContours( pcb_layer, holes );
419 VRML_LAYER* vrmllayer[] =
425 for(
int lcnt = 0; ; lcnt++ )
427 if( vrmllayer[lcnt] ==
nullptr )
431 m_board->ConvertBrdLayerToPolygonalContours( pcb_layer[lcnt], outlines );
441 VRML_LAYER* aLayer,
bool aPlane,
bool aTop,
442 double aTop_z,
double aBottom_z )
445 static const char* shape_boiler[] =
452 " appearance Appearance {\n",
453 " material Material {\n",
457 " geometry IndexedFaceSet {\n",
459 " coord Coordinate {\n",
476 int marker_found = 0, lineno = 0;
478 while( marker_found < 4 )
480 if( shape_boiler[lineno] )
482 aOut_file << shape_boiler[lineno];
488 switch( marker_found )
492 std::streamsize lastPrecision = aOut_file.precision();
493 aOut_file <<
" diffuseColor " << std::setprecision(3);
498 aOut_file <<
" specularColor ";
499 aOut_file << aColor.
spec_red <<
" ";
500 aOut_file << aColor.
spec_grn <<
" ";
501 aOut_file << aColor.
spec_blu <<
"\n";
503 aOut_file <<
" emissiveColor ";
504 aOut_file << aColor.
emit_red <<
" ";
505 aOut_file << aColor.
emit_grn <<
" ";
506 aOut_file << aColor.
emit_blu <<
"\n";
508 aOut_file <<
" ambientIntensity " << aColor.
ambient <<
"\n";
509 aOut_file <<
" transparency " << aColor.
transp <<
"\n";
510 aOut_file <<
" shininess " << aColor.
shiny <<
"\n";
511 aOut_file.precision( lastPrecision );
518 aLayer->WriteVertices( aTop_z, aOut_file,
m_precision );
520 aLayer->Write3DVertices( aTop_z, aBottom_z, aOut_file,
m_precision );
528 aLayer->WriteIndices( aTop, aOut_file );
530 aLayer->Write3DIndices( aOut_file );
722 int copper_layers =
m_board->GetCopperLayerCount();
729 int orderFromTop = 0;
759 for(
int icnt = 0; icnt < aOutlines.
OutlineCount(); icnt++ )
763 int seg = aVlayer->NewContour();
765 for(
int jj = 0; jj < outline.
PointCount(); jj++ )
769 throw( std::runtime_error( aVlayer->GetError() ) );
772 aVlayer->EnsureWinding( seg,
false );
781 wxLogWarning(
_(
"Board outline is malformed. Run DRC for a full analysis." ) );
786 for(
int cnt = 0; cnt <
m_pcbOutlines.OutlineCount(); cnt++ )
792 for(
int j = 0; j < outline.
PointCount(); j++ )
810 wxLogError(
_(
"VRML Export Failed: Could not add holes to contours." ) );
820 m_holes.EnsureWinding( seg,
true );
838 via->LayerPair( &top_layer, &bottom_layer );
841 if( top_layer !=
F_Cu && bottom_layer !=
B_Cu )
847 if( hole_radius <= 0 )
864 double minSegLength =
M_PI * 2.0 * hole_radius / nsides;
865 double maxSegLength = minSegLength*2.0;
867 m_holes.SetArcParams( nsides*2, minSegLength, maxSegLength );
868 m_plated_holes.SetArcParams( nsides*2, minSegLength, maxSegLength );
870 m_holes.AddCircle( x, -y, hole_radius,
true,
true );
883 double hole_drill = std::min( hole_drill_w, hole_drill_h );
897 double minSegLength =
M_PI * hole_drill / nsides;
898 double maxSegLength = minSegLength*2.0;
900 m_holes.SetArcParams( nsides*2, minSegLength, maxSegLength );
901 m_plated_holes.SetArcParams( nsides*2, minSegLength, maxSegLength );
919 hole_drill_w * 2.0, hole_drill_h * 2.0,
924 m_holes.AddSlot( hole_x, -hole_y, hole_drill_w * 2.0, hole_drill_h * 2.0,
935 m_plated_holes.AddCircle( hole_x, -hole_y, hole_drill,
true,
false );
939 m_holes.AddCircle( hole_x, -hole_y, hole_drill,
true,
false );
951static void build_quat(
double x,
double y,
double z,
double a,
double q[4] )
953 double sina = sin( a / 2 );
965 rot[3] = acos( q[3] ) * 2;
967 for(
int i = 0; i < 3; i++ )
968 rot[i] = q[i] / sin( rot[3] / 2 );
977 tmp[0] = q2[3] * q1[0] + q2[0] * q1[3] + q2[1] * q1[2] - q2[2] * q1[1];
978 tmp[1] = q2[3] * q1[1] + q2[1] * q1[3] + q2[2] * q1[0] - q2[0] * q1[2];
979 tmp[2] = q2[3] * q1[2] + q2[2] * q1[3] + q2[0] * q1[1] - q2[1] * q1[0];
980 tmp[3] = q2[3] * q1[3] - q2[0] * q1[0] - q2[1] * q1[1] - q2[2] * q1[2];
996 wxCHECK( aFootprint, );
999 wxString footprintBasePath = wxEmptyString;
1015 footprintBasePath = fpRow->
GetFullURI(
true );
1032 std::vector<const EMBEDDED_FILES*> embeddedFilesStack;
1036 auto sM = aFootprint->
Models().begin();
1037 auto eM = aFootprint->
Models().end();
1048 embeddedFilesStack.clear();
1050 embeddedFilesStack.push_back(
m_board->GetEmbeddedFiles() );
1053 std::move( embeddedFilesStack ) );
1060 double rotx = -sM->m_Rotation.x;
1061 double roty = -sM->m_Rotation.y;
1062 double rotz = -sM->m_Rotation.z;
1072 double q1[4], q2[4], rot[4];
1085 double offsetFactor = 1000.0f *
pcbIUScale.IU_PER_MILS / 25.4f;
1089 double offsetx = sM->m_Offset.x * offsetFactor;
1090 double offsety = sM->m_Offset.y * offsetFactor;
1091 double offsetz = sM->m_Offset.z * offsetFactor;
1107 wxCHECK( aOutputFile, );
1109 int old_precision = aOutputFile->precision();
1112 embeddedFilesStack.clear();
1114 embeddedFilesStack.push_back(
m_board->GetEmbeddedFiles() );
1116 wxFileName srcFile =
m_Cache3Dmodels->GetResolver()->ResolvePath( sM->m_Filename, footprintBasePath,
1117 std::move( embeddedFilesStack ) );
1118 if( !srcFile.FileExists() ) {
1126 dstFile.SetName( srcFile.GetName() );
1127 dstFile.SetExt( wxT(
"wrl" ) );
1130 wxDateTime srcModTime = srcFile.GetModificationTime();
1131 wxDateTime destModTime = wxDateTime();
1133 if( dstFile.FileExists() )
1134 destModTime = dstFile.GetModificationTime();
1136 if( srcModTime != destModTime )
1138 wxString fileExt = srcFile.GetExt();
1139 fileExt.LowerCase();
1143 if( fileExt == wxT(
"wrl" ) )
1145 if( !wxCopyFile( srcFile.GetFullPath(), dstFile.GetFullPath() ) )
1151 else if( fileExt == wxT(
"wrz" ) )
1153 wxFileInputStream input_file_stream( srcFile.GetFullPath() );
1154 if( !input_file_stream.IsOk() || input_file_stream.GetSize() == wxInvalidSize )
1160 wxZlibInputStream zlib_input_stream( input_file_stream, wxZLIB_GZIP );
1161 wxFFileOutputStream output_file_stream( dstFile.GetFullPath() );
1162 if( !zlib_input_stream.IsOk() || !output_file_stream.IsOk() )
1164 output_file_stream.Close();
1169 output_file_stream.Write( zlib_input_stream );
1170 output_file_stream.Close();
1175 if( (
nullptr == mod3d) ||
1185 (*aOutputFile) <<
"Transform {\n";
1188 if(
std::abs( rot[3] ) > 0.0001745 )
1190 (*aOutputFile) <<
" rotation ";
1191 (*aOutputFile) << rot[0] <<
" " << rot[1] <<
" " << rot[2] <<
" " << rot[3] <<
"\n";
1194 (*aOutputFile) <<
" translation ";
1195 (*aOutputFile) << trans.
x <<
" ";
1196 (*aOutputFile) << trans.
y <<
" ";
1197 (*aOutputFile) << trans.
z <<
"\n";
1199 (*aOutputFile) <<
" scale ";
1200 (*aOutputFile) << sM->m_Scale.x <<
" ";
1201 (*aOutputFile) << sM->m_Scale.y <<
" ";
1202 (*aOutputFile) << sM->m_Scale.z <<
"\n";
1204 (*aOutputFile) <<
" children [\n Inline {\n url \"";
1208 wxFileName tmp = dstFile;
1209 tmp.SetExt( wxT(
"" ) );
1210 tmp.SetName( wxT(
"" ) );
1211 tmp.RemoveLastDir();
1212 dstFile.MakeRelativeTo( tmp.GetPath() );
1215 wxString fn = dstFile.GetFullPath();
1216 fn.Replace( wxT(
"\\" ), wxT(
"/" ) );
1217 (*aOutputFile) <<
TO_UTF8( fn ) <<
"\"\n } ]\n";
1218 (*aOutputFile) <<
" }\n";
1220 aOutputFile->precision( old_precision );
1224 if(
nullptr == mod3d )
1233 if(
std::abs( rot[3] ) > 0.0001745 )
1237 modelShape->
SetScale(
SGPOINT( sM->m_Scale.x, sM->m_Scale.y, sM->m_Scale.z ) );
1258 const wxString& aFullFileName,
double aMMtoWRMLunit,
1259 bool aIncludeUnspecified,
bool aIncludeDNP,
1260 bool aExport3DFiles,
bool aUseRelativePaths,
1261 const wxString& a3D_Subdir,
1262 double aXRef,
double aYRef )
1264 if( aProject ==
nullptr )
1267 *aMessages =
_(
"No project when exporting the VRML file");
1275 wxFileName subdir( a3D_Subdir, wxT(
"" ) );
1277 m_Subdir3DFpModels = subdir.GetAbsolutePath( wxFileName( aFullFileName ).GetPath() );
1291 SetOffset( -aXRef / 2.54, aYRef / 2.54 );
1299 bool success =
true;
1330 catch(
const std::exception& e )
1333 *aMessages <<
_(
"VRML Export Failed:\n" ) <<
From_UTF8( e.what() );
1342 bool aIncludeUnspecified,
bool aIncludeDNP,
1343 bool aExport3DFiles,
bool aUseRelativePaths,
1344 const wxString& a3D_Subdir,
1345 double aXRef,
double aYRef )
1352 aIncludeUnspecified, aIncludeDNP,
1353 aExport3DFiles, aUseRelativePaths,
1354 a3D_Subdir, aXRef, aYRef );
1356 if( !msgs.IsEmpty() )
1357 wxMessageBox( msgs );
1369 throw( std::runtime_error(
"Could not create 3D model subdirectory" ) );
1374 if( output_file.fail() )
1376 std::ostringstream ostr;
1377 ostr <<
"Could not open file '" <<
TO_UTF8( aFullFileName ) <<
"'";
1378 throw( std::runtime_error( ostr.str().c_str() ) );
1381 output_file.imbue( std::locale::classic() );
1384 wxString fn = aFullFileName;
1385 fn.Replace( wxT(
"\\" ) , wxT(
"/" ) );
1386 output_file <<
"#VRML V2.0 utf8\n";
1387 output_file <<
"WorldInfo {\n";
1388 output_file <<
" title \"" <<
TO_UTF8( fn ) <<
" - Generated by Pcbnew\"\n";
1389 output_file <<
"}\n";
1390 output_file <<
"Transform {\n";
1391 output_file <<
" scale " << std::setprecision(
m_precision );
1395 output_file <<
" children [\n";
1405 output_file <<
"]\n}\n";
1412 if( colorIdx == -1 )
1438 VRML_LAYER* layer,
double top_z,
bool aTopPlane )
1440 std::vector< double > vertices;
1441 std::vector< int > idxPlane;
1443 if( !( *layer ).Get2DTriangles( vertices, idxPlane, top_z, aTopPlane ) )
1448 if( ( idxPlane.size() % 3 ) )
1450 throw( std::runtime_error(
"[BUG] index lists are not a multiple of 3 (not a triangle "
1454 std::vector< SGPOINT > vlist;
1455 size_t nvert = vertices.size() / 3;
1458 for(
size_t i = 0; i < nvert; ++i, j+= 3 )
1459 vlist.emplace_back( vertices[j], vertices[j+1], vertices[j+2] );
1468 coordIdx.
SetIndices( idxPlane.size(), &idxPlane[0] );
1474 for(
size_t i = 0; i < nvert; ++i )
1479 for(
size_t i = 0; i < nvert; ++i )
1486 if(
nullptr != modelColor )
1497 VRML_LAYER* layer,
double top_z,
double bottom_z )
1499 std::vector< double > vertices;
1500 std::vector< int > idxPlane;
1501 std::vector< int > idxSide;
1503 if( top_z < bottom_z )
1510 if( !( *layer ).Get3DTriangles( vertices, idxPlane, idxSide, top_z, bottom_z )
1511 || idxPlane.empty() || idxSide.empty() )
1516 if( ( idxPlane.size() % 3 ) || ( idxSide.size() % 3 ) )
1518 throw( std::runtime_error(
"[BUG] index lists are not a multiple of 3 (not a "
1519 "triangle list)" ) );
1522 std::vector< SGPOINT > vlist;
1523 size_t nvert = vertices.size() / 3;
1526 for(
size_t i = 0; i < nvert; ++i, j+= 3 )
1527 vlist.emplace_back( vertices[j], vertices[j+1], vertices[j+2] );
1536 coordIdx.
SetIndices( idxPlane.size(), &idxPlane[0] );
1543 for(
size_t i = 0; i < j; ++i )
1547 for(
size_t i = 0; i < j; ++i )
1553 if(
nullptr != modelColor )
1571 std::vector< int >::iterator sI = idxSide.begin();
1572 std::vector< int >::iterator eI = idxSide.end();
defines the basic data associated with a single 3D model.
constexpr EDA_IU_SCALE pcbIUScale
#define ADD_COLOR(list, r, g, b, a, name)
static bool g_ColorsLoaded
@ BS_ITEM_TYPE_SILKSCREEN
@ BS_ITEM_TYPE_DIELECTRIC
@ BS_ITEM_TYPE_SOLDERMASK
Manage one layer needed to make a physical board.
Manage layers needed to make a physical board.
const std::vector< BOARD_STACKUP_ITEM * > & GetList() const
wxString m_FinishType
The name of external copper finish.
Information pertinent to a Pcbnew printed circuit board.
VRML_COLOR & GetColor(VRML_COLOR_INDEX aIndex)
static CUSTOM_COLORS_LIST m_MaskColors
SGNODE * m_sgmaterial[VRML_COLOR_LAST]
static CUSTOM_COLORS_LIST m_PasteColors
static KIGFX::COLOR4D m_DefaultSolderPaste
VRML_LAYER m_top_soldermask
bool GetLayer3D(int layer, VRML_LAYER **vlayer)
bool SetScale(double aWorldScale)
SGNODE * getSGColor(VRML_COLOR_INDEX colorIdx)
void ComputeLayer3D_Zpos()
EXPORTER_PCB_VRML(BOARD *aBoard)
SHAPE_POLY_SET m_pcbOutlines
VRML_LAYER m_plated_holes
void SetLayerZ(int aLayer, double aValue)
void ExportVrmlPolygonSet(VRML_LAYER *aVlayer, const SHAPE_POLY_SET &aOutlines)
void create_vrml_shell(IFSG_TRANSFORM &PcbOutput, VRML_COLOR_INDEX colorID, VRML_LAYER *layer, double top_z, double bottom_z)
void write_triangle_bag(std::ostream &aOut_file, const VRML_COLOR &aColor, VRML_LAYER *aLayer, bool aPlane, bool aTop, double aTop_z, double aBottom_z)
bool m_includeUnspecified
void initStaticColorList()
std::list< SGNODE * > m_components
static KIGFX::COLOR4D m_DefaultSilkscreen
static CUSTOM_COLORS_LIST m_SilkscreenColors
void SetOffset(double aXoff, double aYoff)
double GetLayerZ(int aLayer)
bool ExportVRML_File(PROJECT *aProject, wxString *aMessages, const wxString &aFullFileName, double aMMtoWRMLunit, bool aIncludeUnspecified, bool aIncludeDNP, bool aExport3DFiles, bool aUseRelativePaths, const wxString &a3D_Subdir, double aXRef, double aYRef)
Export a VRML file image of the board.
void ExportVrmlPadHole(PAD *aPad)
static CUSTOM_COLORS_LIST m_BoardColors
void create_vrml_plane(IFSG_TRANSFORM &PcbOutput, VRML_COLOR_INDEX colorID, VRML_LAYER *layer, double aHeight, bool aTopPlane)
bool m_UseInlineModelsInBrdfile
wxString m_Subdir3DFpModels
static KIGFX::COLOR4D m_DefaultBoardBody
static CUSTOM_COLORS_LIST m_FinishColors
static KIGFX::COLOR4D m_DefaultSolderMask
bool m_UseRelPathIn3DModelFilename
void ExportVrmlFootprint(FOOTPRINT *aFootprint, std::ostream *aOutputFile)
void ExportFp3DModelsAsLinkedFile(const wxString &aFullFileName)
VRML_LAYER m_bot_soldermask
VRML_COLOR vrml_colors_list[VRML_COLOR_LAST]
void ExportVrmlSolderMask()
void writeLayers(const char *aFileName, OSTREAM *aOutputFile)
void ExportStandardLayers()
static KIGFX::COLOR4D m_DefaultSurfaceFinish
double m_BoardToVrmlScale
IFSG_TRANSFORM m_OutputPCB
void ExportVrmlViaHoles()
S3D_CACHE * m_Cache3Dmodels
Wrapper to expose an API for writing VRML files, without exposing all the many structures used in the...
EXPORTER_VRML(BOARD *aBoard)
EXPORTER_PCB_VRML * pcb_exporter
bool ExportVRML_File(PROJECT *aProject, wxString *aMessages, const wxString &aFullFileName, double aMMtoWRMLunit, bool aIncludeUnspecified, bool aIncludeDNP, bool aExport3DFiles, bool aUseRelativePaths, const wxString &a3D_Subdir, double aXRef, double aYRef)
Exports the board and its footprint shapes 3D (vrml files only) as a vrml file.
Hold a record identifying a library accessed by the appropriate footprint library #PLUGIN object in t...
const FP_LIB_TABLE_ROW * FindRow(const wxString &aNickName, bool aCheckIfEnabled=false)
Return an FP_LIB_TABLE_ROW if aNickName is found in this table or in any chained fall back table frag...
bool SetDiffuse(float aRVal, float aGVal, float aBVal)
bool SetSpecular(float aRVal, float aGVal, float aBVal)
bool SetShininess(float aShininess) noexcept
bool SetAmbient(float aRVal, float aGVal, float aBVal)
bool SetTransparency(float aTransparency) noexcept
The wrapper for SGCOORDINDEX.
bool NewNode(SGNODE *aParent) override
Create a new node to associate with this wrapper.
The wrapper for SGCOORDS.
bool NewNode(SGNODE *aParent) override
Create a new node to associate with this wrapper.
bool SetCoordsList(size_t aListSize, const SGPOINT *aCoordsList)
bool AddCoord(double aXValue, double aYValue, double aZValue)
The wrapper for the SGFACESET class.
bool NewNode(SGNODE *aParent) override
Create a new node to associate with this wrapper.
bool AddIndex(int aIndex)
Add a single index to the list.
bool SetIndices(size_t nIndices, int *aIndexList)
Set the number of indices and creates a copy of the given index data.
bool SetParent(SGNODE *aParent)
Set the parent SGNODE of this object.
SGNODE * GetRawPtr(void) noexcept
Return the raw internal SGNODE pointer.
bool AddChildNode(SGNODE *aNode)
Add a node as a child owned by this node.
bool AddRefNode(SGNODE *aNode)
Add a reference to an existing node which is not owned by (not a child of) this node.
The wrapper for the SGNORMALS class.
bool NewNode(SGNODE *aParent) override
Create a new node to associate with this wrapper.
bool AddNormal(double aXValue, double aYValue, double aZValue)
The wrapper for the SGSHAPE class.
bool NewNode(SGNODE *aParent) override
Create a new node to associate with this wrapper.
A color representation with 4 components: red, green, blue, alpha.
COLOR4D Brightened(double aFactor) const
Return a color that is brighter by a given factor, without modifying object.
COLOR4D Mix(const COLOR4D &aColor, double aFactor) const
Return a color that is mixed with the input by a factor.
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
const wxString GetFullURI(bool aSubstituted=false) const
Return the full location specifying URI for the LIB, either in original UI form or in environment var...
static LSET AllCuMask(int aCuLayerCount)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
const VECTOR2I & GetDrillSize() const
PAD_ATTRIB GetAttribute() const
VECTOR2I GetPosition() const override
EDA_ANGLE GetOrientation() const
Return the rotation angle of the pad.
PAD_DRILL_SHAPE GetDrillShape() const
bool ExportVRML_File(const wxString &aFullFileName, double aMMtoWRMLunit, bool aIncludeUnspecified, bool aIncludeDNP, bool aExport3DFiles, bool aUseRelativePaths, const wxString &a3D_Subdir, double aXRef, double aYRef)
Create the file(s) exporting current BOARD to a VRML file.
static FP_LIB_TABLE * PcbFootprintLibs(PROJECT *aProject)
Return the table of footprint libraries without Kiway.
static S3D_CACHE * Get3DCacheManager(PROJECT *aProject, bool updateProjDir=false)
Return a pointer to an instance of the 3D cache manager.
Container for project specific data.
The base class of all Scene Graph nodes.
void SetVector(double aXVal, double aYVal, double aZVal)
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
int PointCount() const
Return the number of points (vertices) in this line chain.
const VECTOR2I & CPoint(int aIndex) const
Return a reference to a given point in the line chain.
Represent a set of closed polygons.
void RemoveAllContours()
Remove all outlines & holes (clears) the polygon set.
void Fracture()
Convert a set of polygons with holes to a single outline with "slits"/"fractures" connecting the oute...
void BooleanIntersection(const SHAPE_POLY_SET &b)
Perform boolean polyset intersection.
int OutlineCount() const
Return the number of outlines in the set.
void BooleanSubtract(const SHAPE_POLY_SET &b)
Perform boolean polyset difference.
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
std::vector< CUSTOM_COLOR_ITEM > CUSTOM_COLORS_LIST
static constexpr EDA_ANGLE FULL_CIRCLE
static void build_quat(double x, double y, double z, double a, double q[4])
static void compose_quat(double q1[4], double q2[4], double qr[4])
static void from_quat(double q[4], double rot[4])
#define ERR_APPROX_MAX_MM
@ VRML_COLOR_TOP_SOLDMASK
@ VRML_COLOR_BOT_SOLDMASK
a few functions useful in geometry calculations.
int GetArcToSegmentCount(int aRadius, int aErrorMax, const EDA_ANGLE &aArcAngle)
collects header files for all SG* wrappers and the API
PCB_LAYER_ID
A quick note on layer IDs:
This file contains miscellaneous commonly used macros and functions.
SGLIB_API bool WriteVRML(const char *filename, bool overwrite, SGNODE *aTopNode, bool reuse, bool renameNodes)
Write out the given node and its subnodes to a VRML2 file.
SGLIB_API SGNODE * GetSGNodeParent(SGNODE *aNode)
SGLIB_API SGVECTOR CalcTriNorm(const SGPOINT &p1, const SGPOINT &p2, const SGPOINT &p3)
Return the normal vector of a triangle described by vertices p1, p2, p3.
SGLIB_API void DestroyNode(SGNODE *aNode) noexcept
Delete the given SG* class node.
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
@ NPTH
like PAD_PTH, but not plated mechanical use only, no connection allowed
#define OPEN_OSTREAM(var, name)
#define CLOSE_STREAM(var)
wxString From_UTF8(const char *cstring)
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
A class to handle a custom color (predefined color) for the color picker dialog.
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.
double DEG2RAD(double deg)
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)