30#include <wx/translation.h>
44 std::vector<wxString> subNodeChildrenToCount = { wxT(
"LIBRARY" ), wxT(
"PARTS" ),
58 for( ; cNode; cNode = cNode->
GetNext() )
60 if( cNode->GetName() == wxT(
"HEADER" ) )
71 wxASSERT_MSG(
true, wxT(
"Unknown File Resolution" ) );
79 THROW_IO_ERROR( wxT(
"The selected file is a CADSTAR library file (as opposed "
80 "to a layout file). CADSTAR libraries cannot yet be "
81 "imported into KiCad." ) );
85 THROW_IO_ERROR( wxT(
"The selected file is an unknown CADSTAR format so "
86 "cannot be imported into KiCad." ) );
90 else if( cNode->GetName() == wxT(
"ASSIGNMENTS" ) )
94 else if( cNode->GetName() == wxT(
"LIBRARY" ) )
98 else if( cNode->GetName() == wxT(
"DEFAULTS" ) )
104 else if( cNode->GetName() == wxT(
"PARTS" ) )
108 else if( cNode->GetName() == wxT(
"LAYOUT" ) )
112 else if( cNode->GetName() == wxT(
"DISPLAY" ) )
132 wxASSERT( aNode->GetName() == wxT(
"ASSIGNMENTS" ) );
139 for( ; cNode; cNode = cNode->
GetNext() )
141 if( cNode->GetName() == wxT(
"LAYERDEFS" ) )
143 else if( cNode->GetName() == wxT(
"CODEDEFS" ) )
145 else if( cNode->GetName() == wxT(
"TECHNOLOGY" ) )
147 else if( cNode->GetName() == wxT(
"GRIDS" ) )
149 else if( cNode->GetName() == wxT(
"NETCLASSEDITATTRIBSETTINGS" ) )
151 else if( cNode->GetName() == wxT(
"SPCCLASSEDITATTRIBSETTINGS" ) )
161 wxASSERT( aNode->GetName() == wxT(
"LAYERDEFS" ) );
163 wxXmlAttribute* xmlAttribute =
nullptr;
170 for( ; cNode; cNode = cNode->
GetNext() )
172 wxString nodeName = cNode->GetName();
174 if( nodeName == wxT(
"LAYERSTACK" ) )
176 xmlAttribute = cNode->GetAttributes();
178 for( ; xmlAttribute; xmlAttribute = xmlAttribute->GetNext() )
183 LayerStack.push_back( (
LAYER_ID) xmlAttribute->GetValue() );
188 else if( nodeName == wxT(
"MATERIAL" ) )
191 material.
Parse( cNode, aContext );
192 Materials.insert( std::make_pair( material.
ID, material ) );
194 else if( nodeName == wxT(
"LAYER" ) )
197 layer.
Parse( cNode, aContext );
198 Layers.insert( std::make_pair( layer.
ID, layer ) );
200 else if( nodeName == wxT(
"SWAPPAIR" ) )
205 Layers[layerId].SwapLayerID = swapLayerId;
217 wxASSERT( aNode->GetName() == wxT(
"RULESET" ) );
224 for( ; cNode; cNode = cNode->
GetNext() )
226 wxString nodeName = cNode->GetName();
228 if( nodeName == wxT(
"ROUCODEREF" ) )
232 else if( nodeName == wxT(
"VIACODEREF" ) )
236 else if( nodeName == wxT(
"SPACINGCODE" ) )
239 spacingcode.
Parse( cNode, aContext );
240 SpacingCodes.insert( std::make_pair( spacingcode.
ID, spacingcode ) );
252 wxASSERT( aNode->GetName() == wxT(
"CODEDEFS" ) );
256 for( ; cNode; cNode = cNode->
GetNext() )
258 wxString nodeName = cNode->GetName();
260 if( ParseSubNode( cNode, aContext ) )
263 else if( nodeName == wxT(
"COPPERCODE" ) )
266 coppercode.
Parse( cNode, aContext );
267 CopperCodes.insert( std::make_pair( coppercode.
ID, coppercode ) );
269 else if( nodeName == wxT(
"SPACINGCODE" ) )
272 spacingcode.
Parse( cNode, aContext );
273 SpacingCodes.insert( std::make_pair( spacingcode.
ID, spacingcode ) );
275 else if( nodeName == wxT(
"RULESET" ) )
278 ruleset.
Parse( cNode, aContext );
279 Rulesets.insert( std::make_pair( ruleset.
ID, ruleset ) );
281 else if( nodeName == wxT(
"PADCODE" ) )
284 padcode.
Parse( cNode, aContext );
285 PadCodes.insert( std::make_pair( padcode.
ID, padcode ) );
287 else if( nodeName == wxT(
"VIACODE" ) )
290 viacode.
Parse( cNode, aContext );
291 ViaCodes.insert( std::make_pair( viacode.
ID, viacode ) );
293 else if( nodeName == wxT(
"LAYERPAIR" ) )
296 layerpair.
Parse( cNode, aContext );
297 LayerPairs.insert( std::make_pair( layerpair.
ID, layerpair ) );
299 else if( nodeName == wxT(
"SPCCLASSSPACE" ) )
302 spcclassspace.
Parse( cNode, aContext );
303 SpacingClasses.push_back( spcclassspace );
315 wxASSERT( aNode->GetName() == wxT(
"MATERIAL" ) );
322 if( sType == wxT(
"CONSTRUCTION" ) )
326 else if( sType == wxT(
"ELECTRICAL" ) )
330 else if( sType == wxT(
"NONELEC" ) )
347 for( ; iNode; iNode = iNode->
GetNext() )
349 wxString nodeName = iNode->GetName();
351 if( nodeName == wxT(
"RELPERMIT" ) )
355 else if( nodeName == wxT(
"LOSSTANGENT" ) )
359 else if( nodeName == wxT(
"RESISTIVITY" ) )
373 wxASSERT( aNode->GetName() == wxT(
"LAYER" ) );
379 auto processLayerMaterialDetails = [&]() {
381 for( ; tempNode; tempNode = tempNode->
GetNext() )
383 wxString tempNodeName = tempNode->GetName();
385 if( tempNodeName == wxT(
"MAKE" ) || tempNodeName == wxT(
"LAYERHEIGHT" ) )
387 if( tempNodeName == wxT(
"LAYERHEIGHT" ) )
399 if( childOfTempNode )
401 if( childOfTempNode->GetName() == wxT(
"EMBEDS" ) )
405 if( embedsValue == wxT(
"UPWARDS" ) )
409 else if( embedsValue == wxT(
"DOWNWARDS" ) )
428 else if( tempNodeName == wxT(
"BIAS" ) )
432 if( bias == wxT(
"X_BIASED" ) )
436 else if( bias == wxT(
"Y_BIASED" ) )
440 else if( bias == wxT(
"ANTITRACK" ) )
444 else if( bias == wxT(
"OBSTACLE" ) )
448 else if( bias == wxT(
"UNBIASED" ) )
467 for( ; cNode; cNode = cNode->
GetNext() )
469 wxString cNodeName = cNode->GetName();
471 if( cNodeName == wxT(
"ALLDOC" ) )
475 else if( cNodeName == wxT(
"ALLELEC" ) )
479 else if( cNodeName == wxT(
"ALLLAYER" ) )
483 else if( cNodeName == wxT(
"ASSCOMPCOPP" ) )
487 else if( cNodeName == wxT(
"JUMPERLAYER" ) )
491 else if( cNodeName == wxT(
"NOLAYER" ) )
495 else if( cNodeName == wxT(
"POWER" ) )
499 processLayerMaterialDetails();
501 else if( cNodeName == wxT(
"DOC" ) )
505 else if( cNodeName == wxT(
"CONSTRUCTION" ) )
508 processLayerMaterialDetails();
510 else if( cNodeName == wxT(
"ELEC" ) )
514 processLayerMaterialDetails();
516 else if( cNodeName == wxT(
"NONELEC" ) )
520 processLayerMaterialDetails();
522 else if( cNodeName == wxT(
"DESCRIPTION" ) )
526 else if( cNodeName == wxT(
"REFPLANE" ) )
528 ReferencePlane =
true;
530 else if( cNodeName == wxT(
"VLAYER" ) )
534 else if( cNodeName == wxT(
"LASUBTYP" ) )
539 if( sSubType == wxT(
"LAYERSUBTYPE_ASSEMBLY" ) )
543 else if( sSubType == wxT(
"LAYERSUBTYPE_PASTE" ) )
547 else if( sSubType == wxT(
"LAYERSUBTYPE_PLACEMENT" ) )
551 else if( sSubType == wxT(
"LAYERSUBTYPE_SILKSCREEN" ) )
555 else if( sSubType == wxT(
"LAYERSUBTYPE_SOLDERRESIST" ) )
559 else if( sSubType == wxT(
"LAYERSUBTYPE_CLEARANCE" ) )
563 else if( sSubType == wxT(
"LAYERSUBTYPE_ROUT" ) )
583 wxASSERT( aNode->GetName() == wxT(
"COPREASSIGN" ) );
593 wxASSERT( aNode->GetName() == wxT(
"COPPERCODE" ) );
602 for( ; cNode; cNode = cNode->
GetNext() )
604 if( cNode->GetName() == wxT(
"COPREASSIGN" ) )
607 reassign.
Parse( cNode, aContext );
608 Reassigns.push_back( reassign );
621 wxASSERT( aNode->GetName() == wxT(
"SPACEREASSIGN" ) );
632 wxASSERT( aNode->GetName() == wxT(
"SPACINGCODE" ) );
639 for( ; cNode; cNode = cNode->
GetNext() )
641 wxString cNodeName = cNode->GetName();
643 if( cNodeName == wxT(
"SPACEREASSIGN" ) )
646 reassign.
Parse( cNode, aContext );
647 Reassigns.push_back( reassign );
659 wxString aNodeName = aNode->GetName();
661 if( aNodeName == wxT(
"ANNULUS" ) || aNodeName == wxT(
"BULLET" ) || aNodeName == wxT(
"ROUND" )
662 || aNodeName == wxT(
"DIAMOND" ) || aNodeName == wxT(
"FINGER" )
663 || aNodeName == wxT(
"OCTAGON" ) || aNodeName == wxT(
"RECTANGLE" )
664 || aNodeName == wxT(
"ROUNDED" ) || aNodeName == wxT(
"SQUARE" ) )
677 wxASSERT( IsPadShape( aNode ) );
679 wxString aNodeName = aNode->GetName();
681 if( aNodeName == wxT(
"ANNULUS" ) )
683 else if( aNodeName == wxT(
"BULLET" ) )
685 else if( aNodeName == wxT(
"ROUND" ) )
687 else if( aNodeName == wxT(
"DIAMOND" ) )
689 else if( aNodeName == wxT(
"FINGER" ) )
691 else if( aNodeName == wxT(
"OCTAGON" ) )
693 else if( aNodeName == wxT(
"RECTANGLE" ) )
695 else if( aNodeName == wxT(
"ROUNDED" ) )
697 else if( aNodeName == wxT(
"SQUARE" ) )
726 if( aNode->
GetChildren()->GetName() == wxT(
"ORIENT" ) )
748 wxASSERT( aNode->GetName() == wxT(
"PADREASSIGN" ) );
763 wxASSERT( aNode->GetName() == wxT(
"PADCODE" ) );
771 for( ; cNode; cNode = cNode->
GetNext() )
773 wxString cNodeName = cNode->GetName();
777 Shape.Parse( cNode, aContext );
779 else if( cNodeName == wxT(
"CLEARANCE" ) )
783 else if( cNodeName == wxT(
"RELIEFWIDTH" ) )
787 else if( cNodeName == wxT(
"DRILL" ) )
792 for( ; subNode; subNode = subNode->
GetNext() )
794 wxString subNodeName = subNode->GetName();
796 if( subNodeName == wxT(
"NONPLATED" ) )
798 else if( subNodeName == wxT(
"OVERSIZE" ) )
804 else if( cNodeName == wxT(
"DRILLLENGTH" ) )
808 else if( cNodeName == wxT(
"DRILLORIENTATION" ) )
812 else if( cNodeName == wxT(
"DRILLXOFFSET" ) )
816 else if( cNodeName == wxT(
"DRILLYOFFSET" ) )
820 else if( cNodeName == wxT(
"PADREASSIGN" ) )
823 reassign.
Parse( cNode, aContext );
824 Reassigns.insert( std::make_pair( reassign.
LayerID, reassign.
Shape ) );
836 wxASSERT( aNode->GetName() == wxT(
"VIAREASSIGN" ) );
851 wxASSERT( aNode->GetName() == wxT(
"VIACODE" ) );
859 for( ; cNode; cNode = cNode->
GetNext() )
861 wxString cNodeName = cNode->GetName();
865 Shape.Parse( cNode, aContext );
867 else if( cNodeName == wxT(
"CLEARANCE" ) )
871 else if( cNodeName == wxT(
"RELIEFWIDTH" ) )
875 else if( cNodeName == wxT(
"DRILL" ) )
880 for( ; subNode; subNode = subNode->
GetNext() )
882 wxString subNodeName = subNode->GetName();
884 if( subNodeName == wxT(
"OVERSIZE" ) )
890 else if( cNodeName == wxT(
"VIAREASSIGN" ) )
893 reassign.
Parse( cNode, aContext );
894 Reassigns.insert( std::make_pair( reassign.
LayerID, reassign.
Shape ) );
906 wxASSERT( aNode->GetName() == wxT(
"LAYERPAIR" ) );
918 if( aNode->
GetChildren()->GetName() == wxT(
"VIACODEREF" ) )
934 wxASSERT( aNode->GetName() == wxT(
"SPCCLASSSPACE" ) );
945 wxASSERT( aNode->GetName() == wxT(
"TECHNOLOGY" ) );
949 for( ; cNode; cNode = cNode->
GetNext() )
951 wxString cNodeName = cNode->GetName();
953 if( ParseSubNode( cNode, aContext ) )
956 else if( cNodeName == wxT(
"MINROUTEWIDTH" ) )
960 else if( cNodeName == wxT(
"MINNECKED" ) )
964 else if( cNodeName == wxT(
"MINUNNECKED" ) )
968 else if( cNodeName == wxT(
"MINMITER" ) )
972 else if( cNodeName == wxT(
"MAXMITER" ) )
976 else if( cNodeName == wxT(
"MAXPHYSLAYER" ) )
980 else if( cNodeName == wxT(
"TRACKGRID" ) )
984 else if( cNodeName == wxT(
"VIAGRID" ) )
988 else if( cNodeName == wxT(
"BACKOFFJCTS" ) )
990 BackOffJunctions =
true;
992 else if( cNodeName == wxT(
"BCKOFFWIDCHANGE" ) )
994 BackOffWidthChange =
true;
1005 const wxString& aPadSideString )
1007 if( aPadSideString == wxT(
"THRU" ) )
1009 else if( aPadSideString == wxT(
"BOTTOM" ) )
1011 else if( aPadSideString == wxT(
"TOP" ) )
1020 wxASSERT( aNode->GetName() == wxT(
"COMPCOPPER" ) );
1026 bool shapeIsInitialised =
false;
1027 wxString location = wxT(
"COMPCOPPER" );
1032 for( ; cNode; cNode = cNode->
GetNext() )
1034 wxString cNodeName = cNode->GetName();
1036 if( !shapeIsInitialised && Shape.IsShape( cNode ) )
1038 Shape.Parse( cNode, aContext );
1039 shapeIsInitialised =
true;
1041 else if( cNodeName == wxT(
"SWAPRULE" ) )
1045 else if( cNodeName == wxT(
"ASSOCPIN" ) )
1047 wxXmlAttribute* xmlAttribute = cNode->GetAttributes();
1049 for( ; xmlAttribute; xmlAttribute = xmlAttribute->GetNext() )
1056 if( !xmlAttribute->GetValue().ToLong( &padId ) )
1059 AssociatedPadIDs.push_back( (
PAD_ID) padId );
1074 wxASSERT( aNode->GetName() == wxT(
"COMPAREA" ) );
1081 bool shapeIsInitialised =
false;
1087 for( ; cNode; cNode = cNode->
GetNext() )
1089 wxString cNodeName = cNode->GetName();
1093 Shape.Parse( cNode, aContext );
1094 shapeIsInitialised =
true;
1096 else if( cNodeName == wxT(
"SWAPRULE" ) )
1100 else if( cNodeName == wxT(
"USAGE" ) )
1102 wxXmlAttribute* xmlAttribute = cNode->GetAttributes();
1104 for( ; xmlAttribute; xmlAttribute = xmlAttribute->GetNext() )
1109 if( xmlAttribute->GetValue() == wxT(
"NO_TRACKS" ) )
1111 else if( xmlAttribute->GetValue() == wxT(
"NO_VIAS" ) )
1129 wxASSERT( aNode->GetName() == wxT(
"EXITS" ) );
1131 wxXmlAttribute* xmlAttribute = aNode->GetAttributes();
1133 for( ; xmlAttribute; xmlAttribute = xmlAttribute->GetNext() )
1138 if( xmlAttribute->GetValue() == wxT(
"FREE" ) )
1140 else if( xmlAttribute->GetValue() == wxT(
"N" ) )
1142 else if( xmlAttribute->GetValue() == wxT(
"S" ) )
1144 else if( xmlAttribute->GetValue() == wxT(
"E" ) )
1146 else if( xmlAttribute->GetValue() == wxT(
"W" ) )
1148 else if( xmlAttribute->GetValue() == wxT(
"NE" ) )
1150 else if( xmlAttribute->GetValue() == wxT(
"NW" ) )
1152 else if( xmlAttribute->GetValue() == wxT(
"SE" ) )
1154 else if( xmlAttribute->GetValue() == wxT(
"SW" ) )
1166 wxASSERT( aNode->GetName() == wxT(
"PAD" ) );
1178 for( ; cNode; cNode = cNode->
GetNext() )
1180 wxString cNodeName = cNode->GetName();
1182 if( cNodeName == wxT(
"ORIENT" ) )
1184 else if( cNodeName == wxT(
"FIRSTPAD" ) )
1186 else if( cNodeName == wxT(
"EXITS" ) )
1187 Exits.Parse( cNode, aContext );
1188 else if( cNodeName == wxT(
"PADIDENTIFIER" ) )
1190 else if( cNodeName == wxT(
"PCBONLYPAD" ) )
1192 else if( cNodeName == wxT(
"PT" ) )
1193 Position.Parse( cNode, aContext );
1202 wxASSERT( aNode->GetName() == wxT(
"DIMARROW" ) );
1203 bool arrowStyleInitialised =
false;
1204 bool upperAngleInitialised =
false;
1205 bool lowerAngleInitialised =
false;
1212 for( ; cNode; cNode = cNode->
GetNext() )
1214 wxString cNodeName = cNode->GetName();
1216 if( cNodeName == wxT(
"ARROWSTYLE" ) )
1219 arrowStyleInitialised =
true;
1221 if( arrowStyleStr == wxT(
"DIMENSION_ARROWOPEN" ) )
1222 ArrowStyle = STYLE::OPEN;
1223 else if( arrowStyleStr == wxT(
"DIMENSION_ARROWCLOSED" ) )
1224 ArrowStyle = STYLE::CLOSED;
1225 else if( arrowStyleStr == wxT(
"DIMENSION_ARROWCLEAR" ) )
1227 else if( arrowStyleStr == wxT(
"DIMENSION_ARROWCLOSEDFILLED" ) )
1228 ArrowStyle = STYLE::CLOSED_FILLED;
1232 else if( cNodeName == wxT(
"ARROWANGLEA" ) )
1235 upperAngleInitialised =
true;
1237 else if( cNodeName == wxT(
"ARROWANGLEB" ) )
1240 lowerAngleInitialised =
true;
1248 if( !arrowStyleInitialised )
1251 if( !upperAngleInitialised )
1254 if( !lowerAngleInitialised )
1262 wxASSERT( aNode->GetName() == wxT(
"DIMTEXT" ) );
1269 if( cNode->GetName() != wxT(
"TXTSTYLE" ) )
1274 if( styleStr == wxT(
"DIMENSION_INTERNAL" ) )
1275 Style = STYLE::INSIDE;
1276 else if( styleStr == wxT(
"DIMENSION_EXTERNAL" ) )
1277 Style = STYLE::OUTSIDE;
1288 wxASSERT( aNode->GetName() == wxT(
"EXTLINE" ) );
1297 for( ; cNode; cNode = cNode->
GetNext() )
1299 wxString cNodeName = cNode->GetName();
1301 if( noOfPoints < 2 && cNodeName == wxT(
"PT" ) )
1305 if( noOfPoints == 1 )
1306 Start.Parse( cNode, aContext );
1308 End.Parse( cNode, aContext );
1310 else if( cNodeName == wxT(
"SUPPRESSFIRST" ) )
1312 SuppressFirst =
true;
1320 if( noOfPoints != 2 )
1327 if( aNode->GetName() == wxT(
"LEADERLINE" ) || aNode->GetName() == wxT(
"LINEARLINE" )
1328 || aNode->GetName() == wxT(
"ANGULARLINE" ) )
1341 wxASSERT( IsLine( aNode ) );
1343 if( aNode->GetName() == wxT(
"LINEARLINE" ) )
1344 Type = TYPE::LINEARLINE;
1345 else if( aNode->GetName() == wxT(
"LEADERLINE" ) )
1346 Type = TYPE::LEADERLINE;
1347 else if( aNode->GetName() == wxT(
"ANGULARLINE" ) )
1348 Type = TYPE::ANGULARLINE;
1350 wxASSERT_MSG(
true, wxT(
"Not a valid type. What happened to the node Name?" ) );
1354 if( Type == TYPE::LEADERLINE )
1362 int requiredNoOfPoints = 2;
1364 if( Type == TYPE::ANGULARLINE )
1365 requiredNoOfPoints = 3;
1367 for( ; cNode; cNode = cNode->
GetNext() )
1369 wxString cNodeName = cNode->GetName();
1371 if( cNodeName == wxT(
"DIMLINETYPE" ) )
1375 if( styleStr == wxT(
"DIMENSION_INTERNAL" ) )
1376 Style = STYLE::INTERNAL;
1377 else if( styleStr == wxT(
"DIMENSION_EXTERNAL" ) )
1378 Style = STYLE::EXTERNAL;
1382 else if( noOfPoints < requiredNoOfPoints && cNodeName == wxT(
"PT" ) )
1386 if( noOfPoints == 1 )
1387 Start.Parse( cNode, aContext );
1388 else if( noOfPoints == 2 )
1389 End.Parse( cNode, aContext );
1391 Centre.Parse( cNode, aContext );
1393 else if( Type == TYPE::LEADERLINE && cNodeName == wxT(
"LEADERANG" ) )
1403 if( noOfPoints != requiredNoOfPoints )
1410 if( aNode->GetName() == wxT(
"LINEARDIM" ) || aNode->GetName() == wxT(
"LEADERDIM" )
1411 || aNode->GetName() == wxT(
"ANGLEDIM" ) )
1424 wxASSERT( IsDimension( aNode ) );
1426 std::map<wxString, TYPE> typeMap = { { wxT(
"LINEARDIM" ), TYPE::LINEARDIM },
1427 { wxT(
"LEADERDIM" ), TYPE::LEADERDIM }, { wxT(
"ANGLEDIM" ), TYPE::ANGLEDIM } };
1430 wxASSERT_MSG( typeMap.find( aNode->GetName() ) != typeMap.end(),
1431 wxT(
"Not a valid type. What happened to the node Name?" ) );
1433 Type = typeMap[aNode->GetName()];
1437 std::map<wxString, SUBTYPE> subTypeMap = {
1438 { wxT(
"DIMENSION_ORTHOGONAL" ), SUBTYPE::ORTHOGONAL },
1439 { wxT(
"DIMENSION_DIRECT" ), SUBTYPE::DIRECT },
1440 { wxT(
"DIMENSION_ANGLED" ), SUBTYPE::ANGLED },
1441 { wxT(
"DIMENSION_DIAMETER" ), SUBTYPE::DIAMETER },
1442 { wxT(
"DIMENSION_RADIUS" ), SUBTYPE::RADIUS },
1443 { wxT(
"DIMENSION_ANGULAR" ), SUBTYPE::ANGULAR } };
1445 if( subTypeMap.find( subTypeStr ) == subTypeMap.end() )
1448 Subtype = subTypeMap[subTypeStr];
1453 bool idParsed =
false;
1454 bool unitsParsed =
false;
1455 bool arrowParsed =
false;
1456 bool textFormatParsed =
false;
1457 bool extLineParsed =
false;
1458 bool lineParsed =
false;
1459 bool textParsed =
false;
1461 for( ; cNode; cNode = cNode->
GetNext() )
1463 wxString cNodeName = cNode->GetName();
1465 if( !idParsed && cNodeName == wxT(
"DIMREF" ) )
1470 else if( !unitsParsed && cNodeName == wxT(
"UNITS" ) )
1475 else if( !unitsParsed && cNodeName == wxT(
"ANGUNITS" ) )
1480 else if( !arrowParsed && cNodeName == wxT(
"DIMARROW" ) )
1482 Arrow.Parse( cNode, aContext );
1485 else if( !textFormatParsed && cNodeName == wxT(
"DIMTEXT" ) )
1487 TextParams.Parse( cNode, aContext );
1488 textFormatParsed =
true;
1490 else if( !extLineParsed && cNodeName == wxT(
"EXTLINE" ) )
1492 ExtensionLineParams.Parse( cNode, aContext );
1493 extLineParsed =
true;
1495 else if( !lineParsed && LINE::IsLine( cNode ) )
1497 Line.Parse( cNode, aContext );
1500 else if( !textParsed && cNodeName == wxT(
"TEXT" ) )
1503 Text.Parse( cNode, aContext,
false );
1506 else if( cNodeName == wxT(
"FIX" ) )
1510 else if( cNodeName == wxT(
"GROUPREF" ) )
1514 else if( cNodeName == wxT(
"REUSEBLOCKREF" ) )
1516 ReuseBlockRef.Parse( cNode, aContext );
1528 wxASSERT( aNode->GetName() == wxT(
"SYMDEF" ) );
1530 ParseIdentifiers( aNode, aContext );
1534 if( ReferenceName.StartsWith( wxT(
"JUMPERNF" ), &rest ) )
1536 else if( ReferenceName.StartsWith( wxT(
"STARPOINTNF" ), &rest ) )
1538 else if( ReferenceName == wxT(
"TESTPOINT" ) )
1545 for( ; cNode; cNode = cNode->
GetNext() )
1547 wxString cNodeName = cNode->GetName();
1549 if( ParseSubNode( cNode, aContext ) )
1553 else if( cNodeName == wxT(
"SYMHEIGHT" ) )
1557 else if( cNodeName == wxT(
"COMPCOPPER" ) )
1560 compcopper.
Parse( cNode, aContext );
1561 ComponentCoppers.push_back( compcopper );
1563 else if( cNodeName == wxT(
"COMPAREA" ) )
1566 area.
Parse( cNode, aContext );
1567 ComponentAreas.insert( std::make_pair( area.
ID, area ) );
1569 else if( cNodeName == wxT(
"PAD" ) )
1572 pad.Parse( cNode, aContext );
1573 ComponentPads.insert( std::make_pair(
pad.ID,
pad ) );
1575 else if( cNodeName == wxT(
"DIMENSIONS" ) )
1579 for( ; dimensionNode; dimensionNode = dimensionNode->
GetNext() )
1584 dim.
Parse( dimensionNode, aContext );
1585 Dimensions.insert( std::make_pair( dim.
ID, dim ) );
1599 if( !Stub && !Origin.IsFullySpecified() )
1606 wxASSERT( aNode->GetName() == wxT(
"LIBRARY" ) );
1610 for( ; cNode; cNode = cNode->
GetNext() )
1612 wxString cNodeName = cNode->GetName();
1614 if( cNodeName == wxT(
"SYMDEF" ) )
1617 symdef.
Parse( cNode, aContext );
1618 ComponentDefinitions.insert( std::make_pair( symdef.
ID, symdef ) );
1632 wxASSERT( aNode->GetName() == wxT(
"BOARD" ) );
1638 bool shapeIsInitialised =
false;
1644 for( ; cNode; cNode = cNode->
GetNext() )
1646 wxString cNodeName = cNode->GetName();
1650 Shape.Parse( cNode, aContext );
1651 shapeIsInitialised =
true;
1653 else if( cNodeName == wxT(
"ATTR" ) )
1656 attr.
Parse( cNode, aContext );
1657 AttributeValues.insert( std::make_pair( attr.
AttributeID, attr ) );
1659 else if( cNodeName == wxT(
"FIX" ) )
1663 else if( cNodeName == wxT(
"GROUPREF" ) )
1667 else if( cNodeName == wxT(
"REUSEBLOCKREF" ) )
1669 ReuseBlockRef.Parse( cNode, aContext );
1681 wxASSERT( aNode->GetName() == wxT(
"AREA" ) );
1689 bool shapeIsInitialised =
false;
1695 for( ; cNode; cNode = cNode->
GetNext() )
1697 wxString cNodeName = cNode->GetName();
1701 Shape.Parse( cNode, aContext );
1702 shapeIsInitialised =
true;
1704 else if( cNodeName == wxT(
"FIX" ) )
1708 else if( cNodeName == wxT(
"USAGE" ) )
1710 wxXmlAttribute* xmlAttribute = cNode->GetAttributes();
1712 for( ; xmlAttribute; xmlAttribute = xmlAttribute->GetNext() )
1717 if( xmlAttribute->GetValue() == wxT(
"PLACEMENT" ) )
1719 else if( xmlAttribute->GetValue() == wxT(
"ROUTING" ) )
1721 else if( xmlAttribute->GetValue() == wxT(
"KEEPOUT" ) )
1723 else if( xmlAttribute->GetValue() == wxT(
"NO_TRACKS" ) )
1725 else if( xmlAttribute->GetValue() == wxT(
"NO_VIAS" ) )
1733 else if( cNodeName == wxT(
"AREAHEIGHT" ) )
1737 else if( cNodeName == wxT(
"GROUPREF" ) )
1741 else if( cNodeName == wxT(
"REUSEBLOCKREF" ) )
1743 ReuseBlockRef.Parse( cNode, aContext );
1745 else if( cNodeName == wxT(
"ATTR" ) )
1748 attr.
Parse( cNode, aContext );
1749 AttributeValues.insert( std::make_pair( attr.
AttributeID, attr ) );
1761 wxASSERT( aNode->GetName() == wxT(
"PINATTR" ) );
1767 for( ; cNode; cNode = cNode->
GetNext() )
1769 wxString cNodeName = cNode->GetName();
1771 if( cNodeName == wxT(
"ATTR" ) )
1774 attrVal.
Parse( cNode, aContext );
1775 AttributeValues.insert( std::make_pair( attrVal.
AttributeID, attrVal ) );
1777 else if( cNodeName == wxT(
"TESTLAND" ) )
1791 wxASSERT( aNode->GetName() == wxT(
"PADEXCEPTION" ) );
1797 for( ; cNode; cNode = cNode->
GetNext() )
1799 wxString cNodeName = cNode->GetName();
1801 if( cNodeName == wxT(
"PADCODEREF" ) )
1805 else if( cNodeName == wxT(
"EXITS" ) )
1807 OverrideExits =
true;
1808 Exits.Parse( cNode, aContext );
1810 else if( cNodeName == wxT(
"SIDE" ) )
1812 OverrideSide =
true;
1815 else if( cNodeName == wxT(
"ORIENT" ) )
1817 OverrideOrientation =
true;
1830 wxASSERT( aNode->GetName() == wxT(
"COMP" ) );
1838 bool originParsed =
false;
1840 for( ; cNode; cNode = cNode->
GetNext() )
1842 wxString cNodeName = cNode->GetName();
1844 if( !originParsed && cNodeName == wxT(
"PT" ) )
1846 Origin.Parse( cNode, aContext );
1847 originParsed =
true;
1849 else if( cNodeName == wxT(
"GROUPREF" ) )
1853 else if( cNodeName == wxT(
"REUSEBLOCKREF" ) )
1855 ReuseBlockRef.Parse( cNode, aContext );
1857 else if( cNodeName == wxT(
"TESTPOINT" ) )
1861 else if( cNodeName == wxT(
"FIX" ) )
1865 else if( cNodeName == wxT(
"MIRROR" ) )
1869 else if( cNodeName == wxT(
"READABILITY" ) )
1873 else if( cNodeName == wxT(
"ORIENT" ) )
1877 else if( cNodeName == wxT(
"VCOMPMASTER" ) )
1882 else if( cNodeName == wxT(
"TEXTLOC" ) )
1885 textloc.
Parse( cNode, aContext );
1886 TextLocations.insert( std::make_pair( textloc.
AttributeID, textloc ) );
1888 else if( cNodeName == wxT(
"ATTR" ) )
1891 attrVal.
Parse( cNode, aContext );
1892 AttributeValues.insert( std::make_pair( attrVal.
AttributeID, attrVal ) );
1894 else if( cNodeName == wxT(
"PINATTR" ) )
1897 pinAttr.
Parse( cNode, aContext );
1898 PinAttributes.insert( std::make_pair( pinAttr.
Pin, pinAttr ) );
1900 else if( cNodeName == wxT(
"COMPPINLABEL" ) )
1904 PinLabels.insert( std::make_pair( pinID, pinLabel ) );
1906 else if( cNodeName == wxT(
"PADEXCEPTION" ) )
1909 padExcept.
Parse( cNode, aContext );
1910 PadExceptions.insert( std::make_pair( padExcept.
ID, padExcept ) );
1926 wxASSERT( aNode->GetName() == wxT(
"TESTLAND" ) );
1930 if( side == wxT(
"MIN_SIDE" ) )
1932 else if( side == wxT(
"MAX_SIDE" ) )
1934 else if( side == wxT(
"BOTH_SIDES" ) )
1945 wxASSERT( aNode->GetName() == wxT(
"TRUNK" ) );
1954 wxASSERT( aNode->GetName() == wxT(
"PIN" ) );
1966 ParseIdentifiers( aNode, aContext );
1969 for( ; cNode; cNode = cNode->
GetNext() )
1971 if( ParseSubNode( cNode, aContext ) )
1973 else if( cNode->GetName() == wxT(
"TRUNKREF" ) )
1983 wxASSERT( aNode->GetName() == wxT(
"VIA" ) );
1991 for( ; cNode; cNode = cNode->
GetNext() )
1993 wxString cNodeName = cNode->GetName();
1995 if( cNodeName == wxT(
"PT" ) )
1996 Location.Parse( cNode, aContext );
1997 else if( cNodeName == wxT(
"FIX" ) )
1999 else if( cNodeName == wxT(
"GROUPREF" ) )
2001 else if( cNodeName == wxT(
"REUSEBLOCKREF" ) )
2002 ReuseBlockRef.Parse( cNode, aContext );
2003 else if( cNodeName == wxT(
"TESTLAND" ) )
2005 else if( cNode->GetName() == wxT(
"TRUNKREF" ) )
2016 wxASSERT( aNode->GetName() == wxT(
"COPTERM" ) );
2027 wxASSERT( aNode->GetName() == wxT(
"ROUTEWIDTH" ) );
2030 XNODE* prevNode = aNode;
2033 for( ; nextNode; nextNode = nextNode->
GetNext() )
2035 if( nextNode->GetName() == wxT(
"FIX" ) )
2039 else if( nextNode->GetName() == wxT(
"TDROPATSTART" ) )
2041 TeardropAtStart =
true;
2044 else if( nextNode->GetName() == wxT(
"TDROPATEND" ) )
2046 TeardropAtEnd =
true;
2051 Vertex.Parse( nextNode, aContext );
2053 else if( nextNode->GetName() == wxT(
"ROUTEWIDTH" ) )
2062 prevNode = nextNode;
2071 wxASSERT( aNode->GetName() == wxT(
"ROUTE" ) );
2077 bool startPointParsed =
false;
2079 for( ; cNode; cNode = cNode->
GetNext() )
2081 wxString cNodeName = cNode->GetName();
2083 if( !startPointParsed && cNodeName == wxT(
"PT" ) )
2085 startPointParsed =
true;
2086 StartPoint.Parse( cNode, aContext );
2088 else if( cNodeName == wxT(
"ROUTEWIDTH" ) )
2091 cNode = rtVert.
Parse( cNode, aContext );
2092 RouteVertices.push_back( rtVert );
2094 assert( cNode !=
nullptr );
2107 ParseIdentifiers( aNode, aContext );
2111 bool routeParsed =
false;
2113 for( ; cNode; cNode = cNode->
GetNext() )
2115 wxString cNodeName = cNode->GetName();
2117 if( ParseSubNode( cNode, aContext ) )
2121 else if( !Unrouted && !routeParsed && cNodeName == wxT(
"ROUTE" ) )
2123 Route.Parse( cNode, aContext );
2126 else if( !routeParsed && cNodeName == wxT(
"UNROUTE" ) )
2131 else if( cNode->GetName() == wxT(
"TRUNKREF" ) )
2145 ParseIdentifiers( aNode, aContext );
2150 for( ; cNode; cNode = cNode->
GetNext() )
2152 wxString cNodeName = cNode->GetName();
2154 if( cNodeName == wxT(
"JPT" ) )
2157 jpt.
Parse( cNode, aContext );
2158 Junctions.insert( std::make_pair( jpt.
ID, jpt ) );
2160 else if( ParseSubNode( cNode, aContext ) )
2164 else if( cNodeName == wxT(
"PIN" ) )
2167 pin.Parse( cNode, aContext );
2168 Pins.insert( std::make_pair(
pin.ID,
pin ) );
2170 else if( cNodeName == wxT(
"VIA" ) )
2173 via.Parse( cNode, aContext );
2174 Vias.insert( std::make_pair(
via.ID,
via ) );
2176 else if( cNodeName == wxT(
"COPTERM" ) )
2179 cterm.
Parse( cNode, aContext );
2180 CopperTerminals.insert( std::make_pair( cterm.
ID, cterm ) );
2182 else if( cNodeName == wxT(
"CONN" ) )
2185 conn.
Parse( cNode, aContext );
2186 Connections.push_back( conn );
2198 wxASSERT( aNode->GetName() == wxT(
"POURING" ) );
2210 if( MinIsolCopStr == wxT(
"NONE" ) )
2217 if( MinDisjCopStr == wxT(
"NONE" ) )
2224 for( ; cNode; cNode = cNode->
GetNext() )
2226 wxString cNodeName = cNode->GetName();
2228 if( cNodeName == wxT(
"NOPINRELIEF" ) )
2230 ThermalReliefOnPads =
false;
2232 else if( cNodeName == wxT(
"NOVIARELIEF" ) )
2234 ThermalReliefOnVias =
false;
2236 else if( cNodeName == wxT(
"IGNORETRN" ) )
2238 AllowInNoRouting =
true;
2240 else if( cNodeName == wxT(
"BOXPINS" ) )
2242 BoxIsolatedPins =
true;
2244 else if( cNodeName == wxT(
"REGENERATE" ) )
2246 AutomaticRepour =
true;
2248 else if( cNodeName == wxT(
"AUTOROUTETARGET" ) )
2250 TargetForAutorouting =
true;
2252 else if( cNodeName == wxT(
"THERMALCUTOUT" ) )
2254 ReliefType = RELIEF_TYPE::CUTOUTS;
2256 else if( cNodeName == wxT(
"FILLED" ) )
2260 else if( cNodeName == wxT(
"HATCHCODEREF" ) )
2262 FillType = COPPER_FILL_TYPE::HATCHED;
2275 wxASSERT( aNode->GetName() == wxT(
"TEMPLATE" ) );
2284 bool shapeParsed =
false;
2285 bool pouringParsed =
false;
2287 for( ; cNode; cNode = cNode->
GetNext() )
2289 wxString cNodeName = cNode->GetName();
2293 Shape.Parse( cNode, aContext );
2296 else if( !pouringParsed && cNodeName == wxT(
"POURING" ) )
2298 Pouring.Parse( cNode, aContext );
2299 pouringParsed =
true;
2301 else if( cNodeName == wxT(
"FIX" ) )
2305 else if( cNodeName == wxT(
"GROUPREF" ) )
2309 else if( cNodeName == wxT(
"REUSEBLOCKREF" ) )
2311 ReuseBlockRef.Parse( cNode, aContext );
2313 else if( cNodeName == wxT(
"ATTR" ) )
2316 attr.
Parse( cNode, aContext );
2317 AttributeValues.insert( std::make_pair( attr.
AttributeID, attr ) );
2330 wxASSERT( aNode->GetName() == wxT(
"TERM" ) );
2335 bool locationParsed =
false;
2337 for( ; cNode; cNode = cNode->
GetNext() )
2339 wxString cNodeName = cNode->GetName();
2341 if( !locationParsed && cNodeName == wxT(
"PT" ) )
2343 Location.Parse( cNode, aContext );
2344 locationParsed =
true;
2346 else if( cNodeName == wxT(
"FIX" ) )
2360 wxASSERT( aNode->GetName() == wxT(
"NETREF" ) );
2366 for( ; cNode; cNode = cNode->
GetNext() )
2368 wxString cNodeName = cNode->GetName();
2370 if( cNodeName == wxT(
"TERM" ) )
2373 term.
Parse( cNode, aContext );
2374 CopperTerminals.insert( std::make_pair( term.
ID, term ) );
2376 else if( cNodeName == wxT(
"FIX" ) )
2390 wxASSERT( aNode->GetName() == wxT(
"COPPER" ) );
2397 bool shapeParsed =
false;
2398 bool netRefParsed =
false;
2400 for( ; cNode; cNode = cNode->
GetNext() )
2402 wxString cNodeName = cNode->GetName();
2406 Shape.Parse( cNode, aContext );
2409 else if( !netRefParsed && cNodeName == wxT(
"NETREF" ) )
2411 NetRef.Parse( cNode, aContext );
2412 netRefParsed =
true;
2414 else if( cNodeName == wxT(
"FIX" ) )
2418 else if( cNodeName == wxT(
"GROUPREF" ) )
2422 else if( cNodeName == wxT(
"REUSEBLOCKREF" ) )
2424 ReuseBlockRef.Parse( cNode, aContext );
2426 else if( cNodeName == wxT(
"POURED" ) )
2430 else if( cNodeName == wxT(
"ATTR" ) )
2433 attr.
Parse( cNode, aContext );
2434 AttributeValues.insert( std::make_pair( attr.
AttributeID, attr ) );
2446 wxASSERT( aNode->GetName() == wxT(
"DRILLTABLE" ) );
2452 bool positionParsed =
false;
2454 for( ; cNode; cNode = cNode->
GetNext() )
2456 wxString cNodeName = cNode->GetName();
2458 if( !positionParsed && cNodeName == wxT(
"PT" ) )
2460 Position.Parse( cNode, aContext );
2461 positionParsed =
true;
2463 else if( cNodeName == wxT(
"ORIENT" ) )
2467 else if( cNodeName == wxT(
"MIRROR" ) )
2471 else if( cNodeName == wxT(
"FIX" ) )
2475 else if( cNodeName == wxT(
"READABILITY" ) )
2479 else if( cNodeName == wxT(
"GROUPREF" ) )
2483 else if( cNodeName == wxT(
"REUSEBLOCKREF" ) )
2485 ReuseBlockRef.Parse( cNode, aContext );
2497 wxASSERT( aNode->GetName() == wxT(
"LAYOUT" ) );
2500 bool netSynchParsed =
false;
2501 bool dimensionsParsed =
false;
2503 for( ; cNode; cNode = cNode->
GetNext() )
2505 wxString cNodeName = cNode->GetName();
2507 if( !netSynchParsed && cNodeName == wxT(
"NETSYNCH" ) )
2509 std::map<wxString, NETSYNCH> netSynchMap = { { wxT(
"WARNING" ),
NETSYNCH::WARNING },
2514 if( netSynchMap.find( nsString ) == netSynchMap.end() )
2517 NetSynch = netSynchMap[nsString];
2518 netSynchParsed =
true;
2520 else if( cNodeName == wxT(
"GROUP" ) )
2523 group.Parse( cNode, aContext );
2524 Groups.insert( std::make_pair(
group.ID,
group ) );
2526 else if( cNodeName == wxT(
"REUSEBLOCK" ) )
2529 reuseblock.
Parse( cNode, aContext );
2530 ReuseBlocks.insert( std::make_pair( reuseblock.
ID, reuseblock ) );
2532 else if( cNodeName == wxT(
"BOARD" ) )
2535 board.
Parse( cNode, aContext );
2536 Boards.insert( std::make_pair( board.
ID, board ) );
2538 else if( cNodeName == wxT(
"FIGURE" ) )
2541 figure.
Parse( cNode, aContext );
2542 Figures.insert( std::make_pair( figure.
ID, figure ) );
2544 else if( cNodeName == wxT(
"AREA" ) )
2547 area.
Parse( cNode, aContext );
2548 Areas.insert( std::make_pair( area.
ID, area ) );
2550 else if( cNodeName == wxT(
"COMP" ) )
2553 comp.
Parse( cNode, aContext );
2554 Components.insert( std::make_pair( comp.
ID, comp ) );
2556 else if( cNodeName == wxT(
"TRUNK" ) )
2559 trunk.
Parse( cNode, aContext );
2560 Trunks.insert( std::make_pair( trunk.
ID, trunk ) );
2562 else if( cNodeName == wxT(
"NET" ) )
2565 net.
Parse( cNode, aContext );
2566 Nets.insert( std::make_pair( net.
ID, net ) );
2568 else if( cNodeName == wxT(
"TEMPLATE" ) )
2571 temp.
Parse( cNode, aContext );
2572 Templates.insert( std::make_pair( temp.
ID, temp ) );
2574 else if( cNodeName == wxT(
"COPPER" ) )
2577 copper.
Parse( cNode, aContext );
2578 Coppers.insert( std::make_pair( copper.
ID, copper ) );
2580 else if( cNodeName == wxT(
"TEXT" ) )
2583 txt.
Parse( cNode, aContext );
2584 Texts.insert( std::make_pair( txt.
ID, txt ) );
2586 else if( cNodeName == wxT(
"DOCSYMBOL" ) )
2589 docsym.
Parse( cNode, aContext );
2590 DocumentationSymbols.insert( std::make_pair( docsym.
ID, docsym ) );
2592 else if( !dimensionsParsed && cNodeName == wxT(
"DIMENSIONS" ) )
2596 for( ; dimensionNode; dimensionNode = dimensionNode->
GetNext() )
2601 dim.
Parse( dimensionNode, aContext );
2602 Dimensions.insert( std::make_pair( dim.
ID, dim ) );
2610 dimensionsParsed =
true;
2612 else if( cNodeName == wxT(
"DRILLTABLE" ) )
2615 drilltable.
Parse( cNode, aContext );
2616 DrillTables.insert( std::make_pair( drilltable.
ID, drilltable ) );
2618 else if( cNodeName == wxT(
"VHIERARCHY" ) )
2620 VariantHierarchy.Parse( cNode, aContext );
2622 else if( cNodeName == wxT(
"ERRORMARK" ) )
constexpr double PCB_IU_PER_MM
#define THROW_MISSING_NODE_IO_ERROR(nodename, location)
#define THROW_UNKNOWN_NODE_IO_ERROR(nodename, location)
#define THROW_UNKNOWN_PARAMETER_IO_ERROR(param, location)
#define THROW_MISSING_PARAMETER_IO_ERROR(param, location)
#define THROW_PARSING_IO_ERROR(param, location)
static UNITS ParseUnits(XNODE *aNode)
static SWAP_RULE ParseSwapRule(XNODE *aNode)
static const long UNDEFINED_VALUE
static void CheckNoNextNodes(XNODE *aNode)
static XNODE * LoadArchiveFile(const wxString &aFileName, const wxString &aFileTypeIdentifier, PROGRESS_REPORTER *aProgressReporter=nullptr)
Reads a CADSTAR Archive file (S-parameter format)
wxString LAYER_ID
ID of a Sheet (if schematic) or board Layer (if PCB)
static ANGUNITS ParseAngunits(XNODE *aNode)
long PART_DEFINITION_PIN_ID
Pin identifier in the part definition.
static wxString GetXmlAttributeIDString(XNODE *aNode, unsigned int aID, bool aIsRequired=true)
void checkPoint()
Updates m_progressReporter or throws if user cancelled.
static bool IsValidAttribute(wxXmlAttribute *aAttribute)
static READABILITY ParseReadability(XNODE *aNode)
static void CheckNoChildNodes(XNODE *aNode)
static long GetXmlAttributeIDLong(XNODE *aNode, unsigned int aID, bool aIsRequired=true)
static void ParseChildEValue(XNODE *aNode, PARSER_CONTEXT *aContext, EVALUE &aValueToParse)
static long GetNumberOfStepsForReporting(XNODE *aRootNode, std::vector< wxString > aSubNodeChildrenToCount)
PROGRESS_REPORTER * m_progressReporter
static TESTLAND_SIDE ParseTestlandSide(XNODE *aNode)
@ STARPOINT
From CADSTAR Help: "Starpoints are special symbols/components that can be used to electrically connec...
@ JUMPER
From CADSTAR Help: "Jumpers are components used primarily for the purpose of routing.
@ COMPONENT
Standard PCB Component definition.
@ TESTPOINT
From CADSTAR Help: "A testpoint is an area of copper connected to a net.
@ ANTI_ROUTE
Keyword "ANTITRACK".
@ OBSTACLE
Keyword "OBSTACLE".
@ UNBIASED
Keyword "UNBIASED" (default)
long PAD_ID
Pad identifier (pin) in the PCB.
@ LAYERSUBTYPE_SOLDERRESIST
@ LAYERSUBTYPE_SILKSCREEN
int KiCadUnitMultiplier
Use this value to convert units in this CPA file to KiCad units.
@ ALLELEC
Inbuilt layer type (cannot be assigned to user layers)
@ ALLDOC
Inbuilt layer type (cannot be assigned to user layers)
@ NONELEC
This type has subtypes.
@ NOLAYER
Inbuilt layer type (cannot be assigned to user layers)
@ JUMPERLAYER
Inbuilt layer type (cannot be assigned to user layers)
@ ALLLAYER
Inbuilt layer type (cannot be assigned to user layers)
@ ASSCOMPCOPP
Inbuilt layer type (cannot be assigned to user layers)
@ ROUNDED_RECT
Keyword "ROUNDED".
@ MAX
The highest PHYSICAL_LAYER_ID currently defined (i.e. back / bottom side).
@ MIN
The lowest PHYSICAL_LAYER_ID currently defined (i.e. front / top side).
void Parse()
Parses the file.
static PAD_SIDE GetPadSide(const wxString &aPadSideString)
PAD_SIDE
From CADSTAR Help: "This parameter indicates the physical layers on which the selected pad is placed.
@ MAXIMUM
The highest PHYSICAL_LAYER_ID currently defined (i.e.
@ MINIMUM
PHYSICAL_LAYER_ID 1 (i.e.
@ THROUGH_HOLE
All physical layers currently defined.
virtual void BeginPhase(int aPhase)=0
Initialize the aPhase virtual zone of the dialog progress bar.
virtual void SetMaxProgress(int aMaxProgress)=0
Fix the value that gives the 100 percent progress bar length (inside the current virtual zone).
Hold an XML or S-expression element.
XNODE * GetChildren() const
#define THROW_IO_ERROR(msg)
This file contains miscellaneous commonly used macros and functions.
#define KI_FALLTHROUGH
The KI_FALLTHROUGH macro is to be used when switch statement cases should purposely fallthrough from ...
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
DOCUMENTATION_SYMBOL_ID ID
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
NETELEMENT_ID ID
First character is "J".
std::function< void()> CheckPointCallback
Callback function to report progress.
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
static bool IsShape(XNODE *aNode)
Corresponds to CADSTAR "origin".
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
static bool IsVertex(XNODE *aNode)
From CADSTAR Help: "Area is for creating areas within which, and nowhere else, certain operations are...
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
TECHNOLOGY_SECTION Technology
bool SpacingclassEditAttributeSettings
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
bool NetclassEditAttributeSettings
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
static bool IsPadShape(XNODE *aNode)
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
From CADSTAR Help: "Area is for creating areas within which, and nowhere else, certain operations are...
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
A shape of copper in the component footprint.
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
static bool IsLine(XNODE *aNode)
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
Linear, leader (radius/diameter) or angular dimension.
static bool IsDimension(XNODE *aNode)
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
DIMENSION_ID ID
Some ID (doesn't seem to be used) subnode="DIMREF".
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
NETELEMENT_ID ID
First two character are "CT".
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
< "PIN" nodename (represents a PAD in a PCB component)
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
< Two sibbling nodes: first node being "ROUTEWIDTH" and next node being a VERTEX (e....
XNODE * Parse(XNODE *aNode, PARSER_CONTEXT *aContext)
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
PART_DEFINITION_PIN_ID Pin
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
SPACINGCODE_ID ID
Possible spacing rules:
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
Templates are CADSTAR's equivalent to a "filled zone".
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override