69 long long maxDesignSizekicad = std::numeric_limits<int>::max();
71 if( designSizeXkicad > maxDesignSizekicad || designSizeYkicad > maxDesignSizekicad )
76 _(
"The design is too large and cannot be imported into KiCad. \n"
77 "Please reduce the maximum design size in CADSTAR by navigating to: \n"
78 "Design Tab -> Properties -> Design Options -> Maximum Design Size. \n"
79 "Current Design size: %.2f, %.2f millimeters. \n"
80 "Maximum permitted design size: %.2f, %.2f millimeters.\n" ),
94 _(
"The selected file indicates that nets might be out of synchronisation "
95 "with the schematic. It is recommended that you carry out an 'Align Nets' "
96 "procedure in CADSTAR and re-import, to avoid inconsistencies between the "
97 "PCB and the schematic. " ) );
107 long numSteps =
Layout.Coppers.size();
110 numSteps += (
Layout.Templates.size() *
Layout.Templates.size() ) / 2;
134 wxLogError( wxString::Format(
_(
"Unable to determine zone fill priorities for layer "
135 "'%s'. A best attempt has been made but it is "
136 "possible that DRC errors exist and that manual "
137 "editing of the zone priorities is required." ),
138 m_board->GetLayerName(
id ) ) );
145 if(
Layout.Trunks.size() > 0 )
148 _(
"The CADSTAR design contains Trunk routing elements, which have no KiCad "
149 "equivalent. These elements were not loaded." ) );
152 if(
Layout.VariantHierarchy.Variants.size() > 0 )
154 wxLogWarning( wxString::Format(
155 _(
"The CADSTAR design contains variants which has no KiCad equivalent. Only "
156 "the variant '%s' was loaded." ),
157 Layout.VariantHierarchy.Variants.begin()->second.Name ) );
160 if(
Layout.ReuseBlocks.size() > 0 )
163 _(
"The CADSTAR design contains re-use blocks which has no KiCad equivalent. The "
164 "re-use block information has been discarded during the import." ) );
167 wxLogWarning(
_(
"CADSTAR fonts are different to the ones in KiCad. This will likely result "
168 "in alignment issues that may cause DRC errors. Please review the imported "
169 "text elements carefully and correct manually if required." ) );
172 _(
"The CADSTAR design has been imported successfully.\n"
173 "Please review the import errors and warnings (if any)." ) );
178 std::vector<FOOTPRINT*> retval;
180 for( std::pair<SYMDEF_ID, FOOTPRINT*> fpPair :
m_libraryMap )
182 retval.push_back(
static_cast<FOOTPRINT*
>( fpPair.second->Clone() ) );
198 for( std::pair<SYMDEF_ID, FOOTPRINT*> libItem :
m_libraryMap )
219 std::vector<std::unique_ptr<FOOTPRINT>> retval;
223 footprint->SetParent(
nullptr );
224 retval.emplace_back( footprint );
242 wxLogWarning( wxString::Format(
243 _(
"The CADSTAR layer '%s' has no KiCad equivalent. All elements on this "
244 "layer have been mapped to KiCad layer '%s' instead." ),
245 aCadstarLayerName,
LSET::Name( aKiCadLayer ) ) );
255 wxLogMessage( wxString::Format(
256 _(
"The CADSTAR layer '%s' has been assumed to be a technical layer. All "
257 "elements on this layer have been mapped to KiCad layer '%s'." ),
258 aCadstarLayerName,
LSET::Name( aKiCadLayer ) ) );
265 int aDielectricSublayer )
277 if( !aCadstarLayer.
Name.IsEmpty() )
291 LAYER_ID ElecLayerID = wxEmptyString;
294 std::vector<LAYER_ID> ConstructionLayers;
299 bool IsInitialised() {
return !ElecLayerID.IsEmpty() || ConstructionLayers.size() > 0; };
302 std::vector<LAYER_BLOCK> cadstarBoardStackup;
303 LAYER_BLOCK currentBlock;
315 if( currentBlock.IsInitialised() )
317 cadstarBoardStackup.push_back( currentBlock );
318 currentBlock = LAYER_BLOCK();
321 currentBlock.ElecLayerID = cadstarLayerID;
328 wxLogWarning( wxString::Format(
_(
"The CADSTAR construction layer '%s' is on "
329 "the outer surface of the board. It has been "
331 cadstarLayer.
Name ) );
335 currentBlock.ConstructionLayers.push_back( cadstarLayerID );
340 if( currentBlock.IsInitialised() )
341 cadstarBoardStackup.push_back( currentBlock );
346 if( cadstarBoardStackup.back().ConstructionLayers.size() > 0 )
348 for(
const LAYER_ID& layerID : cadstarBoardStackup.back().ConstructionLayers )
352 wxLogWarning( wxString::Format(
_(
"The CADSTAR construction layer '%s' is on "
353 "the outer surface of the board. It has been "
355 cadstarLayer.
Name ) );
358 cadstarBoardStackup.back().ConstructionLayers.clear();
364 LAYER_BLOCK bottomLayer = cadstarBoardStackup.back();
365 cadstarBoardStackup.pop_back();
367 LAYER_BLOCK secondToLastLayer = cadstarBoardStackup.back();
368 cadstarBoardStackup.pop_back();
370 LAYER_BLOCK dummyLayer;
372 if( secondToLastLayer.ConstructionLayers.size() > 0 )
374 LAYER_ID lastConstruction = secondToLastLayer.ConstructionLayers.back();
376 if( secondToLastLayer.ConstructionLayers.size() > 1 )
380 secondToLastLayer.ConstructionLayers.pop_back();
386 Assignments.Layerdefs.Layers.at( lastConstruction ).Thickness /= 2;
389 dummyLayer.ConstructionLayers.push_back( lastConstruction );
392 cadstarBoardStackup.push_back( secondToLastLayer );
393 cadstarBoardStackup.push_back( dummyLayer );
394 cadstarBoardStackup.push_back( bottomLayer );
399 wxASSERT( cadstarBoardStackup.back().ConstructionLayers.size() == 0 );
410 size_t stackIndex = 0;
416 LAYER_ID layerID = cadstarBoardStackup.at( stackIndex ).ElecLayerID;
418 if( layerID.IsEmpty() )
421 item->SetThickness( 0 );
429 switch( copperLayer.
Type )
445 wxFAIL_MSG( wxT(
"Unexpected Layer type. Was expecting an electrical type" ) );
449 m_board->SetLayerType( item->GetBrdLayerId(), copperType );
450 m_board->SetLayerName( item->GetBrdLayerId(), item->GetLayerName() );
451 m_layermap.insert( { copperLayer.
ID, item->GetBrdLayerId() } );
456 LAYER_BLOCK layerBlock = cadstarBoardStackup.at( stackIndex );
457 LAYER_BLOCK layerBlockBelow = cadstarBoardStackup.at( stackIndex + 1 );
459 if( layerBlock.ConstructionLayers.size() == 0 )
465 int dielectricId = stackIndex + 1;
466 item->SetDielectricLayerId( dielectricId );
471 if( layerBlock.ElecLayerID.IsEmpty() )
478 LAYER copperLayer =
Assignments.Layerdefs.Layers.at( layerBlock.ElecLayerID );
480 if( layerBlockBelow.ElecLayerID.IsEmpty() )
491 LAYER copperLayerBelow =
492 Assignments.Layerdefs.Layers.at( layerBlockBelow.ElecLayerID );
509 int dielectricSublayer = 0;
511 for(
LAYER_ID constructionLaID : layerBlock.ConstructionLayers )
513 LAYER dielectricLayer =
Assignments.Layerdefs.Layers.at( constructionLaID );
515 if( dielectricSublayer )
516 item->AddDielectricPrms( dielectricSublayer );
519 m_board->SetLayerName( item->GetBrdLayerId(), item->GetLayerName() );
520 m_layermap.insert( { dielectricLayer.
ID, item->GetBrdLayerId() } );
521 ++dielectricSublayer;
528 item->SetColor( wxT(
"White" ) );
532 item->SetColor( wxT(
"Green" ) );
540 int numElecLayersProcessed = 0;
543 int currentDocLayer = 0;
551 wxString layerName = curLayer.
Name.Lower();
564 kicadLayerID = aBack;
566 kicadLayerID = aFront;
570 case LOG_LEVEL::NONE:
577 case LOG_LEVEL::WARN:
583 switch( curLayer.
Type )
591 THROW_IO_ERROR( wxString::Format(
_(
"Unexpected layer '%s' in layer stack." ),
598 ++numElecLayersProcessed;
606 if( currentDocLayer >= docLayers.size() )
609 kicadLayerID = docLayers.at( currentDocLayer++ );
627 if( layerName.Contains( wxT(
"glue" ) ) || layerName.Contains( wxT(
"adhesive" ) ) )
631 else if( layerName.Contains( wxT(
"silk" ) ) || layerName.Contains( wxT(
"legend" ) ) )
635 else if( layerName.Contains( wxT(
"assembly" ) ) || layerName.Contains( wxT(
"fabrication" ) ) )
639 else if( layerName.Contains( wxT(
"resist" ) ) || layerName.Contains( wxT(
"mask" ) ) )
643 else if( layerName.Contains( wxT(
"paste" ) ) )
674 wxFAIL_MSG( wxT(
"Unknown CADSTAR Layer Sub-type" ) );
680 wxFAIL_MSG( wxT(
"Unknown CADSTAR Layer Type" ) );
695 std::vector<INPUT_LAYER_DESC> inputLayers;
696 std::map<wxString, LAYER_ID> cadstarLayerNameMap;
698 for( std::pair<LAYER_ID, PCB_LAYER_ID> layerPair :
m_layermap )
710 inputLayers.push_back( iLdesc );
711 cadstarLayerNameMap.insert( { curLayer->
Name, curLayer->
ID } );
715 if( inputLayers.size() == 0 )
721 for( std::pair<wxString, PCB_LAYER_ID> layerPair : reMappedLayers )
725 wxFAIL_MSG( wxT(
"Unexpected Layer ID" ) );
729 LAYER_ID cadstarLayerID = cadstarLayerNameMap.at( layerPair.first );
730 m_layermap.at( cadstarLayerID ) = layerPair.second;
731 enabledLayers |=
LSET( { layerPair.second } );
734 m_board->SetEnabledLayers( enabledLayers );
735 m_board->SetVisibleLayers( enabledLayers );
742 std::map<SPACINGCODE_ID, SPACINGCODE>& spacingCodes =
Assignments.Codedefs.SpacingCodes;
745 [&]( wxString aID,
int* aVal )
747 if( spacingCodes.find( aID ) == spacingCodes.end() )
748 wxLogWarning(
_(
"Design rule %s was not found. This was ignored." ) );
766 auto applyNetClassRule = [&]( wxString aID,
const std::shared_ptr<NETCLASS>& aNetClassPtr )
769 applyRule( aID, &value );
772 aNetClassPtr->SetClearance( value );
777 wxLogWarning(
_(
"KiCad design rules are different from CADSTAR ones. Only the compatible "
778 "design rules were imported. It is recommended that you review the design "
779 "rules that have been applied." ) );
785 for( std::pair<SYMDEF_ID, SYMDEF_PCB> symPair :
Library.ComponentDefinitions )
795 if( component.
Figures.size() > 0 )
798 componentLayer = firstFigure.
LayerID;
800 else if( component.
Texts.size() > 0 )
802 TEXT firstText = component.
Texts.begin()->second;
803 componentLayer = firstText.
LayerID;
826 m_libraryMap.insert( std::make_pair( key, footprint ) );
834 for( std::pair<FIGURE_ID, FIGURE> figPair : aComponent.
Figures )
836 FIGURE& fig = figPair.second;
843 wxString::Format( wxT(
"Component %s:%s -> Figure %s" ),
856 bool compCopperError =
false;
863 LSET remainingLayers = layers;
891 std::unique_ptr<PAD>
pad = std::make_unique<PAD>( aFootprint );
893 pad->SetLayerSet( copperLayers );
894 pad->SetNumber( anchorPad.
Identifier.IsEmpty() ? wxString::Format( wxT(
"%ld" ), anchorPad.
ID )
904 if( anchorSize <= 0 )
910 pad->SetPosition( anchorPos );
913 shapePolys.
Move( -anchorPos );
930 remainingLayers ^= copperLayers;
933 if( remainingLayers.any() )
938 wxString::Format( wxT(
"Component %s:%s -> Copper element" ),
950 for( std::pair<COMP_AREA_ID, COMPONENT_AREA> areaPair : aComponent.
ComponentAreas )
956 int lineThickness = 0;
981 libName << wxT(
" (" ) << aComponent.
Alternate << wxT(
")" );
983 wxLogError( wxString::Format(
_(
"The CADSTAR area '%s' in library component '%s' does not "
984 "have a KiCad equivalent. The area is neither a via nor "
985 "route keepout area. The area was not imported." ),
986 area.
ID, libName ) );
995 for( std::pair<PAD_ID, COMPONENT_PAD> padPair : aComponent.
ComponentPads )
1011 std::unique_ptr<PAD>
pad = std::make_unique<PAD>( aParent );
1014 switch( aCadstarPad.
Side )
1029 wxFAIL_MSG( wxT(
"Unknown Pad type" ) );
1033 pad->SetLocalSolderMaskMargin( 0 );
1034 pad->SetLocalSolderPasteMargin( 0 );
1035 pad->SetLocalSolderPasteMarginRatio( 0.0 );
1036 bool complexPadErrorLogged =
false;
1038 for(
auto& [layer, shape] : csPadcode.
Reassigns )
1042 if( shape.Size == 0 )
1045 padLayerSet.
reset( kiLayer );
1053 std::optional<int> localMargin =
pad->GetLocalSolderMaskMargin();
1055 if( !localMargin.has_value() )
1056 pad->SetLocalSolderMaskMargin( newMargin );
1058 pad->SetLocalSolderMaskMargin( newMargin );
1062 std::optional<int> localMargin =
pad->GetLocalSolderPasteMargin();
1064 if( !localMargin.has_value() )
1065 pad->SetLocalSolderPasteMargin( newMargin );
1067 pad->SetLocalSolderPasteMargin( newMargin );
1073 if( !complexPadErrorLogged )
1075 complexPadErrorLogged =
true;
1076 errorMSG += wxT(
"\n - " )
1077 + wxString::Format(
_(
"The CADSTAR pad definition '%s' is a complex pad stack, "
1078 "which is not supported in KiCad. Please review the "
1079 "imported pads as they may require manual correction." ),
1086 pad->SetLayerSet( padLayerSet );
1093 pad->SetNumber( wxT(
"" ) );
1097 pad->SetNumber( aCadstarPad.
Identifier.IsEmpty() ? wxString::Format( wxT(
"%ld" ), aCadstarPad.
ID )
1219 wxFAIL_MSG( wxT(
"Unknown Pad Shape" ) );
1254 pad->SetDrillSize( { 0, 0 } );
1259 LSET lset =
pad->GetLayerSet();
1262 if( lset.size() > 0 )
1266 int maxError =
m_board->GetDesignSettings().m_MaxError;
1268 pad->SetPosition( { 0, 0 } );
1269 pad->TransformShapeToPolygon( padOutline, layer, 0, maxError,
ERROR_INSIDE );
1276 padShape->
Move( padOffset - drillOffset );
1281 if( editedPadOutline.
Contains( { 0, 0 } ) )
1287 padOffset = { 0, 0 };
1294 drillOffset = { 0, 0 };
1296 errorMSG += wxT(
"\n - " )
1297 + wxString::Format(
_(
"The CADSTAR pad definition '%s' has the hole shape outside the "
1298 "pad shape. The hole has been moved to the center of the pad." ),
1304 wxFAIL_MSG( wxT(
"No copper layers defined in the pad?" ) );
1327 wxLogError(
_(
"The CADSTAR pad definition '%s' has import errors: %s" ),
1334 return pad.release();
1340 size_t index = aCadstarPadID - (long) 1;
1344 THROW_IO_ERROR( wxString::Format(
_(
"Unable to find pad index '%d' in footprint '%s'." ),
1345 (
long) aCadstarPadID,
1355 for( std::pair<GROUP_ID, GROUP> groupPair :
Layout.Groups )
1357 GROUP& csGroup = groupPair.second;
1369 for( std::pair<GROUP_ID, GROUP> groupPair :
Layout.Groups )
1371 GROUP& csGroup = groupPair.second;
1373 if( !csGroup.
GroupID.IsEmpty() )
1377 THROW_IO_ERROR( wxString::Format(
_(
"Unable to find group ID %s in the group definitions." ),
1382 THROW_IO_ERROR( wxString::Format(
_(
"Unable to find sub group %s in the group map (parent "
1383 "group ID=%s, Name=%s)." ),
1392 parentGroup->
AddItem( kiCadGroup );
1401 for( std::pair<BOARD_ID, CADSTAR_BOARD> boardPair :
Layout.Boards )
1407 wxString::Format( wxT(
"BOARD %s" ), board.
ID ),
m_board, boardGroup );
1409 if( !board.
GroupID.IsEmpty() )
1419 for( std::pair<FIGURE_ID, FIGURE> figPair :
Layout.Figures )
1421 FIGURE& fig = figPair.second;
1438 for( std::pair<TEXT_ID, TEXT> txtPair :
Layout.Texts )
1440 TEXT& csTxt = txtPair.second;
1448 for( std::pair<DIMENSION_ID, DIMENSION> dimPair :
Layout.Dimensions )
1452 switch( csDim.
Type )
1454 case DIMENSION::TYPE::LINEARDIM:
1457 case DIMENSION::SUBTYPE::ANGLED:
1458 wxLogWarning( wxString::Format(
_(
"Dimension ID %s is an angled dimension, which has no KiCad "
1459 "equivalent. An aligned dimension was loaded instead." ),
1462 case DIMENSION::SUBTYPE::DIRECT:
1463 case DIMENSION::SUBTYPE::ORTHOGONAL:
1465 if( csDim.
Line.
Style == DIMENSION::LINE::STYLE::EXTERNAL )
1467 wxLogWarning( wxString::Format(
_(
"Dimension ID %s has 'External' style in CADSTAR. External "
1468 "dimension styles are not yet supported in KiCad. The "
1469 "dimension object was imported with an internal dimension "
1476 if( csDim.
Subtype == DIMENSION::SUBTYPE::ORTHOGONAL )
1499 VECTOR2I crossbarVector = crossbarEnd - crossbarStart;
1501 double height = 0.0;
1503 if( csDim.
Subtype == DIMENSION::SUBTYPE::ORTHOGONAL )
1506 height = heightVector.
y;
1508 height = heightVector.
x;
1514 height = heightVector.
x * angle.
Cos() + heightVector.
y * angle.
Sin();
1524 wxLogError(
_(
"Unexpected Dimension type (ID %s). This was not imported." ), csDim.
ID );
1529 case DIMENSION::TYPE::LEADERDIM:
1532 if( csDim.
Line.
Style == DIMENSION::LINE::STYLE::INTERNAL )
1656 case DIMENSION::TYPE::ANGLEDIM:
1658 wxLogError(
_(
"Dimension %s is an angular dimension which has no KiCad equivalent. "
1659 "The object was not imported." ),
1669 for( std::pair<AREA_ID, AREA> areaPair :
Layout.Areas )
1671 AREA& area = areaPair.second;
1675 int lineThickness = 0;
1698 wxLogWarning( wxString::Format(
_(
"The CADSTAR area '%s' is marked as a placement area in "
1699 "CADSTAR. Placement areas are not supported in KiCad. Only "
1700 "the supported elements for the area were imported." ),
1706 wxLogError( wxString::Format(
_(
"The CADSTAR area '%s' does not have a KiCad equivalent. Pure "
1707 "Placement areas are not supported." ),
1722 for( std::pair<COMPONENT_ID, COMPONENT> compPair :
Layout.Components )
1726 if( !
comp.VariantID.empty() &&
comp.VariantParentComponentID !=
comp.ID )
1733 THROW_IO_ERROR( wxString::Format(
_(
"Unable to find component '%s' in the library (Symdef ID: '%s')" ),
1738 FOOTPRINT* libFootprint = fpIter->second;
1749 if(
Parts.PartDefinitions.find(
comp.PartID ) !=
Parts.PartDefinitions.end() )
1757 for( std::pair<PART_DEFINITION_PIN_ID, PART::DEFINITION::PIN> pinPair :
1760 PART::DEFINITION::PIN
pin = pinPair.second;
1761 wxString pinName =
pin.Name;
1763 if( pinName.empty() )
1764 pinName =
pin.Identifier;
1766 if( pinName.empty() )
1767 pinName = wxString::Format( wxT(
"%ld" ),
pin.ID );
1775 if(
comp.PadExceptions.size() > 0 )
1779 for( std::pair<PAD_ID, PADEXCEPTION> padPair :
comp.PadExceptions )
1788 if( !padEx.
PadCode.IsEmpty() )
1803 wxString padNumber = kiPad->
GetNumber();
1818 footprint->
SetValue( wxEmptyString );
1834 if( !
comp.PartID.IsEmpty() &&
comp.PartID != wxT(
"NO_PART" ) )
1846 for( std::pair<DOCUMENTATION_SYMBOL_ID, DOCUMENTATION_SYMBOL> docPair :
Layout.DocumentationSymbols )
1851 auto docSymIter =
Library.ComponentDefinitions.find( docSymInstance.
SymdefID );
1853 if( docSymIter ==
Library.ComponentDefinitions.end() )
1855 THROW_IO_ERROR( wxString::Format(
_(
"Unable to find documentation symbol in the "
1856 "library (Symdef ID: '%s')" ),
1860 SYMDEF_PCB& docSymDefinition = ( *docSymIter ).second;
1866 bool mirrorInvert = docSymInstance.
Mirror;
1871 if( !docSymDefinition.
Alternate.IsEmpty() )
1872 groupName += wxT(
" (" ) + docSymDefinition.
Alternate + wxT(
")" );
1880 for( std::pair<FIGURE_ID, FIGURE> figPair : docSymDefinition.
Figures )
1882 FIGURE fig = figPair.second;
1884 wxString::Format( wxT(
"DOCUMENTATION SYMBOL %s, FIGURE %s" ),
1886 m_board, groupID, moveVector, rotationAngle, scalingFactor,
1887 centreOfTransform, mirrorInvert );
1891 for( std::pair<TEXT_ID, TEXT> textPair : docSymDefinition.
Texts )
1893 TEXT txt = textPair.second;
1895 scalingFactor, centreOfTransform, mirrorInvert );
1903 for( std::pair<TEMPLATE_ID, TEMPLATE> tempPair :
Layout.Templates )
1905 TEMPLATE& csTemplate = tempPair.second;
1907 int zonelinethickness = 0;
1917 if( !( csTemplate.
NetID.IsEmpty() || csTemplate.
NetID == wxT(
"NONE" ) ) )
1922 wxLogWarning( wxString::Format(
_(
"The CADSTAR template '%s' has the setting 'Allow in No Routing "
1923 "Areas' enabled. This setting has no KiCad equivalent, so it has "
1925 csTemplate.
Name ) );
1930 wxLogWarning( wxString::Format(
_(
"The CADSTAR template '%s' has the setting 'Box Isolated Pins' "
1931 "enabled. This setting has no KiCad equivalent, so it has been "
1933 csTemplate.
Name ) );
1938 wxLogWarning( wxString::Format(
_(
"The CADSTAR template '%s' has the setting 'Automatic Repour' "
1939 "enabled. This setting has no KiCad equivalent, so it has been "
1941 csTemplate.
Name ) );
1949 wxLogWarning( wxString::Format(
1950 _(
"The CADSTAR template '%s' has a non-zero value defined for the "
1951 "'Sliver Width' setting. There is no KiCad equivalent for "
1952 "this, so this setting was ignored." ),
1953 csTemplate.
Name ) );
1959 wxLogWarning( wxString::Format(
1960 _(
"The CADSTAR template '%s' has different settings for 'Retain Poured Copper "
1961 "- Disjoint' and 'Retain Poured Copper - Isolated'. KiCad does not "
1962 "distinguish between these two settings. The setting for disjoint copper "
1963 "has been applied as the minimum island area of the KiCad Zone." ),
1964 csTemplate.
Name ) );
1967 long long minIslandArea = -1;
1994 if( csTemplate.
Pouring.
FillType == TEMPLATE::POURING::COPPER_FILL_TYPE::HATCHED )
2010 wxLogWarning( wxString::Format(
2011 _(
"The CADSTAR template '%s' has different settings for thermal relief "
2012 "in pads and vias. KiCad only supports one single setting for both. The "
2013 "setting for pads has been applied." ),
2014 csTemplate.
Name ) );
2025 if( spokeWidth < minThickness )
2027 wxLogWarning( wxString::Format(
2028 _(
"The CADSTAR template '%s' has thermal reliefs in the original design "
2029 "but the spoke width (%.2f mm) is thinner than the minimum thickness of "
2030 "the zone (%.2f mm). KiCad requires the minimum thickness of the zone "
2031 "to be preserved. Therefore the minimum thickness has been applied as "
2032 "the new spoke width and will be applied next time the zones are "
2037 spokeWidth = minThickness;
2058 wxString powerPlaneLayerName =
Assignments.Layerdefs.Layers.at( layer ).Name;
2059 NET_ID netid = wxEmptyString;
2061 for( std::pair<NET_ID, NET_PCB> netPair :
Layout.Nets )
2065 if( net.
Name == powerPlaneLayerName )
2072 if( netid.IsEmpty() )
2074 wxLogError(
_(
"The CADSTAR layer '%s' is defined as a power plane layer. However no net with "
2075 "such name exists. The layer has been loaded but no copper zone was created." ),
2076 powerPlaneLayerName );
2080 for( std::pair<BOARD_ID, CADSTAR_BOARD> boardPair :
Layout.Boards )
2105 for( std::pair<COPPER_ID, COPPER> copPair :
Layout.Coppers )
2107 COPPER& csCopper = copPair.second;
2169 wxLogWarning(
_(
"The CADSTAR design contains COPPER elements, which have no direct KiCad "
2170 "equivalent. These have been imported as a KiCad Zone if solid or hatch "
2171 "filled, or as a KiCad Track if the shape was an unfilled outline (open or "
2245 for( std::pair<NET_ID, NET_PCB> netPair :
Layout.Nets )
2248 wxString netnameForErrorReporting = net.
Name;
2250 std::map<NETELEMENT_ID, long> netelementSizes;
2252 if( netnameForErrorReporting.IsEmpty() )
2253 netnameForErrorReporting = wxString::Format( wxT(
"$%ld" ), net.
SignalNum );
2255 for( std::pair<NETELEMENT_ID, NET_PCB::VIA> viaPair : net.
Vias )
2257 NET_PCB::VIA
via = viaPair.second;
2261 netelementSizes.insert( { viaPair.first, viaSize } );
2264 for( std::pair<NETELEMENT_ID, NET_PCB::PIN> pinPair : net.
Pins )
2266 NET_PCB::PIN
pin = pinPair.second;
2269 if( footprint ==
nullptr )
2271 wxLogWarning( wxString::Format(
_(
"The net '%s' references component ID '%s' which does not exist. "
2272 "This has been ignored." ),
2273 netnameForErrorReporting,
pin.ComponentID ) );
2275 else if( (
pin.PadID - (
long) 1 ) > footprint->
Pads().size() )
2277 wxLogWarning( wxString::Format(
_(
"The net '%s' references non-existent pad index '%d' in "
2278 "component '%s'. This has been ignored." ),
2279 netnameForErrorReporting,
2298 if( assocPads.find(
pin.PadID ) != assocPads.end() )
2300 for(
PAD_ID copperPadID : assocPads.at(
pin.PadID ) )
2309 int padsize = std::min(
pad->GetSizeX(),
pad->GetSizeY() );
2310 netelementSizes.insert( { pinPair.first, padsize } );
2318 auto getJunctionSize =
2319 [&](
const NETELEMENT_ID& aJptNetElemId,
const NET_PCB::CONNECTION_PCB& aConnectionToIgnore ) ->
int
2321 int jptsize = std::numeric_limits<int>::max();
2323 for( NET_PCB::CONNECTION_PCB connection : net.
Connections )
2325 if( connection.Route.RouteVertices.size() == 0 )
2328 if( connection.StartNode == aConnectionToIgnore.StartNode
2329 && connection.EndNode == aConnectionToIgnore.EndNode )
2334 if( connection.StartNode == aJptNetElemId )
2336 int s =
getKiCadLength( connection.Route.RouteVertices.front().RouteWidth );
2337 jptsize = std::max( jptsize, s );
2339 else if( connection.EndNode == aJptNetElemId )
2341 int s =
getKiCadLength( connection.Route.RouteVertices.back().RouteWidth );
2342 jptsize = std::max( jptsize, s );
2346 if( jptsize == std::numeric_limits<int>::max()
2347 && !aConnectionToIgnore.Route.RouteVertices.empty() )
2351 NET_PCB::ROUTE_VERTEX vertex = aConnectionToIgnore.Route.RouteVertices.front();
2353 if( aConnectionToIgnore.EndNode == aJptNetElemId )
2354 vertex = aConnectionToIgnore.Route.RouteVertices.back();
2362 for(
const NET_PCB::CONNECTION_PCB& connection : net.
Connections )
2364 int startSize = std::numeric_limits<int>::max();
2365 int endSize = std::numeric_limits<int>::max();
2367 if( netelementSizes.find( connection.StartNode ) != netelementSizes.end() )
2368 startSize = netelementSizes.at( connection.StartNode );
2370 startSize = getJunctionSize( connection.StartNode, connection );
2372 if( netelementSizes.find( connection.EndNode ) != netelementSizes.end() )
2373 endSize = netelementSizes.at( connection.EndNode );
2375 endSize = getJunctionSize( connection.EndNode, connection );
2380 if( !connection.Unrouted )
2389 auto findAndReplaceTextField =
2392 if(
m_context.TextFieldToValuesMap.find( aField ) !=
m_context.TextFieldToValuesMap.end() )
2394 if(
m_context.TextFieldToValuesMap.at( aField ) != aValue )
2396 m_context.TextFieldToValuesMap.at( aField ) = aValue;
2397 m_context.InconsistentTextFields.insert( aField );
2403 m_context.TextFieldToValuesMap.insert( { aField, aValue } );
2411 std::map<wxString, wxString>& txtVars =
m_project->GetTextVars();
2414 if(
Layout.VariantHierarchy.Variants.size() > 0 )
2416 VARIANT loadedVar =
Layout.VariantHierarchy.Variants.begin()->second;
2424 for( std::pair<TEXT_FIELD_NAME, wxString> txtvalue :
m_context.TextFieldToValuesMap )
2427 wxString varValue = txtvalue.second;
2429 txtVars.insert( { varName, varValue } );
2432 for( std::pair<wxString, wxString> txtvalue :
m_context.FilenamesToTextMap )
2434 wxString varName = txtvalue.first;
2435 wxString varValue = txtvalue.second;
2437 txtVars.insert( { varName, varValue } );
2442 wxLogError(
_(
"Text Variables could not be set as there is no project loaded." ) );
2450 for( std::pair<ATTRIBUTE_ID, ATTRIBUTE_VALUE> attrPair : aComponent.
AttributeValues )
2458 for( std::pair<ATTRIBUTE_ID, TEXT_LOCATION> textlocPair : aComponent.
TextLocations )
2464 attrval = wxEmptyString;
2466 attrval = wxT(
"${REFERENCE}" );
2478 const NET_PCB::ROUTE& aCadstarRoute,
2479 long aStartWidth,
long aEndWidth )
2481 if( aCadstarRoute.RouteVertices.size() == 0 )
2484 std::vector<PCB_SHAPE*> shapes;
2485 std::vector<NET_PCB::ROUTE_VERTEX> routeVertices = aCadstarRoute.RouteVertices;
2488 if( aStartWidth < routeVertices.front().RouteWidth )
2490 NET_PCB::ROUTE_VERTEX newFrontVertex = aCadstarRoute.RouteVertices.front();
2491 newFrontVertex.RouteWidth = aStartWidth;
2492 newFrontVertex.Vertex.End = aCadstarRoute.StartPoint;
2493 routeVertices.insert( routeVertices.begin(), newFrontVertex );
2497 if( aEndWidth < routeVertices.back().RouteWidth )
2499 NET_PCB::ROUTE_VERTEX newBackVertex = aCadstarRoute.RouteVertices.back();
2500 newBackVertex.RouteWidth = aEndWidth;
2501 routeVertices.push_back( newBackVertex );
2504 POINT prevEnd = aCadstarRoute.StartPoint;
2506 for(
const NET_PCB::ROUTE_VERTEX& v : routeVertices )
2512 shapes.push_back( shape );
2513 prevEnd = v.Vertex.End;
2518 wxLogError(
_(
"The CADSTAR design contains teardrops. This importer does not yet "
2519 "support them, so the teardrops in the design have been ignored." ) );
2544 via->SetLocked( aCadstarVia.Fixed );
2548 wxLogError(
_(
"The CADSTAR via code '%s' has different shape from a circle defined. "
2549 "KiCad only supports circular vias so this via type has been changed to "
2550 "be a via with circular shape of %.2f mm diameter." ),
2562 if( start_layer_outside && end_layer_outside )
2564 else if( ( !start_layer_outside ) && ( !end_layer_outside ) )
2580 const LAYER_ID& aCadstarLayerOverride,
2582 double aRotationAngle,
double aScalingFactor,
2584 bool aMirrorInvert )
2587 aContainer->
Add( txt );
2592 RotatePoint( rotatedTextPos, aTransformCentre, rotationAngle );
2593 rotatedTextPos.
x =
KiROUND( ( rotatedTextPos.
x - aTransformCentre.
x ) * aScalingFactor );
2594 rotatedTextPos.
y =
KiROUND( ( rotatedTextPos.
y - aTransformCentre.
y ) * aScalingFactor );
2595 rotatedTextPos += aTransformCentre;
2654 wxFAIL_MSG( wxT(
"Unknown Alignment - needs review!" ) );
2661 if( aScalingFactor != 1.0 )
2667 scaledTextSize.
x =
KiROUND( (
double) unscaledTextSize.
x * aScalingFactor );
2668 scaledTextSize.
y =
KiROUND( (
double) unscaledTextSize.
y * aScalingFactor );
2674 txt->
Move( aMoveVector );
2679 LAYER_ID layersToDrawOn = aCadstarLayerOverride;
2681 if( layersToDrawOn.IsEmpty() )
2682 layersToDrawOn = aCadstarText.
LayerID;
2693 if( !aCadstarGroupID.IsEmpty() )
2704 if( !aCadstarGroupID.IsEmpty() )
2713 const wxString& aShapeName,
2717 double aRotationAngle,
double aScalingFactor,
2719 bool aMirrorInvert )
2721 auto drawAsOutline =
2725 aCadstarGroupID, aMoveVector, aRotationAngle, aScalingFactor,
2726 aTransformCentre, aMirrorInvert );
2728 aCadstarGroupID, aMoveVector, aRotationAngle, aScalingFactor,
2729 aTransformCentre, aMirrorInvert );
2739 if( aCadstarShape.
Vertices.size() < 3 )
2755 aRotationAngle, aScalingFactor, aTransformCentre,
2765 if( !aCadstarGroupID.IsEmpty() )
2776 double aRotationAngle,
2777 double aScalingFactor,
2779 bool aMirrorInvert )
2781 for(
const CUTOUT& cutout : aCutouts )
2784 aCadstarGroupID, aMoveVector, aRotationAngle, aScalingFactor,
2785 aTransformCentre, aMirrorInvert );
2796 double aRotationAngle,
2797 double aScalingFactor,
2799 bool aMirrorInvert )
2801 std::vector<PCB_SHAPE*> shapes =
getShapesFromVertices( aCadstarVertices, aContainer, aCadstarGroupID,
2802 aMoveVector, aRotationAngle, aScalingFactor,
2803 aTransformCentre, aMirrorInvert );
2808 shape->SetLayer( aKiCadLayer );
2809 shape->SetParent( aContainer );
2815std::vector<PCB_SHAPE*>
2820 double aRotationAngle,
double aScalingFactor,
2822 bool aMirrorInvert )
2824 std::vector<PCB_SHAPE*> shapes;
2826 if( aCadstarVertices.size() < 2 )
2830 const VERTEX* prev = &aCadstarVertices.at( 0 );
2833 for(
size_t i = 1; i < aCadstarVertices.size(); i++ )
2835 cur = &aCadstarVertices.at( i );
2837 aRotationAngle, aScalingFactor, aTransformCentre, aMirrorInvert ) );
2846 const VERTEX& aCadstarVertex,
2850 double aRotationAngle,
2851 double aScalingFactor,
2853 bool aMirrorInvert )
2865 centerPoint = ( startPoint + endPoint ) / 2;
2872 switch( aCadstarVertex.
Type )
2879 shape->
SetEnd( endPoint );
2895 EDA_ANGLE arcStartAngle( startPoint - centerPoint );
2896 EDA_ANGLE arcEndAngle( endPoint - centerPoint );
2897 EDA_ANGLE arcAngle = ( arcEndAngle - arcStartAngle ).Normalize();
2914 if( aScalingFactor != 1.0 )
2916 shape->
Move( -1*aTransformCentre );
2917 shape->
Scale( aScalingFactor );
2918 shape->
Move( aTransformCentre );
2921 if( aRotationAngle != 0.0 )
2924 if( aMoveVector !=
VECTOR2I{ 0, 0 } )
2925 shape->
Move( aMoveVector );
2927 if( !aCadstarGroupID.IsEmpty() )
2937 ZONE* zone =
new ZONE( aParentContainer );
2953 for(
int i = 0; i < polygon.
HoleCount( 0 ); i++ )
2964 double aRotationAngle,
2965 double aScalingFactor,
2967 bool aMirrorInvert )
2972 aContainer, noGroup, aMoveVector,
2973 aRotationAngle, aScalingFactor,
2974 aTransformCentre, aMirrorInvert );
2985 noGroup, aMoveVector,
2986 aRotationAngle, aScalingFactor,
2987 aTransformCentre, aMirrorInvert );
2998 if( aLineThickness > 0 )
3006 for(
int j = 0; j < polySet.
HoleCount( i ); ++j )
3021 switch( shape->GetShape() )
3025 SHAPE_ARC arc( shape->GetCenter(), shape->GetStart(), shape->GetArcAngle() );
3027 if( shape->EndsSwapped() )
3035 lineChain.
Append( shape->GetStartX(), shape->GetStartY() );
3036 lineChain.
Append( shape->GetEndX(), shape->GetEndY() );
3040 wxFAIL_MSG( wxT(
"Drawsegment type is unexpected. Ignored." ) );
3061 int aWidthOverride )
3063 std::vector<PCB_TRACK*> tracks;
3075 if( aTrack->GetLength() != 0 )
3077 tracks.push_back( aTrack );
3088 switch( shape->GetShape() )
3092 SHAPE_ARC arc( shape->GetStart(), shape->GetArcMid(), shape->GetEnd(), 0 );
3094 if( shape->EndsSwapped() )
3097 track =
new PCB_ARC( aParentContainer, &arc );
3102 track =
new PCB_TRACK( aParentContainer );
3103 track->
SetStart( shape->GetStart() );
3104 track->
SetEnd( shape->GetEnd() );
3108 wxFAIL_MSG( wxT(
"Drawsegment type is unexpected. Ignored." ) );
3112 if( aWidthOverride == -1 )
3113 track->
SetWidth( shape->GetWidth() );
3118 track->
SetLayer( shape->GetLayer() );
3122 if( aNet !=
nullptr )
3130 if( prevTrack !=
nullptr )
3132 int offsetAmount = ( track->
GetWidth() / 2 ) - ( prevTrack->
GetWidth() / 2 );
3134 if( offsetAmount > 0 )
3141 else if( offsetAmount < 0 )
3146 prevTrack->
SetEnd( newEnd );
3162 addTrack( synthTrack );
3167 addTrack( prevTrack );
3181 FOOTPRINT* aFootprint,
const wxString& aAttributeValue )
3194 aFootprint->
SetValue( aAttributeValue );
3195 field = &aFootprint->
Value();
3200 aFootprint->
Add( field );
3201 field->
SetText( aAttributeValue );
3214 aFootprint->
SetValue( aAttributeValue );
3215 field = &aFootprint->
Value();
3221 aFootprint->
Add( field );
3222 field->
SetText( aAttributeValue );
3231 if( aCadstarAttrLoc.
Mirror )
3289 wxFAIL_MSG( wxT(
"Unknown Alignment - needs review!" ) );
3296 const long& aOffsetAmount )
3298 VECTOR2I v( *aPointToOffset - aRefPoint );
3304 aPointToOffset->
x = offsetted.
x;
3305 aPointToOffset->
y = offsetted.
y;
3309 *aPointToOffset = aRefPoint;
3332 if( textSize.
x == 0 )
3337 if( textSize.
x == 0 || textSize.
y == 0 )
3356 wxCHECK(
Assignments.Codedefs.LineCodes.find( aCadstarLineCodeID ) !=
Assignments.Codedefs.LineCodes.end(),
3366 wxCHECK(
Assignments.Codedefs.CopperCodes.find( aCadstaCopperCodeID ) !=
Assignments.Codedefs.CopperCodes.end(),
3369 return Assignments.Codedefs.CopperCodes.at( aCadstaCopperCodeID );
3375 wxCHECK(
Assignments.Codedefs.TextCodes.find( aCadstarTextCodeID ) !=
Assignments.Codedefs.TextCodes.end(),
3378 return Assignments.Codedefs.TextCodes.at( aCadstarTextCodeID );
3387 return Assignments.Codedefs.PadCodes.at( aCadstarPadCodeID );
3396 return Assignments.Codedefs.ViaCodes.at( aCadstarViaCodeID );
3402 wxCHECK(
Assignments.Codedefs.LayerPairs.find( aCadstarLayerPairID ) !=
Assignments.Codedefs.LayerPairs.end(),
3405 return Assignments.Codedefs.LayerPairs.at( aCadstarLayerPairID );
3411 wxCHECK(
Assignments.Codedefs.AttributeNames.find( aCadstarAttributeID )
3415 return Assignments.Codedefs.AttributeNames.at( aCadstarAttributeID ).Name;
3420 const std::map<ATTRIBUTE_ID, ATTRIBUTE_VALUE>& aCadstarAttrMap )
3422 wxCHECK( aCadstarAttrMap.find( aCadstarAttributeID ) != aCadstarAttrMap.end(), wxEmptyString );
3424 return aCadstarAttrMap.at( aCadstarAttributeID ).Value;
3432 return Assignments.Layerdefs.Layers.at( aCadstarLayerID ).Type;
3440 wxCHECK(
Parts.PartDefinitions.find( aCadstarPartID ) !=
Parts.PartDefinitions.end(),
PART() );
3442 return Parts.PartDefinitions.at( aCadstarPartID );
3449 wxCHECK(
Assignments.Codedefs.RouteCodes.find( aCadstarRouteCodeID ) !=
Assignments.Codedefs.RouteCodes.end(),
3452 return Assignments.Codedefs.RouteCodes.at( aCadstarRouteCodeID );
3459 wxCHECK(
Assignments.Codedefs.HatchCodes.find( aCadstarHatchcodeID ) !=
Assignments.Codedefs.HatchCodes.end(),
3462 return Assignments.Codedefs.HatchCodes.at( aCadstarHatchcodeID );
3471 if( hcode.
Hatches.size() < 1 )
3472 return m_board->GetDesignSettings().GetDefaultZoneSettings().m_HatchOrientation;
3483 if( hcode.
Hatches.size() < 1 )
3484 return m_board->GetDesignSettings().GetDefaultZoneSettings().m_HatchThickness;
3495 if( hcode.
Hatches.size() < 1 )
3496 return m_board->GetDesignSettings().GetDefaultZoneSettings().m_HatchGap;
3520 if( hcode.
Hatches.size() != 2 )
3522 wxLogWarning( wxString::Format(
3523 _(
"The CADSTAR Hatching code '%s' has %d hatches defined. "
3524 "KiCad only supports 2 hatches (crosshatching) 90 degrees apart. "
3525 "The imported hatching is crosshatched." ),
3530 if( hcode.
Hatches.at( 0 ).LineWidth != hcode.
Hatches.at( 1 ).LineWidth )
3532 wxLogWarning( wxString::Format(
3533 _(
"The CADSTAR Hatching code '%s' has different line widths for each "
3534 "hatch. KiCad only supports one width for the hatching. The imported "
3535 "hatching uses the width defined in the first hatch definition, i.e. "
3544 wxLogWarning( wxString::Format(
3545 _(
"The CADSTAR Hatching code '%s' has different step sizes for each "
3546 "hatch. KiCad only supports one step size for the hatching. The imported "
3547 "hatching uses the step size defined in the first hatching definition, "
3554 if( abs( hcode.
Hatches.at( 0 ).OrientAngle - hcode.
Hatches.at( 1 ).OrientAngle )
3557 wxLogWarning( wxString::Format(
3558 _(
"The hatches in CADSTAR Hatching code '%s' have an angle "
3559 "difference of %.1f degrees. KiCad only supports hatching 90 "
3560 "degrees apart. The imported hatching has two hatches 90 "
3561 "degrees apart, oriented %.1f degrees from horizontal." ),
3564 - hcode.
Hatches.at( 1 ).OrientAngle ) ).AsDegrees(),
3590 wxString prefix = wxEmptyString;
3591 wxString suffix = wxEmptyString;
3592 size_t startpos = aCadstarDim.
Text.
Text.Find( wxT(
"<@DISTANCE" ) );
3594 if( startpos != wxNOT_FOUND )
3597 wxString remainingStr = aCadstarDim.
Text.
Text.Mid( startpos );
3598 size_t endpos = remainingStr.Find(
"@>" );
3602 if( suffix.StartsWith( wxT(
"mm" ) ) )
3605 suffix = suffix.Mid( 2 );
3623 switch( dimensionUnits )
3628 wxLogWarning( wxString::Format(
_(
"Dimension ID %s uses a type of unit that "
3629 "is not supported in KiCad. Millimeters were "
3630 "applied instead." ),
3646 wxFAIL_MSG( wxT(
"We should have handled design units before coming here!" ) );
3654 std::map<TEMPLATE_ID, std::set<TEMPLATE_ID>> winningOverlaps;
3660 -
m_board->GetDesignSettings().m_MinClearance;
3662 int retval = std::max( aZoneA->
GetLocalClearance().value(), aZoneB->GetLocalClearance().value() );
3671 [&](
ZONE* aLowerZone,
ZONE* aHigherZone ) ->
double
3674 intersectShape.
Inflate( inflateValue( aLowerZone, aHigherZone ),
3684 double leftOverArea = lowerZoneFill.
Area();
3686 return leftOverArea;
3689 auto intersectionAreaOfZoneOutlines =
3690 [&](
ZONE* aZoneA,
ZONE* aZoneB ) ->
double
3700 return outLineA.
Area();
3704 auto isLowerPriority =
3707 return winningOverlaps[b].count( a ) > 0;
3710 for( std::map<TEMPLATE_ID, ZONE*>::iterator it1 =
m_zonesMap.begin(); it1 !=
m_zonesMap.end(); ++it1 )
3713 ZONE* thisZone = it1->second;
3718 for( std::map<TEMPLATE_ID, ZONE*>::iterator it2 = it1;
3722 ZONE* otherZone = it2->second;
3724 if( thisTemplate.
ID == otherTemplate.
ID )
3733 if( intersectionAreaOfZoneOutlines( thisZone, otherZone ) == 0 )
3742 if( thisZonePolyFill.
Area() > 0.0 && otherZonePolyFill.
Area() > 0.0 )
3745 double areaThis = errorArea( thisZone, otherZone );
3747 double areaOther = errorArea( otherZone, thisZone );
3749 if( areaThis > areaOther )
3752 winningOverlaps[thisTemplate.
ID].insert( otherTemplate.
ID );
3757 winningOverlaps[otherTemplate.
ID].insert( thisTemplate.
ID );
3760 else if( thisZonePolyFill.
Area() > 0.0 )
3763 winningOverlaps[thisTemplate.
ID].insert( otherTemplate.
ID );
3765 else if( otherZonePolyFill.
Area() > 0.0 )
3768 winningOverlaps[otherTemplate.
ID].insert( thisTemplate.
ID );
3774 if( intersectionAreaOfZoneOutlines( thisZone, otherZone ) != 0 )
3777 winningOverlaps[otherTemplate.
ID].insert( thisTemplate.
ID );
3779 winningOverlaps[thisTemplate.
ID].insert( otherTemplate.
ID );
3788 std::set<TEMPLATE_ID> intersectingIDs;
3790 for(
const std::pair<
TEMPLATE_ID, std::set<TEMPLATE_ID>>& idPair : winningOverlaps )
3792 intersectingIDs.insert( idPair.first );
3793 intersectingIDs.insert( idPair.second.begin(), idPair.second.end() );
3797 std::vector<TEMPLATE_ID> sortedIDs;
3801 sortedIDs.push_back(
id );
3805 std::sort( sortedIDs.begin(), sortedIDs.end(), isLowerPriority );
3811 if( prevID.IsEmpty() )
3817 wxASSERT( !isLowerPriority(
id, prevID ) );
3819 int newPriority =
m_zonesMap.at( prevID )->GetAssignedPriority();
3822 if( isLowerPriority( prevID,
id ) )
3825 m_zonesMap.at(
id )->SetAssignedPriority( newPriority );
3830 for(
const std::pair<
TEMPLATE_ID, std::set<TEMPLATE_ID>>& idPair : winningOverlaps )
3834 for(
const TEMPLATE_ID& losingID : idPair.second )
3836 if(
m_zonesMap.at( losingID )->GetAssignedPriority() >
m_zonesMap.at( winningID )->GetAssignedPriority() )
3867 if( aCadstarNetID.IsEmpty() )
3873 return m_netMap.at( aCadstarNetID );
3877 wxCHECK(
Layout.Nets.find( aCadstarNetID ) !=
Layout.Nets.end(),
nullptr );
3880 wxString newName = csNet.
Name;
3882 if( csNet.
Name.IsEmpty() )
3884 if( csNet.
Pins.size() > 0 )
3888 NET_PCB::PIN firstPin = ( *csNet.
Pins.begin() ).second;
3891 newName = wxT(
"Net-(" );
3893 newName << wxT(
"-Pad" ) << wxString::Format( wxT(
"%ld" ), firstPin.PadID );
3894 newName << wxT(
")" );
3898 wxFAIL_MSG( wxT(
"A net with no pins associated?" ) );
3899 newName = wxT(
"csNet-" );
3900 newName << wxString::Format( wxT(
"%i" ), csNet.
SignalNum );
3906 wxLogMessage(
_(
"The CADSTAR design contains nets with a 'Net Class' assigned. KiCad "
3907 "does not have an equivalent to CADSTAR's Net Class so these elements "
3908 "were not imported. Note: KiCad's version of 'Net Class' is closer to "
3909 "CADSTAR's 'Net Route Code' (which has been imported for all nets)." ) );
3915 wxLogWarning(
_(
"The CADSTAR design contains nets with a 'Spacing Class' assigned. "
3916 "KiCad does not have an equivalent to CADSTAR's Spacing Class so "
3917 "these elements were not imported. Please review the design rules as "
3918 "copper pours may be affected by this." ) );
3922 std::shared_ptr<NET_SETTINGS>& netSettings =
m_board->GetDesignSettings().m_NetSettings;
3924 std::shared_ptr<NETCLASS> netclass;
3926 std::tuple<ROUTECODE_ID, NETCLASS_ID, SPACING_CLASS_ID> key = { csNet.
RouteCodeID,
3936 wxString netClassName;
3939 netClassName += wxT(
"Route code: " ) + rc.
Name;
3944 netClassName += wxT(
" | Net class: " ) + nc.
Name;
3950 netClassName += wxT(
" | Spacing class: " ) + sp.
Name;
3953 netclass.reset(
new NETCLASS( netClassName ) );
3954 netSettings->SetNetclass( netClassName, netclass );
3959 m_board->GetDesignSettings().m_NetSettings->SetNetclassPatternAssignment( newName, netclass->GetName() );
3963 m_netMap.insert( { aCadstarNetID, netInfo } );
4018 wxCHECK(
Assignments.Layerdefs.Layers.find( aCadstarLayerID ) !=
Assignments.Layerdefs.Layers.end(),
false );
4022 switch( layer.
Type )
4088 parentGroup->
AddItem( aKiCadItem );
4094 wxString groupName = aName;
4098 groupName = aName + wxT(
"_" ) + wxString::Format( wxT(
"%i" ), ++num );
4102 docSymGroup->
SetName( groupName );
4104 m_groupMap.insert( { groupID, docSymGroup } );
constexpr int ARC_HIGH_DEF
constexpr double PCB_IU_PER_MM
Pcbnew IU is 1 nanometer.
constexpr EDA_IU_SCALE pcbIUScale
LAYER_T
The allowed types of layers, same as Specctra DSN spec.
@ BS_ITEM_TYPE_SILKSCREEN
@ BS_ITEM_TYPE_DIELECTRIC
@ BS_ITEM_TYPE_SOLDERMASK
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
#define COMPONENT_NAME_2_ATTRID
Component Name 2 Attribute ID - typically used for indicating the placement of designators in placeme...
#define COMPONENT_NAME_ATTRID
Component Name Attribute ID - typically used for placement of designators on silk screen.
Loads a cpa file into a KiCad BOARD object.
BASE_SET & reset(size_t pos)
bool SetNetCode(int aNetCode, bool aNoAssert)
Set net using a net code.
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
NETINFO_ITEM * GetNet() const
Return #NET_INFO object for a given item.
void SetNet(NETINFO_ITEM *aNetInfo)
Set a NET_INFO object for the item.
Container for design settings for a BOARD object.
std::shared_ptr< NET_SETTINGS > m_NetSettings
int m_CopperEdgeClearance
BOARD_STACKUP & GetStackupDescriptor()
void SetBoardThickness(int aThickness)
int GetLineThickness(PCB_LAYER_ID aLayer) const
Return the default graphic segment thickness from the layer class for the given layer.
int m_ViasMinAnnularWidth
Abstract interface for BOARD_ITEMs capable of storing other items inside.
virtual void Add(BOARD_ITEM *aItem, ADD_MODE aMode=ADD_MODE::INSERT, bool aSkipConnectivity=false)=0
Adds an item to the container.
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
virtual BOARD_ITEM * Duplicate(bool addToParentGroup, BOARD_COMMIT *aCommit=nullptr) const
Create a copy of this BOARD_ITEM.
void SetLocked(bool aLocked) override
bool IsLocked() const override
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
Manage one layer needed to make a physical board.
void SetThickness(int aThickness, int aDielectricSubLayer=0)
void SetMaterial(const wxString &aName, int aDielectricSubLayer=0)
void SetLossTangent(double aTg, int aDielectricSubLayer=0)
void SetEpsilonR(double aEpsilon, int aDielectricSubLayer=0)
void SetLayerName(const wxString &aName)
Manage layers needed to make a physical board.
void RemoveAll()
Delete all items in list and clear the list.
const std::vector< BOARD_STACKUP_ITEM * > & GetList() const
int BuildBoardThicknessFromStackup() const
void BuildDefaultStackupList(const BOARD_DESIGN_SETTINGS *aSettings, int aActiveCopperLayersCount=0)
Create a default stackup, according to the current BOARD_DESIGN_SETTINGS settings.
@ ANTICLOCKWISE_SEMICIRCLE
static const long FONT_BOLD
static const std::map< TEXT_FIELD_NAME, wxString > CADSTAR_TO_KICAD_FIELDS
Map between CADSTAR fields and KiCad text variables.
TEXT_FIELD_NAME
These are special fields in text objects enclosed between the tokens '<@' and '>' such as <@[FIELD_NA...
@ NO_ALIGNMENT
NO_ALIGNMENT has different meaning depending on the object type.
static const long UNDEFINED_VALUE
static wxString ParseTextFields(const wxString &aTextString, PARSER_CONTEXT *aParserContext)
Replaces CADSTAR fields for the equivalent in KiCad and stores the field values in aParserContext.
wxString LAYER_ID
ID of a Sheet (if schematic) or board Layer (if PCB)
static void FixTextPositionNoAlignment(EDA_TEXT *aKiCadTextItem)
Correct the position of a text element that had NO_ALIGNMENT in CADSTAR.
@ OUTLINE
Unfilled closed shape.
@ OPENSHAPE
Unfilled open shape. Cannot have cutouts.
@ SOLID
Filled closed shape (solid fill).
@ HATCHED
Filled closed shape (hatch fill).
static const double TXT_HEIGHT_RATIO
CADSTAR fonts are drawn on a 24x24 integer matrix, where the each axis goes from 0 to 24.
void checkPoint()
Updates m_progressReporter or throws if user canceled.
@ DESIGN
Inherits from design units (assumed Assignments->Technology->Units)
PROGRESS_REPORTER * m_progressReporter
std::map< TEMPLATE_ID, ZONE * > m_zonesMap
Map between Cadstar and KiCad zones.
std::map< std::tuple< ROUTECODE_ID, NETCLASS_ID, SPACING_CLASS_ID >, std::shared_ptr< NETCLASS > > m_netClassMap
Map between Cadstar and KiCad classes.
bool m_doneCopperWarning
Used by loadCoppers() to avoid multiple duplicate warnings.
std::set< PADCODE_ID > m_padcodesTested
Used by getKiCadPad() to avoid multiple duplicate warnings.
int getKiCadLength(long long aCadstarLength)
void initStackupItem(const LAYER &aCadstarLayer, BOARD_STACKUP_ITEM *aKiCadItem, int aDielectricSublayer)
int m_numCopperLayers
Number of layers in the design.
std::vector< LAYER_ID > m_powerPlaneLayers
List of layers that are marked as power plane in CADSTAR.
void drawCadstarText(const TEXT &aCadstarText, BOARD_ITEM_CONTAINER *aContainer, const GROUP_ID &aCadstarGroupID=wxEmptyString, const LAYER_ID &aCadstarLayerOverride=wxEmptyString, const VECTOR2I &aMoveVector={ 0, 0 }, double aRotationAngle=0.0, double aScalingFactor=1.0, const VECTOR2I &aTransformCentre={ 0, 0 }, bool aMirrorInvert=false)
bool isLayerSet(const LAYER_ID &aCadstarLayerID)
LAYERPAIR getLayerPair(const LAYERPAIR_ID &aCadstarLayerPairID)
FOOTPRINT * getFootprintFromCadstarID(const COMPONENT_ID &aCadstarComponentID)
PADCODE getPadCode(const PADCODE_ID &aCadstarPadCodeID)
int loadNetVia(const NET_ID &aCadstarNetID, const NET_PCB::VIA &aCadstarVia)
Load via and return via size.
EDA_ANGLE getAngle(const long long &aCadstarAngle)
std::vector< PCB_SHAPE * > getShapesFromVertices(const std::vector< VERTEX > &aCadstarVertices, BOARD_ITEM_CONTAINER *aContainer=nullptr, const GROUP_ID &aCadstarGroupID=wxEmptyString, const VECTOR2I &aMoveVector={ 0, 0 }, double aRotationAngle=0.0, double aScalingFactor=1.0, const VECTOR2I &aTransformCentre={ 0, 0 }, bool aMirrorInvert=false)
Returns a vector of pointers to PCB_SHAPE objects.
void applyTextCode(EDA_TEXT *aKiCadText, const TEXTCODE_ID &aCadstarTextCodeID)
Apply cadstar textcode parameters to a KiCad text object.
std::map< COMPONENT_ID, FOOTPRINT * > m_componentMap
Map between Cadstar and KiCad components on the board.
SHAPE_LINE_CHAIN getLineChainFromShapes(const std::vector< PCB_SHAPE * > &aShapes)
Returns a SHAPE_LINE_CHAIN object from a series of PCB_SHAPE objects.
std::map< PAD_ID, std::vector< PAD_ID > > ASSOCIATED_COPPER_PADS
Map of pad anchor points (first) to copper pads (second).
void applyDimensionSettings(const DIMENSION &aCadstarDim, PCB_DIMENSION_BASE *aKiCadDim)
void loadNetTracks(const NET_ID &aCadstarNetID, const NET_PCB::ROUTE &aCadstarRoute, long aStartWidth=std::numeric_limits< long >::max(), long aEndWidth=std::numeric_limits< long >::max())
ZONE * getZoneFromCadstarShape(const SHAPE &aCadstarShape, const int &aLineThickness, BOARD_ITEM_CONTAINER *aParentContainer)
PCB_LAYER_ID getKiCadCopperLayerID(unsigned int aLayerNum, bool aDetectMaxLayer=true)
std::vector< PCB_TRACK * > makeTracksFromShapes(const std::vector< PCB_SHAPE * > &aShapes, BOARD_ITEM_CONTAINER *aParentContainer, NETINFO_ITEM *aNet=nullptr, PCB_LAYER_ID aLayerOverride=UNDEFINED_LAYER, int aWidthOverride=-1)
Returns a vector of pointers to TRACK/ARC objects.
VIACODE getViaCode(const VIACODE_ID &aCadstarViaCodeID)
VECTOR2I m_designCenter
Used for calculating the required offset to apply to the Cadstar design so that it fits in KiCad canv...
void Load(BOARD *aBoard, PROJECT *aProject)
Loads a CADSTAR PCB Archive file into the KiCad BOARD object given.
void drawCadstarCutoutsAsShapes(const std::vector< CUTOUT > &aCutouts, const PCB_LAYER_ID &aKiCadLayer, int aLineThickness, BOARD_ITEM_CONTAINER *aContainer, const GROUP_ID &aCadstarGroupID=wxEmptyString, const VECTOR2I &aMoveVector={ 0, 0 }, double aRotationAngle=0.0, double aScalingFactor=1.0, const VECTOR2I &aTransformCentre={ 0, 0 }, bool aMirrorInvert=false)
Uses PCB_SHAPEs to draw the cutouts on m_board object.
void logBoardStackupWarning(const wxString &aCadstarLayerName, const PCB_LAYER_ID &aKiCadLayer)
std::vector< FOOTPRINT * > GetLoadedLibraryFootpints() const
Return a copy of the loaded library footprints (caller owns the objects)
PCB_SHAPE * getShapeFromVertex(const POINT &aCadstarStartPoint, const VERTEX &aCadstarVertex, BOARD_ITEM_CONTAINER *aContainer=nullptr, const GROUP_ID &aCadstarGroupID=wxEmptyString, const VECTOR2I &aMoveVector={ 0, 0 }, double aRotationAngle=0.0, double aScalingFactor=1.0, const VECTOR2I &aTransformCentre={ 0, 0 }, bool aMirrorInvert=false)
Returns a pointer to a PCB_SHAPE object.
void checkAndLogHatchCode(const HATCHCODE_ID &aCadstarHatchcodeID)
bool m_doneSpacingClassWarning
Used by getKiCadNet() to avoid multiple duplicate warnings.
int m_numNets
Number of nets loaded so far.
void loadDocumentationSymbols()
void loadLibraryPads(const SYMDEF_PCB &aComponent, FOOTPRINT *aFootprint)
void loadComponentLibrary()
PAD * getKiCadPad(const COMPONENT_PAD &aCadstarPad, FOOTPRINT *aParent)
void drawCadstarShape(const SHAPE &aCadstarShape, const PCB_LAYER_ID &aKiCadLayer, int aLineThickness, const wxString &aShapeName, BOARD_ITEM_CONTAINER *aContainer, const GROUP_ID &aCadstarGroupID=wxEmptyString, const VECTOR2I &aMoveVector={ 0, 0 }, double aRotationAngle=0.0, double aScalingFactor=1.0, const VECTOR2I &aTransformCentre={ 0, 0 }, bool aMirrorInvert=false)
NETINFO_ITEM * getKiCadNet(const NET_ID &aCadstarNetID)
Searches m_netMap and returns the NETINFO_ITEM pointer if exists.
void logBoardStackupMessage(const wxString &aCadstarLayerName, const PCB_LAYER_ID &aKiCadLayer)
int getLineThickness(const LINECODE_ID &aCadstarLineCodeID)
bool m_doneTearDropWarning
std::map< NET_ID, NETINFO_ITEM * > m_netMap
Map between Cadstar and KiCad Nets.
void loadComponentAttributes(const COMPONENT &aComponent, FOOTPRINT *aFootprint)
PCB_GROUP * getKiCadGroup(const GROUP_ID &aCadstarGroupID)
bool m_logLayerWarnings
Used in loadBoardStackup()
HATCHCODE getHatchCode(const HATCHCODE_ID &aCadstarHatchcodeID)
void loadLibraryCoppers(const SYMDEF_PCB &aComponent, FOOTPRINT *aFootprint)
LAYER_TYPE getLayerType(const LAYER_ID aCadstarLayerID)
void loadLibraryFigures(const SYMDEF_PCB &aComponent, FOOTPRINT *aFootprint)
TEXTCODE getTextCode(const TEXTCODE_ID &aCadstarTextCodeID)
wxString getAttributeName(const ATTRIBUTE_ID &aCadstarAttributeID)
wxString getAttributeValue(const ATTRIBUTE_ID &aCadstarAttributeID, const std::map< ATTRIBUTE_ID, ATTRIBUTE_VALUE > &aCadstarAttributeMap)
void applyRouteOffset(VECTOR2I *aPointToOffset, const VECTOR2I &aRefPoint, const long &aOffsetAmount)
CADSTAR's Post Processor does an action called "Route Offset" which is applied when a route is wider ...
VECTOR2I getKiCadPoint(const VECTOR2I &aCadstarPoint)
Scales, offsets and inverts y axis to make the point usable directly in KiCad.
void remapUnsureLayers()
Callback m_layerMappingHandler for layers we aren't sure of.
double getAngleTenthDegree(const long long &aCadstarAngle)
LSET getKiCadLayerSet(const LAYER_ID &aCadstarLayerID)
void addToGroup(const GROUP_ID &aCadstarGroupID, BOARD_ITEM *aKiCadItem)
std::map< SYMDEF_ID, FOOTPRINT * > m_libraryMap
Map between Cadstar and KiCad components in the library.
COPPERCODE getCopperCode(const COPPERCODE_ID &aCadstaCopperCodeID)
SHAPE_POLY_SET getPolySetFromCadstarShape(const SHAPE &aCadstarShape, int aLineThickness=-1, BOARD_ITEM_CONTAINER *aContainer=nullptr, const VECTOR2I &aMoveVector={ 0, 0 }, double aRotationAngle=0.0, double aScalingFactor=1.0, const VECTOR2I &aTransformCentre={ 0, 0 }, bool aMirrorInvert=false)
Returns a SHAPE_POLY_SET object from a Cadstar SHAPE.
EDA_ANGLE getHatchCodeAngle(const HATCHCODE_ID &aCadstarHatchcodeID)
int getKiCadHatchCodeThickness(const HATCHCODE_ID &aCadstarHatchcodeID)
PCB_LAYER_ID getKiCadLayer(const LAYER_ID &aCadstarLayerID)
std::set< HATCHCODE_ID > m_hatchcodesTested
Used by checkAndLogHatchCode() to avoid multiple duplicate warnings.
void loadLibraryAreas(const SYMDEF_PCB &aComponent, FOOTPRINT *aFootprint)
GROUP_ID createUniqueGroupID(const wxString &aName)
Adds a new PCB_GROUP* to m_groupMap.
int getKiCadHatchCodeGap(const HATCHCODE_ID &aCadstarHatchcodeID)
std::vector< std::unique_ptr< FOOTPRINT > > LoadLibrary()
Parse a CADSTAR PCB Archive and load the footprints contained within.
ROUTECODE getRouteCode(const ROUTECODE_ID &aCadstarRouteCodeID)
void drawCadstarVerticesAsShapes(const std::vector< VERTEX > &aCadstarVertices, const PCB_LAYER_ID &aKiCadLayer, int aLineThickness, BOARD_ITEM_CONTAINER *aContainer, const GROUP_ID &aCadstarGroupID=wxEmptyString, const VECTOR2I &aMoveVector={ 0, 0 }, double aRotationAngle=0.0, double aScalingFactor=1.0, const VECTOR2I &aTransformCentre={ 0, 0 }, bool aMirrorInvert=false)
Uses PCB_SHAPE to draw the vertices on m_board object.
void addAttribute(const ATTRIBUTE_LOCATION &aCadstarAttrLoc, const ATTRIBUTE_ID &aCadstarAttributeID, FOOTPRINT *aFootprint, const wxString &aAttributeValue)
Adds a CADSTAR Attribute to a KiCad footprint.
std::map< GROUP_ID, PCB_GROUP * > m_groupMap
Map between Cadstar and KiCad groups.
bool calculateZonePriorities(PCB_LAYER_ID &aLayer)
Tries to make a best guess as to the zone priorities based on the pour status.
std::map< LAYER_ID, PCB_LAYER_ID > m_layermap
Map between Cadstar and KiCad Layers.
PAD *& getPadReference(FOOTPRINT *aFootprint, const PAD_ID aCadstarPadID)
bool m_doneNetClassWarning
Used by getKiCadNet() to avoid multiple duplicate warnings.
double getAngleDegrees(const long long &aCadstarAngle)
PART getPart(const PART_ID &aCadstarPartID)
LAYER_MAPPING_HANDLER m_layerMappingHandler
Callback to get layer mapping.
std::map< SYMDEF_ID, ASSOCIATED_COPPER_PADS > m_librarycopperpads
Associated copper pads (if any) for each component library definition.
long PAD_ID
Pad identifier (pin) in the PCB.
@ LAYERSUBTYPE_SOLDERRESIST
@ LAYERSUBTYPE_SILKSCREEN
void Parse(bool aLibrary=false)
Parses the file.
int KiCadUnitMultiplier
Use this value to convert units in this CPA file to KiCad units.
@ UNDEFINED
Only used for error detection.
@ 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".
@ MAXIMUM
The highest PHYSICAL_LAYER_ID currently defined (i.e.
@ MINIMUM
PHYSICAL_LAYER_ID 1 (i.e.
@ THROUGH_HOLE
All physical layers currently defined.
EDA_ANGLE NormalizeNegative()
void AddItem(EDA_ITEM *aItem)
Add item to group.
void SetName(const wxString &aName)
void SetCenter(const VECTOR2I &aCenter)
SHAPE_POLY_SET & GetPolyShape()
void SetPolyShape(const SHAPE_POLY_SET &aShape)
virtual void SetFilled(bool aFlag)
void SetStart(const VECTOR2I &aStart)
void SetShape(SHAPE_T aShape)
void SetEnd(const VECTOR2I &aEnd)
void SetArcAngleAndEnd(const EDA_ANGLE &aAngle, bool aCheckNegativeAngle=false)
Set the end point from the angle center and start.
void SetFillMode(FILL_T aFill)
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
const EDA_ANGLE & GetTextAngle() const
void SetTextSize(VECTOR2I aNewSize, bool aEnforceMinTextSize=true)
virtual const wxString & GetText() const
Return the string associated with the text object.
void SetTextPos(const VECTOR2I &aPoint)
void SetMirrored(bool isMirrored)
void SetVertJustify(GR_TEXT_V_ALIGN_T aType)
virtual void SetVisible(bool aVisible)
void SetTextThickness(int aWidth)
The TextThickness is that set by the user.
void SetBold(bool aBold)
Set the text to be bold - this will also update the font if needed.
void SetKeepUpright(bool aKeepUpright)
virtual void SetText(const wxString &aText)
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
int GetTextThickness() const
void SetItalic(bool aItalic)
Set the text to be italic - this will also update the font if needed.
void SetFont(KIFONT::FONT *aFont)
VECTOR2I GetTextSize() const
void SetHorizJustify(GR_TEXT_H_ALIGN_T aType)
FONT is an abstract base class for both outline and stroke fonts.
static FONT * GetFont(const wxString &aFontName=wxEmptyString, bool aBold=false, bool aItalic=false, const std::vector< wxString > *aEmbeddedFiles=nullptr, bool aForDrawingSheet=false)
A logical library item identifier and consists of various portions much like a URI.
int Parse(const UTF8 &aId, bool aFix=false)
Parse LIB_ID with the information from aId.
const UTF8 & GetLibItemName() const
LSEQ is a sequence (and therefore also a set) of PCB_LAYER_IDs.
LSET is a set of PCB_LAYER_IDs.
static const LSET & AllBoardTechMask()
Return a mask holding board technical layers (no CU layer) on both side.
static const LSET & UserMask()
LSEQ Seq(const LSEQ &aSequence) const
Return an LSEQ from the union of this LSET and a desired sequence.
static LSET AllCuMask(int aCuLayerCount)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
static const LSET & AllLayersMask()
static LSET UserDefinedLayersMask(int aUserDefinedLayerCount=MAX_USER_DEFINED_LAYERS)
Return a mask with the requested number of user defined layers.
static LSET AllCuMask()
return AllCuMask( MAX_CU_LAYERS );
static wxString Name(PCB_LAYER_ID aLayerId)
Return the fixed name association with aLayerId.
bool Contains(PCB_LAYER_ID aLayer) const
See if the layer set contains a PCB layer.
Handle the data for a net.
void SetNetClass(const std::shared_ptr< NETCLASS > &aNetClass)
std::shared_ptr< NETCLASS > GetDefaultNetclass()
Gets the default netclass for the project.
static constexpr PCB_LAYER_ID ALL_LAYERS
! Temporary layer identifier to identify code that is not padstack-aware
const wxString & GetNumber() const
void SetNumber(const wxString &aNumber)
Set the pad number (note that it can be alphanumeric, such as the array reference "AA12").
void SetUnitsFormat(const DIM_UNITS_FORMAT aFormat)
void SetPrefix(const wxString &aPrefix)
void SetExtensionOffset(int aOffset)
void SetSuffix(const wxString &aSuffix)
void SetLineThickness(int aWidth)
virtual const VECTOR2I & GetStart() const
The dimension's origin is the first feature point for the dimension.
virtual void SetEnd(const VECTOR2I &aPoint)
void SetPrecision(DIM_PRECISION aPrecision)
virtual void SetStart(const VECTOR2I &aPoint)
void SetOverrideText(const wxString &aValue)
void SetUnitsMode(DIM_UNITS_MODE aMode)
For better understanding of the points that make a dimension:
void SetExtensionHeight(int aHeight)
void SetHeight(int aHeight)
Set the distance from the feature points to the crossbar line.
A leader is a dimension-like object pointing to a specific point.
An orthogonal dimension is like an aligned dimension, but the extension lines are locked to the X or ...
void SetOrientation(DIR aOrientation)
Set the orientation of the dimension line (so, perpendicular to the feature lines).
A set of BOARD_ITEMs (i.e., without duplicates).
void SetLocked(bool aLocked) override
void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle) override
Rotate this object.
void Flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection) override
Flip this object, i.e.
void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
void Move(const VECTOR2I &aMoveVector) override
Move this object.
void Scale(double aScale)
void SetStroke(const STROKE_PARAMS &aStroke) override
void Flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection) override
Flip this object, i.e.
virtual void SetPosition(const VECTOR2I &aPos) override
void Move(const VECTOR2I &aMoveVector) override
Move this object.
void SetEnd(const VECTOR2I &aEnd)
void SetStart(const VECTOR2I &aStart)
const VECTOR2I & GetStart() const
const VECTOR2I & GetEnd() const
virtual void SetWidth(int aWidth)
virtual int GetWidth() const
Container for project specific data.
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
virtual const VECTOR2I GetPoint(int aIndex) const override
void SetClosed(bool aClosed)
Mark the line chain as closed (i.e.
int PointCount() const
Return the number of points (vertices) in this line chain.
void Append(int aX, int aY, bool aAllowDuplication=false)
Append a new point at the end of the line chain.
Represent a set of closed polygons.
void BooleanAdd(const SHAPE_POLY_SET &b)
Perform boolean polyset union.
void ClearArcs()
Removes all arc references from all the outlines and holes in the polyset.
double Area()
Return the area of this poly set.
void Inflate(int aAmount, CORNER_STRATEGY aCornerStrategy, int aMaxError, bool aSimplify=false)
Perform outline inflation/deflation.
int HoleCount(int aOutline) const
Returns the number of holes in a given outline.
int AddHole(const SHAPE_LINE_CHAIN &aHole, int aOutline=-1)
Adds a new hole to the given outline (default: last) and returns its index.
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
SHAPE_LINE_CHAIN & Hole(int aOutline, int aHole)
Return the reference to aHole-th hole in the aIndex-th outline.
void BooleanIntersection(const SHAPE_POLY_SET &b)
Perform boolean polyset intersection.
const SHAPE_LINE_CHAIN & CHole(int aOutline, int aHole) const
int OutlineCount() const
Return the number of outlines in the set.
void Move(const VECTOR2I &aVector) override
void Fracture(bool aSimplify=true)
Convert a set of polygons with holes to a single outline with "slits"/"fractures" connecting the oute...
bool Contains(const VECTOR2I &aP, int aSubpolyIndex=-1, int aAccuracy=0, bool aUseBBoxCaches=false) const
Return true if a given subpolygon contains the point aP.
void BooleanSubtract(const SHAPE_POLY_SET &b)
Perform boolean polyset difference.
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
virtual VECTOR2I GetStart() const
Simple container to manage line stroke parameters.
T EuclideanNorm() const
Compute the Euclidean norm of the vector, which is defined as sqrt(x ** 2 + y ** 2).
VECTOR2< T > Resize(T aNewLength) const
Return a vector of the same direction, but length specified in aNewLength.
Handle a list of polygons defining a copper zone.
void SetHatchThickness(int aThickness)
void SetNeedRefill(bool aNeedRefill)
void SetDoNotAllowPads(bool aEnable)
std::optional< int > GetLocalClearance() const override
void SetLocalClearance(std::optional< int > aClearance)
void AddPolygon(std::vector< VECTOR2I > &aPolygon)
Add a polygon to the zone outline.
std::shared_ptr< SHAPE_POLY_SET > GetFilledPolysList(PCB_LAYER_ID aLayer) const
void SetMinThickness(int aMinThickness)
void SetHatchOrientation(const EDA_ANGLE &aStep)
void SetThermalReliefSpokeWidth(int aThermalReliefSpokeWidth)
virtual void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
SHAPE_POLY_SET * Outline()
void SetHatchStyle(ZONE_BORDER_DISPLAY_STYLE aStyle)
SHAPE_POLY_SET * GetFill(PCB_LAYER_ID aLayer)
void SetIsRuleArea(bool aEnable)
void SetDoNotAllowTracks(bool aEnable)
void SetFilledPolysList(PCB_LAYER_ID aLayer, const SHAPE_POLY_SET &aPolysList)
Set the list of filled polygons.
void SetIsFilled(bool isFilled)
void SetFillMode(ZONE_FILL_MODE aFillMode)
bool HasFilledPolysForLayer(PCB_LAYER_ID aLayer) const
void SetLayerSet(const LSET &aLayerSet) override
void SetDoNotAllowVias(bool aEnable)
void SetThermalReliefGap(int aThermalReliefGap)
virtual LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
void SetDoNotAllowFootprints(bool aEnable)
void SetDoNotAllowZoneFills(bool aEnable)
void SetAssignedPriority(unsigned aPriority)
void SetPadConnection(ZONE_CONNECTION aPadConnection)
void SetZoneName(const wxString &aName)
void SetIslandRemovalMode(ISLAND_REMOVAL_MODE aRemove)
void SetMinIslandArea(long long int aArea)
void SetHatchGap(int aStep)
void TransformArcToPolygon(SHAPE_POLY_SET &aBuffer, const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd, int aWidth, int aError, ERROR_LOC aErrorLoc)
Convert arc to multiple straight segments.
void TransformOvalToPolygon(SHAPE_POLY_SET &aBuffer, const VECTOR2I &aStart, const VECTOR2I &aEnd, int aWidth, int aError, ERROR_LOC aErrorLoc, int aMinSegCount=0)
Convert a oblong shape to a polygon, using multiple segments.
@ RECT_CHAMFER_BOTTOM_LEFT
@ ROUND_ALL_CORNERS
All angles are rounded.
static constexpr EDA_ANGLE ANGLE_90
static constexpr EDA_ANGLE ANGLE_180
#define IGNORE_PARENT_GROUP
@ FILLED_SHAPE
Fill with object color.
#define DEFAULT_SIZE_TEXT
This is the "default-of-the-default" hardcoded text size; individual application define their own def...
#define THROW_IO_ERROR(msg)
macro which captures the "call site" values of FILE_, __FUNCTION & LINE
PCB_LAYER_ID
A quick note on layer IDs:
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 ...
@ LEFT_RIGHT
Flip left to right (around the Y axis)
constexpr int Mils2IU(const EDA_IU_SCALE &aIuScale, int mils)
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
@ NPTH
like PAD_PTH, but not plated mechanical use only, no connection allowed
@ SMD
Smd pad, appears on the solder paste layer (default)
@ PTH
Plated through hole pad.
Class to handle a set of BOARD_ITEMs.
ALIGNMENT Alignment
In CADSTAR The default alignment for a TEXT object (when "(No Alignment()" is selected) Bottom Left o...
ATTRIBUTE_LOCATION AttributeLocation
bool HasLocation
Flag to know if this ATTRIBUTE_VALUE has a location i.e.
Represent a cutout in a closed shape (e.g.
std::vector< VERTEX > Vertices
long ScaleRatioNumerator
Documentation symbols can be arbitrarily scaled when added to a design.
long ScaleRatioDenominator
Documentation symbols can be arbitrarily scaled when added to a design.
POINT Origin
Origin of the component (this is used as the reference point when placing the component in the design...
LAYER_ID LayerID
Move all objects in the Symdef to this layer.
SYMDEF_ID SymdefID
Normally documentation symbols only have TEXT, FIGURE and TEXT_LOCATION objects which are all drawn o...
long Modifier1
It seems this is related to weight. 400=Normal, 700=Bold.
GROUP_ID GroupID
If not empty, this GROUP is part of another GROUP.
std::vector< HATCH > Hatches
ROUTECODE_ID RouteCodeID
"NETCODE" subnode
wxString Name
This is undefined (wxEmptyString) if the net is unnamed.
NETCLASS_ID NetClassID
The net might not have a net class, in which case it will be wxEmptyString ("NETCLASSREF" subnode)
SPACING_CLASS_ID SpacingClassID
The net might not have a spacing class, in which case it will be wxEmptyString ("SPACINGCLASS" subnod...
long SignalNum
This is undefined if the net has been given a name.
wxString Name
This name can be different to the PART name.
std::map< PART_DEFINITION_PIN_ID, PIN > Pins
Represent a point in x,y coordinates.
std::vector< VERTEX > Vertices
wxString HatchCodeID
Only Applicable for HATCHED Type.
std::vector< CUTOUT > Cutouts
Not Applicable to OPENSHAPE Type.
std::map< FIGURE_ID, FIGURE > Figures
POINT Origin
Origin of the component (this is used as the reference point when placing the component in the design...
wxString Alternate
This is in addition to ReferenceName.
std::map< TEXT_ID, TEXT > Texts
wxString ReferenceName
This is the name which identifies the symbol in the library Multiple components may exist with the sa...
wxString BuildLibName() const
long Width
Defaults to 0 if using system fonts or, if using CADSTAR font, default to equal height (1:1 aspect ra...
Corresponds to CADSTAR "origin".
ALIGNMENT Alignment
In CADSTAR The default alignment for a TEXT object (when "(No Alignment)" is selected) Bottom Left of...
< Nodename = "VARIANT" or "VMASTER" (master variant
Represents a vertex in a shape.
From CADSTAR Help: "Area is for creating areas within which, and nowhere else, certain operations are...
bool Keepout
From CADSTAR Help: "Auto Placement cannot place components within this area.
bool Placement
From CADSTAR Help: "Auto Placement can place components within this area.
bool NoVias
From CADSTAR Help: "No vias will be placed within this area by the automatic router.
bool Routing
From CADSTAR Help: "Area can be used to place routes during Automatic Routing.
bool NoTracks
From CADSTAR Help: "Area cannot be used to place routes during automatic routing.
GROUP_ID GroupID
Normally CADSTAR_BOARD cannot be part of a reuseblock, but included for completeness.
long OrientAngle
1/1000 of a Degree
From CADSTAR Help: "Area is for creating areas within which, and nowhere else, certain operations are...
bool NoVias
From CADSTAR Help: "Check this button to specify that any area created by the Rectangle,...
bool NoTracks
From CADSTAR Help: "Check this button to specify that any area created by the Rectangle,...
A shape of copper in the component footprint.
std::vector< PAD_ID > AssociatedPadIDs
COPPERCODE_ID CopperCodeID
bool PCBonlyPad
From CADSTAR Help: "The PCB Only Pad property can be used to stop ECO Update, Back Annotation,...
PAD_EXITS Exits
See PAD_EXITS.
POINT Position
Pad position within the component's coordinate frame.
wxString Identifier
This is an identifier that is displayed to the user.
PAD_SIDE Side
See PAD_SIDE.
std::map< ATTRIBUTE_ID, ATTRIBUTE_VALUE > AttributeValues
std::map< ATTRIBUTE_ID, TEXT_LOCATION > TextLocations
This contains location of any attributes, including designator position.
COPPERCODE_ID CopperCodeID
TEMPLATE_ID PouredTemplateID
If not empty, it means this COPPER is part of a poured template.
long Offset
Offset from the measurement point.
long Overshoot
Overshoot of the extension line past the arrow line.
long LeaderLineExtensionLength
Only for TYPE=LEADERLINE Length of the horizontal part of the leader line [param6].
LINECODE_ID LineCodeID
param0
long LeaderLineLength
Only for TYPE=LEADERLINE Length of the angled part of the leader line [param5].
long LeaderAngle
Only for TYPE=LEADERLINE subnode "LEADERANG".
STYLE Style
Subnode="DIMLINETYPE".
Linear, leader (radius/diameter) or angular dimension.
LAYER_ID LayerID
ID on which to draw this [param1].
EXTENSION_LINE ExtensionLineParams
Not applicable to TYPE=LEADERDIM.
DIMENSION_ID ID
Some ID (doesn't seem to be used) subnode="DIMREF".
long Precision
Number of decimal points to display in the measurement [param3].
PHYSICAL_LAYER_ID PhysicalLayerStart
PHYSICAL_LAYER_ID PhysicalLayerEnd
long Thickness
Note: Units of length are defined in file header.
std::vector< CONNECTION_PCB > Connections
std::map< NETELEMENT_ID, VIA > Vias
std::map< NETELEMENT_ID, PIN > Pins
std::map< NETELEMENT_ID, JUNCTION_PCB > Junctions
long ReliefWidth
if undefined inherits from design
std::map< LAYER_ID, CADSTAR_PAD_SHAPE > Reassigns
long ReliefClearance
if undefined inherits from design
PADCODE_ID PadCode
If not empty, override padcode.
std::map< PAD_ID, COMPONENT_PAD > ComponentPads
std::vector< COMPONENT_COPPER > ComponentCoppers
std::map< COMP_AREA_ID, COMPONENT_AREA > ComponentAreas
long AdditionalIsolation
This is the gap to apply in routes and pads in addition to the existing pad-to-copper or route-to-cop...
bool ThermalReliefOnVias
false when subnode "NOVIARELIEF" is present
HATCHCODE_ID HatchCodeID
Only for FillType = HATCHED.
bool ThermalReliefOnPads
false when subnode "NOPINRELIEF" is present
long ThermalReliefPadsAngle
Orientation for the thermal reliefs.
long MinDisjointCopper
The value is the length of one side of a notional square.
bool AutomaticRepour
true when subnode "REGENERATE" is present
bool AllowInNoRouting
true when subnode "IGNORETRN" is present
bool BoxIsolatedPins
true when subnode "BOXPINS" is present
long ClearanceWidth
Specifies the space around pads when pouring (i.e.
COPPERCODE_ID ReliefCopperCodeID
From CADSTAR Help: "Relief Copper Code is forselecting the width of line used to draw thethermal reli...
COPPER_FILL_TYPE FillType
Assume solid fill.
COPPERCODE_ID CopperCodeID
From CADSTAR Help: "Copper Code is for selecting the width of the line used to draw the outline and f...
long ThermalReliefViasAngle
Disabled when !ThermalReliefOnVias (param6)
long MinIsolatedCopper
The value is the length of one side of a notional square.
long SliverWidth
Minimum width of copper that may be created.
Templates are CADSTAR's equivalent to a "filled zone".
POURING Pouring
Copper pour settings (e.g. relief / hatching /etc.)
@ USER
The field ID hasn't been set yet; field is invalid.
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.
double DEG2RAD(double deg)
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
VECTOR2< int32_t > VECTOR2I
@ THERMAL
Use thermal relief for pads.
@ FULL
pads are covered by copper