44#include "vrml_layer.h"
60 const wxString& aFullFileName,
double aMMtoWRMLunit,
61 bool aExport3DFiles,
bool aUseRelativePaths,
62 const wxString& a3D_Subdir,
63 double aXRef,
double aYRef )
66 aFullFileName, aMMtoWRMLunit,
67 aExport3DFiles, aUseRelativePaths,
68 a3D_Subdir, aXRef, aYRef );
79#define ERR_APPROX_MAX_MM 0.005
98 m_OutputPCB( nullptr )
127 COLOR4D boardBody( 0, 0, 0, 0 );
134 if( aColorName.StartsWith( wxT(
"#" ) ) )
142 if(
color.m_ColorName == aColorName )
143 return color.m_Color;
152 wxString colorName = stackupItem->GetColor();
154 switch( stackupItem->GetType() )
157 if( stackupItem->GetBrdLayerId() ==
F_SilkS )
164 if( stackupItem->GetBrdLayerId() ==
F_Mask )
175 if( boardBody ==
COLOR4D( 0, 0, 0, 0 ) )
176 boardBody = layerColor;
178 boardBody = boardBody.
Mix( layerColor, 1.0 - layerColor.
a );
180 boardBody.
a += ( 1.0 - boardBody.
a ) * layerColor.
a / 2;
189 if( boardBody ==
COLOR4D( 0, 0, 0, 0 ) )
194 if( finishName.EndsWith( wxT(
"OSP" ) ) )
198 else if( finishName.EndsWith( wxT(
"IG" ) )
199 || finishName.EndsWith( wxT(
"gold" ) ) )
203 else if( finishName.StartsWith( wxT(
"HAL" ) )
204 || finishName.StartsWith( wxT(
"HASL" ) )
205 || finishName.EndsWith( wxT(
"tin" ) )
206 || finishName.EndsWith( wxT(
"nickel" ) ) )
210 else if( finishName.EndsWith( wxT(
"silver" ) ) )
216 [](
const COLOR4D& aColor,
double aSpecular,
double aAmbient,
double aShiny )
222 spec.
r, spec.
g, spec.
b,
223 aAmbient, 1.0 - aColor.
a, aShiny );
271#define ADD_COLOR( list, r, g, b, a, name ) \
272 list.emplace_back( r/255.0, g/255.0, b/255.0, a, name )
333 if( aWorldScale < 0.001 || aWorldScale > 10.0 )
334 throw( std::runtime_error(
"WorldScale out of range (valid range is 0.001 to 10.0)" ) );
348 m_holes.SetVertexOffsets( aXoff, aYoff );
376 default:
return false;
389 for(
int lcnt = 0; lcnt < 2; lcnt++ )
415 VRML_LAYER* vrmllayer[] =
421 for(
int lcnt = 0; ; lcnt++ )
423 if( vrmllayer[lcnt] ==
nullptr )
436 VRML_LAYER* aLayer,
bool aPlane,
bool aTop,
437 double aTop_z,
double aBottom_z )
440 static const char* shape_boiler[] =
447 " appearance Appearance {\n",
448 " material Material {\n",
452 " geometry IndexedFaceSet {\n",
454 " coord Coordinate {\n",
471 int marker_found = 0, lineno = 0;
473 while( marker_found < 4 )
475 if( shape_boiler[lineno] )
477 aOut_file << shape_boiler[lineno];
483 switch( marker_found )
487 std::streamsize lastPrecision = aOut_file.precision();
488 aOut_file <<
" diffuseColor " << std::setprecision(3);
493 aOut_file <<
" specularColor ";
494 aOut_file << aColor.
spec_red <<
" ";
495 aOut_file << aColor.
spec_grn <<
" ";
496 aOut_file << aColor.
spec_blu <<
"\n";
498 aOut_file <<
" emissiveColor ";
499 aOut_file << aColor.
emit_red <<
" ";
500 aOut_file << aColor.
emit_grn <<
" ";
501 aOut_file << aColor.
emit_blu <<
"\n";
503 aOut_file <<
" ambientIntensity " << aColor.
ambient <<
"\n";
504 aOut_file <<
" transparency " << aColor.
transp <<
"\n";
505 aOut_file <<
" shininess " << aColor.
shiny <<
"\n";
506 aOut_file.precision( lastPrecision );
513 aLayer->WriteVertices( aTop_z, aOut_file,
m_precision );
515 aLayer->Write3DVertices( aTop_z, aBottom_z, aOut_file,
m_precision );
523 aLayer->WriteIndices( aTop, aOut_file );
525 aLayer->Write3DIndices( aOut_file );
728 if( i < copper_layers )
756 for(
int icnt = 0; icnt < aOutlines.
OutlineCount(); icnt++ )
760 int seg = aVlayer->NewContour();
762 for(
int jj = 0; jj < outline.
PointCount(); jj++ )
766 throw( std::runtime_error( aVlayer->GetError() ) );
769 aVlayer->EnsureWinding( seg,
false );
778 wxLogWarning(
_(
"Board outline is malformed. Run DRC for a full analysis." ) );
789 for(
int j = 0; j < outline.
PointCount(); j++ )
807 wxLogError(
_(
"VRML Export Failed: Could not add holes to contours." ) );
817 m_holes.EnsureWinding( seg,
true );
835 via->LayerPair( &top_layer, &bottom_layer );
838 if( top_layer !=
F_Cu && bottom_layer !=
B_Cu )
844 if( hole_radius <= 0 )
861 double minSegLength = M_PI * 2.0 * hole_radius / nsides;
862 double maxSegLength = minSegLength*2.0;
864 m_holes.SetArcParams( nsides*2, minSegLength, maxSegLength );
865 m_plated_holes.SetArcParams( nsides*2, minSegLength, maxSegLength );
867 m_holes.AddCircle( x, -y, hole_radius,
true,
true );
880 double hole_drill = std::min( hole_drill_w, hole_drill_h );
894 double minSegLength = M_PI * hole_drill / nsides;
895 double maxSegLength = minSegLength*2.0;
897 m_holes.SetArcParams( nsides*2, minSegLength, maxSegLength );
898 m_plated_holes.SetArcParams( nsides*2, minSegLength, maxSegLength );
916 hole_drill_w * 2.0, hole_drill_h * 2.0,
921 m_holes.AddSlot( hole_x, -hole_y, hole_drill_w * 2.0, hole_drill_h * 2.0,
932 m_plated_holes.AddCircle( hole_x, -hole_y, hole_drill,
true,
false );
936 m_holes.AddCircle( hole_x, -hole_y, hole_drill,
true,
false );
948static void build_quat(
double x,
double y,
double z,
double a,
double q[4] )
950 double sina = sin( a / 2 );
962 rot[3] = acos( q[3] ) * 2;
964 for(
int i = 0; i < 3; i++ )
965 rot[i] = q[i] / sin( rot[3] / 2 );
974 tmp[0] = q2[3] * q1[0] + q2[0] * q1[3] + q2[1] * q1[2] - q2[2] * q1[1];
975 tmp[1] = q2[3] * q1[1] + q2[1] * q1[3] + q2[2] * q1[0] - q2[0] * q1[2];
976 tmp[2] = q2[3] * q1[2] + q2[2] * q1[3] + q2[0] * q1[1] - q2[1] * q1[0];
977 tmp[3] = q2[3] * q1[3] - q2[0] * q1[0] - q2[1] * q1[1] - q2[2] * q1[2];
993 wxCHECK( aFootprint, );
1002 auto sM = aFootprint->
Models().begin();
1003 auto eM = aFootprint->
Models().end();
1017 if(
nullptr == mod3d )
1028 double rotx = -sM->m_Rotation.x;
1029 double roty = -sM->m_Rotation.y;
1030 double rotz = -sM->m_Rotation.z;
1040 double q1[4], q2[4], rot[4];
1053 double offsetFactor = 1000.0f *
IU_PER_MILS / 25.4f;
1057 double offsetx = sM->m_Offset.x * offsetFactor;
1058 double offsety = sM->m_Offset.y * offsetFactor;
1059 double offsetz = sM->m_Offset.z * offsetFactor;
1075 wxCHECK( aOutputFile, );
1077 int old_precision = aOutputFile->precision();
1083 dstFile.SetName( srcFile.GetName() );
1084 dstFile.SetExt( wxT(
"wrl" ) );
1087 wxDateTime srcModTime = srcFile.GetModificationTime();
1088 wxDateTime destModTime = srcModTime;
1090 destModTime.SetToCurrent();
1092 if( dstFile.FileExists() )
1093 destModTime = dstFile.GetModificationTime();
1095 if( srcModTime != destModTime )
1097 wxString fileExt = srcFile.GetExt();
1098 fileExt.LowerCase();
1102 if( fileExt == wxT(
"wrl" ) )
1104 if( !wxCopyFile( srcFile.GetFullPath(), dstFile.GetFullPath() ) )
1115 (*aOutputFile) <<
"Transform {\n";
1118 if(
std::abs( rot[3] ) > 0.0001745 )
1120 (*aOutputFile) <<
" rotation ";
1121 (*aOutputFile) << rot[0] <<
" " << rot[1] <<
" " << rot[2] <<
" " << rot[3] <<
"\n";
1124 (*aOutputFile) <<
" translation ";
1125 (*aOutputFile) << trans.
x <<
" ";
1126 (*aOutputFile) << trans.
y <<
" ";
1127 (*aOutputFile) << trans.
z <<
"\n";
1129 (*aOutputFile) <<
" scale ";
1130 (*aOutputFile) << sM->m_Scale.x <<
" ";
1131 (*aOutputFile) << sM->m_Scale.y <<
" ";
1132 (*aOutputFile) << sM->m_Scale.z <<
"\n";
1134 (*aOutputFile) <<
" children [\n Inline {\n url \"";
1138 wxFileName tmp = dstFile;
1139 tmp.SetExt( wxT(
"" ) );
1140 tmp.SetName( wxT(
"" ) );
1141 tmp.RemoveLastDir();
1142 dstFile.MakeRelativeTo( tmp.GetPath() );
1145 wxString fn = dstFile.GetFullPath();
1146 fn.Replace( wxT(
"\\" ), wxT(
"/" ) );
1147 (*aOutputFile) <<
TO_UTF8( fn ) <<
"\"\n } ]\n";
1148 (*aOutputFile) <<
" }\n";
1150 aOutputFile->precision( old_precision );
1157 if(
std::abs( rot[3] ) > 0.0001745 )
1161 modelShape->
SetScale(
SGPOINT( sM->m_Scale.x, sM->m_Scale.y, sM->m_Scale.z ) );
1182 const wxString& aFullFileName,
double aMMtoWRMLunit,
1183 bool aExport3DFiles,
bool aUseRelativePaths,
1184 const wxString& a3D_Subdir,
1185 double aXRef,
double aYRef )
1187 if( aProject ==
nullptr )
1190 *aMessages =
_(
"No project when exporting the VRML file");
1208 SetOffset( -aXRef / 2.54, aYRef / 2.54 );
1216 bool success =
true;
1247 catch(
const std::exception& e )
1250 *aMessages <<
_(
"VRML Export Failed:\n" ) <<
FROM_UTF8( e.what() );
1259 bool aExport3DFiles,
bool aUseRelativePaths,
1260 const wxString& a3D_Subdir,
1261 double aXRef,
double aYRef )
1268 aExport3DFiles, aUseRelativePaths,
1269 a3D_Subdir, aXRef, aYRef );
1271 if( !msgs.IsEmpty() )
1272 wxMessageBox( msgs );
1283 if( ! subdir.DirExists() )
1285 if( !wxDir::Make( subdir.GetFullPath() ) )
1286 throw( std::runtime_error(
"Could not create 3D model subdirectory" ) );
1291 if( output_file.fail() )
1293 std::ostringstream ostr;
1294 ostr <<
"Could not open file '" <<
TO_UTF8( aFullFileName ) <<
"'";
1295 throw( std::runtime_error( ostr.str().c_str() ) );
1298 output_file.imbue( std::locale::classic() );
1301 wxString fn = aFullFileName;
1302 fn.Replace( wxT(
"\\" ) , wxT(
"/" ) );
1303 output_file <<
"#VRML V2.0 utf8\n";
1304 output_file <<
"WorldInfo {\n";
1305 output_file <<
" title \"" <<
TO_UTF8( fn ) <<
" - Generated by Pcbnew\"\n";
1306 output_file <<
"}\n";
1307 output_file <<
"Transform {\n";
1308 output_file <<
" scale " << std::setprecision(
m_precision );
1312 output_file <<
" children [\n";
1322 output_file <<
"]\n}\n";
1329 if( colorIdx == -1 )
1355 VRML_LAYER* layer,
double top_z,
bool aTopPlane )
1357 std::vector< double > vertices;
1358 std::vector< int > idxPlane;
1360 if( !( *layer ).Get2DTriangles( vertices, idxPlane, top_z, aTopPlane ) )
1365 if( ( idxPlane.size() % 3 ) )
1367 throw( std::runtime_error(
"[BUG] index lists are not a multiple of 3 (not a triangle "
1371 std::vector< SGPOINT > vlist;
1372 size_t nvert = vertices.size() / 3;
1375 for(
size_t i = 0; i < nvert; ++i, j+= 3 )
1376 vlist.emplace_back( vertices[j], vertices[j+1], vertices[j+2] );
1385 coordIdx.
SetIndices( idxPlane.size(), &idxPlane[0] );
1391 for(
size_t i = 0; i < nvert; ++i )
1396 for(
size_t i = 0; i < nvert; ++i )
1403 if(
nullptr != modelColor )
1414 VRML_LAYER* layer,
double top_z,
double bottom_z )
1416 std::vector< double > vertices;
1417 std::vector< int > idxPlane;
1418 std::vector< int > idxSide;
1420 if( top_z < bottom_z )
1427 if( !( *layer ).Get3DTriangles( vertices, idxPlane, idxSide, top_z, bottom_z )
1428 || idxPlane.empty() || idxSide.empty() )
1433 if( ( idxPlane.size() % 3 ) || ( idxSide.size() % 3 ) )
1435 throw( std::runtime_error(
"[BUG] index lists are not a multiple of 3 (not a "
1436 "triangle list)" ) );
1439 std::vector< SGPOINT > vlist;
1440 size_t nvert = vertices.size() / 3;
1443 for(
size_t i = 0; i < nvert; ++i, j+= 3 )
1444 vlist.emplace_back( vertices[j], vertices[j+1], vertices[j+2] );
1453 coordIdx.
SetIndices( idxPlane.size(), &idxPlane[0] );
1460 for(
size_t i = 0; i < j; ++i )
1464 for(
size_t i = 0; i < j; ++i )
1470 if(
nullptr != modelColor )
1488 std::vector< int >::iterator sI = idxSide.begin();
1489 std::vector< int >::iterator eI = idxSide.end();
defines the basic data associated with a single 3D model.
constexpr std::size_t arrayDim(T const (&)[N]) noexcept
Returns # of elements in an array.
@ BS_ITEM_TYPE_SILKSCREEN
@ BS_ITEM_TYPE_DIELECTRIC
@ BS_ITEM_TYPE_SOLDERMASK
int GetBoardThickness() const
The full thickness of the board including copper and masks.
BOARD_STACKUP & GetStackupDescriptor()
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
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.
void ConvertBrdLayerToPolygonalContours(PCB_LAYER_ID aLayer, SHAPE_POLY_SET &aOutlines) const
Build a set of polygons which are the outlines of copper items (pads, tracks, vias,...
bool GetBoardPolygonOutlines(SHAPE_POLY_SET &aOutlines, OUTLINE_ERROR_HANDLER *aErrorHandler=nullptr)
Extract the board outlines and build a closed polygon from lines, arcs and circle items on edge cut l...
FOOTPRINTS & Footprints()
int GetCopperLayerCount() const
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
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)
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)
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
double m_layer_z[PCB_LAYER_ID_COUNT]
bool m_UseRelPathIn3DModelFilename
void ExportVrmlFootprint(FOOTPRINT *aFootprint, std::ostream *aOutputFile)
bool ExportVRML_File(PROJECT *aProject, wxString *aMessages, const wxString &aFullFileName, double aMMtoWRMLunit, bool aExport3DFiles, bool aUseRelativePaths, const wxString &a3D_Subdir, double aXRef, double aYRef)
Export a VRML file image of the board.
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 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.
wxString ResolvePath(const wxString &aFileName)
Determines the full path of the given file name.
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
IFSG_COORDINDEX is the wrapper for SGCOORDINDEX.
bool NewNode(SGNODE *aParent) override
Function NewNode creates a new node to associate with this wrapper.
IFSG_COORDS is the wrapper for SGCOORDS.
bool NewNode(SGNODE *aParent) override
Function NewNode creates a new node to associate with this wrapper.
bool SetCoordsList(size_t aListSize, const SGPOINT *aCoordsList)
bool AddCoord(double aXValue, double aYValue, double aZValue)
IFSG_FACESET is the wrapper for the SGFACESET class.
bool NewNode(SGNODE *aParent) override
Function NewNode creates a new node to associate with this wrapper.
bool AddIndex(int aIndex)
Function AddIndex adds a single index to the list.
bool SetIndices(size_t nIndices, int *aIndexList)
Function SetIndices sets the number of indices and creates a copy of the given index data.
bool SetParent(SGNODE *aParent)
Function SetParent sets the parent SGNODE of this object.
SGNODE * GetRawPtr(void) noexcept
Function GetRawPtr() returns the raw internal SGNODE pointer.
void Destroy(void)
Function Destroy deletes the object held by this wrapper.
bool AddChildNode(SGNODE *aNode)
Function AddChildNode adds a node as a child owned by this node.
bool AddRefNode(SGNODE *aNode)
Function AddRefNode adds a reference to an existing node which is not owned by (not a child of) this ...
IFSG_NORMALS is the wrapper for the SGNORMALS class.
bool NewNode(SGNODE *aParent) override
Function NewNode creates a new node to associate with this wrapper.
bool AddNormal(double aXValue, double aYValue, double aZValue)
IFSG_SHAPE is the wrapper for the SGSHAPE class.
bool NewNode(SGNODE *aParent) override
Function NewNode creates 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.
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
LSEQ is a sequence (and therefore also a set) of PCB_LAYER_IDs.
static LSET AllCuMask(int aCuLayerCount=MAX_CU_LAYERS)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
PAD_DRILL_SHAPE_T GetDrillShape() const
const VECTOR2I & GetDrillSize() const
PAD_ATTRIB GetAttribute() const
VECTOR2I GetPosition() const override
EDA_ANGLE GetOrientation() const
Return the rotation angle of the pad.
bool ExportVRML_File(const wxString &aFullFileName, double aMMtoWRMLunit, bool aExport3DFiles, bool aUseRelativePaths, const wxString &a3D_Subdir, double aXRef, double aYRef)
Create the file(s) exporting current BOARD to a VRML file.
Container for project specific data.
SCENEGRAPH * Load(const wxString &aModelFile)
Attempt to load the scene data for a model.
FILENAME_RESOLVER * GetResolver() noexcept
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 BooleanSubtract(const SHAPE_POLY_SET &b, POLYGON_MODE aFastMode)
Perform boolean polyset intersection For aFastMode meaning, see function booleanOp.
void Fracture(POLYGON_MODE aFastMode)
Convert a single outline slitted ("fractured") polygon into a set ouf outlines with holes.
int HoleCount(int aOutline) const
Return the reference to aIndex-th outline in the set.
SHAPE_LINE_CHAIN & Hole(int aOutline, int aHole)
Return the aIndex-th subpolygon in the set.
int OutlineCount() const
Return the number of vertices in a given outline/hole.
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
std::vector< CUSTOM_COLOR_ITEM > CUSTOM_COLORS_LIST
static constexpr EDA_ANGLE & FULL_CIRCLE
#define ADD_COLOR(list, r, g, b, a, name)
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])
static bool g_ColorsLoaded
#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.
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
static wxString FROM_UTF8(const char *cstring)
Convert a UTF8 encoded C string to a wxString for all wxWidgets build modes.
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.
SGLIB_API SGNODE * GetSGNodeParent(SGNODE *aNode)
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,...
SGLIB_API void DestroyNode(SGNODE *aNode) noexcept
Function DestroyNode deletes the given SG* class node.
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
@ NPTH
like PAD_PTH, but not plated
#define OPEN_OSTREAM(var, name)
#define CLOSE_STREAM(var)
A class to handle a custom color (predefined color) for the color picker dialog.
static constexpr int Millimeter2iu(double mm)
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
double DEG2RAD(double deg)
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)