68    long long maxDesignSizekicad = std::numeric_limits<int>::max();
 
   70    if( designSizeXkicad > maxDesignSizekicad || designSizeYkicad > maxDesignSizekicad )
 
   75                _( 
"The design is too large and cannot be imported into KiCad. \n" 
   76                   "Please reduce the maximum design size in CADSTAR by navigating to: \n" 
   77                   "Design Tab -> Properties -> Design Options -> Maximum Design Size. \n" 
   78                   "Current Design size: %.2f, %.2f millimeters. \n"                 
   79                   "Maximum permitted design size: %.2f, %.2f millimeters.\n" ),    
 
   93                _( 
"The selected file indicates that nets might be out of synchronisation " 
   94                   "with the schematic. It is recommended that you carry out an 'Align Nets' " 
   95                   "procedure in CADSTAR and re-import, to avoid inconsistencies between the " 
   96                   "PCB and the schematic. " ) );
 
  106        long numSteps = 
Layout.Coppers.size();
 
  109        numSteps += ( 
Layout.Templates.size() * 
Layout.Templates.size() ) / 2;
 
  133            wxLogError( wxString::Format( 
_( 
"Unable to determine zone fill priorities for layer " 
  134                                             "'%s'. A best attempt has been made but it is " 
  135                                             "possible that DRC errors exist and that manual " 
  136                                             "editing of the zone priorities is required." ),
 
  137                                          m_board->GetLayerName( 
id ) ) );
 
  144    if( 
Layout.Trunks.size() > 0 )
 
  147                _( 
"The CADSTAR design contains Trunk routing elements, which have no KiCad " 
  148                   "equivalent. These elements were not loaded." ) );
 
  151    if( 
Layout.VariantHierarchy.Variants.size() > 0 )
 
  153        wxLogWarning( wxString::Format(
 
  154                _( 
"The CADSTAR design contains variants which has no KiCad equivalent. Only " 
  155                   "the variant '%s' was loaded." ),
 
  156                Layout.VariantHierarchy.Variants.begin()->second.Name ) );
 
  159    if( 
Layout.ReuseBlocks.size() > 0 )
 
  162                _( 
"The CADSTAR design contains re-use blocks which has no KiCad equivalent. The " 
  163                   "re-use block information has been discarded during the import." ) );
 
  166    wxLogWarning( 
_( 
"CADSTAR fonts are different to the ones in KiCad. This will likely result " 
  167                     "in alignment issues that may cause DRC errors. Please review the imported " 
  168                     "text elements carefully and correct manually if required." ) );
 
  171            _( 
"The CADSTAR design has been imported successfully.\n" 
  172               "Please review the import errors and warnings (if any)." ) );
 
 
  177    std::vector<FOOTPRINT*> retval;
 
  179    for( std::pair<SYMDEF_ID, FOOTPRINT*> fpPair : 
m_libraryMap )
 
  181        retval.push_back( 
static_cast<FOOTPRINT*
>( fpPair.second->Clone() ) );
 
 
  197    for( std::pair<SYMDEF_ID, FOOTPRINT*> libItem : 
m_libraryMap )
 
  218    std::vector<std::unique_ptr<FOOTPRINT>> retval;
 
  222        footprint->SetParent( 
nullptr ); 
 
  223        retval.emplace_back( footprint );
 
 
  241        wxLogWarning( wxString::Format(
 
  242                _( 
"The CADSTAR layer '%s' has no KiCad equivalent. All elements on this " 
  243                   "layer have been mapped to KiCad layer '%s' instead." ),
 
  244                aCadstarLayerName, 
LSET::Name( aKiCadLayer ) ) );
 
 
  254        wxLogMessage( wxString::Format(
 
  255                _( 
"The CADSTAR layer '%s' has been assumed to be a technical layer. All " 
  256                   "elements on this layer have been mapped to KiCad layer '%s'." ),
 
  257                aCadstarLayerName, 
LSET::Name( aKiCadLayer ) ) );
 
 
  264                                                  int aDielectricSublayer )
 
  276    if( !aCadstarLayer.
Name.IsEmpty() )
 
 
  290        LAYER_ID ElecLayerID = wxEmptyString;     
 
  293        std::vector<LAYER_ID> ConstructionLayers; 
 
  298        bool IsInitialised() { 
return !ElecLayerID.IsEmpty() || ConstructionLayers.size() > 0; };
 
  301    std::vector<LAYER_BLOCK> cadstarBoardStackup;
 
  302    LAYER_BLOCK              currentBlock;
 
  314            if( currentBlock.IsInitialised() )
 
  316                cadstarBoardStackup.push_back( currentBlock );
 
  317                currentBlock = LAYER_BLOCK(); 
 
  320            currentBlock.ElecLayerID = cadstarLayerID;
 
  327                wxLogWarning( wxString::Format( 
_( 
"The CADSTAR construction layer '%s' is on " 
  328                                                   "the outer surface of the board. It has been " 
  330                                                cadstarLayer.
Name ) );
 
  334                currentBlock.ConstructionLayers.push_back( cadstarLayerID );
 
  339    if( currentBlock.IsInitialised() )
 
  340        cadstarBoardStackup.push_back( currentBlock );
 
  345    if( cadstarBoardStackup.back().ConstructionLayers.size() > 0 )
 
  347        for( 
const LAYER_ID& layerID : cadstarBoardStackup.back().ConstructionLayers )
 
  351            wxLogWarning( wxString::Format( 
_( 
"The CADSTAR construction layer '%s' is on " 
  352                                               "the outer surface of the board. It has been " 
  354                                            cadstarLayer.
Name ) );
 
  357        cadstarBoardStackup.back().ConstructionLayers.clear();
 
  363        LAYER_BLOCK bottomLayer = cadstarBoardStackup.back();
 
  364        cadstarBoardStackup.pop_back();
 
  366        LAYER_BLOCK secondToLastLayer = cadstarBoardStackup.back();
 
  367        cadstarBoardStackup.pop_back();
 
  369        LAYER_BLOCK dummyLayer;
 
  371        if( secondToLastLayer.ConstructionLayers.size() > 0 )
 
  373            LAYER_ID lastConstruction = secondToLastLayer.ConstructionLayers.back();
 
  375            if( secondToLastLayer.ConstructionLayers.size() > 1 )
 
  379                secondToLastLayer.ConstructionLayers.pop_back();
 
  385                Assignments.Layerdefs.Layers.at( lastConstruction ).Thickness /= 2;
 
  388            dummyLayer.ConstructionLayers.push_back( lastConstruction );
 
  391        cadstarBoardStackup.push_back( secondToLastLayer );
 
  392        cadstarBoardStackup.push_back( dummyLayer );
 
  393        cadstarBoardStackup.push_back( bottomLayer );
 
  398    wxASSERT( cadstarBoardStackup.back().ConstructionLayers.size() == 0 );
 
  409    size_t stackIndex = 0;
 
  415            LAYER_ID layerID = cadstarBoardStackup.at( stackIndex ).ElecLayerID;
 
  417            if( layerID.IsEmpty() )
 
  420                item->SetThickness( 0 );
 
  428                switch( copperLayer.
Type )
 
  444                    wxFAIL_MSG( wxT( 
"Unexpected Layer type. Was expecting an electrical type" ) );
 
  448                m_board->SetLayerType( item->GetBrdLayerId(), copperType );
 
  449                m_board->SetLayerName( item->GetBrdLayerId(), item->GetLayerName() );
 
  450                m_layermap.insert( { copperLayer.
ID, item->GetBrdLayerId() } );
 
  455            LAYER_BLOCK layerBlock = cadstarBoardStackup.at( stackIndex );
 
  456            LAYER_BLOCK layerBlockBelow = cadstarBoardStackup.at( stackIndex + 1 );
 
  458            if( layerBlock.ConstructionLayers.size() == 0 )
 
  464            int dielectricId = stackIndex + 1;
 
  465            item->SetDielectricLayerId( dielectricId );
 
  470            if( layerBlock.ElecLayerID.IsEmpty() )
 
  477                LAYER copperLayer = 
Assignments.Layerdefs.Layers.at( layerBlock.ElecLayerID );
 
  479                if( layerBlockBelow.ElecLayerID.IsEmpty() )
 
  490                    LAYER copperLayerBelow =
 
  491                            Assignments.Layerdefs.Layers.at( layerBlockBelow.ElecLayerID );
 
  508            int dielectricSublayer = 0;
 
  510            for( 
LAYER_ID constructionLaID : layerBlock.ConstructionLayers )
 
  512                LAYER dielectricLayer = 
Assignments.Layerdefs.Layers.at( constructionLaID );
 
  514                if( dielectricSublayer )
 
  515                    item->AddDielectricPrms( dielectricSublayer );
 
  518                m_board->SetLayerName( item->GetBrdLayerId(), item->GetLayerName() );
 
  519                m_layermap.insert( { dielectricLayer.
ID, item->GetBrdLayerId() } );
 
  520                ++dielectricSublayer;
 
  527            item->SetColor( wxT( 
"White" ) );
 
  531            item->SetColor( wxT( 
"Green" ) );
 
  539    int numElecLayersProcessed = 0;
 
  542    int                       currentDocLayer = 0;
 
  550        wxString     layerName = curLayer.
Name.Lower();
 
  563                    kicadLayerID = aBack;
 
  565                    kicadLayerID = aFront;
 
  569                case LOG_LEVEL::NONE:
 
  576                case LOG_LEVEL::WARN:
 
  582        switch( curLayer.
Type )
 
  590            THROW_IO_ERROR( wxString::Format( 
_( 
"Unexpected layer '%s' in layer stack." ),
 
  597            ++numElecLayersProcessed;
 
  605            if( currentDocLayer >= docLayers.size() )
 
  608            kicadLayerID = docLayers.at( currentDocLayer++ );
 
  626                if( layerName.Contains( wxT( 
"glue" ) ) || layerName.Contains( wxT( 
"adhesive" ) ) )
 
  630                else if( layerName.Contains( wxT( 
"silk" ) ) || layerName.Contains( wxT( 
"legend" ) ) )
 
  634                else if( layerName.Contains( wxT( 
"assembly" ) ) || layerName.Contains( wxT( 
"fabrication" ) ) )
 
  638                else if( layerName.Contains( wxT( 
"resist" ) ) || layerName.Contains( wxT( 
"mask" ) ) )
 
  642                else if( layerName.Contains( wxT( 
"paste" ) ) )
 
  673                wxFAIL_MSG( wxT( 
"Unknown CADSTAR Layer Sub-type" ) );
 
  679            wxFAIL_MSG( wxT( 
"Unknown CADSTAR Layer Type" ) );
 
 
  694    std::vector<INPUT_LAYER_DESC> inputLayers;
 
  695    std::map<wxString, LAYER_ID>  cadstarLayerNameMap;
 
  697    for( std::pair<LAYER_ID, PCB_LAYER_ID> layerPair : 
m_layermap )
 
  709            inputLayers.push_back( iLdesc );
 
  710            cadstarLayerNameMap.insert( { curLayer->
Name, curLayer->
ID } );
 
  714    if( inputLayers.size() == 0 )
 
  720    for( std::pair<wxString, PCB_LAYER_ID> layerPair : reMappedLayers )
 
  724            wxFAIL_MSG( wxT( 
"Unexpected Layer ID" ) );
 
  728        LAYER_ID cadstarLayerID        = cadstarLayerNameMap.at( layerPair.first );
 
  729        m_layermap.at( cadstarLayerID ) = layerPair.second;
 
  730        enabledLayers |= 
LSET( { layerPair.second } );
 
  733    m_board->SetEnabledLayers( enabledLayers );
 
  734    m_board->SetVisibleLayers( enabledLayers );
 
 
  741    std::map<SPACINGCODE_ID, SPACINGCODE>& spacingCodes = 
Assignments.Codedefs.SpacingCodes;
 
  744            [&]( wxString aID, 
int* aVal )
 
  746                if( spacingCodes.find( aID ) == spacingCodes.end() )
 
  747                    wxLogWarning( 
_( 
"Design rule %s was not found. This was ignored." ) );
 
  765    auto applyNetClassRule = [&]( wxString aID, 
const std::shared_ptr<NETCLASS>& aNetClassPtr )
 
  768        applyRule( aID, &value );
 
  771            aNetClassPtr->SetClearance( value );
 
  776    wxLogWarning( 
_( 
"KiCad design rules are different from CADSTAR ones. Only the compatible " 
  777                     "design rules were imported. It is recommended that you review the design " 
  778                     "rules that have been applied." ) );
 
 
  784    for( std::pair<SYMDEF_ID, SYMDEF_PCB> symPair : 
Library.ComponentDefinitions )
 
  794        if( component.
Figures.size() > 0 )
 
  797            componentLayer = firstFigure.
LayerID;
 
  799        else if( component.
Texts.size() > 0 )
 
  801            TEXT firstText = component.
Texts.begin()->second;
 
  802            componentLayer = firstText.
LayerID;
 
  825        m_libraryMap.insert( std::make_pair( key, footprint ) );
 
 
  833    for( std::pair<FIGURE_ID, FIGURE> figPair : aComponent.
Figures )
 
  835        FIGURE& fig = figPair.second;
 
  842                              wxString::Format( wxT( 
"Component %s:%s -> Figure %s" ),
 
 
  855    bool compCopperError = 
false;
 
  862        LSET remainingLayers = layers;
 
  864        if( !compCopperError && copperLayers.count() > 1 && compCopper.
AssociatedPadIDs.size() > 0 )
 
  867            wxLogError( 
_( 
"Footprint definition '%s' has component copper associated to a pad on " 
  868                           "multiple layers. Custom padstacks are not supported in KiCad. The " 
  869                           "copper items have been imported as graphical elements." ),
 
  872            compCopperError = 
true;
 
  901            std::unique_ptr<PAD> 
pad = std::make_unique<PAD>( aFootprint );
 
  903            pad->SetLayerSet( copperLayers );
 
  905                                  ? wxString::Format( wxT( 
"%ld" ), anchorPad.
ID )
 
  915            if( anchorSize <= 0 )
 
  921            pad->SetPosition( anchorPos );
 
  925            shapePolys.
Move( -anchorPos );
 
  942            remainingLayers ^= copperLayers; 
 
  945        if( remainingLayers.any() )
 
  950                                  wxString::Format( wxT( 
"Component %s:%s -> Copper element" ),
 
 
  962    for( std::pair<COMP_AREA_ID, COMPONENT_AREA> areaPair : aComponent.
ComponentAreas )
 
  968            int   lineThickness = 0; 
 
  993                libName << wxT( 
" (" ) << aComponent.
Alternate << wxT( 
")" );
 
  996                    wxString::Format( 
_( 
"The CADSTAR area '%s' in library component '%s' does not " 
  997                                         "have a KiCad equivalent. The area is neither a via nor " 
  998                                         "route keepout area. The area was not imported." ),
 
  999                            area.
ID, libName ) );
 
 
 1008    for( std::pair<PAD_ID, COMPONENT_PAD> padPair : aComponent.
ComponentPads )
 
 
 1022    std::unique_ptr<PAD> 
pad = std::make_unique<PAD>( aParent );
 
 1025    switch( aCadstarPad.
Side )
 
 1040        wxFAIL_MSG( wxT( 
"Unknown Pad type" ) );
 
 1044    pad->SetLocalSolderMaskMargin( 0 );
 
 1045    pad->SetLocalSolderPasteMargin( 0 );
 
 1046    pad->SetLocalSolderPasteMarginRatio( 0.0 );
 
 1047    bool complexPadErrorLogged = 
false;
 
 1049    for( 
auto& [layer, shape] : csPadcode.
Reassigns )
 
 1053        if( shape.Size == 0 )
 
 1056                padLayerSet.
reset( kiLayer );
 
 1064                std::optional<int> localMargin = 
pad->GetLocalSolderMaskMargin();
 
 1066                if( !localMargin.has_value() )
 
 1067                    pad->SetLocalSolderMaskMargin( newMargin );
 
 1069                    pad->SetLocalSolderMaskMargin( newMargin );
 
 1073                std::optional<int> localMargin = 
pad->GetLocalSolderPasteMargin();
 
 1075                if( !localMargin.has_value() )
 
 1076                    pad->SetLocalSolderPasteMargin( newMargin );
 
 1078                    pad->SetLocalSolderPasteMargin( newMargin );
 
 1084                if( !complexPadErrorLogged )
 
 1086                    complexPadErrorLogged = 
true;
 
 1090                                    _( 
"The CADSTAR pad definition '%s' is a complex pad stack, " 
 1091                                       "which is not supported in KiCad. Please review the " 
 1092                                       "imported pads as they may require manual correction." ),
 
 1099    pad->SetLayerSet( padLayerSet );
 
 1106        pad->SetNumber( wxT( 
"" ) );
 
 1111                                ? wxString::Format( wxT( 
"%ld" ), aCadstarPad.
ID )
 
 1234        wxFAIL_MSG( wxT( 
"Unknown Pad Shape" ) );
 
 1269        pad->SetDrillSize( { 0, 0 } );
 
 1274        LSET lset = 
pad->GetLayerSet();
 
 1277        if( lset.size() > 0 )
 
 1281            int            maxError = 
m_board->GetDesignSettings().m_MaxError;
 
 1283            pad->SetPosition( { 0, 0 } );
 
 1284            pad->TransformShapeToPolygon( padOutline, layer, 0, maxError, 
ERROR_INSIDE );
 
 1291            padShape->
Move( padOffset - drillOffset );
 
 1296            if( editedPadOutline.
Contains( { 0, 0 } ) )
 
 1302                padOffset   = { 0, 0 };
 
 1309                drillOffset               = { 0, 0 };
 
 1314                                _( 
"The CADSTAR pad definition '%s' has the hole shape outside the " 
 1315                                   "pad shape. The hole has been moved to the center of the pad." ),
 
 1321            wxFAIL_MSG( wxT( 
"No copper layers defined in the pad?" ) );
 
 1344        wxLogError( 
_( 
"The CADSTAR pad definition '%s' has import errors: %s" ),
 
 1351    return pad.release();
 
 
 1356                                                   const PAD_ID aCadstarPadID )
 
 1358    size_t index = aCadstarPadID - (long) 1;
 
 1360    if( !( index < aFootprint->Pads().size() ) )
 
 1362        THROW_IO_ERROR( wxString::Format( 
_( 
"Unable to find pad index '%d' in footprint '%s'." ),
 
 1363                                          (
long) aCadstarPadID,
 
 1367    return aFootprint->
Pads().at( index );
 
 
 1373    for( std::pair<GROUP_ID, GROUP> groupPair : 
Layout.Groups )
 
 1375        GROUP& csGroup = groupPair.second;
 
 1387    for( std::pair<GROUP_ID, GROUP> groupPair : 
Layout.Groups )
 
 1389        GROUP& csGroup = groupPair.second;
 
 1391        if( !csGroup.
GroupID.IsEmpty() )
 
 1395                THROW_IO_ERROR( wxString::Format( 
_( 
"Unable to find group ID %s in the group " 
 1401                THROW_IO_ERROR( wxString::Format( 
_( 
"Unable to find sub group %s in the group " 
 1402                                                     "map (parent group ID=%s, Name=%s)." ),
 
 1411                parentGroup->
AddItem( kiCadGroup );
 
 
 1420    for( std::pair<BOARD_ID, CADSTAR_BOARD> boardPair : 
Layout.Boards )
 
 1426                          wxString::Format( wxT( 
"BOARD %s" ), board.
ID ),
 
 1429        if( !board.
GroupID.IsEmpty() )
 
 
 1441    for( std::pair<FIGURE_ID, FIGURE> figPair : 
Layout.Figures )
 
 1443        FIGURE& fig = figPair.second;
 
 1450                              wxString::Format( wxT( 
"FIGURE %s" ), fig.
ID ),
 
 
 1463    for( std::pair<TEXT_ID, TEXT> txtPair : 
Layout.Texts )
 
 1465        TEXT& csTxt = txtPair.second;
 
 
 1473    for( std::pair<DIMENSION_ID, DIMENSION> dimPair : 
Layout.Dimensions )
 
 1477        switch( csDim.
Type )
 
 1479        case DIMENSION::TYPE::LINEARDIM:
 
 1482            case DIMENSION::SUBTYPE::ANGLED:
 
 1483                wxLogWarning( wxString::Format( 
_( 
"Dimension ID %s is an angled dimension, which " 
 1484                                                   "has no KiCad equivalent. An aligned dimension " 
 1485                                                   "was loaded instead." ),
 
 1488            case DIMENSION::SUBTYPE::DIRECT:
 
 1489            case DIMENSION::SUBTYPE::ORTHOGONAL:
 
 1491                if( csDim.
Line.
Style == DIMENSION::LINE::STYLE::EXTERNAL )
 
 1493                    wxLogWarning( wxString::Format(
 
 1494                            _( 
"Dimension ID %s has 'External' style in CADSTAR. External " 
 1495                               "dimension styles are not yet supported in KiCad. The dimension " 
 1496                               "object was imported with an internal dimension style instead." ),
 
 1502                if( csDim.
Subtype == DIMENSION::SUBTYPE::ORTHOGONAL )
 
 1526                VECTOR2I crossbarVector = crossbarEnd - crossbarStart;
 
 1528                double   height = 0.0;
 
 1530                if( csDim.
Subtype == DIMENSION::SUBTYPE::ORTHOGONAL )
 
 1533                        height = heightVector.
y;
 
 1535                        height = heightVector.
x;
 
 1541                    height = heightVector.
x * angle.
Cos() + heightVector.
y * angle.
Sin();
 
 1551                wxLogError(  
_( 
"Unexpected Dimension type (ID %s). This was not imported." ),
 
 1557        case DIMENSION::TYPE::LEADERDIM:
 
 1560            if( csDim.
Line.
Style == DIMENSION::LINE::STYLE::INTERNAL )
 
 1684        case DIMENSION::TYPE::ANGLEDIM:
 
 1686            wxLogError( 
_( 
"Dimension %s is an angular dimension which has no KiCad equivalent. " 
 1687                           "The object was not imported." ),
 
 
 1697    for( std::pair<AREA_ID, AREA> areaPair : 
Layout.Areas )
 
 1699        AREA& area = areaPair.second;
 
 1703            int   lineThickness = 0; 
 
 1726                wxLogWarning( wxString::Format( 
_( 
"The CADSTAR area '%s' is marked as a placement " 
 1727                                                   "area in CADSTAR. Placement areas are not " 
 1728                                                   "supported in KiCad. Only the supported elements " 
 1729                                                   "for the area were imported." ),
 
 1735            wxLogError( wxString::Format( 
_( 
"The CADSTAR area '%s' does not have a KiCad " 
 1736                                             "equivalent. Pure Placement areas are not supported." ),
 
 
 1751    for( std::pair<COMPONENT_ID, COMPONENT> compPair : 
Layout.Components )
 
 1762            THROW_IO_ERROR( wxString::Format( 
_( 
"Unable to find component '%s' in the library" 
 1763                                                 "(Symdef ID: '%s')" ),
 
 1768        FOOTPRINT* libFootprint = fpIter->second;
 
 1779        if( 
Parts.PartDefinitions.find( comp.
PartID ) != 
Parts.PartDefinitions.end() )
 
 1787                for( std::pair<PART_DEFINITION_PIN_ID, PART::DEFINITION::PIN> pinPair :
 
 1790                    PART::DEFINITION::PIN 
pin = pinPair.second;
 
 1791                    wxString              pinName = 
pin.Name;
 
 1793                    if( pinName.empty() )
 
 1794                        pinName = 
pin.Identifier;
 
 1796                    if( pinName.empty() )
 
 1797                        pinName = wxString::Format( wxT( 
"%ld" ), 
pin.ID );
 
 1809            for( std::pair<PAD_ID, PADEXCEPTION> padPair : comp.
PadExceptions )
 
 1818                if( !padEx.
PadCode.IsEmpty() )
 
 1833                wxString padNumber = kiPad->
GetNumber();
 
 1848        footprint->
SetValue( wxEmptyString );
 
 1864        if( !comp.
PartID.IsEmpty() && comp.
PartID != wxT( 
"NO_PART" ) )
 
 
 1876    for( std::pair<DOCUMENTATION_SYMBOL_ID, DOCUMENTATION_SYMBOL> docPair :
 
 1877            Layout.DocumentationSymbols )
 
 1882        auto docSymIter = 
Library.ComponentDefinitions.find( docSymInstance.
SymdefID );
 
 1884        if( docSymIter == 
Library.ComponentDefinitions.end() )
 
 1886            THROW_IO_ERROR( wxString::Format( 
_( 
"Unable to find documentation symbol in the " 
 1887                                                 "library (Symdef ID: '%s')" ),
 
 1891        SYMDEF_PCB& docSymDefinition = ( *docSymIter ).second;
 
 1898        bool    mirrorInvert      = docSymInstance.
Mirror;
 
 1903        if( !docSymDefinition.
Alternate.IsEmpty() )
 
 1904            groupName += wxT( 
" (" ) + docSymDefinition.
Alternate + wxT( 
")" );
 
 1912            for( std::pair<FIGURE_ID, FIGURE> figPair : docSymDefinition.
Figures )
 
 1914                FIGURE fig = figPair.second;
 
 1916                                  wxString::Format( wxT( 
"DOCUMENTATION SYMBOL %s, FIGURE %s" ),
 
 1918                                  m_board, groupID, moveVector, rotationAngle, scalingFactor,
 
 1919                                  centreOfTransform, mirrorInvert );
 
 1923        for( std::pair<TEXT_ID, TEXT> textPair : docSymDefinition.
Texts )
 
 1925            TEXT txt = textPair.second;
 
 1927                    rotationAngle, scalingFactor, centreOfTransform, mirrorInvert );
 
 
 1935    for( std::pair<TEMPLATE_ID, TEMPLATE> tempPair : 
Layout.Templates )
 
 1937        TEMPLATE& csTemplate = tempPair.second;
 
 1939        int zonelinethickness = 0; 
 
 1949        if( !( csTemplate.
NetID.IsEmpty() || csTemplate.
NetID == wxT( 
"NONE" ) ) )
 
 1954            wxLogWarning( wxString::Format(
 
 1955                    _( 
"The CADSTAR template '%s' has the setting 'Allow in No Routing Areas' " 
 1956                       "enabled. This setting has no KiCad equivalent, so it has been ignored." ),
 
 1957                    csTemplate.
Name ) );
 
 1962            wxLogWarning( wxString::Format(
 
 1963                    _( 
"The CADSTAR template '%s' has the setting 'Box Isolated Pins' " 
 1964                       "enabled. This setting has no KiCad equivalent, so it has been ignored." ),
 
 1965                    csTemplate.
Name ) );
 
 1970            wxLogWarning( wxString::Format(
 
 1971                    _( 
"The CADSTAR template '%s' has the setting 'Automatic Repour' " 
 1972                       "enabled. This setting has no KiCad equivalent, so it has been ignored." ),
 
 1973                    csTemplate.
Name ) );
 
 1981            wxLogWarning( wxString::Format(
 
 1982                    _( 
"The CADSTAR template '%s' has a non-zero value defined for the " 
 1983                       "'Sliver Width' setting. There is no KiCad equivalent for " 
 1984                       "this, so this setting was ignored." ),
 
 1985                    csTemplate.
Name ) );
 
 1991            wxLogWarning( wxString::Format(
 
 1992                    _( 
"The CADSTAR template '%s' has different settings for 'Retain Poured Copper " 
 1993                       "- Disjoint' and 'Retain Poured Copper - Isolated'. KiCad does not " 
 1994                       "distinguish between these two settings. The setting for disjoint copper " 
 1995                       "has been applied as the minimum island area of the KiCad Zone." ),
 
 1996                    csTemplate.
Name ) );
 
 1999        long long minIslandArea = -1;
 
 2026        if( csTemplate.
Pouring.
FillType == TEMPLATE::POURING::COPPER_FILL_TYPE::HATCHED )
 
 2042            wxLogWarning( wxString::Format(
 
 2043                    _( 
"The CADSTAR template '%s' has different settings for thermal relief " 
 2044                       "in pads and vias. KiCad only supports one single setting for both. The " 
 2045                       "setting for pads has been applied." ),
 
 2046                    csTemplate.
Name ) );
 
 2057            if( spokeWidth < minThickness )
 
 2059                wxLogWarning( wxString::Format(
 
 2060                        _( 
"The CADSTAR template '%s' has thermal reliefs in the original design " 
 2061                           "but the spoke width (%.2f mm) is thinner than the minimum thickness of "  
 2062                           "the zone (%.2f mm). KiCad requires the minimum thickness of the zone "    
 2063                           "to be preserved. Therefore the minimum thickness has been applied as " 
 2064                           "the new spoke width and will be applied next time the zones are " 
 2069                spokeWidth = minThickness;
 
 2091        wxString powerPlaneLayerName = 
Assignments.Layerdefs.Layers.at( layer ).Name;
 
 2092        NET_ID   netid               = wxEmptyString;
 
 2094        for( std::pair<NET_ID, NET_PCB> netPair : 
Layout.Nets )
 
 2098            if( net.
Name == powerPlaneLayerName )
 
 2105        if( netid.IsEmpty() )
 
 2107            wxLogError( 
_( 
"The CADSTAR layer '%s' is defined as a power plane layer. However no " 
 2108                           "net with such name exists. The layer has been loaded but no copper " 
 2109                           "zone was created." ),
 
 2110                        powerPlaneLayerName );
 
 2114            for( std::pair<BOARD_ID, CADSTAR_BOARD> boardPair : 
Layout.Boards )
 
 
 2139    for( std::pair<COPPER_ID, COPPER> copPair : 
Layout.Coppers )
 
 2141        COPPER& csCopper = copPair.second;
 
 2208                    _( 
"The CADSTAR design contains COPPER elements, which have no direct KiCad " 
 2209                       "equivalent. These have been imported as a KiCad Zone if solid or hatch " 
 2210                       "filled, or as a KiCad Track if the shape was an unfilled outline (open or " 
 
 2284    for( std::pair<NET_ID, NET_PCB> netPair : 
Layout.Nets )
 
 2287        wxString netnameForErrorReporting = net.
Name;
 
 2289        std::map<NETELEMENT_ID, long> netelementSizes;
 
 2291        if( netnameForErrorReporting.IsEmpty() )
 
 2292            netnameForErrorReporting = wxString::Format( wxT( 
"$%ld" ), net.
SignalNum );
 
 2294        for( std::pair<NETELEMENT_ID, NET_PCB::VIA> viaPair : net.
Vias )
 
 2296            NET_PCB::VIA 
via = viaPair.second;
 
 2300            netelementSizes.insert( { viaPair.first, viaSize } );
 
 2303        for( std::pair<NETELEMENT_ID, NET_PCB::PIN> pinPair : net.
Pins )
 
 2305            NET_PCB::PIN 
pin = pinPair.second;
 
 2308            if( footprint == 
nullptr )
 
 2310                wxLogWarning( wxString::Format(
 
 2311                        _( 
"The net '%s' references component ID '%s' which does not exist. " 
 2312                           "This has been ignored." ),
 
 2313                        netnameForErrorReporting, 
pin.ComponentID ) );
 
 2315            else if( ( 
pin.PadID - (
long) 1 ) > footprint->
Pads().size() )
 
 2317                wxLogWarning( wxString::Format( 
_( 
"The net '%s' references non-existent pad index" 
 2318                                                   " '%d' in component '%s'. This has been " 
 2320                                                netnameForErrorReporting,
 
 2339                    if( assocPads.find( 
pin.PadID ) != assocPads.end() )
 
 2341                        for( 
PAD_ID copperPadID : assocPads.at( 
pin.PadID ) )
 
 2350                int padsize = std::min( 
pad->GetSizeX(), 
pad->GetSizeY() );
 
 2351                netelementSizes.insert( { pinPair.first, padsize } );
 
 2359        auto getJunctionSize =
 
 2360            [&]( 
NETELEMENT_ID aJptNetElemId, 
const NET_PCB::CONNECTION_PCB& aConnectionToIgnore ) -> 
int 
 2362                int jptsize = std::numeric_limits<int>::max();
 
 2364                for( NET_PCB::CONNECTION_PCB connection : net.
Connections )
 
 2366                    if( connection.Route.RouteVertices.size() == 0 )
 
 2369                    if( connection.StartNode == aConnectionToIgnore.StartNode
 
 2370                        && connection.EndNode == aConnectionToIgnore.EndNode )
 
 2375                    if( connection.StartNode == aJptNetElemId )
 
 2377                        int s = 
getKiCadLength( connection.Route.RouteVertices.front().RouteWidth );
 
 2378                        jptsize = std::max( jptsize, s );
 
 2380                    else if( connection.EndNode == aJptNetElemId )
 
 2382                        int s = 
getKiCadLength( connection.Route.RouteVertices.back().RouteWidth );
 
 2383                        jptsize = std::max( jptsize, s );
 
 2387                if( jptsize == std::numeric_limits<int>::max()
 
 2388                    && !aConnectionToIgnore.Route.RouteVertices.empty() )
 
 2392                    NET_PCB::ROUTE_VERTEX vertex = aConnectionToIgnore.Route.RouteVertices.front();
 
 2394                    if( aConnectionToIgnore.EndNode == aJptNetElemId )
 
 2395                        vertex = aConnectionToIgnore.Route.RouteVertices.back();
 
 2403        for( NET_PCB::CONNECTION_PCB connection : net.
Connections )
 
 2405            int startSize = std::numeric_limits<int>::max();
 
 2406            int endSize = std::numeric_limits<int>::max();
 
 2408            if( netelementSizes.find( connection.StartNode ) != netelementSizes.end() )
 
 2409                startSize = netelementSizes.at( connection.StartNode );
 
 2411                startSize = getJunctionSize( connection.StartNode, connection );
 
 2413            if( netelementSizes.find( connection.EndNode ) != netelementSizes.end() )
 
 2414                endSize = netelementSizes.at( connection.EndNode );
 
 2416                endSize = getJunctionSize( connection.EndNode, connection );
 
 2421            if( !connection.Unrouted )
 
 
 2430    auto findAndReplaceTextField =
 
 2433            if( 
m_context.TextFieldToValuesMap.find( aField ) !=
 
 2436                if( 
m_context.TextFieldToValuesMap.at( aField ) != aValue )
 
 2438                    m_context.TextFieldToValuesMap.at( aField ) = aValue;
 
 2439                    m_context.InconsistentTextFields.insert( aField );
 
 2445                m_context.TextFieldToValuesMap.insert( { aField, aValue } );
 
 2453        std::map<wxString, wxString>& txtVars = 
m_project->GetTextVars();
 
 2456        if( 
Layout.VariantHierarchy.Variants.size() > 0 )
 
 2458            VARIANT loadedVar = 
Layout.VariantHierarchy.Variants.begin()->second;
 
 2466        for( std::pair<TEXT_FIELD_NAME, wxString> txtvalue : 
m_context.TextFieldToValuesMap )
 
 2469            wxString varValue = txtvalue.second;
 
 2471            txtVars.insert( { varName, varValue } );
 
 2474        for( std::pair<wxString, wxString> txtvalue : 
m_context.FilenamesToTextMap )
 
 2476            wxString varName  = txtvalue.first;
 
 2477            wxString varValue = txtvalue.second;
 
 2479            txtVars.insert( { varName, varValue } );
 
 2484        wxLogError( 
_( 
"Text Variables could not be set as there is no project loaded." ) );
 
 
 2492    for( std::pair<ATTRIBUTE_ID, ATTRIBUTE_VALUE> attrPair : aComponent.
AttributeValues )
 
 2503    for( std::pair<ATTRIBUTE_ID, TEXT_LOCATION> textlocPair : aComponent.
TextLocations )
 
 2510            attrval = wxEmptyString; 
 
 2514            attrval = wxT( 
"${REFERENCE}" );
 
 
 2529                                                const NET_PCB::ROUTE& aCadstarRoute,
 
 2530                                                long aStartWidth, 
long aEndWidth )
 
 2532    if( aCadstarRoute.RouteVertices.size() == 0 )
 
 2535    std::vector<PCB_SHAPE*> shapes;
 
 2536    std::vector<NET_PCB::ROUTE_VERTEX> routeVertices = aCadstarRoute.RouteVertices;
 
 2539    if( aStartWidth < routeVertices.front().RouteWidth )
 
 2541        NET_PCB::ROUTE_VERTEX newFrontVertex = aCadstarRoute.RouteVertices.front();
 
 2542        newFrontVertex.RouteWidth = aStartWidth;
 
 2543        newFrontVertex.Vertex.End = aCadstarRoute.StartPoint;
 
 2544        routeVertices.insert( routeVertices.begin(), newFrontVertex );
 
 2548    if( aEndWidth < routeVertices.back().RouteWidth )
 
 2550        NET_PCB::ROUTE_VERTEX newBackVertex = aCadstarRoute.RouteVertices.back();
 
 2551        newBackVertex.RouteWidth = aEndWidth;
 
 2552        routeVertices.push_back( newBackVertex );
 
 2555    POINT prevEnd = aCadstarRoute.StartPoint;
 
 2557    for( 
const NET_PCB::ROUTE_VERTEX& v : routeVertices )
 
 2563        shapes.push_back( shape );
 
 2564        prevEnd = v.Vertex.End;
 
 2569            wxLogError( 
_( 
"The CADSTAR design contains teardrops. This importer does not yet " 
 2570                           "support them, so the teardrops in the design have been ignored." ) );
 
 
 2586        const NET_ID& aCadstarNetID, 
const NET_PCB::VIA& aCadstarVia )
 
 2596    via->SetLocked( aCadstarVia.Fixed );
 
 2600        wxLogError( 
_( 
"The CADSTAR via code '%s' has different shape from a circle defined. " 
 2601                       "KiCad only supports circular vias so this via type has been changed to " 
 2602                       "be a via with circular shape of %.2f mm diameter." ),                   
 
 2609    bool start_layer_outside =
 
 2612    bool end_layer_outside =
 
 2616    if( start_layer_outside && end_layer_outside )
 
 2620    else if( ( !start_layer_outside ) && ( !end_layer_outside ) )
 
 
 2641                                                  const LAYER_ID& aCadstarLayerOverride,
 
 2643                                                  double aRotationAngle, 
double aScalingFactor,
 
 2645                                                  bool aMirrorInvert )
 
 2648    aContainer->
Add( txt );
 
 2653    RotatePoint( rotatedTextPos, aTransformCentre, rotationAngle );
 
 2654    rotatedTextPos.
x = 
KiROUND( ( rotatedTextPos.
x - aTransformCentre.
x ) * aScalingFactor );
 
 2655    rotatedTextPos.
y = 
KiROUND( ( rotatedTextPos.
y - aTransformCentre.
y ) * aScalingFactor );
 
 2656    rotatedTextPos += aTransformCentre;
 
 2715        wxFAIL_MSG( wxT( 
"Unknown Alignment - needs review!" ) );
 
 2722    if( aScalingFactor != 1.0 )
 
 2728        scaledTextSize.
x = 
KiROUND( (
double) unscaledTextSize.
x * aScalingFactor );
 
 2729        scaledTextSize.
y = 
KiROUND( (
double) unscaledTextSize.
y * aScalingFactor );
 
 2735    txt->
Move( aMoveVector );
 
 2740    LAYER_ID layersToDrawOn = aCadstarLayerOverride;
 
 2742    if( layersToDrawOn.IsEmpty() )
 
 2743        layersToDrawOn = aCadstarText.
LayerID;
 
 2754            if( !aCadstarGroupID.IsEmpty() )
 
 2765        if( !aCadstarGroupID.IsEmpty() )
 
 
 2775                                                   const wxString& aShapeName,
 
 2779                                                   double aRotationAngle, 
double aScalingFactor,
 
 2781                                                   bool aMirrorInvert )
 
 2783    auto drawAsOutline = [&]()
 
 2786                                     aContainer, aCadstarGroupID, aMoveVector, aRotationAngle,
 
 2787                                     aScalingFactor, aTransformCentre, aMirrorInvert );
 
 2789                                    aCadstarGroupID, aMoveVector, aRotationAngle, aScalingFactor,
 
 2790                                    aTransformCentre, aMirrorInvert );
 
 2793    switch( aCadstarShape.
Type )
 
 2803        wxLogWarning( wxString::Format(
 
 2804                _( 
"The shape for '%s' is Hatch filled in CADSTAR, which has no KiCad equivalent. " 
 2805                   "Using solid fill instead." ),
 
 2811        if( aCadstarShape.
Vertices.size() < 3 )
 
 2822                                                                aMoveVector, aRotationAngle,
 
 2823                                                                aScalingFactor, aTransformCentre,
 
 2833        if( !aCadstarGroupID.IsEmpty() )
 
 
 2847                                                             double aRotationAngle,
 
 2848                                                             double aScalingFactor,
 
 2850                                                             bool aMirrorInvert )
 
 2852    for( 
const CUTOUT& cutout : aCutouts )
 
 2855                                     aCadstarGroupID, aMoveVector, aRotationAngle, aScalingFactor,
 
 2856                                     aTransformCentre, aMirrorInvert );
 
 
 2867                                                              double aRotationAngle,
 
 2868                                                              double aScalingFactor,
 
 2870                                                              bool aMirrorInvert )
 
 2873                                                            aCadstarGroupID, aMoveVector,
 
 2874                                                            aRotationAngle, aScalingFactor,
 
 2875                                                            aTransformCentre, aMirrorInvert );
 
 2880        shape->SetLayer( aKiCadLayer );
 
 2881        shape->SetParent( aContainer );
 
 
 2887std::vector<PCB_SHAPE*>
 
 2892                                                   double aRotationAngle, 
double aScalingFactor,
 
 2894                                                   bool aMirrorInvert )
 
 2896    std::vector<PCB_SHAPE*> shapes;
 
 2898    if( aCadstarVertices.size() < 2 )
 
 2902    const VERTEX* prev = &aCadstarVertices.at( 0 ); 
 
 2905    for( 
size_t i = 1; i < aCadstarVertices.size(); i++ )
 
 2907        cur = &aCadstarVertices.at( i );
 
 2909                                              aMoveVector, aRotationAngle, aScalingFactor,
 
 2910                                              aTransformCentre, aMirrorInvert ) );
 
 
 2919                                                           const VERTEX& aCadstarVertex,
 
 2923                                                           double aRotationAngle,
 
 2924                                                           double aScalingFactor,
 
 2926                                                           bool aMirrorInvert )
 
 2938        centerPoint = ( startPoint + endPoint ) / 2;
 
 2945    switch( aCadstarVertex.
Type )
 
 2952        shape->
SetEnd( endPoint );
 
 2968        EDA_ANGLE arcStartAngle( startPoint - centerPoint );
 
 2969        EDA_ANGLE arcEndAngle( endPoint - centerPoint );
 
 2970        EDA_ANGLE arcAngle = ( arcEndAngle - arcStartAngle ).Normalize();
 
 2987    if( aScalingFactor != 1.0 )
 
 2989        shape->
Move( -1*aTransformCentre );
 
 2990        shape->
Scale( aScalingFactor );
 
 2991        shape->
Move( aTransformCentre );
 
 2994    if( aRotationAngle != 0.0 )
 
 2997    if( aMoveVector != 
VECTOR2I{ 0, 0 } )
 
 2998        shape->
Move( aMoveVector );
 
 3000    if( !aCadstarGroupID.IsEmpty() )
 
 
 3008                                                           const int& aLineThickness,
 
 3011    ZONE* zone = 
new ZONE( aParentContainer );
 
 3027    for( 
int i = 0; i < polygon.
HoleCount( 0 ); i++ )
 
 
 3038                                                                       double aRotationAngle,
 
 3039                                                                       double aScalingFactor,
 
 3041                                                                       bool aMirrorInvert )
 
 3046                                                                   aContainer, noGroup, aMoveVector,
 
 3047                                                                   aRotationAngle, aScalingFactor,
 
 3048                                                                   aTransformCentre, aMirrorInvert );
 
 3059                                                                      noGroup, aMoveVector,
 
 3060                                                                      aRotationAngle, aScalingFactor,
 
 3061                                                                      aTransformCentre, aMirrorInvert );
 
 3072    if( aLineThickness > 0 )
 
 3080        for( 
int j = 0; j < polySet.
HoleCount( i ); ++j )
 
 
 3097        switch( shape->GetShape() )
 
 3101            SHAPE_ARC arc( shape->GetCenter(), shape->GetStart(), shape->GetArcAngle() );
 
 3103            if( shape->EndsSwapped() )
 
 3111            lineChain.
Append( shape->GetStartX(), shape->GetStartY() );
 
 3112            lineChain.
Append( shape->GetEndX(), shape->GetEndY() );
 
 3116            wxFAIL_MSG( wxT( 
"Drawsegment type is unexpected. Ignored." ) );
 
 
 3136                                                  const std::vector<PCB_SHAPE*>& aShapes,
 
 3139                                                  int aWidthOverride )
 
 3141    std::vector<PCB_TRACK*> tracks;
 
 3153                if( aTrack->GetLength() != 0 )
 
 3155                    tracks.push_back( aTrack );
 
 3166        switch( shape->GetShape() )
 
 3170            SHAPE_ARC arc( shape->GetStart(), shape->GetArcMid(), shape->GetEnd(), 0 );
 
 3172            if( shape->EndsSwapped() )
 
 3175            track = 
new PCB_ARC( aParentContainer, &arc );
 
 3180            track = 
new PCB_TRACK( aParentContainer );
 
 3181            track->
SetStart( shape->GetStart() );
 
 3182            track->
SetEnd( shape->GetEnd() );
 
 3186            wxFAIL_MSG( wxT( 
"Drawsegment type is unexpected. Ignored." ) );
 
 3190        if( aWidthOverride == -1 )
 
 3191            track->
SetWidth( shape->GetWidth() );
 
 3196            track->
SetLayer( shape->GetLayer() );
 
 3200        if( aNet != 
nullptr )
 
 3208        if( prevTrack != 
nullptr )
 
 3210            int offsetAmount = ( track->
GetWidth() / 2 ) - ( prevTrack->
GetWidth() / 2 );
 
 3212            if( offsetAmount > 0 )
 
 3219            else if( offsetAmount < 0 )
 
 3224                prevTrack->
SetEnd( newEnd );
 
 3240                addTrack( synthTrack );
 
 3245            addTrack( prevTrack );
 
 
 3260                                               const wxString& aAttributeValue )
 
 3273            aFootprint->
SetValue( aAttributeValue );
 
 3274            field = &aFootprint->
Value();
 
 3279            aFootprint->
Add( field );
 
 3280            field->
SetText( aAttributeValue );
 
 3293        aFootprint->
SetValue( aAttributeValue );
 
 3294        field = &aFootprint->
Value();
 
 3300        aFootprint->
Add( field );
 
 3301        field->
SetText( aAttributeValue );
 
 3311    if( aCadstarAttrLoc.
Mirror ) 
 
 3369        wxFAIL_MSG( wxT( 
"Unknown Alignment - needs review!" ) );
 
 
 3378                                                   const long& aOffsetAmount )
 
 3380    VECTOR2I v( *aPointToOffset - aRefPoint );
 
 3386        aPointToOffset->
x = offsetted.
x;
 
 3387        aPointToOffset->
y = offsetted.
y;
 
 3391        *aPointToOffset = aRefPoint; 
 
 
 3409    if( textSize.
x == 0 )
 
 3414    if( textSize.
x == 0 || textSize.
y == 0 )
 
 
 3431    wxCHECK( 
Assignments.Codedefs.LineCodes.find( aCadstarLineCodeID )
 
 
 3442    wxCHECK( 
Assignments.Codedefs.CopperCodes.find( aCadstaCopperCodeID )
 
 3446    return Assignments.Codedefs.CopperCodes.at( aCadstaCopperCodeID );
 
 
 3453    wxCHECK( 
Assignments.Codedefs.TextCodes.find( aCadstarTextCodeID )
 
 3457    return Assignments.Codedefs.TextCodes.at( aCadstarTextCodeID );
 
 
 3464    wxCHECK( 
Assignments.Codedefs.PadCodes.find( aCadstarPadCodeID )
 
 3468    return Assignments.Codedefs.PadCodes.at( aCadstarPadCodeID );
 
 
 3475    wxCHECK( 
Assignments.Codedefs.ViaCodes.find( aCadstarViaCodeID )
 
 3479    return Assignments.Codedefs.ViaCodes.at( aCadstarViaCodeID );
 
 
 3486    wxCHECK( 
Assignments.Codedefs.LayerPairs.find( aCadstarLayerPairID )
 
 3490    return Assignments.Codedefs.LayerPairs.at( aCadstarLayerPairID );
 
 
 3496    wxCHECK( 
Assignments.Codedefs.AttributeNames.find( aCadstarAttributeID )
 
 3500    return Assignments.Codedefs.AttributeNames.at( aCadstarAttributeID ).Name;
 
 
 3505        const std::map<ATTRIBUTE_ID, ATTRIBUTE_VALUE>&                      aCadstarAttributeMap )
 
 3507    wxCHECK( aCadstarAttributeMap.find( aCadstarAttributeID ) != aCadstarAttributeMap.end(),
 
 3510    return aCadstarAttributeMap.at( aCadstarAttributeID ).Value;
 
 
 3519        return Assignments.Layerdefs.Layers.at( aCadstarLayerID ).Type;
 
 
 3527        const PART_ID& aCadstarPartID )
 
 3529    wxCHECK( 
Parts.PartDefinitions.find( aCadstarPartID ) != 
Parts.PartDefinitions.end(), 
PART() );
 
 3531    return Parts.PartDefinitions.at( aCadstarPartID );
 
 
 3538    wxCHECK( 
Assignments.Codedefs.RouteCodes.find( aCadstarRouteCodeID )
 
 3542    return Assignments.Codedefs.RouteCodes.at( aCadstarRouteCodeID );
 
 
 3549    wxCHECK( 
Assignments.Codedefs.HatchCodes.find( aCadstarHatchcodeID )
 
 3553    return Assignments.Codedefs.HatchCodes.at( aCadstarHatchcodeID );
 
 
 3562    if( hcode.
Hatches.size() < 1 )
 
 3563        return m_board->GetDesignSettings().GetDefaultZoneSettings().m_HatchOrientation;
 
 
 3575    if( hcode.
Hatches.size() < 1 )
 
 3576        return m_board->GetDesignSettings().GetDefaultZoneSettings().m_HatchThickness;
 
 
 3587    if( hcode.
Hatches.size() < 1 )
 
 3588        return m_board->GetDesignSettings().GetDefaultZoneSettings().m_HatchGap;
 
 
 3612        if( hcode.
Hatches.size() != 2 )
 
 3614            wxLogWarning( wxString::Format(
 
 3615                    _( 
"The CADSTAR Hatching code '%s' has %d hatches defined. " 
 3616                       "KiCad only supports 2 hatches (crosshatching) 90 degrees apart. " 
 3617                       "The imported hatching is crosshatched." ),
 
 3622            if( hcode.
Hatches.at( 0 ).LineWidth != hcode.
Hatches.at( 1 ).LineWidth )
 
 3624                wxLogWarning( wxString::Format(
 
 3625                        _( 
"The CADSTAR Hatching code '%s' has different line widths for each " 
 3626                           "hatch. KiCad only supports one width for the hatching. The imported " 
 3627                           "hatching uses the width defined in the first hatch definition, i.e. " 
 3636                wxLogWarning( wxString::Format(
 
 3637                        _( 
"The CADSTAR Hatching code '%s' has different step sizes for each " 
 3638                           "hatch. KiCad only supports one step size for the hatching. The imported " 
 3639                           "hatching uses the step size defined in the first hatching definition, " 
 3646            if( abs( hcode.
Hatches.at( 0 ).OrientAngle - hcode.
Hatches.at( 1 ).OrientAngle )
 
 3649                wxLogWarning( wxString::Format(
 
 3650                        _( 
"The hatches in CADSTAR Hatching code '%s' have an angle  " 
 3651                           "difference of %.1f degrees. KiCad only supports hatching 90 "    
 3652                           "degrees apart.  The imported hatching has two hatches 90 " 
 3653                           "degrees apart, oriented %.1f degrees from horizontal." ),       
 
 3656                                         - hcode.
Hatches.at( 1 ).OrientAngle ) ).AsDegrees(),
 
 
 3682    wxString prefix = wxEmptyString;
 
 3683    wxString suffix = wxEmptyString;
 
 3684    size_t   startpos = aCadstarDim.
Text.
Text.Find( wxT( 
"<@DISTANCE" ) );
 
 3686    if( startpos != wxNOT_FOUND )
 
 3689        wxString remainingStr = aCadstarDim.
Text.
Text.Mid( startpos );
 
 3690        size_t   endpos = remainingStr.Find( 
"@>" );
 
 3694    if( suffix.StartsWith( wxT( 
"mm" ) ) )
 
 3697        suffix = suffix.Mid( 2 );
 
 3715    switch( dimensionUnits )
 
 3720        wxLogWarning( wxString::Format( 
_( 
"Dimension ID %s uses a type of unit that " 
 3721                                           "is not supported in KiCad. Millimeters were " 
 3722                                           "applied instead." ),
 
 3738        wxFAIL_MSG( wxT( 
"We should have handled design units before coming here!" ) );
 
 
 3745    std::map<TEMPLATE_ID, std::set<TEMPLATE_ID>> winningOverlaps;
 
 3751                        - 
m_board->GetDesignSettings().m_MinClearance;
 
 3754                                   aZoneB->GetLocalClearance().value() );
 
 3763        [&]( 
ZONE* aLowerZone, 
ZONE* aHigherZone ) -> 
double 
 3766            intersectShape.
Inflate( inflateValue( aLowerZone, aHigherZone ),
 
 3776            double leftOverArea = lowerZoneFill.
Area();
 
 3778            return leftOverArea;
 
 3781    auto intersectionAreaOfZoneOutlines =
 
 3782        [&]( 
ZONE* aZoneA, 
ZONE* aZoneB ) -> 
double 
 3794            return outLineA.
Area();
 
 3798    auto isLowerPriority =
 
 3801            return winningOverlaps[b].count( a ) > 0;
 
 3804    for( std::map<TEMPLATE_ID, ZONE*>::iterator it1 = 
m_zonesMap.begin();
 
 3808        ZONE*     thisZone = it1->second;
 
 3813        for( std::map<TEMPLATE_ID, ZONE*>::iterator it2 = it1;
 
 3817            ZONE*     otherZone = it2->second;
 
 3819            if( thisTemplate.
ID == otherTemplate.
ID )
 
 3828            if( intersectionAreaOfZoneOutlines( thisZone, otherZone ) == 0 )
 
 3837            if( thisZonePolyFill.
Area() > 0.0 && otherZonePolyFill.
Area() > 0.0 )
 
 3840                double areaThis = errorArea( thisZone, otherZone );
 
 3842                double areaOther = errorArea( otherZone, thisZone );
 
 3844                if( areaThis > areaOther )
 
 3847                    winningOverlaps[thisTemplate.
ID].insert( otherTemplate.
ID );
 
 3852                    winningOverlaps[otherTemplate.
ID].insert( thisTemplate.
ID );
 
 3855            else if( thisZonePolyFill.
Area() > 0.0 )
 
 3858                winningOverlaps[thisTemplate.
ID].insert( otherTemplate.
ID );
 
 3860            else if( otherZonePolyFill.
Area() > 0.0 )
 
 3863                winningOverlaps[otherTemplate.
ID].insert( thisTemplate.
ID );
 
 3869                if( intersectionAreaOfZoneOutlines( thisZone, otherZone ) != 0 )
 
 3872                        winningOverlaps[otherTemplate.
ID].insert( thisTemplate.
ID );
 
 3874                        winningOverlaps[thisTemplate.
ID].insert( otherTemplate.
ID );
 
 3883    std::set<TEMPLATE_ID> intersectingIDs;
 
 3885    for( 
const std::pair<
TEMPLATE_ID, std::set<TEMPLATE_ID>>& idPair : winningOverlaps )
 
 3887        intersectingIDs.insert( idPair.first );
 
 3888        intersectingIDs.insert( idPair.second.begin(), idPair.second.end() );
 
 3892    std::vector<TEMPLATE_ID> sortedIDs;
 
 3896        sortedIDs.push_back( 
id );
 
 3900    std::sort( sortedIDs.begin(), sortedIDs.end(), isLowerPriority );
 
 3906        if( prevID.IsEmpty() )
 
 3912        wxASSERT( !isLowerPriority( 
id, prevID ) );
 
 3914        int newPriority = 
m_zonesMap.at( prevID )->GetAssignedPriority();
 
 3917        if( isLowerPriority( prevID, 
id ) )
 
 3920        m_zonesMap.at( 
id )->SetAssignedPriority( newPriority );
 
 3925    for( 
const std::pair<
TEMPLATE_ID, std::set<TEMPLATE_ID>>& idPair : winningOverlaps )
 
 3929        for( 
const TEMPLATE_ID& losingID : idPair.second )
 
 3931            if( 
m_zonesMap.at( losingID )->GetAssignedPriority()
 
 3932                > 
m_zonesMap.at( winningID )->GetAssignedPriority() )
 
 
 3966    if( aCadstarNetID.IsEmpty() )
 
 3972        return m_netMap.at( aCadstarNetID );
 
 3976        wxCHECK( 
Layout.Nets.find( aCadstarNetID ) != 
Layout.Nets.end(), 
nullptr );
 
 3979        wxString newName = csNet.
Name;
 
 3981        if( csNet.
Name.IsEmpty() )
 
 3983            if( csNet.
Pins.size() > 0 )
 
 3987                NET_PCB::PIN firstPin = ( *csNet.
Pins.begin() ).second;
 
 3990                newName   = wxT( 
"Net-(" );
 
 3992                newName << wxT( 
"-Pad" ) << wxString::Format( wxT( 
"%ld" ), firstPin.PadID );
 
 3993                newName << wxT( 
")" );
 
 3997                wxFAIL_MSG( wxT( 
"A net with no pins associated?" ) );
 
 3998                newName = wxT( 
"csNet-" );
 
 3999                newName << wxString::Format( wxT( 
"%i" ), csNet.
SignalNum );
 
 4006            wxLogMessage( 
_( 
"The CADSTAR design contains nets with a 'Net Class' assigned. KiCad " 
 4007                             "does not have an equivalent to CADSTAR's Net Class so these elements " 
 4008                             "were not imported. Note: KiCad's version of 'Net Class' is closer to " 
 4009                             "CADSTAR's 'Net Route Code' (which has been imported for all nets)." ) );
 
 4016            wxLogWarning( 
_( 
"The CADSTAR design contains nets with a 'Spacing Class' assigned. " 
 4017                             "KiCad does not have an equivalent to CADSTAR's Spacing Class so " 
 4018                             "these elements were not imported. Please review the design rules as " 
 4019                             "copper pours will affected by this." ) );
 
 4023        std::shared_ptr<NET_SETTINGS>& netSettings = 
m_board->GetDesignSettings().m_NetSettings;
 
 4025        std::shared_ptr<NETCLASS>      netclass;
 
 4027        std::tuple<ROUTECODE_ID, NETCLASS_ID, SPACING_CLASS_ID> key = { csNet.
RouteCodeID,
 
 4037            wxString  netClassName;
 
 4040            netClassName += wxT( 
"Route code: " ) + rc.
Name;
 
 4045                netClassName += wxT( 
" | Net class: " ) + nc.
Name;
 
 4051                netClassName += wxT( 
" | Spacing class: " ) + sp.
Name;
 
 4054            netclass.reset( 
new NETCLASS( netClassName ) );
 
 4055            netSettings->SetNetclass( netClassName, netclass );
 
 4060        m_board->GetDesignSettings().m_NetSettings->SetNetclassPatternAssignment( newName, netclass->GetName() );
 
 4064        m_netMap.insert( { aCadstarNetID, netInfo } );
 
 
 4073                                                                bool aDetectMaxLayer )
 
 
 4120    wxCHECK( 
Assignments.Layerdefs.Layers.find( aCadstarLayerID )
 
 4126    switch( layer.
Type )
 
 
 4194    parentGroup->
AddItem( aKiCadItem );
 
 
 4199        const wxString& aName )
 
 4201    wxString groupName = aName;
 
 4206        groupName = aName + wxT( 
"_" ) + wxString::Format( wxT( 
"%i" ), ++num );
 
 4211    docSymGroup->
SetName( groupName );
 
 4213    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.
 
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 PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
 
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 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.
 
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 SetKeepUpright(bool aKeepUpright)
 
virtual void SetText(const wxString &aText)
 
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
 
int GetTextThickness() const
 
VECTOR2I GetTextSize() const
 
void SetHorizJustify(GR_TEXT_H_ALIGN_T aType)
 
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 Fracture()
Convert a set of polygons with holes to a single outline with "slits"/"fractures" connecting the oute...
 
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
 
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.
 
const 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
 
#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...
 
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 o...
 
< 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.
 
wxString Name
Designator e.g. "C1", "R1", etc.
 
POINT Origin
Origin of the component (this is used as the reference point when placing the component in the design...
 
std::map< ATTRIBUTE_ID, ATTRIBUTE_VALUE > AttributeValues
 
std::map< PAD_ID, PADEXCEPTION > PadExceptions
Override pad definitions for this instance.
 
std::map< ATTRIBUTE_ID, TEXT_LOCATION > TextLocations
This contains location of any attributes, including designator position.
 
COMPONENT_ID VariantParentComponentID
 
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