40 for( ; cNode; cNode = cNode->
GetNext() )
42 if( cNode->GetName() == wxT(
"HEADER" ) )
53 wxASSERT_MSG(
true, wxT(
"Unknown File Resolution" ) );
62 "The selected file is a CADSTAR Library file (as opposed to a Layout " 63 "file). CADSTAR libraries cannot yet be imported into KiCad." );
68 "The selected file is an unknown CADSTAR format so cannot be " 69 "imported into KiCad." );
73 else if( cNode->GetName() == wxT(
"ASSIGNMENTS" ) )
77 else if( cNode->GetName() == wxT(
"LIBRARY" ) )
81 else if( cNode->GetName() == wxT(
"DEFAULTS" ) )
87 else if( cNode->GetName() == wxT(
"PARTS" ) )
91 else if( cNode->GetName() == wxT(
"LAYOUT" ) )
95 else if( cNode->GetName() == wxT(
"DISPLAY" ) )
113 wxASSERT( aNode->GetName() == wxT(
"ASSIGNMENTS" ) );
120 for( ; cNode; cNode = cNode->GetNext() )
122 if( cNode->GetName() == wxT(
"LAYERDEFS" ) )
124 else if( cNode->GetName() == wxT(
"CODEDEFS" ) )
126 else if( cNode->GetName() == wxT(
"TECHNOLOGY" ) )
128 else if( cNode->GetName() == wxT(
"GRIDS" ) )
130 else if( cNode->GetName() == wxT(
"NETCLASSEDITATTRIBSETTINGS" ) )
132 else if( cNode->GetName() == wxT(
"SPCCLASSEDITATTRIBSETTINGS" ) )
142 wxASSERT( aNode->GetName() == wxT(
"LAYERDEFS" ) );
144 wxXmlAttribute* xmlAttribute =
NULL;
151 for( ; cNode; cNode = cNode->
GetNext() )
153 wxString nodeName = cNode->GetName();
155 if( nodeName == wxT(
"LAYERSTACK" ) )
157 xmlAttribute = cNode->GetAttributes();
159 for( ; xmlAttribute; xmlAttribute = xmlAttribute->GetNext() )
164 LayerStack.push_back( (
LAYER_ID) xmlAttribute->GetValue() );
169 else if( nodeName == wxT(
"MATERIAL" ) )
172 material.
Parse( cNode, aContext );
173 Materials.insert( std::make_pair( material.
ID, material ) );
175 else if( nodeName == wxT(
"LAYER" ) )
178 layer.
Parse( cNode, aContext );
179 Layers.insert( std::make_pair( layer.
ID, layer ) );
181 else if( nodeName == wxT(
"SWAPPAIR" ) )
186 Layers[layerId].SwapLayerID = swapLayerId;
198 wxASSERT( aNode->GetName() == wxT(
"RULESET" ) );
205 for( ; cNode; cNode = cNode->
GetNext() )
207 wxString nodeName = cNode->GetName();
209 if( nodeName == wxT(
"ROUCODEREF" ) )
213 else if( nodeName == wxT(
"VIACODEREF" ) )
217 else if( nodeName == wxT(
"SPACINGCODE" ) )
220 spacingcode.
Parse( cNode, aContext );
221 SpacingCodes.insert( std::make_pair( spacingcode.
ID, spacingcode ) );
233 wxASSERT( aNode->GetName() == wxT(
"CODEDEFS" ) );
237 for( ; cNode; cNode = cNode->GetNext() )
239 wxString nodeName = cNode->GetName();
241 if( ParseSubNode( cNode, aContext ) )
244 else if( nodeName == wxT(
"COPPERCODE" ) )
247 coppercode.
Parse( cNode, aContext );
248 CopperCodes.insert( std::make_pair( coppercode.
ID, coppercode ) );
250 else if( nodeName == wxT(
"SPACINGCODE" ) )
253 spacingcode.
Parse( cNode, aContext );
254 SpacingCodes.insert( std::make_pair( spacingcode.
ID, spacingcode ) );
256 else if( nodeName == wxT(
"RULESET" ) )
259 ruleset.
Parse( cNode, aContext );
260 Rulesets.insert( std::make_pair( ruleset.
ID, ruleset ) );
262 else if( nodeName == wxT(
"PADCODE" ) )
265 padcode.
Parse( cNode, aContext );
266 PadCodes.insert( std::make_pair( padcode.
ID, padcode ) );
268 else if( nodeName == wxT(
"VIACODE" ) )
271 viacode.
Parse( cNode, aContext );
272 ViaCodes.insert( std::make_pair( viacode.
ID, viacode ) );
274 else if( nodeName == wxT(
"LAYERPAIR" ) )
277 layerpair.
Parse( cNode, aContext );
278 LayerPairs.insert( std::make_pair( layerpair.
ID, layerpair ) );
280 else if( nodeName == wxT(
"SPCCLASSSPACE" ) )
283 spcclassspace.
Parse( cNode, aContext );
284 SpacingClasses.push_back( spcclassspace );
296 wxASSERT( aNode->GetName() == wxT(
"MATERIAL" ) );
303 if( sType == wxT(
"CONSTRUCTION" ) )
307 else if( sType == wxT(
"ELECTRICAL" ) )
311 else if( sType == wxT(
"NONELEC" ) )
328 for( ; iNode; iNode = iNode->
GetNext() )
330 wxString nodeName = iNode->GetName();
332 if( nodeName == wxT(
"RELPERMIT" ) )
336 else if( nodeName == wxT(
"LOSSTANGENT" ) )
340 else if( nodeName == wxT(
"RESISTIVITY" ) )
354 wxASSERT( aNode->GetName() == wxT(
"LAYER" ) );
360 auto processLayerMaterialDetails = [&]() {
362 for( ; tempNode; tempNode = tempNode->
GetNext() )
364 wxString tempNodeName = tempNode->GetName();
366 if( tempNodeName == wxT(
"MAKE" ) || tempNodeName == wxT(
"LAYERHEIGHT" ) )
368 if( tempNodeName == wxT(
"LAYERHEIGHT" ) )
380 if( childOfTempNode )
382 if( childOfTempNode->GetName() == wxT(
"EMBEDS" ) )
386 if( embedsValue == wxT(
"UPWARDS" ) )
390 else if( embedsValue == wxT(
"DOWNWARDS" ) )
407 else if( tempNodeName == wxT(
"BIAS" ) )
411 if( bias == wxT(
"X_BIASED" ) )
415 else if( bias == wxT(
"Y_BIASED" ) )
419 else if( bias == wxT(
"ANTITRACK" ) )
423 else if( bias == wxT(
"OBSTACLE" ) )
427 else if( bias == wxT(
"UNBIASED" ) )
444 for( ; cNode; cNode = cNode->
GetNext() )
446 wxString cNodeName = cNode->GetName();
448 if( cNodeName == wxT(
"ALLDOC" ) )
452 else if( cNodeName == wxT(
"ALLELEC" ) )
456 else if( cNodeName == wxT(
"ALLLAYER" ) )
460 else if( cNodeName == wxT(
"ASSCOMPCOPP" ) )
464 else if( cNodeName == wxT(
"JUMPERLAYER" ) )
468 else if( cNodeName == wxT(
"NOLAYER" ) )
472 else if( cNodeName == wxT(
"POWER" ) )
476 processLayerMaterialDetails();
478 else if( cNodeName == wxT(
"DOC" ) )
482 else if( cNodeName == wxT(
"CONSTRUCTION" ) )
485 processLayerMaterialDetails();
487 else if( cNodeName == wxT(
"ELEC" ) )
491 processLayerMaterialDetails();
493 else if( cNodeName == wxT(
"NONELEC" ) )
497 processLayerMaterialDetails();
499 else if( cNodeName == wxT(
"DESCRIPTION" ) )
503 else if( cNodeName == wxT(
"REFPLANE" ) )
505 ReferencePlane =
true;
507 else if( cNodeName == wxT(
"VLAYER" ) )
511 else if( cNodeName == wxT(
"LASUBTYP" ) )
516 if( sSubType == wxT(
"LAYERSUBTYPE_ASSEMBLY" ) )
520 else if( sSubType == wxT(
"LAYERSUBTYPE_PASTE" ) )
524 else if( sSubType == wxT(
"LAYERSUBTYPE_PLACEMENT" ) )
528 else if( sSubType == wxT(
"LAYERSUBTYPE_SILKSCREEN" ) )
532 else if( sSubType == wxT(
"LAYERSUBTYPE_SOLDERRESIST" ) )
536 else if( sSubType == wxT(
"LAYERSUBTYPE_CLEARANCE" ) )
540 else if( sSubType == wxT(
"LAYERSUBTYPE_ROUT" ) )
560 wxASSERT( aNode->GetName() == wxT(
"COPREASSIGN" ) );
570 wxASSERT( aNode->GetName() == wxT(
"COPPERCODE" ) );
579 for( ; cNode; cNode = cNode->
GetNext() )
581 if( cNode->GetName() == wxT(
"COPREASSIGN" ) )
584 reassign.
Parse( cNode, aContext );
585 Reassigns.push_back( reassign );
597 wxASSERT( aNode->GetName() == wxT(
"SPACEREASSIGN" ) );
608 wxASSERT( aNode->GetName() == wxT(
"SPACINGCODE" ) );
615 for( ; cNode; cNode = cNode->
GetNext() )
617 wxString cNodeName = cNode->GetName();
619 if( cNodeName == wxT(
"SPACEREASSIGN" ) )
622 reassign.
Parse( cNode, aContext );
623 Reassigns.push_back( reassign );
635 wxString aNodeName = aNode->GetName();
637 if( aNodeName == wxT(
"ANNULUS" ) || aNodeName == wxT(
"BULLET" ) || aNodeName == wxT(
"ROUND" )
638 || aNodeName == wxT(
"DIAMOND" ) || aNodeName == wxT(
"FINGER" )
639 || aNodeName == wxT(
"OCTAGON" ) || aNodeName == wxT(
"RECTANGLE" )
640 || aNodeName == wxT(
"ROUNDED" ) || aNodeName == wxT(
"SQUARE" ) )
653 wxASSERT( IsPadShape( aNode ) );
655 wxString aNodeName = aNode->GetName();
657 if( aNodeName == wxT(
"ANNULUS" ) )
659 else if( aNodeName == wxT(
"BULLET" ) )
661 else if( aNodeName == wxT(
"ROUND" ) )
663 else if( aNodeName == wxT(
"DIAMOND" ) )
665 else if( aNodeName == wxT(
"FINGER" ) )
667 else if( aNodeName == wxT(
"OCTAGON" ) )
669 else if( aNodeName == wxT(
"RECTANGLE" ) )
671 else if( aNodeName == wxT(
"ROUNDED" ) )
673 else if( aNodeName == wxT(
"SQUARE" ) )
702 if( aNode->
GetChildren()->GetName() == wxT(
"ORIENT" ) )
724 wxASSERT( aNode->GetName() == wxT(
"PADREASSIGN" ) );
739 wxASSERT( aNode->GetName() == wxT(
"PADCODE" ) );
747 for( ; cNode; cNode = cNode->
GetNext() )
749 wxString cNodeName = cNode->GetName();
753 Shape.Parse( cNode, aContext );
755 else if( cNodeName == wxT(
"CLEARANCE" ) )
759 else if( cNodeName == wxT(
"RELIEFWIDTH" ) )
763 else if( cNodeName == wxT(
"DRILL" ) )
768 for( ; subNode; subNode = subNode->
GetNext() )
770 wxString subNodeName = subNode->GetName();
772 if( subNodeName == wxT(
"NONPLATED" ) )
774 else if( subNodeName == wxT(
"OVERSIZE" ) )
780 else if( cNodeName == wxT(
"DRILLLENGTH" ) )
784 else if( cNodeName == wxT(
"DRILLORIENTATION" ) )
788 else if( cNodeName == wxT(
"DRILLXOFFSET" ) )
792 else if( cNodeName == wxT(
"DRILLYOFFSET" ) )
796 else if( cNodeName == wxT(
"PADREASSIGN" ) )
799 reassign.
Parse( cNode, aContext );
800 Reassigns.insert( std::make_pair( reassign.
LayerID, reassign.
Shape ) );
812 wxASSERT( aNode->GetName() == wxT(
"VIAREASSIGN" ) );
827 wxASSERT( aNode->GetName() == wxT(
"VIACODE" ) );
835 for( ; cNode; cNode = cNode->
GetNext() )
837 wxString cNodeName = cNode->GetName();
841 Shape.Parse( cNode, aContext );
843 else if( cNodeName == wxT(
"CLEARANCE" ) )
847 else if( cNodeName == wxT(
"RELIEFWIDTH" ) )
851 else if( cNodeName == wxT(
"DRILL" ) )
856 for( ; subNode; subNode = subNode->
GetNext() )
858 wxString subNodeName = subNode->GetName();
860 if( subNodeName == wxT(
"OVERSIZE" ) )
866 else if( cNodeName == wxT(
"VIAREASSIGN" ) )
869 reassign.
Parse( cNode, aContext );
870 Reassigns.insert( std::make_pair( reassign.
LayerID, reassign.
Shape ) );
882 wxASSERT( aNode->GetName() == wxT(
"LAYERPAIR" ) );
894 if( aNode->
GetChildren()->GetName() == wxT(
"VIACODEREF" ) )
910 wxASSERT( aNode->GetName() == wxT(
"SPCCLASSSPACE" ) );
921 wxASSERT( aNode->GetName() == wxT(
"TECHNOLOGY" ) );
925 for( ; cNode; cNode = cNode->GetNext() )
927 wxString cNodeName = cNode->GetName();
929 if( ParseSubNode( cNode, aContext ) )
932 else if( cNodeName == wxT(
"MINROUTEWIDTH" ) )
936 else if( cNodeName == wxT(
"MINNECKED" ) )
940 else if( cNodeName == wxT(
"MINUNNECKED" ) )
944 else if( cNodeName == wxT(
"MINMITER" ) )
948 else if( cNodeName == wxT(
"MAXMITER" ) )
952 else if( cNodeName == wxT(
"MAXPHYSLAYER" ) )
956 else if( cNodeName == wxT(
"TRACKGRID" ) )
960 else if( cNodeName == wxT(
"VIAGRID" ) )
964 else if( cNodeName == wxT(
"BACKOFFJCTS" ) )
966 BackOffJunctions =
true;
968 else if( cNodeName == wxT(
"BCKOFFWIDCHANGE" ) )
970 BackOffWidthChange =
true;
980 const wxString& aPadSideString )
982 if( aPadSideString == wxT(
"THRU" ) )
984 else if( aPadSideString == wxT(
"BOTTOM" ) )
986 else if( aPadSideString == wxT(
"TOP" ) )
995 wxASSERT( aNode->GetName() == wxT(
"COMPCOPPER" ) );
1001 bool shapeIsInitialised =
false;
1002 wxString location = wxT(
"COMPCOPPER" );
1007 for( ; cNode; cNode = cNode->
GetNext() )
1009 wxString cNodeName = cNode->GetName();
1011 if( !shapeIsInitialised && Shape.IsShape( cNode ) )
1013 Shape.Parse( cNode, aContext );
1014 shapeIsInitialised =
true;
1016 else if( cNodeName == wxT(
"SWAPRULE" ) )
1020 else if( cNodeName == wxT(
"ASSOCPIN" ) )
1022 wxXmlAttribute* xmlAttribute = cNode->GetAttributes();
1024 for( ; xmlAttribute; xmlAttribute = xmlAttribute->GetNext() )
1031 if( !xmlAttribute->GetValue().ToLong( &padId ) )
1034 AssociatedPadIDs.push_back( (
PAD_ID) padId );
1049 wxASSERT( aNode->GetName() == wxT(
"COMPAREA" ) );
1056 bool shapeIsInitialised =
false;
1062 for( ; cNode; cNode = cNode->
GetNext() )
1064 wxString cNodeName = cNode->GetName();
1068 Shape.Parse( cNode, aContext );
1069 shapeIsInitialised =
true;
1071 else if( cNodeName == wxT(
"SWAPRULE" ) )
1075 else if( cNodeName == wxT(
"USAGE" ) )
1077 wxXmlAttribute* xmlAttribute = cNode->GetAttributes();
1079 for( ; xmlAttribute; xmlAttribute = xmlAttribute->GetNext() )
1084 if( xmlAttribute->GetValue() == wxT(
"NO_TRACKS" ) )
1086 else if( xmlAttribute->GetValue() == wxT(
"NO_VIAS" ) )
1104 wxASSERT( aNode->GetName() == wxT(
"EXITS" ) );
1106 wxXmlAttribute* xmlAttribute = aNode->GetAttributes();
1108 for( ; xmlAttribute; xmlAttribute = xmlAttribute->GetNext() )
1113 if( xmlAttribute->GetValue() == wxT(
"FREE" ) )
1115 else if( xmlAttribute->GetValue() == wxT(
"N" ) )
1117 else if( xmlAttribute->GetValue() == wxT(
"S" ) )
1119 else if( xmlAttribute->GetValue() == wxT(
"E" ) )
1121 else if( xmlAttribute->GetValue() == wxT(
"W" ) )
1123 else if( xmlAttribute->GetValue() == wxT(
"NE" ) )
1125 else if( xmlAttribute->GetValue() == wxT(
"NW" ) )
1127 else if( xmlAttribute->GetValue() == wxT(
"SE" ) )
1129 else if( xmlAttribute->GetValue() == wxT(
"SW" ) )
1141 wxASSERT( aNode->GetName() == wxT(
"PAD" ) );
1153 for( ; cNode; cNode = cNode->
GetNext() )
1155 wxString cNodeName = cNode->GetName();
1157 if( cNodeName == wxT(
"ORIENT" ) )
1159 else if( cNodeName == wxT(
"FIRSTPAD" ) )
1161 else if( cNodeName == wxT(
"EXITS" ) )
1162 Exits.Parse( cNode, aContext );
1163 else if( cNodeName == wxT(
"PADIDENTIFIER" ) )
1165 else if( cNodeName == wxT(
"PCBONLYPAD" ) )
1167 else if( cNodeName == wxT(
"PT" ) )
1168 Position.Parse( cNode, aContext );
1177 wxASSERT( aNode->GetName() == wxT(
"DIMARROW" ) );
1178 bool arrowStyleInitialised =
false;
1179 bool upperAngleInitialised =
false;
1180 bool lowerAngleInitialised =
false;
1187 for( ; cNode; cNode = cNode->
GetNext() )
1189 wxString cNodeName = cNode->GetName();
1191 if( cNodeName == wxT(
"ARROWSTYLE" ) )
1194 arrowStyleInitialised =
true;
1196 if( arrowStyleStr == wxT(
"DIMENSION_ARROWOPEN" ) )
1197 ArrowStyle = STYLE::OPEN;
1198 else if( arrowStyleStr == wxT(
"DIMENSION_ARROWCLOSED" ) )
1199 ArrowStyle = STYLE::CLOSED;
1200 else if( arrowStyleStr == wxT(
"DIMENSION_ARROWCLEAR" ) )
1202 else if( arrowStyleStr == wxT(
"DIMENSION_ARROWCLOSEDFILLED" ) )
1203 ArrowStyle = STYLE::CLOSED_FILLED;
1207 else if( cNodeName == wxT(
"ARROWANGLEA" ) )
1210 upperAngleInitialised =
true;
1212 else if( cNodeName == wxT(
"ARROWANGLEB" ) )
1215 lowerAngleInitialised =
true;
1223 if( !arrowStyleInitialised )
1226 if( !upperAngleInitialised )
1229 if( !lowerAngleInitialised )
1236 wxASSERT( aNode->GetName() == wxT(
"DIMTEXT" ) );
1243 if( cNode->GetName() != wxT(
"TXTSTYLE" ) )
1248 if( styleStr == wxT(
"DIMENSION_INTERNAL" ) )
1249 Style = STYLE::INSIDE;
1250 else if( styleStr == wxT(
"DIMENSION_EXTERNAL" ) )
1251 Style = STYLE::OUTSIDE;
1261 wxASSERT( aNode->GetName() == wxT(
"EXTLINE" ) );
1270 for( ; cNode; cNode = cNode->
GetNext() )
1272 wxString cNodeName = cNode->GetName();
1274 if( noOfPoints < 2 && cNodeName == wxT(
"PT" ) )
1278 if( noOfPoints == 1 )
1279 Start.Parse( cNode, aContext );
1281 End.Parse( cNode, aContext );
1283 else if( cNodeName == wxT(
"SUPPRESSFIRST" ) )
1285 SuppressFirst =
true;
1293 if( noOfPoints != 2 )
1300 if( aNode->GetName() == wxT(
"LEADERLINE" ) || aNode->GetName() == wxT(
"LINEARLINE" )
1301 || aNode->GetName() == wxT(
"ANGULARLINE" ) )
1314 wxASSERT( IsLine( aNode ) );
1316 if( aNode->GetName() == wxT(
"LINEARLINE" ) )
1317 Type = TYPE::LINEARLINE;
1318 else if( aNode->GetName() == wxT(
"LEADERLINE" ) )
1319 Type = TYPE::LEADERLINE;
1320 else if( aNode->GetName() == wxT(
"ANGULARLINE" ) )
1321 Type = TYPE::ANGULARLINE;
1323 wxASSERT_MSG(
true,
"Not a valid type. What happened to the node Name?" );
1327 if( Type == TYPE::LEADERLINE )
1335 int requiredNoOfPoints = 2;
1337 if( Type == TYPE::ANGULARLINE )
1338 requiredNoOfPoints = 3;
1340 for( ; cNode; cNode = cNode->
GetNext() )
1342 wxString cNodeName = cNode->GetName();
1344 if( cNodeName == wxT(
"DIMLINETYPE" ) )
1348 if( styleStr == wxT(
"DIMENSION_INTERNAL" ) )
1349 Style = STYLE::INTERNAL;
1350 else if( styleStr == wxT(
"DIMENSION_EXTERNAL" ) )
1351 Style = STYLE::EXTERNAL;
1355 else if( noOfPoints < requiredNoOfPoints && cNodeName == wxT(
"PT" ) )
1359 if( noOfPoints == 1 )
1360 Start.Parse( cNode, aContext );
1361 else if( noOfPoints == 2 )
1362 End.Parse( cNode, aContext );
1364 Centre.Parse( cNode, aContext );
1366 else if( Type == TYPE::LEADERLINE && cNodeName == wxT(
"LEADERANG" ) )
1376 if( noOfPoints != requiredNoOfPoints )
1383 if( aNode->GetName() == wxT(
"LINEARDIM" ) || aNode->GetName() == wxT(
"LEADERDIM" )
1384 || aNode->GetName() == wxT(
"ANGLEDIM" ) )
1397 wxASSERT( IsDimension( aNode ) );
1399 std::map<wxString, TYPE> typeMap = { { wxT(
"LINEARDIM" ), TYPE::LINEARDIM },
1400 { wxT(
"LEADERDIM" ), TYPE::LEADERDIM }, { wxT(
"ANGLEDIM" ), TYPE::ANGLEDIM } };
1403 wxASSERT_MSG( typeMap.find( aNode->GetName() ) != typeMap.end(),
1404 "Not a valid type. What happened to the node Name?" );
1406 Type = typeMap[aNode->GetName()];
1410 std::map<wxString, SUBTYPE> subTypeMap = {
1411 { wxT(
"DIMENSION_ORTHOGONAL" ), SUBTYPE::ORTHOGONAL },
1412 { wxT(
"DIMENSION_DIRECT" ), SUBTYPE::DIRECT },
1413 { wxT(
"DIMENSION_ANGLED" ), SUBTYPE::ANGLED },
1414 { wxT(
"DIMENSION_DIAMETER" ), SUBTYPE::DIAMETER },
1415 { wxT(
"DIMENSION_RADIUS" ), SUBTYPE::RADIUS },
1416 { wxT(
"DIMENSION_ANGULAR" ), SUBTYPE::ANGULAR } };
1418 if( subTypeMap.find( subTypeStr ) == subTypeMap.end() )
1421 Subtype = subTypeMap[subTypeStr];
1426 bool idParsed =
false;
1427 bool unitsParsed =
false;
1428 bool arrowParsed =
false;
1429 bool textFormatParsed =
false;
1430 bool extLineParsed =
false;
1431 bool lineParsed =
false;
1432 bool textParsed =
false;
1434 for( ; cNode; cNode = cNode->
GetNext() )
1436 wxString cNodeName = cNode->GetName();
1438 if( !idParsed && cNodeName == wxT(
"DIMREF" ) )
1443 else if( !unitsParsed && cNodeName == wxT(
"UNITS" ) )
1448 else if( !unitsParsed && cNodeName == wxT(
"ANGUNITS" ) )
1453 else if( !arrowParsed && cNodeName == wxT(
"DIMARROW" ) )
1455 Arrow.Parse( cNode, aContext );
1458 else if( !textFormatParsed && cNodeName == wxT(
"DIMTEXT" ) )
1460 TextParams.Parse( cNode, aContext );
1461 textFormatParsed =
true;
1463 else if( !extLineParsed && cNodeName == wxT(
"EXTLINE" ) )
1465 ExtensionLineParams.Parse( cNode, aContext );
1466 extLineParsed =
true;
1468 else if( !lineParsed && LINE::IsLine( cNode ) )
1470 Line.Parse( cNode, aContext );
1473 else if( !textParsed && cNodeName == wxT(
"TEXT" ) )
1476 Text.Parse( cNode, aContext,
false );
1479 else if( cNodeName == wxT(
"FIX" ) )
1483 else if( cNodeName == wxT(
"GROUPREF" ) )
1487 else if( cNodeName == wxT(
"REUSEBLOCKREF" ) )
1489 ReuseBlockRef.Parse( cNode, aContext );
1501 wxASSERT( aNode->GetName() == wxT(
"SYMDEF" ) );
1503 ParseIdentifiers( aNode, aContext );
1507 if( ReferenceName.StartsWith( wxT(
"JUMPERNF" ), &rest ) )
1509 else if( ReferenceName.StartsWith( wxT(
"STARPOINTNF" ), &rest ) )
1511 else if( ReferenceName == wxT(
"TESTPOINT" ) )
1518 for( ; cNode; cNode = cNode->
GetNext() )
1520 wxString cNodeName = cNode->GetName();
1522 if( ParseSubNode( cNode, aContext ) )
1526 else if( cNodeName == wxT(
"SYMHEIGHT" ) )
1530 else if( cNodeName == wxT(
"COMPCOPPER" ) )
1533 compcopper.
Parse( cNode, aContext );
1534 ComponentCoppers.push_back( compcopper );
1536 else if( cNodeName == wxT(
"COMPAREA" ) )
1539 area.
Parse( cNode, aContext );
1540 ComponentAreas.insert( std::make_pair( area.
ID, area ) );
1542 else if( cNodeName == wxT(
"PAD" ) )
1545 pad.
Parse( cNode, aContext );
1546 ComponentPads.insert( std::make_pair( pad.
ID, pad ) );
1548 else if( cNodeName == wxT(
"DIMENSIONS" ) )
1552 for( ; dimensionNode; dimensionNode = dimensionNode->
GetNext() )
1557 dim.
Parse( dimensionNode, aContext );
1558 Dimensions.insert( std::make_pair( dim.
ID, dim ) );
1572 if( !Stub && !Origin.IsFullySpecified() )
1579 wxASSERT( aNode->GetName() == wxT(
"LIBRARY" ) );
1583 for( ; cNode; cNode = cNode->GetNext() )
1585 wxString cNodeName = cNode->GetName();
1587 if( cNodeName == wxT(
"SYMDEF" ) )
1590 symdef.
Parse( cNode, aContext );
1591 ComponentDefinitions.insert( std::make_pair( symdef.
ID, symdef ) );
1603 wxASSERT( aNode->GetName() == wxT(
"BOARD" ) );
1609 bool shapeIsInitialised =
false;
1615 for( ; cNode; cNode = cNode->
GetNext() )
1617 wxString cNodeName = cNode->GetName();
1621 Shape.Parse( cNode, aContext );
1622 shapeIsInitialised =
true;
1624 else if( cNodeName == wxT(
"ATTR" ) )
1627 attr.
Parse( cNode, aContext );
1628 AttributeValues.insert( std::make_pair( attr.
AttributeID, attr ) );
1630 else if( cNodeName == wxT(
"FIX" ) )
1634 else if( cNodeName == wxT(
"GROUPREF" ) )
1638 else if( cNodeName == wxT(
"REUSEBLOCKREF" ) )
1640 ReuseBlockRef.Parse( cNode, aContext );
1652 wxASSERT( aNode->GetName() == wxT(
"AREA" ) );
1660 bool shapeIsInitialised =
false;
1666 for( ; cNode; cNode = cNode->
GetNext() )
1668 wxString cNodeName = cNode->GetName();
1672 Shape.Parse( cNode, aContext );
1673 shapeIsInitialised =
true;
1675 else if( cNodeName == wxT(
"FIX" ) )
1679 else if( cNodeName == wxT(
"USAGE" ) )
1681 wxXmlAttribute* xmlAttribute = cNode->GetAttributes();
1683 for( ; xmlAttribute; xmlAttribute = xmlAttribute->GetNext() )
1688 if( xmlAttribute->GetValue() == wxT(
"PLACEMENT" ) )
1690 else if( xmlAttribute->GetValue() == wxT(
"ROUTING" ) )
1692 else if( xmlAttribute->GetValue() == wxT(
"KEEPOUT" ) )
1694 else if( xmlAttribute->GetValue() == wxT(
"NO_TRACKS" ) )
1696 else if( xmlAttribute->GetValue() == wxT(
"NO_VIAS" ) )
1704 else if( cNodeName == wxT(
"AREAHEIGHT" ) )
1708 else if( cNodeName == wxT(
"GROUPREF" ) )
1712 else if( cNodeName == wxT(
"REUSEBLOCKREF" ) )
1714 ReuseBlockRef.Parse( cNode, aContext );
1716 else if( cNodeName == wxT(
"ATTR" ) )
1719 attr.
Parse( cNode, aContext );
1720 AttributeValues.insert( std::make_pair( attr.
AttributeID, attr ) );
1732 wxASSERT( aNode->GetName() == wxT(
"PINATTR" ) );
1738 for( ; cNode; cNode = cNode->
GetNext() )
1740 wxString cNodeName = cNode->GetName();
1742 if( cNodeName == wxT(
"ATTR" ) )
1745 attrVal.
Parse( cNode, aContext );
1746 AttributeValues.insert( std::make_pair( attrVal.
AttributeID, attrVal ) );
1748 else if( cNodeName == wxT(
"TESTLAND" ) )
1762 wxASSERT( aNode->GetName() == wxT(
"PADEXCEPTION" ) );
1768 for( ; cNode; cNode = cNode->
GetNext() )
1770 wxString cNodeName = cNode->GetName();
1772 if( cNodeName == wxT(
"PADCODEREF" ) )
1776 else if( cNodeName == wxT(
"EXITS" ) )
1778 OverrideExits =
true;
1779 Exits.Parse( cNode, aContext );
1781 else if( cNodeName == wxT(
"SIDE" ) )
1783 OverrideSide =
true;
1786 else if( cNodeName == wxT(
"ORIENT" ) )
1788 OverrideOrientation =
true;
1801 wxASSERT( aNode->GetName() == wxT(
"COMP" ) );
1809 bool originParsed =
false;
1811 for( ; cNode; cNode = cNode->
GetNext() )
1813 wxString cNodeName = cNode->GetName();
1815 if( !originParsed && cNodeName == wxT(
"PT" ) )
1817 Origin.Parse( cNode, aContext );
1818 originParsed =
true;
1820 else if( cNodeName == wxT(
"GROUPREF" ) )
1824 else if( cNodeName == wxT(
"REUSEBLOCKREF" ) )
1826 ReuseBlockRef.Parse( cNode, aContext );
1828 else if( cNodeName == wxT(
"TESTPOINT" ) )
1832 else if( cNodeName == wxT(
"FIX" ) )
1836 else if( cNodeName == wxT(
"MIRROR" ) )
1840 else if( cNodeName == wxT(
"READABILITY" ) )
1844 else if( cNodeName == wxT(
"ORIENT" ) )
1848 else if( cNodeName == wxT(
"VCOMPMASTER" ) )
1853 else if( cNodeName == wxT(
"TEXTLOC" ) )
1855 TEXT_LOCATION textloc;
1856 textloc.Parse( cNode, aContext );
1857 TextLocations.insert( std::make_pair( textloc.AttributeID, textloc ) );
1859 else if( cNodeName == wxT(
"ATTR" ) )
1861 ATTRIBUTE_VALUE attrVal;
1862 attrVal.Parse( cNode, aContext );
1863 AttributeValues.insert( std::make_pair( attrVal.AttributeID, attrVal ) );
1865 else if( cNodeName == wxT(
"PINATTR" ) )
1868 pinAttr.
Parse( cNode, aContext );
1869 PinAttributes.insert( std::make_pair( pinAttr.
Pin, pinAttr ) );
1871 else if( cNodeName == wxT(
"COMPPINLABEL" ) )
1875 PinLabels.insert( std::make_pair( pinID, pinLabel ) );
1877 else if( cNodeName == wxT(
"PADEXCEPTION" ) )
1880 padExcept.
Parse( cNode, aContext );
1881 PadExceptions.insert( std::make_pair( padExcept.
ID, padExcept ) );
1897 wxASSERT( aNode->GetName() == wxT(
"TESTLAND" ) );
1901 if( side == wxT(
"MIN_SIDE" ) )
1903 else if( side == wxT(
"MAX_SIDE" ) )
1905 else if( side == wxT(
"BOTH_SIDES" ) )
1916 wxASSERT( aNode->GetName() == wxT(
"TRUNK" ) );
1925 wxASSERT( aNode->GetName() == wxT(
"PIN" ) );
1936 ParseIdentifiers( aNode, aContext );
1939 for( ; cNode; cNode = cNode->
GetNext() )
1941 if( ParseSubNode( cNode, aContext ) )
1943 else if( cNode->GetName() == wxT(
"TRUNKREF" ) )
1953 wxASSERT( aNode->GetName() == wxT(
"VIA" ) );
1961 for( ; cNode; cNode = cNode->
GetNext() )
1963 wxString cNodeName = cNode->GetName();
1965 if( cNodeName == wxT(
"PT" ) )
1966 Location.Parse( cNode, aContext );
1967 else if( cNodeName == wxT(
"FIX" ) )
1969 else if( cNodeName == wxT(
"GROUPREF" ) )
1971 else if( cNodeName == wxT(
"REUSEBLOCKREF" ) )
1972 ReuseBlockRef.Parse( cNode, aContext );
1973 else if( cNodeName == wxT(
"TESTLAND" ) )
1975 else if( cNode->GetName() == wxT(
"TRUNKREF" ) )
1985 wxASSERT( aNode->GetName() == wxT(
"COPTERM" ) );
1995 wxASSERT( aNode->GetName() == wxT(
"ROUTEWIDTH" ) );
2000 if( nextNode->GetName() == wxT(
"FIX" ) )
2003 nextNode = nextNode->
GetNext();
2009 Vertex.Parse( nextNode, aContext );
2017 wxASSERT( aNode->GetName() == wxT(
"ROUTE" ) );
2023 bool startPointParsed =
false;
2025 for( ; cNode; cNode = cNode->
GetNext() )
2027 wxString cNodeName = cNode->GetName();
2029 if( !startPointParsed && cNodeName == wxT(
"PT" ) )
2031 startPointParsed =
true;
2032 StartPoint.Parse( cNode, aContext );
2034 else if( cNodeName == wxT(
"ROUTEWIDTH" ) )
2037 cNode = rtVert.
Parse( cNode, aContext );
2038 RouteVertices.push_back( rtVert );
2050 ParseIdentifiers( aNode, aContext );
2054 bool routeParsed =
false;
2056 for( ; cNode; cNode = cNode->
GetNext() )
2058 wxString cNodeName = cNode->GetName();
2060 if( ParseSubNode( cNode, aContext ) )
2064 else if( !Unrouted && !routeParsed && cNodeName == wxT(
"ROUTE" ) )
2066 Route.Parse( cNode, aContext );
2069 else if( !routeParsed && cNodeName == wxT(
"UNROUTE" ) )
2074 else if( cNode->GetName() == wxT(
"TRUNKREF" ) )
2088 ParseIdentifiers( aNode, aContext );
2093 for( ; cNode; cNode = cNode->
GetNext() )
2095 wxString cNodeName = cNode->GetName();
2097 if( cNodeName == wxT(
"JPT" ) )
2100 jpt.
Parse( cNode, aContext );
2101 Junctions.insert( std::make_pair( jpt.
ID, jpt ) );
2103 else if( ParseSubNode( cNode, aContext ) )
2107 else if( cNodeName == wxT(
"PIN" ) )
2110 pin.
Parse( cNode, aContext );
2111 Pins.insert( std::make_pair( pin.
ID, pin ) );
2113 else if( cNodeName == wxT(
"VIA" ) )
2116 via.
Parse( cNode, aContext );
2117 Vias.insert( std::make_pair( via.
ID, via ) );
2119 else if( cNodeName == wxT(
"COPTERM" ) )
2122 cterm.
Parse( cNode, aContext );
2123 CopperTerminals.insert( std::make_pair( cterm.
ID, cterm ) );
2125 else if( cNodeName == wxT(
"CONN" ) )
2128 conn.
Parse( cNode, aContext );
2129 Connections.push_back( conn );
2141 wxASSERT( aNode->GetName() == wxT(
"POURING" ) );
2153 if( MinIsolCopStr == wxT(
"NONE" ) )
2160 if( MinDisjCopStr == wxT(
"NONE" ) )
2167 for( ; cNode; cNode = cNode->
GetNext() )
2169 wxString cNodeName = cNode->GetName();
2171 if( cNodeName == wxT(
"NOPINRELIEF" ) )
2173 ThermalReliefOnPads =
false;
2175 else if( cNodeName == wxT(
"NOVIARELIEF" ) )
2177 ThermalReliefOnVias =
false;
2179 else if( cNodeName == wxT(
"IGNORETRN" ) )
2181 AllowInNoRouting =
true;
2183 else if( cNodeName == wxT(
"BOXPINS" ) )
2185 BoxIsolatedPins =
true;
2187 else if( cNodeName == wxT(
"REGENERATE" ) )
2189 AutomaticRepour =
true;
2191 else if( cNodeName == wxT(
"AUTOROUTETARGET" ) )
2193 TargetForAutorouting =
true;
2195 else if( cNodeName == wxT(
"THERMALCUTOUT" ) )
2197 ReliefType = RELIEF_TYPE::CUTOUTS;
2199 else if( cNodeName == wxT(
"FILLED" ) )
2203 else if( cNodeName == wxT(
"HATCHCODEREF" ) )
2205 FillType = COPPER_FILL_TYPE::HATCHED;
2218 wxASSERT( aNode->GetName() == wxT(
"TEMPLATE" ) );
2227 bool shapeParsed =
false;
2228 bool pouringParsed =
false;
2230 for( ; cNode; cNode = cNode->
GetNext() )
2232 wxString cNodeName = cNode->GetName();
2236 Shape.Parse( cNode, aContext );
2239 else if( !pouringParsed && cNodeName == wxT(
"POURING" ) )
2241 Pouring.Parse( cNode, aContext );
2242 pouringParsed =
true;
2244 else if( cNodeName == wxT(
"FIX" ) )
2248 else if( cNodeName == wxT(
"GROUPREF" ) )
2252 else if( cNodeName == wxT(
"REUSEBLOCKREF" ) )
2254 ReuseBlockRef.Parse( cNode, aContext );
2256 else if( cNodeName == wxT(
"ATTR" ) )
2259 attr.
Parse( cNode, aContext );
2260 AttributeValues.insert( std::make_pair( attr.
AttributeID, attr ) );
2272 wxASSERT( aNode->GetName() == wxT(
"TERM" ) );
2277 bool locationParsed =
false;
2279 for( ; cNode; cNode = cNode->
GetNext() )
2281 wxString cNodeName = cNode->GetName();
2283 if( !locationParsed && cNodeName == wxT(
"PT" ) )
2285 Location.Parse( cNode, aContext );
2286 locationParsed =
true;
2288 else if( cNodeName == wxT(
"FIX" ) )
2302 wxASSERT( aNode->GetName() == wxT(
"NETREF" ) );
2308 for( ; cNode; cNode = cNode->
GetNext() )
2310 wxString cNodeName = cNode->GetName();
2312 if( cNodeName == wxT(
"TERM" ) )
2315 term.
Parse( cNode, aContext );
2316 CopperTerminals.insert( std::make_pair( term.
ID, term ) );
2318 else if( cNodeName == wxT(
"FIX" ) )
2332 wxASSERT( aNode->GetName() == wxT(
"COPPER" ) );
2339 bool shapeParsed =
false;
2340 bool netRefParsed =
false;
2342 for( ; cNode; cNode = cNode->
GetNext() )
2344 wxString cNodeName = cNode->GetName();
2348 Shape.Parse( cNode, aContext );
2351 else if( !netRefParsed && cNodeName == wxT(
"NETREF" ) )
2353 NetRef.Parse( cNode, aContext );
2354 netRefParsed =
true;
2356 else if( cNodeName == wxT(
"FIX" ) )
2360 else if( cNodeName == wxT(
"GROUPREF" ) )
2364 else if( cNodeName == wxT(
"REUSEBLOCKREF" ) )
2366 ReuseBlockRef.Parse( cNode, aContext );
2368 else if( cNodeName == wxT(
"POURED" ) )
2372 else if( cNodeName == wxT(
"ATTR" ) )
2374 ATTRIBUTE_VALUE attr;
2375 attr.Parse( cNode, aContext );
2376 AttributeValues.insert( std::make_pair( attr.AttributeID, attr ) );
2388 wxASSERT( aNode->GetName() == wxT(
"DRILLTABLE" ) );
2394 bool positionParsed =
false;
2396 for( ; cNode; cNode = cNode->
GetNext() )
2398 wxString cNodeName = cNode->GetName();
2400 if( !positionParsed && cNodeName == wxT(
"PT" ) )
2402 Position.Parse( cNode, aContext );
2403 positionParsed =
true;
2405 else if( cNodeName == wxT(
"ORIENT" ) )
2409 else if( cNodeName == wxT(
"MIRROR" ) )
2413 else if( cNodeName == wxT(
"FIX" ) )
2417 else if( cNodeName == wxT(
"READABILITY" ) )
2421 else if( cNodeName == wxT(
"GROUPREF" ) )
2425 else if( cNodeName == wxT(
"REUSEBLOCKREF" ) )
2427 ReuseBlockRef.Parse( cNode, aContext );
2439 wxASSERT( aNode->GetName() == wxT(
"LAYOUT" ) );
2442 bool netSynchParsed =
false;
2443 bool dimensionsParsed =
false;
2445 for( ; cNode; cNode = cNode->GetNext() )
2447 wxString cNodeName = cNode->GetName();
2449 if( !netSynchParsed && cNodeName == wxT(
"NETSYNCH" ) )
2451 std::map<wxString, NETSYNCH> netSynchMap = { { wxT(
"WARNING" ),
NETSYNCH::WARNING },
2456 if( netSynchMap.find( nsString ) == netSynchMap.end() )
2459 NetSynch = netSynchMap[nsString];
2460 netSynchParsed =
true;
2462 else if( cNodeName == wxT(
"GROUP" ) )
2465 group.
Parse( cNode, aContext );
2466 Groups.insert( std::make_pair( group.
ID, group ) );
2468 else if( cNodeName == wxT(
"REUSEBLOCK" ) )
2471 reuseblock.
Parse( cNode, aContext );
2472 ReuseBlocks.insert( std::make_pair( reuseblock.
ID, reuseblock ) );
2474 else if( cNodeName == wxT(
"BOARD" ) )
2477 board.
Parse( cNode, aContext );
2478 Boards.insert( std::make_pair( board.
ID, board ) );
2480 else if( cNodeName == wxT(
"FIGURE" ) )
2483 figure.
Parse( cNode, aContext );
2484 Figures.insert( std::make_pair( figure.
ID, figure ) );
2486 else if( cNodeName == wxT(
"AREA" ) )
2489 area.
Parse( cNode, aContext );
2490 Areas.insert( std::make_pair( area.
ID, area ) );
2492 else if( cNodeName == wxT(
"COMP" ) )
2495 comp.
Parse( cNode, aContext );
2496 Components.insert( std::make_pair( comp.
ID, comp ) );
2498 else if( cNodeName == wxT(
"TRUNK" ) )
2501 trunk.
Parse( cNode, aContext );
2502 Trunks.insert( std::make_pair( trunk.
ID, trunk ) );
2504 else if( cNodeName == wxT(
"NET" ) )
2507 net.
Parse( cNode, aContext );
2508 Nets.insert( std::make_pair( net.
ID, net ) );
2510 else if( cNodeName == wxT(
"TEMPLATE" ) )
2513 temp.
Parse( cNode, aContext );
2514 Templates.insert( std::make_pair( temp.
ID, temp ) );
2516 else if( cNodeName == wxT(
"COPPER" ) )
2519 copper.
Parse( cNode, aContext );
2520 Coppers.insert( std::make_pair( copper.
ID, copper ) );
2522 else if( cNodeName == wxT(
"TEXT" ) )
2525 txt.
Parse( cNode, aContext );
2526 Texts.insert( std::make_pair( txt.
ID, txt ) );
2528 else if( cNodeName == wxT(
"DOCSYMBOL" ) )
2531 docsym.
Parse( cNode, aContext );
2532 DocumentationSymbols.insert( std::make_pair( docsym.
ID, docsym ) );
2534 else if( !dimensionsParsed && cNodeName == wxT(
"DIMENSIONS" ) )
2538 for( ; dimensionNode; dimensionNode = dimensionNode->
GetNext() )
2543 dim.
Parse( dimensionNode, aContext );
2544 Dimensions.insert( std::make_pair( dim.
ID, dim ) );
2552 dimensionsParsed =
true;
2554 else if( cNodeName == wxT(
"DRILLTABLE" ) )
2557 drilltable.
Parse( cNode, aContext );
2558 DrillTables.insert( std::make_pair( drilltable.
ID, drilltable ) );
2560 else if( cNodeName == wxT(
"VHIERARCHY" ) )
2562 VariantHierarchy.Parse( cNode, aContext );
2564 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
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)
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
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)
NETELEMENT_ID ID
First character is "P".
#define THROW_MISSING_PARAMETER_IO_ERROR(param, location)
static bool IsPadShape(XNODE *aNode)
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
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.
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
static XNODE * LoadArchiveFile(const wxString &aFileName, const wxString &aFileTypeIdentifier)
Reads a CADSTAR Archive file (S-parameter format)
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)
Returns a pointer to the last node.
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)
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)
NETELEMENT_ID ID
First character is "V".
static bool IsLine(XNODE *aNode)
static void CheckNoNextNodes(XNODE *aNode)
Inbuilt layer type (cannot be assigned to user layers)
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
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
#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: