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" ) )
1884 TEXT_LOCATION textloc;
1885 textloc.Parse( cNode, aContext );
1886 TextLocations.insert( std::make_pair( textloc.AttributeID, textloc ) );
1888 else if( cNodeName == wxT(
"ATTR" ) )
1890 ATTRIBUTE_VALUE attrVal;
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" ) );
2032 if( nextNode->GetName() == wxT(
"FIX" ) )
2035 nextNode = nextNode->
GetNext();
2041 Vertex.Parse( nextNode, aContext );
2049 wxASSERT( aNode->GetName() == wxT(
"ROUTE" ) );
2055 bool startPointParsed =
false;
2057 for( ; cNode; cNode = cNode->
GetNext() )
2059 wxString cNodeName = cNode->GetName();
2061 if( !startPointParsed && cNodeName == wxT(
"PT" ) )
2063 startPointParsed =
true;
2064 StartPoint.Parse( cNode, aContext );
2066 else if( cNodeName == wxT(
"ROUTEWIDTH" ) )
2069 cNode = rtVert.
Parse( cNode, aContext );
2070 RouteVertices.push_back( rtVert );
2083 ParseIdentifiers( aNode, aContext );
2087 bool routeParsed =
false;
2089 for( ; cNode; cNode = cNode->
GetNext() )
2091 wxString cNodeName = cNode->GetName();
2093 if( ParseSubNode( cNode, aContext ) )
2097 else if( !Unrouted && !routeParsed && cNodeName == wxT(
"ROUTE" ) )
2099 Route.Parse( cNode, aContext );
2102 else if( !routeParsed && cNodeName == wxT(
"UNROUTE" ) )
2107 else if( cNode->GetName() == wxT(
"TRUNKREF" ) )
2121 ParseIdentifiers( aNode, aContext );
2126 for( ; cNode; cNode = cNode->
GetNext() )
2128 wxString cNodeName = cNode->GetName();
2130 if( cNodeName == wxT(
"JPT" ) )
2133 jpt.
Parse( cNode, aContext );
2134 Junctions.insert( std::make_pair( jpt.
ID, jpt ) );
2136 else if( ParseSubNode( cNode, aContext ) )
2140 else if( cNodeName == wxT(
"PIN" ) )
2143 pin.Parse( cNode, aContext );
2144 Pins.insert( std::make_pair(
pin.ID,
pin ) );
2146 else if( cNodeName == wxT(
"VIA" ) )
2149 via.Parse( cNode, aContext );
2150 Vias.insert( std::make_pair(
via.ID,
via ) );
2152 else if( cNodeName == wxT(
"COPTERM" ) )
2155 cterm.
Parse( cNode, aContext );
2156 CopperTerminals.insert( std::make_pair( cterm.
ID, cterm ) );
2158 else if( cNodeName == wxT(
"CONN" ) )
2161 conn.
Parse( cNode, aContext );
2162 Connections.push_back( conn );
2174 wxASSERT( aNode->GetName() == wxT(
"POURING" ) );
2186 if( MinIsolCopStr == wxT(
"NONE" ) )
2193 if( MinDisjCopStr == wxT(
"NONE" ) )
2200 for( ; cNode; cNode = cNode->
GetNext() )
2202 wxString cNodeName = cNode->GetName();
2204 if( cNodeName == wxT(
"NOPINRELIEF" ) )
2206 ThermalReliefOnPads =
false;
2208 else if( cNodeName == wxT(
"NOVIARELIEF" ) )
2210 ThermalReliefOnVias =
false;
2212 else if( cNodeName == wxT(
"IGNORETRN" ) )
2214 AllowInNoRouting =
true;
2216 else if( cNodeName == wxT(
"BOXPINS" ) )
2218 BoxIsolatedPins =
true;
2220 else if( cNodeName == wxT(
"REGENERATE" ) )
2222 AutomaticRepour =
true;
2224 else if( cNodeName == wxT(
"AUTOROUTETARGET" ) )
2226 TargetForAutorouting =
true;
2228 else if( cNodeName == wxT(
"THERMALCUTOUT" ) )
2230 ReliefType = RELIEF_TYPE::CUTOUTS;
2232 else if( cNodeName == wxT(
"FILLED" ) )
2236 else if( cNodeName == wxT(
"HATCHCODEREF" ) )
2238 FillType = COPPER_FILL_TYPE::HATCHED;
2251 wxASSERT( aNode->GetName() == wxT(
"TEMPLATE" ) );
2260 bool shapeParsed =
false;
2261 bool pouringParsed =
false;
2263 for( ; cNode; cNode = cNode->
GetNext() )
2265 wxString cNodeName = cNode->GetName();
2269 Shape.Parse( cNode, aContext );
2272 else if( !pouringParsed && cNodeName == wxT(
"POURING" ) )
2274 Pouring.Parse( cNode, aContext );
2275 pouringParsed =
true;
2277 else if( cNodeName == wxT(
"FIX" ) )
2281 else if( cNodeName == wxT(
"GROUPREF" ) )
2285 else if( cNodeName == wxT(
"REUSEBLOCKREF" ) )
2287 ReuseBlockRef.Parse( cNode, aContext );
2289 else if( cNodeName == wxT(
"ATTR" ) )
2292 attr.
Parse( cNode, aContext );
2293 AttributeValues.insert( std::make_pair( attr.
AttributeID, attr ) );
2306 wxASSERT( aNode->GetName() == wxT(
"TERM" ) );
2311 bool locationParsed =
false;
2313 for( ; cNode; cNode = cNode->
GetNext() )
2315 wxString cNodeName = cNode->GetName();
2317 if( !locationParsed && cNodeName == wxT(
"PT" ) )
2319 Location.Parse( cNode, aContext );
2320 locationParsed =
true;
2322 else if( cNodeName == wxT(
"FIX" ) )
2336 wxASSERT( aNode->GetName() == wxT(
"NETREF" ) );
2342 for( ; cNode; cNode = cNode->
GetNext() )
2344 wxString cNodeName = cNode->GetName();
2346 if( cNodeName == wxT(
"TERM" ) )
2349 term.
Parse( cNode, aContext );
2350 CopperTerminals.insert( std::make_pair( term.
ID, term ) );
2352 else if( cNodeName == wxT(
"FIX" ) )
2366 wxASSERT( aNode->GetName() == wxT(
"COPPER" ) );
2373 bool shapeParsed =
false;
2374 bool netRefParsed =
false;
2376 for( ; cNode; cNode = cNode->
GetNext() )
2378 wxString cNodeName = cNode->GetName();
2382 Shape.Parse( cNode, aContext );
2385 else if( !netRefParsed && cNodeName == wxT(
"NETREF" ) )
2387 NetRef.Parse( cNode, aContext );
2388 netRefParsed =
true;
2390 else if( cNodeName == wxT(
"FIX" ) )
2394 else if( cNodeName == wxT(
"GROUPREF" ) )
2398 else if( cNodeName == wxT(
"REUSEBLOCKREF" ) )
2400 ReuseBlockRef.Parse( cNode, aContext );
2402 else if( cNodeName == wxT(
"POURED" ) )
2406 else if( cNodeName == wxT(
"ATTR" ) )
2408 ATTRIBUTE_VALUE attr;
2409 attr.Parse( cNode, aContext );
2410 AttributeValues.insert( std::make_pair( attr.AttributeID, attr ) );
2422 wxASSERT( aNode->GetName() == wxT(
"DRILLTABLE" ) );
2428 bool positionParsed =
false;
2430 for( ; cNode; cNode = cNode->
GetNext() )
2432 wxString cNodeName = cNode->GetName();
2434 if( !positionParsed && cNodeName == wxT(
"PT" ) )
2436 Position.Parse( cNode, aContext );
2437 positionParsed =
true;
2439 else if( cNodeName == wxT(
"ORIENT" ) )
2443 else if( cNodeName == wxT(
"MIRROR" ) )
2447 else if( cNodeName == wxT(
"FIX" ) )
2451 else if( cNodeName == wxT(
"READABILITY" ) )
2455 else if( cNodeName == wxT(
"GROUPREF" ) )
2459 else if( cNodeName == wxT(
"REUSEBLOCKREF" ) )
2461 ReuseBlockRef.Parse( cNode, aContext );
2473 wxASSERT( aNode->GetName() == wxT(
"LAYOUT" ) );
2476 bool netSynchParsed =
false;
2477 bool dimensionsParsed =
false;
2479 for( ; cNode; cNode = cNode->GetNext() )
2481 wxString cNodeName = cNode->GetName();
2483 if( !netSynchParsed && cNodeName == wxT(
"NETSYNCH" ) )
2485 std::map<wxString, NETSYNCH> netSynchMap = { { wxT(
"WARNING" ),
NETSYNCH::WARNING },
2490 if( netSynchMap.find( nsString ) == netSynchMap.end() )
2493 NetSynch = netSynchMap[nsString];
2494 netSynchParsed =
true;
2496 else if( cNodeName == wxT(
"GROUP" ) )
2499 group.Parse( cNode, aContext );
2500 Groups.insert( std::make_pair(
group.ID,
group ) );
2502 else if( cNodeName == wxT(
"REUSEBLOCK" ) )
2505 reuseblock.
Parse( cNode, aContext );
2506 ReuseBlocks.insert( std::make_pair( reuseblock.
ID, reuseblock ) );
2508 else if( cNodeName == wxT(
"BOARD" ) )
2511 board.
Parse( cNode, aContext );
2512 Boards.insert( std::make_pair( board.
ID, board ) );
2514 else if( cNodeName == wxT(
"FIGURE" ) )
2517 figure.
Parse( cNode, aContext );
2518 Figures.insert( std::make_pair( figure.
ID, figure ) );
2520 else if( cNodeName == wxT(
"AREA" ) )
2523 area.
Parse( cNode, aContext );
2524 Areas.insert( std::make_pair( area.
ID, area ) );
2526 else if( cNodeName == wxT(
"COMP" ) )
2529 comp.
Parse( cNode, aContext );
2530 Components.insert( std::make_pair( comp.
ID, comp ) );
2532 else if( cNodeName == wxT(
"TRUNK" ) )
2535 trunk.
Parse( cNode, aContext );
2536 Trunks.insert( std::make_pair( trunk.
ID, trunk ) );
2538 else if( cNodeName == wxT(
"NET" ) )
2541 net.
Parse( cNode, aContext );
2542 Nets.insert( std::make_pair( net.
ID, net ) );
2544 else if( cNodeName == wxT(
"TEMPLATE" ) )
2547 temp.
Parse( cNode, aContext );
2548 Templates.insert( std::make_pair( temp.
ID, temp ) );
2550 else if( cNodeName == wxT(
"COPPER" ) )
2553 copper.
Parse( cNode, aContext );
2554 Coppers.insert( std::make_pair( copper.
ID, copper ) );
2556 else if( cNodeName == wxT(
"TEXT" ) )
2559 txt.
Parse( cNode, aContext );
2560 Texts.insert( std::make_pair( txt.
ID, txt ) );
2562 else if( cNodeName == wxT(
"DOCSYMBOL" ) )
2565 docsym.
Parse( cNode, aContext );
2566 DocumentationSymbols.insert( std::make_pair( docsym.
ID, docsym ) );
2568 else if( !dimensionsParsed && cNodeName == wxT(
"DIMENSIONS" ) )
2572 for( ; dimensionNode; dimensionNode = dimensionNode->
GetNext() )
2577 dim.
Parse( dimensionNode, aContext );
2578 Dimensions.insert( std::make_pair( dim.
ID, dim ) );
2586 dimensionsParsed =
true;
2588 else if( cNodeName == wxT(
"DRILLTABLE" ) )
2591 drilltable.
Parse( cNode, aContext );
2592 DrillTables.insert( std::make_pair( drilltable.
ID, drilltable ) );
2594 else if( cNodeName == wxT(
"VHIERARCHY" ) )
2596 VariantHierarchy.Parse( cNode, aContext );
2598 else if( cNodeName == wxT(
"ERRORMARK" ) )
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
long PART_DEFINITION_PIN_ID
Pin identifier in the part definition.
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
virtual void SetMaxProgress(int aMaxProgress)=0
Fix the value that gives the 100 percent progress bar length (inside the current virtual zone).
virtual void BeginPhase(int aPhase)=0
Initialize the aPhase virtual zone of the dialog progress bar.
Inbuilt layer type (cannot be assigned to user layers)
Inbuilt layer type (cannot be assigned to user layers)
Inbuilt layer type (cannot be assigned to user layers)
static bool IsDimension(XNODE *aNode)
static XNODE * LoadArchiveFile(const wxString &aFileName, const wxString &aFileTypeIdentifier, PROGRESS_REPORTER *aProgressReporter=nullptr)
Reads a CADSTAR Archive file (S-parameter format)
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
The highest PHYSICAL_LAYER_ID currently defined (i.e. back / bottom side).
static ANGUNITS ParseAngunits(XNODE *aNode)
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
From CADSTAR Help: "A testpoint is an area of copper connected to a net.
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
bool SpacingclassEditAttributeSettings
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 IsValidAttribute(wxXmlAttribute *aAttribute)
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
long PAD_ID
Pad identifier (pin) in the PCB.
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
#define KI_FALLTHROUGH
The KI_FALLTHROUGH macro is to be used when switch statement cases should purposely fallthrough from ...
From CADSTAR Help: "Area is for creating areas within which, and nowhere else, certain operations are...
static SWAP_RULE ParseSwapRule(XNODE *aNode)
#define THROW_MISSING_PARAMETER_IO_ERROR(param, location)
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
static void CheckNoChildNodes(XNODE *aNode)
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
From CADSTAR Help: "Jumpers are components used primarily for the purpose of routing.
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
This file contains miscellaneous commonly used macros and functions.
static PAD_SIDE GetPadSide(const wxString &aPadSideString)
From CADSTAR Help: "Area is for creating areas within which, and nowhere else, certain operations are...
Keyword "UNBIASED" (default)
A shape of copper in the component footprint.
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
< Two sibbling nodes: first node being "ROUTEWIDTH" and next node being a VERTEX (e....
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse()
Parses the file.
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
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
PART_DEFINITION_PIN_ID Pin
XNODE * GetChildren() const
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
DOCUMENTATION_SYMBOL_ID ID
DIMENSION_ID ID
Some ID (doesn't seem to be used) subnode="DIMREF".
constexpr double PCB_IU_PER_MM
Inbuilt layer type (cannot be assigned to user layers)
TECHNOLOGY_SECTION Technology
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
The highest PHYSICAL_LAYER_ID currently defined (i.e.
XNODE * Parse(XNODE *aNode, PARSER_CONTEXT *aContext)
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
static bool IsShape(XNODE *aNode)
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
#define THROW_PARSING_IO_ERROR(param, location)
#define THROW_MISSING_NODE_IO_ERROR(nodename, location)
From CADSTAR Help: "Starpoints are special symbols/components that can be used to electrically connec...
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
Standard PCB Component definition.
All physical layers currently defined.
static bool IsVertex(XNODE *aNode)
PHYSICAL_LAYER_ID 1 (i.e.
static const long UNDEFINED_VALUE
The lowest PHYSICAL_LAYER_ID currently defined (i.e. front / top side).
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
static long GetXmlAttributeIDLong(XNODE *aNode, unsigned int aID, bool aIsRequired=true)
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void checkPoint()
Updates m_progressReporter or throws if user cancelled.
Hold an XML or S-expression element.
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
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 READABILITY ParseReadability(XNODE *aNode)
static bool IsLine(XNODE *aNode)
static void CheckNoNextNodes(XNODE *aNode)
Inbuilt layer type (cannot be assigned to user layers)
static bool IsPadShape(XNODE *aNode)
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
static void ParseChildEValue(XNODE *aNode, PARSER_CONTEXT *aContext, EVALUE &aValueToParse)
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
PROGRESS_REPORTER * m_progressReporter
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
NETELEMENT_ID ID
First two character are "CT".
bool NetclassEditAttributeSettings
static UNITS ParseUnits(XNODE *aNode)
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
NETELEMENT_ID ID
First character is "J".
static TESTLAND_SIDE ParseTestlandSide(XNODE *aNode)
Inbuilt layer type (cannot be assigned to user layers)
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
wxString LAYER_ID
ID of a Sheet (if schematic) or board Layer (if PCB)
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
#define THROW_UNKNOWN_NODE_IO_ERROR(nodename, location)
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
< "PIN" nodename (represents a PAD in a PCB component)
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
static wxString GetXmlAttributeIDString(XNODE *aNode, unsigned int aID, bool aIsRequired=true)
#define THROW_IO_ERROR(msg)
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
static long GetNumberOfStepsForReporting(XNODE *aRootNode, std::vector< wxString > aSubNodeChildrenToCount)
#define THROW_UNKNOWN_PARAMETER_IO_ERROR(param, location)
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
int KiCadUnitMultiplier
Use this value to convert units in this CPA file to KiCad units.
Linear, leader (radius/diameter) or angular dimension.
PAD_SIDE
From CADSTAR Help: "This parameter indicates the physical layers on which the selected pad is placed.
SPACINGCODE_ID ID
Possible spacing rules: