62 wxString libName = aFileName.GetName();
64 if( libName.IsEmpty() && aRootSheet )
67 libName = fn.GetName();
70 if( libName.IsEmpty() )
89 THROW_IO_ERROR(
_(
"File does not appear to be a CADSTAR parts Library file" ) );
101 std::vector<LIB_SYMBOL*> retVal;
105 std::unique_ptr<LIB_SYMBOL> loadedPart =
loadLibPart( part );
110 retVal.push_back( loadedPart.release() );
117std::unique_ptr<LIB_SYMBOL>
121 std::unique_ptr<LIB_SYMBOL> retSym;
133 m_reporter->
Report( wxString::Format(
_(
"Unable to find symbol %s, referenced by part "
134 "%s. The part was not loaded." ),
143 std::unique_ptr<LIB_SYMBOL> kiSymDef(
loadSymdef( symbolID )->Duplicate() );
145 if( (
int)sym.
m_Pins.size() != kiSymDef->GetPinCount() )
147 m_reporter->
Report( wxString::Format(
_(
"Inconsistent pin numbers in symbol %s "
148 "compared to the one defined in part %s. The "
149 "part was not loaded." ),
163 wxCHECK( termID > 0 && sym.
m_Pins.size() >=
size_t( termID ),
nullptr );
164 SCH_PIN*
pin = kiSymDef->GetPin( storedPinNum );
165 size_t termIdx = size_t( termID ) - 1;
174 wxString partPinNum = wxString::Format(
"%ld", sym.
m_Pins[termIdx].m_Identifier );
175 pin->SetNumber( partPinNum );
189 wxCHECK( kiSymDef->GetUnitCount() == 1,
nullptr );
191 retSym = std::move( kiSymDef );
193 retSym->SetUnitCount( aPart.
m_Symbols.size(),
true );
195 retSym->SetName( escapedPartName );
197 retSym->GetValueField().SetText( aPart.
m_Value.value_or(
"" ) );
199 retSym->SetDescription( aPart.
m_Description.value_or(
"" ) );
201 auto addFieldIfHasValue =
202 [&](
const wxString&
name,
const std::optional<std::string>& value )
204 if( value.has_value() )
217 wxString modelVal = wxString::Format(
"model=\"%s\"", aPart.
m_SpiceModel.value() );
244 VECTOR2I symCenter = retSym->GetBodyBoundingBox( unit, 0,
false,
false ).GetCenter();
245 symCenter.
y = -symCenter.
y;
251 for(
auto& [signalName, csPinVector] : aPart.
m_HiddenPins )
255 std::unique_ptr<SCH_PIN>
pin = std::make_unique<SCH_PIN>( retSym.get() );
257 long pinNum = csPin.m_Identifier;
258 pin->SetNumber( wxString::Format(
"%ld", pinNum ) );
259 pin->SetName( signalName );
260 pin->SetType( ELECTRICAL_PINTYPE::PT_POWER_IN );
262 pin->SetVisible(
false );
272 direction = { -direction.
y, direction.
x };
277 pin->SetPosition( symCenter + offset );
279 pin->SetShape( GRAPHIC_PINSHAPE::LINE );
280 pin->SetUnit( unit );
281 retSym->AddDrawItem(
pin.release() );
301 std::unique_ptr<LIB_SYMBOL>& aDestSym,
302 int aDestUnit,
bool aOverrideFields )
305 for(
SCH_ITEM* item : aDestSym->GetUnitDrawItems( aDestUnit, 0 ) )
306 aDestSym->RemoveDrawItem( item );
309 for(
SCH_ITEM* newItem : aSourceSym->GetUnitDrawItems( 1, 0 ) )
313 itemCopy->
SetUnit( aDestUnit );
314 aDestSym->AddDrawItem( itemCopy );
318 if( aOverrideFields )
320 std::vector<SCH_FIELD*> fieldsToCopy;
321 aSourceSym->GetFields( fieldsToCopy );
323 for(
SCH_FIELD* templateField : fieldsToCopy )
326 templateField->Copy( appliedField );
334 wxCHECK( aSchematic, );
384 m_reporter->
Report( wxString::Format(
_(
"The CADSTAR design contains variants which has "
385 "no KiCad equivalent. Only the master variant "
386 "('%s') was loaded." ),
393 m_reporter->
Report(
_(
"The CADSTAR design contains grouped items which has no KiCad "
394 "equivalent. Any grouped items have been ungrouped." ),
400 m_reporter->
Report(
_(
"The CADSTAR design contains re-use blocks which has no KiCad "
401 "equivalent. The re-use block information has been discarded during "
408 for( std::pair<LAYER_ID, SCH_SHEET*> sheetPair :
m_sheetMap )
413 BOX2I sheetBoundingBox;
428 if( field.IsVisible() )
429 bbox.
Merge( field.GetBoundingBox() );
435 wxString txt = txtItem->
GetText();
437 if( txt.Contains(
"${" ) )
444 bbox = item->GetBoundingBox();
447 sheetBoundingBox.
Merge( bbox );
460 auto roundToNearestGrid =
461 [&](
int aNumber ) ->
int
463 int error = aNumber %
grid;
464 int absError =
sign( error ) * error;
466 if( absError > (
grid / 2 ) )
467 return aNumber + (
sign( error ) *
grid ) - error;
469 return aNumber - error;
476 int longestSide = std::max( targetSheetSize.
x, targetSheetSize.
y );
477 int margin = ( (double) longestSide * 0.03 );
478 margin = roundToNearestGrid( margin );
479 targetSheetSize += margin * 2;
490 VECTOR2I sheetcentre( pageSizeIU.
x / 2, pageSizeIU.
y / 2 );
494 VECTOR2I translation = sheetcentre - itemsCentre;
495 translation.
x = roundToNearestGrid( translation.
x );
496 translation.
y = roundToNearestGrid( translation.
y );
499 std::vector<SCH_ITEM*> allItems;
502 std::back_inserter( allItems ) );
506 item->Move( translation );
514 m_reporter->
Report(
_(
"CADSTAR fonts are different to the ones in KiCad. This will likely "
515 "result in alignment issues. Please review the imported text elements "
516 "carefully and correct manually if required." ),
520 "Please review the import errors and warnings (if any)." ) );
533 constexpr long long maxDesignSizekicad = std::numeric_limits<int>::max();
535 if( designSizeXkicad > maxDesignSizekicad || designSizeYkicad > maxDesignSizekicad )
538 _(
"The design is too large and cannot be imported into KiCad. \n"
539 "Please reduce the maximum design size in CADSTAR by navigating to: \n"
540 "Design Tab -> Properties -> Design Options -> Maximum Design Size. \n"
541 "Current Design size: %.2f, %.2f millimeters. \n"
542 "Maximum permitted design size: %.2f, %.2f millimeters.\n" ),
558 if( orphanSheets.size() > 1 )
563 for(
LAYER_ID sheetID : orphanSheets )
579 else if( orphanSheets.size() > 0 )
581 LAYER_ID rootSheetID = orphanSheets.at( 0 );
583 wxFileName loadedFilePath = wxFileName(
Filename );
585 std::string filename = wxString::Format(
"%s_%02d", loadedFilePath.GetName(),
599 THROW_IO_ERROR(
_(
"The selected file is a CADSTAR symbol library. It does not contain a "
600 "schematic design so cannot be imported/opened in this way." ) );
604 THROW_IO_ERROR(
_(
"The CADSTAR schematic might be corrupt: there is no root sheet." ) );
613 BLOCK& block = blockPair.second;
616 if( block.
Type == BLOCK::TYPE::PARENT )
618 else if( block.
Type == BLOCK::TYPE::CHILD )
627 for( std::pair<TERMINAL_ID, TERMINAL> termPair : block.
Terminals )
630 wxString
name =
"YOU SHOULDN'T SEE THIS TEXT. THIS IS A BUG.";
634 if( block.
Type == BLOCK::TYPE::PARENT )
636 else if( block.
Type == BLOCK::TYPE::CHILD )
640 sheetPin->
SetShape( LABEL_FLAG_SHAPE::L_UNSPECIFIED );
661 PART_ID partID = partPair.first;
662 PART part = partPair.second;
672 GATE_ID gateID = gatePair.first;
673 PART::DEFINITION::GATE gate = gatePair.second;
676 if( symbolID.IsEmpty() )
678 m_reporter->
Report( wxString::Format(
_(
"Part definition '%s' references symbol "
679 "'%s' (alternate '%s') which could not be "
680 "found in the symbol library. The part has "
681 "not been loaded into the KiCad library." ),
703 m_reporter->
Report( wxString::Format(
_(
"Part definition '%s' has an incomplete "
704 "definition (no symbol definitions are "
705 "associated with it). The part has not "
706 "been loaded into the KiCad library." ),
727 SYMBOL sym = symPair.second;
736 m_reporter->
Report( wxString::Format(
_(
"Symbol '%s' references part '%s' which "
737 "could not be found in the library. The "
738 "symbol was not loaded" ),
746 if( sym.
GateID.IsEmpty() )
800 partname.Replace( wxT(
"\n" ), wxT(
"\\n" ) );
801 partname.Replace( wxT(
"\r" ), wxT(
"\\r" ) );
802 partname.Replace( wxT(
"\t" ), wxT(
"\\t" ) );
803 partField->
SetText( partname );
826 wxASSERT( attrField->
GetName() == attrName );
828 attrVal.
Value.Replace( wxT(
"\n" ), wxT(
"\\n" ) );
829 attrVal.
Value.Replace( wxT(
"\r" ), wxT(
"\\r" ) );
830 attrVal.
Value.Replace( wxT(
"\t" ), wxT(
"\\t" ) );
843 THROW_IO_ERROR( wxString::Format(
_(
"Symbol ID '%s' references library symbol "
844 "'%s' which could not be found in the "
845 "library. Did you export all items of the "
855 THROW_IO_ERROR( wxString::Format(
_(
"Symbol ID '%s' is a signal reference or "
856 "global signal but it has too many pins. The "
857 "expected number of pins is 1 but %d were "
881 wxString libPartName = libraryNetName;
887 if( libPartName != symbolInstanceNetName )
889 libPartName += wxT(
" (" ) + symbolInstanceNetName + wxT(
")" );
895 wxCHECK( templatePart, );
899 kiPart->
SetName( libPartName );
904 std::vector<SCH_PIN*> pins = kiPart->
GetPins();
905 wxCHECK( pins.size() == 1, );
907 pins.at( 0 )->SetType( ELECTRICAL_PINTYPE::PT_POWER_IN );
908 pins.at( 0 )->SetName( symbolInstanceNetName );
960 netLabel->
SetText(
"***UNKNOWN NET****" );
974 if( libSymDef.
Alternate.Lower().Contains(
"in" ) )
975 netLabel->
SetShape( LABEL_FLAG_SHAPE::L_INPUT );
976 else if( libSymDef.
Alternate.Lower().Contains(
"bi" ) )
977 netLabel->
SetShape( LABEL_FLAG_SHAPE::L_BIDI );
978 else if( libSymDef.
Alternate.Lower().Contains(
"out" ) )
979 netLabel->
SetShape( LABEL_FLAG_SHAPE::L_OUTPUT );
981 netLabel->
SetShape( LABEL_FLAG_SHAPE::L_UNSPECIFIED );
988 screen->
Append( netLabel );
993 wxASSERT_MSG(
false,
"Unknown Symbol Variant." );
998 m_reporter->
Report( wxString::Format(
_(
"Symbol ID '%s' is of an unknown type. It is "
999 "neither a symbol or a net power / symbol. "
1000 "The symbol was not loaded." ),
1009 if( symbolName.empty() )
1010 symbolName = wxString::Format(
"ID: %s", sym.
ID );
1012 symbolName += sym.
GateID;
1014 m_reporter->
Report( wxString::Format(
_(
"Symbol '%s' is scaled in the original "
1015 "CADSTAR schematic but this is not supported "
1016 "in KiCad. When the symbol is reloaded from "
1017 "the library, it will revert to the original "
1031 BUS bus = busPair.second;
1032 bool firstPt =
true;
1035 if( bus.
LayerID != wxT(
"NO_SHEET" ) )
1038 std::shared_ptr<BUS_ALIAS> kiBusAlias = std::make_shared<BUS_ALIAS>();
1040 kiBusAlias->SetName( bus.
Name );
1041 kiBusAlias->SetParent( screen );
1049 label->
SetText( wxT(
"{" ) + busname + wxT(
"}" ) );
1098 label->
SetText( wxT(
"{" ) + busname + wxT(
"}" ) );
1113 wxString netName = net.
Name;
1114 std::map<NETELEMENT_ID, SCH_LABEL*> netlabels;
1116 if( netName.IsEmpty() )
1117 netName = wxString::Format(
"$%ld", net.
SignalNum );
1121 for( std::pair<NETELEMENT_ID, NET_SCH::SYM_TERM> terminalPair : net.
Terminals )
1123 NET_SCH::SYM_TERM netTerm = terminalPair.second;
1132 if( netTerm.HasNetLabel )
1137 applyTextSettings( val, netTerm.NetLabel.TextCodeID, netTerm.NetLabel.Alignment,
1138 netTerm.NetLabel.Justification, netTerm.NetLabel.OrientAngle,
1139 netTerm.NetLabel.Mirror );
1157 && netTerm.HasNetLabel )
1167 applyTextSettings( label, netTerm.NetLabel.TextCodeID, netTerm.NetLabel.Alignment,
1168 netTerm.NetLabel.Justification );
1170 netlabels.insert( { netTerm.ID, label } );
1173 m_sheetMap.at( sheet )->GetScreen()->Append( label );
1177 auto getHierarchicalLabel =
1180 if( aNode.Contains(
"BLKT" ) )
1183 BLOCK_PIN_ID blockPinID = std::make_pair( blockTerm.BlockID,
1184 blockTerm.TerminalID );
1194 for( std::pair<NETELEMENT_ID, NET_SCH::BLOCK_TERM> blockPair : net.
BlockTerminals )
1196 SCH_HIERLABEL* label = getHierarchicalLabel( blockPair.first );
1203 for( std::pair<NETELEMENT_ID, NET_SCH::BUS_TERM> busPair : net.
BusTerminals )
1205 NET_SCH::BUS_TERM busTerm = busPair.second;
1209 m_busesMap.at( bus.
ID )->Members().emplace_back( netName );
1229 if( busTerm.HasNetLabel )
1231 applyTextSettings( label, busTerm.NetLabel.TextCodeID, busTerm.NetLabel.Alignment,
1232 busTerm.NetLabel.Justification );
1239 netlabels.insert( { busTerm.ID, label } );
1243 for( std::pair<NETELEMENT_ID, NET_SCH::DANGLER> danglerPair : net.
Danglers )
1245 NET_SCH::DANGLER dangler = danglerPair.second;
1251 if( dangler.HasNetLabel )
1253 applyTextSettings( label, dangler.NetLabel.TextCodeID, dangler.NetLabel.Alignment,
1254 dangler.NetLabel.Justification );
1258 netlabels.insert( { dangler.ID, label } );
1260 m_sheetMap.at( dangler.LayerID )->GetScreen()->Append( label );
1263 for( NET_SCH::CONNECTION_SCH conn : net.
Connections )
1265 if( conn.LayerID == wxT(
"NO_SHEET" ) )
1276 if( conn.Path.size() < 1 || conn.Path.front() != start )
1277 conn.Path.insert( conn.Path.begin(), start );
1279 if( conn.Path.size() < 2 || conn.Path.back() != end )
1280 conn.Path.push_back( end );
1282 bool firstPt =
true;
1283 bool secondPt =
false;
1289 for(
const POINT& pt : conn.Path )
1297 std::vector<NETELEMENT_ID> nodes;
1298 nodes.push_back( conn.StartNode );
1299 nodes.push_back( conn.EndNode );
1314 int leftSide = sheetPosition.
x;
1315 int rightSide = sheetPosition.
x + sheetSize.
x;
1316 int topSide = sheetPosition.
y;
1317 int botSide = sheetPosition.
y + sheetSize.
y;
1321 sheetEdge.
Append( leftSide, topSide );
1322 sheetEdge.
Append( rightSide, topSide );
1323 sheetEdge.
Append( rightSide, botSide );
1324 sheetEdge.
Append( leftSide, botSide );
1325 sheetEdge.
Append( leftSide, topSide );
1329 if( !wireChain.
Intersect( sheetEdge, wireToSheetIntersects ) )
1334 if( node == conn.StartNode )
1335 wireChain = wireChain.
Reverse();
1339 if( node == conn.StartNode )
1340 wireChain = wireChain.
Reverse();
1346 VECTOR2I intsctPt = wireToSheetIntersects.at( 0 ).p;
1347 int intsctIndx = wireChain.
FindSegment( intsctPt );
1348 wxASSERT_MSG( intsctIndx != -1,
"Can't find intersecting segment" );
1350 if( node == conn.StartNode )
1351 wireChain.
Replace( 0, intsctIndx, intsctPt );
1353 wireChain.
Replace( intsctIndx + 1, -1, intsctPt );
1361 auto fixNetLabelsAndSheetPins =
1366 if( netlabels.find( aNetEleID ) != netlabels.end() )
1367 netlabels.at( aNetEleID )->SetSpinStyle( spin.
MirrorY() );
1369 SCH_HIERLABEL* sheetPin = getHierarchicalLabel( aNetEleID );
1391 fixNetLabelsAndSheetPins( wireAngle, conn.StartNode );
1400 if( !conn.ConnectionLineCode.IsEmpty() )
1405 m_sheetMap.at( conn.LayerID )->GetScreen()->Append( wire );
1412 fixNetLabelsAndSheetPins( wireAngle, conn.EndNode );
1416 for( std::pair<NETELEMENT_ID, NET_SCH::JUNCTION_SCH> juncPair : net.
Junctions )
1418 NET_SCH::JUNCTION_SCH junc = juncPair.second;
1423 m_sheetMap.at( junc.LayerID )->GetScreen()->Append( kiJunc );
1425 if( junc.HasNetLabel )
1439 m_sheetMap.at( junc.LayerID )->GetScreen()->Append( label );
1450 FIGURE fig = figPair.second;
1461 TEXT txt = textPair.second;
1471 for( std::pair<DOCUMENTATION_SYMBOL_ID, DOCUMENTATION_SYMBOL> docSymPair :
1478 m_reporter->
Report( wxString::Format(
_(
"Documentation Symbol '%s' refers to symbol "
1479 "definition ID '%s' which does not exist in "
1480 "the library. The symbol was not loaded." ),
1493 bool mirrorInvert = docSym.
Mirror;
1495 for( std::pair<FIGURE_ID, FIGURE> figPair : docSymDef.
Figures )
1497 FIGURE fig = figPair.second;
1500 centreOfTransform, mirrorInvert );
1503 for( std::pair<TEXT_ID, TEXT> textPair : docSymDef.
Texts )
1505 TEXT txt = textPair.second;
1507 txt.
Mirror = ( txt.
Mirror ) ? !mirrorInvert : mirrorInvert;
1513 scalingFactor, centreOfTransform, mirrorInvert );
1532 auto findAndReplaceTextField =
1556 std::map<wxString, wxString>& txtVars = pj->
GetTextVars();
1572 wxString varValue = txtvalue.second;
1574 txtVars.insert( { varName, varValue } );
1579 wxString varName = txtvalue.first;
1580 wxString varValue = txtvalue.second;
1582 txtVars.insert( { varName, varValue } );
1587 m_reporter->
Report(
_(
"Text Variables could not be set as there is no project attached." ),
1595 std::unique_ptr<LIB_SYMBOL>& aKiCadSymbol )
1598 SCH_FIELD* existingField = aKiCadSymbol->FindField( aFieldName );
1600 if( existingField !=
nullptr )
1601 return existingField;
1603 int newfieldID = aKiCadSymbol->GetFieldCount();
1605 newfield->
SetName( aFieldName );
1607 aKiCadSymbol->AddField( newfield );
1626 std::unique_ptr<LIB_SYMBOL> kiSym = std::make_unique<LIB_SYMBOL>( csSym.
BuildLibName() );
1627 const int gateNumber = 1;
1630 for( std::pair<FIGURE_ID, FIGURE> figPair : csSym.
Figures )
1632 FIGURE fig = figPair.second;
1649 return getKiCadLibraryPoint( aPt, csSym.Origin );
1662 shape->
SetFillMode( FILL_T::FILLED_WITH_BG_BODYCOLOR );
1664 kiSym->AddDrawItem( shape );
1671 for( std::pair<TERMINAL_ID, TERMINAL> termPair : csSym.
Terminals )
1674 wxString pinNum = wxString::Format(
"%ld", term.
ID );
1675 wxString pinName = wxEmptyString;
1676 std::unique_ptr<SCH_PIN>
pin = std::make_unique<SCH_PIN>( kiSym.get() );
1679 pin->SetType( ELECTRICAL_PINTYPE::PT_PASSIVE );
1682 pin->SetLength( 0 );
1683 pin->SetShape( GRAPHIC_PINSHAPE::LINE );
1684 pin->SetUnit( gateNumber );
1685 pin->SetNumber( pinNum );
1686 pin->SetName( pinName );
1704 pin->SetNumberTextSize( pinNumberHeight );
1705 pin->SetNameTextSize( pinNameHeight );
1707 pinNumToTerminals.insert( {
pin->GetNumber(), term.
ID } );
1708 kiSym->AddDrawItem(
pin.release() );
1716 for( std::pair<TEXT_ID, TEXT> textPair : csSym.
Texts )
1718 TEXT csText = textPair.second;
1720 auto libtext = std::make_unique<SCH_TEXT>( pos, csText.
Text,
LAYER_DEVICE );
1722 libtext->SetUnit( gateNumber );
1724 libtext->SetMultilineAllowed(
true );
1730 if( csText.
Text.Contains(
"\n" ) )
1732 wxArrayString strings;
1734 wxPoint firstLinePos;
1736 for(
size_t ii = 0; ii < strings.size(); ++ii )
1738 BOX2I bbox = libtext->GetTextBox( ii );
1741 RotatePoint( linePos, libtext->GetTextPos(), -libtext->GetTextAngle() );
1744 textLine->
SetText( strings[ii] );
1751 kiSym->AddDrawItem( textLine );
1757 libtext->SetMultilineAllowed(
false );
1758 kiSym->AddDrawItem( libtext.release() );
1780 wxCHECK( partField,
nullptr );
1796 for(
auto& [attributeId, textLocation] : csSym.
TextLocations )
1821 if( attrValue.HasLocation )
1828 m_symDefMap.insert( { aSymdefID, std::move( kiSym ) } );
1835 const PART& aCadstarPart,
1841 std::unique_ptr<LIB_SYMBOL> kiSymDef(
loadSymdef( aSymdefID )->Duplicate() );
1842 wxCHECK( kiSymDef, );
1845 std::unique_ptr<LIB_SYMBOL> tempSymbol( aSymbol );
1853 SCH_PIN*
pin = kiSymDef->GetPin( storedPinNum );
1858 if( pinNum.IsEmpty() )
1860 if( !csPin.Identifier.IsEmpty() )
1861 pinNum = csPin.Identifier;
1863 pinNum = wxString::Format(
"%ld", termID );
1865 pinNum = wxString::Format(
"%ld", csPin.ID );
1869 pin->SetNumber( pinNum );
1870 pin->SetName( pinName );
1872 pinNumMap.insert( { termID, pinNum } );
1883 tempSymbol->GetValueField().SetVisible(
false );
1892 wxString footprintRefName = wxEmptyString;
1893 wxString footprintAlternateName = wxEmptyString;
1900 wxString attributeValue = aAttributeVal.Value;
1901 attributeValue.Replace( wxT(
"\n" ), wxT(
"\\n" ) );
1902 attributeValue.Replace( wxT(
"\r" ), wxT(
"\\r" ) );
1903 attributeValue.Replace( wxT(
"\t" ), wxT(
"\\t" ) );
1909 if( attrName == wxT(
"(PartDefinitionNameStem)" ) )
1912 attributeValue.Replace( wxT(
" " ),
"_" );
1913 tempSymbol->GetReferenceField().SetText( attributeValue );
1916 else if( attrName == wxT(
"(PartDescription)" ) )
1918 tempSymbol->SetDescription( attributeValue );
1921 else if( attrName == wxT(
"(PartDefinitionReferenceName)" ) )
1923 footprintRefName = attributeValue;
1926 else if( attrName == wxT(
"(PartDefinitionAlternateName)" ) )
1928 footprintAlternateName = attributeValue;
1932 bool attrIsNew = tempSymbol->FindField( attrName ) ==
nullptr;
1935 wxASSERT( attrField->
GetName() == attrName );
1936 attrField->
SetText( aAttributeVal.Value );
1937 attrField->
SetUnit( gateNumber );
1939 const ATTRIBUTE_ID& attrid = aAttributeVal.AttributeID;
1942 if( aAttributeVal.HasLocation )
1948 else if( attrIsNew )
1958 loadLibraryField( attrVal );
1962 loadLibraryField( attrVal );
1968 tempSymbol->SetShowPinNames(
false );
1969 tempSymbol->SetShowPinNumbers(
false );
1973 aSymbol = tempSymbol.release();
1978 const wxString& aFootprintName,
1979 const wxString& aFootprintAlternate )
1981 wxString fpNameInLibrary =
generateLibName( aFootprintName, aFootprintAlternate );
1983 if( !fpNameInLibrary.IsEmpty() )
1985 wxArrayString fpFilters;
1986 fpFilters.Add( aFootprintName );
1988 if( !aFootprintAlternate.IsEmpty() )
1989 fpFilters.Add( fpNameInLibrary );
1991 aKiCadSymbol->SetFPFilters( fpFilters );
1994 aKiCadSymbol->GetFootprintField().SetText( libID.
Format() );
2003 int aLineThickness )
2005 const VERTEX* prev = &aCadstarVertices.at( 0 );
2010 for(
size_t i = 1; i < aCadstarVertices.size(); i++ )
2012 cur = &aCadstarVertices.at( i );
2023 centerPoint = ( startPoint + endPoint ) / 2;
2053 shape->
SetEnd( startPoint );
2058 shape->
SetEnd( endPoint );
2064 shape->
SetUnit( aGateNumber );
2083 aCadstarAttrLoc.
Mirror );
2111 int compOrientation = 0;
2113 if( aCadstarSymbol.
Mirror )
2115 compAngle = -compAngle;
2116 compOrientation += SYMBOL_ORIENTATION_T::SYM_MIRROR_Y;
2121 EDA_ANGLE test2( aComponentOrientation );
2125 m_reporter->
Report( wxString::Format(
_(
"Symbol '%s' is rotated by an angle of %.1f "
2126 "degrees in the original CADSTAR design but "
2127 "KiCad only supports rotation angles multiples "
2128 "of 90 degrees. The connecting wires will need "
2139 m_reporter->
Report( wxString::Format(
_(
"Symbol '%s' references sheet ID '%s' which does "
2140 "not exist in the design. The symbol was not "
2150 wxString gate = ( aCadstarSymbol.
GateID.IsEmpty() ) ? wxString( wxT(
"A" ) ) : aCadstarSymbol.
GateID;
2151 wxString partGateIndex = aCadstarSymbol.
PartRef.
RefID + gate;
2158 std::map<wxString, SCH_PIN*> pinNumToLibPinMap;
2160 for(
auto& term : termNumMap )
2162 wxString pinNum = term.second;
2163 pinNumToLibPinMap.insert( { pinNum,
2167 auto replacePinNumber =
2168 [&]( wxString aOldPinNum, wxString aNewPinNum )
2170 if( aOldPinNum == aNewPinNum )
2173 SCH_PIN* libpin = pinNumToLibPinMap.at( aOldPinNum );
2178 for(
auto& pinPair : aCadstarSymbol.
PinNumbers )
2180 SYMBOL::PIN_NUM
pin = pinPair.second;
2182 replacePinNumber( termNumMap.at(
pin.TerminalID ),
2183 wxString::Format(
"%ld",
pin.PinNum ) );
2187 for(
auto& pinPair : aCadstarSymbol.
PinNames )
2190 replacePinNumber( termNumMap.at(
pin.TerminalID ),
pin.NameOrLabel );
2220 if( textIsVertical )
2223 alignment =
mirrorX( alignment );
2229 aCadstarAttrLoc.
Mirror );
2236 int compOrientation = SYMBOL_ORIENTATION_T::SYM_ORIENT_0;
2243 compOrientation = SYMBOL_ORIENTATION_T::SYM_ORIENT_0;
2244 aReturnedOrientation =
ANGLE_0;
2248 compOrientation = SYMBOL_ORIENTATION_T::SYM_ORIENT_90;
2253 compOrientation = SYMBOL_ORIENTATION_T::SYM_ORIENT_180;
2258 compOrientation = SYMBOL_ORIENTATION_T::SYM_ORIENT_270;
2262 return compOrientation;
2271 auto logUnknownNetElementError =
2274 m_reporter->
Report( wxString::Format(
_(
"Net %s references unknown net element %s. "
2275 "The net was not properly loaded and may "
2276 "require manual fixing." ),
2285 if( aNetElementID.Contains(
"J" ) )
2288 return logUnknownNetElementError();
2290 return aNet.
Junctions.at( aNetElementID ).Location;
2292 else if( aNetElementID.Contains(
"P" ) )
2295 return logUnknownNetElementError();
2301 return logUnknownNetElementError();
2308 return logUnknownNetElementError();
2314 VECTOR2I pinOffset = libpinPosition - libOrigin;
2318 VECTOR2I pinPosition = symbolOrigin + pinOffset;
2322 pinPosition.
x = ( 2 * symbolOrigin.
x ) - pinPosition.
x;
2327 RotatePoint( pinPosition, symbolOrigin, -adjustedOrientation );
2330 retval.
x = pinPosition.
x;
2331 retval.
y = pinPosition.
y;
2335 else if( aNetElementID.Contains(
"BT" ) )
2338 return logUnknownNetElementError();
2340 return aNet.
BusTerminals.at( aNetElementID ).SecondPoint;
2342 else if( aNetElementID.Contains(
"BLKT" ) )
2345 return logUnknownNetElementError();
2351 return logUnknownNetElementError();
2353 return Schematic.
Blocks.at( blockid ).Terminals.at( termid ).Position;
2355 else if( aNetElementID.Contains(
"D" ) )
2358 return logUnknownNetElementError();
2360 return aNet.
Danglers.at( aNetElementID ).Position;
2364 return logUnknownNetElementError();
2371 wxString netname = aNet.
Name;
2373 if( netname.IsEmpty() )
2374 netname = wxString::Format(
"$%ld", aNet.
SignalNum );
2386 const double& aScalingFactor,
2388 const bool& aMirrorInvert )
2393 const VERTEX* prev = &aCadstarVertices.at( 0 );
2397 "First vertex should always be a point vertex" );
2399 auto pointTransform =
2403 aScalingFactor, aTransformCentre, aMirrorInvert );
2406 for(
size_t ii = 1; ii < aCadstarVertices.size(); ii++ )
2408 cur = &aCadstarVertices.at( ii );
2410 VECTOR2I transformedStartPoint = pointTransform( prev->
End );
2411 VECTOR2I transformedEndPoint = pointTransform( cur->
End );
2433 segment->
SetLayer( aKiCadSchLayerID );
2445 wxFAIL_MSG(
"Unknown CADSTAR Vertex type" );
2454 const LAYER_ID& aCadstarSheetIDOverride,
2458 const double& aScalingFactor,
2460 const bool& aMirrorInvert )
2463 aCadstarSheetIDOverride, aKiCadSchLayerID, aMoveVector, aRotation,
2464 aScalingFactor, aTransformCentre, aMirrorInvert );
2469 aKiCadSchLayerID, aMoveVector, aRotation, aScalingFactor,
2470 aTransformCentre, aMirrorInvert );
2481 "Sheet already loaded!" );
2484 aParentSheet.
Last(),
2500 wxString loadedFilename = wxFileName(
Filename ).GetName();
2501 std::string filename = wxString::Format(
"%s_%02d", loadedFilename, sheetNum ).ToStdString();
2506 filenameField.
SetText( filename );
2513 wxString pageNumStr = wxString::Format(
"%d",
getSheetNumber( aCadstarSheetID ) );
2518 m_sheetMap.insert( { aCadstarSheetID, sheet } );
2528 "FIXME! Parent sheet should be loaded before attempting to load subsheets" );
2532 BLOCK& block = blockPair.second;
2534 if( block.
LayerID == aCadstarSheetID && block.
Type == BLOCK::TYPE::CHILD )
2538 if( block.
Figures.size() > 0 )
2541 "is drawn on sheet '%s' but is not "
2542 "linked to another sheet in the "
2543 "design. KiCad requires all sheet "
2544 "symbols to be associated to a sheet, "
2545 "so the block was not loaded." ),
2557 std::pair<VECTOR2I, VECTOR2I> blockExtents;
2559 if( block.
Figures.size() > 0 )
2565 THROW_IO_ERROR( wxString::Format(
_(
"The CADSTAR schematic might be corrupt: "
2566 "Block %s references a child sheet but has no "
2567 "Figure defined." ),
2580 field.SetVisible(
false );
2624 std::vector<LAYER_ID> childSheets, orphanSheets;
2629 BLOCK& block = blockPair.second;
2632 if( block.
Type == BLOCK::TYPE::CHILD )
2633 childSheets.push_back( assocSheetID );
2639 if( std::find( childSheets.begin(), childSheets.end(), sheetID ) == childSheets.end() )
2640 orphanSheets.push_back( sheetID );
2643 return orphanSheets;
2653 if( sheetID == aCadstarSheetID )
2666 wxCHECK_MSG( aItem, , wxT(
"aItem is null" ) );
2668 if( aCadstarSheetID ==
"ALL_SHEETS" )
2674 LAYER_ID sheetID = sheetPair.first;
2681 aItem = duplicateItem;
2683 else if( aCadstarSheetID ==
"NO_SHEET" )
2685 wxFAIL_MSG( wxT(
"Trying to add an item to NO_SHEET? This might be a documentation symbol." ) );
2691 m_sheetMap.at( aCadstarSheetID )->GetScreen()->Append( aItem );
2696 wxFAIL_MSG( wxT(
"Unknown Sheet ID." ) );
2704 const wxString& aSymDefAlternate )
2715 wxString refKey = symdef.ReferenceName.Lower();
2716 wxString altKey = symdef.Alternate.Lower();
2728 else if( altKey.IsEmpty() )
2736 wxString refKeyToFind = aSymdefName.Lower();
2737 wxString altKeyToFind = aSymDefAlternate.Lower();
2776 LINE_STYLE::SOLID );
2786 default:
return LINE_STYLE::DEFAULT;
2815 aCadstarAttributeID );
2841CADSTAR_SCH_ARCHIVE_LOADER::PART::DEFINITION::PIN
2845 for( std::pair<PART_DEFINITION_PIN_ID, PART::DEFINITION::PIN> pinPair :
2848 PART::DEFINITION::PIN partPin = pinPair.second;
2850 if( partPin.TerminalGate == aGateID && partPin.TerminalPin == aTerminalID )
2854 return PART::DEFINITION::PIN();
2862 case CADSTAR_PIN_TYPE::UNCOMMITTED:
return ELECTRICAL_PINTYPE::PT_PASSIVE;
2863 case CADSTAR_PIN_TYPE::INPUT:
return ELECTRICAL_PINTYPE::PT_INPUT;
2864 case CADSTAR_PIN_TYPE::OUTPUT_OR:
return ELECTRICAL_PINTYPE::PT_OPENCOLLECTOR;
2865 case CADSTAR_PIN_TYPE::OUTPUT_NOT_OR:
return ELECTRICAL_PINTYPE::PT_OUTPUT;
2866 case CADSTAR_PIN_TYPE::OUTPUT_NOT_NORM_OR:
return ELECTRICAL_PINTYPE::PT_OUTPUT;
2867 case CADSTAR_PIN_TYPE::POWER:
return ELECTRICAL_PINTYPE::PT_POWER_IN;
2868 case CADSTAR_PIN_TYPE::GROUND:
return ELECTRICAL_PINTYPE::PT_POWER_IN;
2869 case CADSTAR_PIN_TYPE::TRISTATE_BIDIR:
return ELECTRICAL_PINTYPE::PT_BIDI;
2870 case CADSTAR_PIN_TYPE::TRISTATE_INPUT:
return ELECTRICAL_PINTYPE::PT_INPUT;
2871 case CADSTAR_PIN_TYPE::TRISTATE_DRIVER:
return ELECTRICAL_PINTYPE::PT_OUTPUT;
2874 return ELECTRICAL_PINTYPE::PT_UNSPECIFIED;
2879 if( aCadstarGateID.IsEmpty() )
2882 return (
int) aCadstarGateID.Upper().GetChar( 0 ) - (int) wxUniChar(
'A' ) + 1;
2925 switch( aCadstarAlignment )
2944 default: wxFAIL_MSG(
"Unknown Cadstar Alignment" );
return aCadstarAlignment;
2952 switch( aCadstarAlignment )
2966 default: wxFAIL_MSG(
"Unknown Cadstar Alignment" );
return aCadstarAlignment;
2976 aKiCadTextItem->
SetText( escapedText );
2987 if( textWidth == 0 )
3008 const long long aCadstarOrientAngle,
3017 ALIGNMENT textAlignment = aCadstarAlignment;
3023 textAlignment =
mirrorX( aCadstarAlignment );
3028 switch( aAlignment )
3083 wxCHECK( textEdaItem, );
3105 textAlignment =
rotate180( textAlignment );
3109 textAlignment =
rotate180( textAlignment );
3112 wxFAIL_MSG(
"Unknown Quadrant" );
3116 setAlignment( aKiCadTextItem, textAlignment );
3123 setAlignment( aKiCadTextItem, textAlignment );
3125 int off =
static_cast<SCH_TEXT*
>( aKiCadTextItem )->GetTextOffset();
3136 default: wxFAIL_MSG(
"Unexpected Spin Style" );
break;
3164 wxFAIL_MSG(
"Unexpected Spin Style" );
3173 label->SetSpinStyle( spin );
3177 wxFAIL_MSG(
"Unexpected item type" );
3192 aCadstarTextElement.
Mirror );
3199 long long aScalingFactorNumerator,
3200 long long aScalingFactorDenominator )
3204 if( aScalingFactorNumerator == aScalingFactorDenominator )
3208 [&](
int aLength ) ->
int
3210 return( aLength * aScalingFactorNumerator ) / aScalingFactorDenominator;
3216 return VECTOR2I( scaleLen( aCoord.x ), scaleLen( aCoord.y ) );
3222 return VECTOR2I( scaleLen( aSize.x ), scaleLen( aSize.y ) );
3229 switch( item.Type() )
3231 case KICAD_T::SCH_SHAPE_T:
3235 if( shape.
GetShape() == SHAPE_T::ARC )
3241 else if( shape.
GetShape() == SHAPE_T::POLY )
3251 case KICAD_T::SCH_PIN_T:
3255 pin.SetPosition( scalePt(
pin.GetPosition() ) );
3256 pin.SetLength( scaleLen(
pin.GetLength() ) );
3260 case KICAD_T::SCH_TEXT_T:
3296 if( aGateNumber > 0 && shape.
GetUnit() != aGateNumber )
3299 if( shape.
GetShape() != SHAPE_T::POLY )
3309 if( pt0 != pt1 && uniqueSegments.count( pt0 ) == 0 && uniqueSegments.count( pt1 ) == 0 )
3312 if( pt0.
x == pt1.
x || pt0.
y == pt1.
y )
3314 uniqueSegments.insert( { pt0, poly } );
3315 uniqueSegments.insert( { pt1, poly } );
3323 auto setPinOrientation =
3330 pin->SetOrientation( PIN_ORIENTATION::PIN_RIGHT );
3332 pin->SetOrientation( PIN_ORIENTATION::PIN_UP );
3334 pin->SetOrientation( PIN_ORIENTATION::PIN_LEFT );
3336 pin->SetOrientation( PIN_ORIENTATION::PIN_DOWN );
3339 if( uniqueSegments.count(
pin->GetPosition() ) )
3345 if( otherPt ==
pin->GetPosition() )
3346 otherPt = poly.
CPoint( 1 );
3357std::pair<VECTOR2I, VECTOR2I>
3365 if( upperLeft.
x > v.
End.
x )
3366 upperLeft.
x = v.
End.
x;
3368 if( upperLeft.
y < v.
End.
y )
3369 upperLeft.
y = v.
End.
y;
3371 if( lowerRight.
x < v.
End.
x )
3372 lowerRight.
x = v.
End.
x;
3374 if( lowerRight.
y > v.
End.
y )
3375 lowerRight.
y = v.
End.
y;
3382 if( upperLeft.
x > v.
End.
x )
3383 upperLeft.
x = v.
End.
x;
3385 if( upperLeft.
y < v.
End.
y )
3386 upperLeft.
y = v.
End.
y;
3388 if( lowerRight.
x < v.
End.
x )
3389 lowerRight.
x = v.
End.
x;
3391 if( lowerRight.
y > v.
End.
y )
3392 lowerRight.
y = v.
End.
y;
3399 VECTOR2I size = lowerRightKiCad - upperLeftKiCad;
3401 return { upperLeftKiCad,
VECTOR2I( abs( size.
x ), abs( size.
y ) ) };
3431 const double& aScalingFactor,
3433 const bool& aMirrorInvert )
3437 if( aScalingFactor != 1.0 )
3440 retVal -= aTransformCentre;
3441 retVal.
x =
KiROUND( retVal.
x * aScalingFactor );
3442 retVal.
y =
KiROUND( retVal.
y * aScalingFactor );
3443 retVal += aTransformCentre;
3447 MIRROR( retVal.
x, aTransformCentre.
x );
3449 if( !aRotation.
IsZero() )
3450 RotatePoint( retVal, aTransformCentre, aRotation );
3452 if( aMoveVector !=
VECTOR2I{ 0, 0 } )
3453 retVal += aMoveVector;
3461 return sqrt( ( (
double) aPoint.
x * (
double) aPoint.
x )
3462 + ( (
double) aPoint.
y * (
double) aPoint.
y ) );
constexpr EDA_IU_SCALE schIUScale
constexpr double SCH_IU_PER_MM
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
CADSTAR_PIN_TYPE
file: cadstar_archive_objects.h Contains common object definitions
#define SYMBOL_NAME_ATTRID
Symbol Name attribute ID - used for placement of designators on the schematic.
#define SIGNALNAME_ORIGIN_ATTRID
#define LINK_ORIGIN_ATTRID
const wxString PartAcceptanceFieldName
const wxString PartNumberFieldName
const wxString PartNameFieldName
const wxString PartVersionFieldName
Loads a csa file into a KiCad SCHEMATIC object.
constexpr Vec Centre() const
constexpr BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Modify the position and size of the rectangle in order to contain aRect.
constexpr coord_type GetLeft() const
constexpr coord_type GetRight() const
constexpr const SizeVec & GetSize() const
constexpr coord_type GetTop() const
constexpr coord_type GetBottom() const
@ ANTICLOCKWISE_SEMICIRCLE
static wxString EscapeFieldText(const wxString &aFieldText)
@ FRACTIONALGRID
Param1 = Units, Param2 = Divisor.
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.
long TERMINAL_ID
Terminal is the pin identifier in the schematic.
TEXT_FIELD_NAME
These are special fields in text objects enclosed between the tokens '<@' and '>' such as <@[FIELD_NA...
ALIGNMENT
From CADSTAR Help: "Text Alignment enables you to define the position of an alignment origin for all ...
@ NO_ALIGNMENT
NO_ALIGNMENT has different meaning depending on the object type.
static const long UNDEFINED_VALUE
static wxString generateLibName(const wxString &aRefName, const wxString &aAlternateName)
wxString LAYER_ID
ID of a Sheet (if schematic) or board Layer (if PCB)
static void FixTextPositionNoAlignment(EDA_TEXT *aKiCadTextItem)
Corrects 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 cancelled.
static wxString HandleTextOverbar(wxString aCadstarString)
Convert a string with CADSTAR overbar characters to equivalent in KiCad.
JUSTIFICATION
From CADSTAR Help: "Multi Line Text can also be justified as Left, Centre or Right.
PROGRESS_REPORTER * m_progressReporter
bool CheckFileHeader(const std::filesystem::path &aPath) const
CADSTAR_PARTS_LIB_MODEL ReadFile(const std::filesystem::path &aPath) const
static SCH_FIELD * addNewFieldToSymbol(const wxString &aFieldName, std::unique_ptr< LIB_SYMBOL > &aKiCadSymbol)
void loadItemOntoKiCadSheet(const LAYER_ID &aCadstarSheetID, SCH_ITEM *aItem)
void Load(SCHEMATIC *aSchematic, SCH_SHEET *aRootSheet)
Loads a CADSTAR Schematic Archive file into the KiCad SCHEMATIC object given.
ROUTECODE getRouteCode(const ROUTECODE_ID &aCadstarRouteCodeID)
static wxString CreateLibName(const wxFileName &aFileName, const SCH_SHEET *aRootSheet)
std::map< BLOCK_PIN_ID, SCH_HIERLABEL * > m_sheetPinMap
Cadstar->KiCad Sheet Pins.
const int SMALL_LABEL_SIZE
VECTOR2I applyTransform(const VECTOR2I &aPoint, const VECTOR2I &aMoveVector={ 0, 0 }, const EDA_ANGLE &aRotation=ANGLE_0, const double &aScalingFactor=1.0, const VECTOR2I &aTransformCentre={ 0, 0 }, const bool &aMirrorInvert=false)
std::map< SYMBOL_ID, SCH_GLOBALLABEL * > m_globalLabelsMap
Cadstar->KiCad Global Labels.
SCH_SYMBOL * loadSchematicSymbol(const SYMBOL &aCadstarSymbol, const LIB_SYMBOL &aKiCadPart, EDA_ANGLE &aComponentOrientation)
void applyTextSettings(EDA_TEXT *aKiCadTextItem, const TEXTCODE_ID &aCadstarTextCodeID, const ALIGNMENT &aCadstarAlignment, const JUSTIFICATION &aCadstarJustification, const long long aCadstarOrientAngle=0, bool aMirrored=false)
void loadSheetAndChildSheets(const LAYER_ID &aCadstarSheetID, const VECTOR2I &aPosition, const VECTOR2I &aSheetSize, const SCH_SHEET_PATH &aParentSheet)
wxString getAttributeName(const ATTRIBUTE_ID &aCadstarAttributeID)
std::vector< LIB_SYMBOL * > m_loadedSymbols
Loaded symbols so far.
PART getPart(const PART_ID &aCadstarPartID)
std::vector< LAYER_ID > findOrphanSheets()
std::map< BUS_ID, std::shared_ptr< BUS_ALIAS > > m_busesMap
Cadstar->KiCad Buses.
SCH_TEXT * getKiCadSchText(const TEXT &aCadstarTextElement)
std::map< TERMINAL_ID, wxString > TERMINAL_TO_PINNUM_MAP
Map between a terminal ID in a symbol definition to the pin number that should be imported into KiCad...
wxString getNetName(const NET_SCH &aNet)
std::pair< BLOCK_ID, TERMINAL_ID > BLOCK_PIN_ID
std::map< SYMBOL_ID, SCH_SYMBOL * > m_powerSymMap
Cadstar->KiCad Power Symbols.
std::pair< PART_ID, GATE_ID > PART_GATE_ID
void loadDocumentationSymbols()
VECTOR2I getKiCadLibraryPoint(const VECTOR2I &aCadstarPoint, const VECTOR2I &aCadstarCentre)
PART::DEFINITION::PIN getPartDefinitionPin(const PART &aCadstarPart, const GATE_ID &aGateID, const TERMINAL_ID &aTerminalID)
std::map< wxString, TERMINAL_ID > PINNUM_TO_TERMINAL_MAP
std::map< SYMDEF_ID, PINNUM_TO_TERMINAL_MAP > m_symDefTerminalsMap
int getTextHeightFromTextCode(const TEXTCODE_ID &aCadstarTextCodeID)
void loadChildSheets(const LAYER_ID &aCadstarSheetID, const SCH_SHEET_PATH &aSheet)
void applyToLibraryFieldAttribute(const ATTRIBUTE_LOCATION &aCadstarAttrLoc, const VECTOR2I &aSymbolOrigin, SCH_FIELD *aKiCadField)
double getPolarRadius(const VECTOR2I &aPoint)
void setFootprintOnSymbol(std::unique_ptr< LIB_SYMBOL > &aKiCadSymbol, const wxString &aFootprintName, const wxString &aFootprintAlternate)
void applyTextCodeIfExists(EDA_TEXT *aKiCadTextItem, const TEXTCODE_ID &aCadstarTextCodeID)
int getSheetNumber(const LAYER_ID &aCadstarSheetID)
void copySymbolItems(std::unique_ptr< LIB_SYMBOL > &aSourceSym, std::unique_ptr< LIB_SYMBOL > &aDestSym, int aDestUnit, bool aOverrideFields=true)
int getLineThickness(const LINECODE_ID &aCadstarLineCodeID)
TEXTCODE getTextCode(const TEXTCODE_ID &aCadstarTextCodeID)
SPIN_STYLE getSpinStyle(const long long &aCadstarOrientation, bool aMirror)
std::map< wxString, LIB_SYMBOL * > m_powerSymLibMap
NetName->KiCad Power Lib Symbol.
std::map< std::pair< wxString, wxString >, SYMDEF_ID > m_SymDefNamesCache
Cache storing symbol names and alternates to symdef IDs.
std::map< PART_ID, TERMINAL_TO_PINNUM_MAP > m_pinNumsMap
Cadstar Part->KiCad Pin number map.
void loadHierarchicalSheetPins()
std::vector< LIB_SYMBOL * > LoadPartsLib(const wxString &aFilename)
ELECTRICAL_PINTYPE getKiCadPinType(const CADSTAR_PIN_TYPE &aPinType)
wxString m_footprintLibName
Name of the footprint library to prepend all footprints with.
int getKiCadLength(long long aCadstarLength)
std::map< PART_ID, LIB_SYMBOL * > m_partMap
Cadstar->KiCad Parts.
bool isAttributeVisible(const ATTRIBUTE_ID &aCadstarAttributeID)
VECTOR2I getKiCadPoint(const VECTOR2I &aCadstarPoint)
EDA_ANGLE getAngle(const long long &aCadstarAngle)
const double ARC_ACCURACY
std::map< wxString, SYMDEF_ID > m_DefaultSymDefNamesCache
Cache storing symbol names (default alternate) to symdef IDs.
void loadSymbolGateAndPartFields(const SYMDEF_ID &aSymdefID, const PART &aCadstarPart, const GATE_ID &aGateID, LIB_SYMBOL *aSymbol)
void loadFigure(const FIGURE &aCadstarFigure, const LAYER_ID &aCadstarSheetIDOverride, SCH_LAYER_ID aKiCadSchLayerID, const VECTOR2I &aMoveVector={ 0, 0 }, const EDA_ANGLE &aRotation=ANGLE_0, const double &aScalingFactor=1.0, const VECTOR2I &aTransformCentre={ 0, 0 }, const bool &aMirrorInvert=false)
std::map< PART_GATE_ID, SYMDEF_ID > m_partSymbolsMap
Map holding the symbols loaded so far for a particular PART_ID and GATE_ID.
LIB_SYMBOL * getScaledLibPart(const LIB_SYMBOL *aSymbol, long long aScalingFactorNumerator, long long aScalingFactorDenominator)
SYMDEF_ID getSymDefFromName(const wxString &aSymdefName, const wxString &aSymDefAlternate)
std::pair< VECTOR2I, VECTOR2I > getFigureExtentsKiCad(const FIGURE &aCadstarFigure)
std::map< LAYER_ID, SCH_SHEET * > m_sheetMap
Cadstar->KiCad Sheets.
POINT getLocationOfNetElement(const NET_SCH &aNet, const NETELEMENT_ID &aNetElementID)
void fixUpLibraryPins(LIB_SYMBOL *aSymbolToFix, int aGateNumber)
std::map< SYMDEF_ID, std::unique_ptr< const LIB_SYMBOL > > m_symDefMap
Cadstar->KiCad Lib Symbols loaded so far.
std::unique_ptr< LIB_SYMBOL > loadLibPart(const CADSTAR_PART_ENTRY &aPart)
ALIGNMENT rotate180(const ALIGNMENT &aCadstarAlignment)
long long getCadstarAngle(const EDA_ANGLE &aAngle)
void loadLibrarySymbolShapeVertices(const std::vector< VERTEX > &aCadstarVertices, const VECTOR2I &aSymbolOrigin, LIB_SYMBOL *aSymbol, int aGateNumber, int aLineThickness)
LINE_STYLE getLineStyle(const LINECODE_ID &aCadstarLineCodeID)
VECTOR2I m_designCenter
Required for calculating the offset to apply to the Cadstar design so that it fits in the KiCad canva...
ALIGNMENT mirrorX(const ALIGNMENT &aCadstarAlignment)
int getComponentOrientation(const EDA_ANGLE &aOrientAngle, EDA_ANGLE &aReturnedOrientation)
void loadShapeVertices(const std::vector< VERTEX > &aCadstarVertices, LINECODE_ID aCadstarLineCodeID, LAYER_ID aCadstarSheetID, SCH_LAYER_ID aKiCadSchLayerID, const VECTOR2I &aMoveVector={ 0, 0 }, const EDA_ANGLE &aRotation=ANGLE_0, const double &aScalingFactor=1.0, const VECTOR2I &aTransformCentre={ 0, 0 }, const bool &aMirrorInvert=false)
const LIB_SYMBOL * loadSymdef(const SYMDEF_ID &aSymdefID)
int getKiCadUnitNumberFromGate(const GATE_ID &aCadstarGateID)
void loadSymbolFieldAttribute(const ATTRIBUTE_LOCATION &aCadstarAttrLoc, const EDA_ANGLE &aComponentOrientation, bool aIsMirrored, SCH_FIELD *aKiCadField)
void loadSchematicSymbolInstances()
ASSIGNMENTS_SCM Assignments
CADSTAR_SCHEMATIC Schematic
int KiCadUnitDivider
Use this value to convert units in this CSA file to KiCad units.
PARTNAMECOL SymbolPartNameColor
void Parse()
Parses the file.
A base class for most all the KiCad significant classes used in schematics and boards.
virtual const BOX2I GetBoundingBox() const
Return the orthogonal bounding box of this object for display purposes.
KICAD_T Type() const
Returns the type of object.
virtual void SetParent(EDA_ITEM *aParent)
EDA_ITEM * GetParent() const
SHAPE_POLY_SET & GetPolyShape()
void SetPolyShape(const SHAPE_POLY_SET &aShape)
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
void SetStart(const VECTOR2I &aStart)
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
void SetEnd(const VECTOR2I &aEnd)
void SetArcGeometry(const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd)
Set the three controlling points for an arc.
void SetFillMode(FILL_T aFill)
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
int GetTextHeight() const
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 SetVertJustify(GR_TEXT_V_ALIGN_T aType)
void SetTextWidth(int aWidth)
virtual void SetVisible(bool aVisible)
void SetTextThickness(int aWidth)
The TextThickness is that set by the user.
void SetTextHeight(int aHeight)
void SetBold(bool aBold)
Set the text to be bold - this will also update the font if needed.
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 SetMultilineAllowed(bool aAllow)
VECTOR2I GetTextSize() const
void SetHorizJustify(GR_TEXT_H_ALIGN_T aType)
iterator end()
Returns a read/write iterator that points to one past the last element in the EE_RTREE.
iterator begin()
Returns a read/write iterator that points to the first element in the EE_RTREE N.B.
A logical library item identifier and consists of various portions much like a URI.
int SetLibItemName(const UTF8 &aLibItemName)
Override the library item name portion of the LIB_ID to aLibItemName.
int SetLibNickname(const UTF8 &aLibNickname)
Override the logical library name portion of the LIB_ID to aLibNickname.
static UTF8 FixIllegalChars(const UTF8 &aLibItemName, bool aLib)
Replace illegal LIB_ID item name characters with underscores '_'.
Define a library symbol object.
std::vector< SCH_PIN * > GetPins(int aUnit, int aBodyStyle) const
Return a list of pin object pointers from the draw item list.
void SetUnitCount(int aCount, bool aDuplicateDrawItems=true)
Set the units per symbol count.
SCH_FIELD & GetValueField() const
Return reference to the value field.
LIB_ITEMS_CONTAINER & GetDrawItems()
Return a reference to the draw item list.
wxString GetName() const override
SCH_FIELD & GetReferenceField() const
Return reference to the reference designator field.
void AddDrawItem(SCH_ITEM *aItem, bool aSort=true)
Add a new draw aItem to the draw object list and sort according to aSort.
virtual void SetName(const wxString &aName)
ITERATOR_BASE< SCH_ITEM, MULTIVECTOR< SCH_ITEM, FIRST_TYPE_VAL, LAST_TYPE_VAL >, typename ITEM_PTR_VECTOR::iterator > ITERATOR
The const iterator.
ITERATOR end(int aType=UNDEFINED_TYPE)
ITERATOR begin(int aType=UNDEFINED_TYPE)
Describe the page size and margins of a paper page on which to eventually print or plot.
void SetHeightMils(double aHeightInMils)
const VECTOR2D GetSizeIU(double aIUScale) const
Gets the page size in internal units.
void SetWidthMils(double aWidthInMils)
virtual void SetNumPhases(int aNumPhases)=0
Set the number of phases.
virtual void BeginPhase(int aPhase)=0
Initialize the aPhase virtual zone of the dialog progress bar.
virtual void SetMaxProgress(int aMaxProgress)=0
Fix the value that gives the 100 percent progress bar length (inside the current virtual zone).
Container for project specific data.
virtual const wxString GetProjectPath() const
Return the full path of the project.
virtual std::map< wxString, wxString > & GetTextVars() const
virtual REPORTER & Report(const wxString &aText, SEVERITY aSeverity=RPT_SEVERITY_UNDEFINED)=0
Report a string with a given severity.
Holds all the data relating to one schematic.
PROJECT & Prj() const override
Return a reference to the project this schematic is part of.
void SetSize(const VECTOR2I &aSize)
Class for a wire to bus entry.
Instances are attached to a symbol or sheet and provide a place for the symbol's value,...
wxString GetName(bool aUseDefaultName=true) const
Return the field name (not translated).
void SetPosition(const VECTOR2I &aPosition) override
void SetName(const wxString &aName)
void SetText(const wxString &aText) override
void SetSpinStyle(SPIN_STYLE aSpinStyle) override
void SetSpinStyle(SPIN_STYLE aSpinStyle) override
Base class for any item which can be embedded within the SCHEMATIC container class,...
void SetLayer(SCH_LAYER_ID aLayer)
virtual void SetUnit(int aUnit)
SCH_ITEM * Duplicate(bool doClone=false) const
Routine to create a new copy of given item.
void SetPosition(const VECTOR2I &aPosition) override
void SetShape(LABEL_FLAG_SHAPE aShape)
void SetPosition(const VECTOR2I &aPosition) override
void AutoplaceFields(SCH_SCREEN *aScreen, AUTOPLACE_ALGO aAlgo) override
virtual void SetSpinStyle(SPIN_STYLE aSpinStyle)
Segment description base class to describe items which have 2 end points (track, wire,...
void SetStartPoint(const VECTOR2I &aPosition)
void SetLineWidth(const int aSize)
VECTOR2I GetEndPoint() const
VECTOR2I GetStartPoint() const
void SetLineStyle(const LINE_STYLE aStyle)
void SetEndPoint(const VECTOR2I &aPosition)
void SetNumber(const wxString &aNumber)
const PAGE_INFO & GetPageSettings() const
void Append(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
void AddBusAlias(std::shared_ptr< BUS_ALIAS > aAlias)
Add a bus alias definition (and transfers ownership of the pointer).
void SetPageSettings(const PAGE_INFO &aPageSettings)
EE_RTREE & Items()
Gets the full RTree, usually for iterating.
void SetFileName(const wxString &aFileName)
Set the file name for this screen to aFileName.
void Update(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
Update aItem's bounding box in the tree.
void SetPosition(const VECTOR2I &aPos) override
void SetStroke(const STROKE_PARAMS &aStroke) override
void AddPoint(const VECTOR2I &aPosition)
VECTOR2I GetPosition() const override
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
void SetPageNumber(const wxString &aPageNumber)
Set the sheet instance user definable page number.
SCH_SHEET * Last() const
Return a pointer to the last SCH_SHEET of the list.
void push_back(SCH_SHEET *aSheet)
Forwarded method from std::vector.
Define a sheet pin (label) used in sheets to create hierarchical schematics.
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
wxString GetFileName() const
Return the filename corresponding to this sheet.
void AddPin(SCH_SHEET_PIN *aSheetPin)
Add aSheetPin to the sheet.
std::vector< SCH_FIELD > & GetFields()
bool LocatePathOfScreen(SCH_SCREEN *aScreen, SCH_SHEET_PATH *aList)
Search the existing hierarchy for an instance of screen loaded from aFileName.
SCH_SCREEN * GetScreen() const
VECTOR2I GetPosition() const override
void SetFields(const std::vector< SCH_FIELD > &aFields)
Set multiple schematic fields.
void SetScreen(SCH_SCREEN *aScreen)
Set the SCH_SCREEN associated with this sheet to aScreen.
static bool ClassOf(const EDA_ITEM *aItem)
void AutoplaceFields(SCH_SCREEN *aScreen, AUTOPLACE_ALGO aAlgo) override
BOX2I GetBodyAndPinsBoundingBox() const override
Return a bounding box for the symbol body and pins but not the fields.
void SetPosition(const VECTOR2I &aPosition) override
int GetFieldCount() const
Return the number of fields in this symbol.
SCH_FIELD * FindField(const wxString &aFieldName, bool aIncludeDefaultFields=true, bool aCaseInsensitive=false)
Search for a SCH_FIELD with aFieldName.
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly) override
Populate a std::vector with SCH_FIELDs.
SCH_FIELD * GetField(MANDATORY_FIELD_T aFieldType)
Return a mandatory field in this symbol.
void UpdatePins()
Updates the cache of SCH_PIN objects for each pin.
void SetRef(const SCH_SHEET_PATH *aSheet, const wxString &aReference)
Set the reference for the given sheet path for this symbol.
void SetOrientation(int aOrientation)
Compute the new transform matrix based on aOrientation for the symbol which is applied to the current...
SCH_FIELD * AddField(const SCH_FIELD &aField)
Add a field to the symbol.
std::unique_ptr< LIB_SYMBOL > & GetLibSymbolRef()
VECTOR2I GetPosition() const override
void SetPosition(const VECTOR2I &aPosition) override
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
const VECTOR2I & GetArcMid() const
const VECTOR2I & GetP1() const
const VECTOR2I & GetP0() const
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
const SHAPE_LINE_CHAIN Reverse() const
Reverse point order in the line chain.
void SetPoint(int aIndex, const VECTOR2I &aPos)
Move a point to a specific location.
int FindSegment(const VECTOR2I &aP, int aThreshold=1) const
Search for segment containing point aP.
int Intersect(const SEG &aSeg, INTERSECTIONS &aIp) const
Find all intersection points between our line chain and the segment aSeg.
void Replace(int aStartIndex, int aEndIndex, const VECTOR2I &aP)
Replace points with indices in range [start_index, end_index] with a single point aP.
virtual size_t GetPointCount() const override
void Append(int aX, int aY, bool aAllowDuplication=false)
Append a new point at the end of the line chain.
const VECTOR2I & CPoint(int aIndex) const
Return a reference to a given point in the line chain.
const VECTOR2I NearestPoint(const VECTOR2I &aP, bool aAllowInternalShapePoints=true) const
Find a point on the line chain that is closest to point aP.
std::vector< INTERSECTION > INTERSECTIONS
const std::vector< VECTOR2I > & CPoints() const
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
SPIN_STYLE MirrorX()
Mirror the label spin style across the X axis or simply swaps up and bottom.
SPIN_STYLE MirrorY()
Mirror the label spin style across the Y axis or simply swaps left and right.
Simple container to manage line stroke parameters.
virtual void SetShowPinNumbers(bool aShow)
Set or clear the pin number visibility flag.
virtual void SetShowPinNames(bool aShow)
Set or clear the pin name visibility flag.
T EuclideanNorm() const
Compute the Euclidean norm of the vector, which is defined as sqrt(x ** 2 + y ** 2).
#define DEFAULT_WIRE_WIDTH_MILS
The default bus width in mils. (can be changed in preference menu)
static constexpr EDA_ANGLE ANGLE_0
static constexpr EDA_ANGLE ANGLE_90
static constexpr EDA_ANGLE ANGLE_VERTICAL
static constexpr EDA_ANGLE ANGLE_HORIZONTAL
static constexpr EDA_ANGLE ANGLE_45
static constexpr EDA_ANGLE ANGLE_270
static constexpr EDA_ANGLE ANGLE_180
static constexpr EDA_ANGLE ANGLE_135
static const std::string KiCadSchematicFileExtension
#define THROW_IO_ERROR(msg)
SCH_LAYER_ID
Eeschema drawing layers.
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 ...
constexpr void MIRROR(T &aPoint, const T &aMirrorRef)
Updates aPoint with the mirror of aPoint relative to the aMirrorRef.
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
ELECTRICAL_PINTYPE
The symbol library pin object electrical types used in ERC tests.
Definition of the SCH_SHEET_PATH and SCH_SHEET_LIST classes for Eeschema.
std::vector< SCH_FIELD > SCH_FIELDS
A container for several SCH_FIELD items.
void wxStringSplit(const wxString &aText, wxArrayString &aStrings, wxChar aSplitter)
Split aString to a string list separated at aSplitter.
bool ReplaceIllegalFileNameChars(std::string *aName, int aReplaceChar)
Checks aName for illegal file name characters.
wxString EscapeString(const wxString &aSource, ESCAPE_CONTEXT aContext)
The Escape/Unescape routines use HTML-entity-reference-style encoding to handle characters which are:...
LINE_STYLE
Dashed line types.
std::map< ATTRIBUTE_ID, ATTRCOL > AttributeColors
JUSTIFICATION Justification
Note: Justification has no effect on single lines of text.
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.
std::map< LINECODE_ID, LINECODE > LineCodes
std::map< ATTRIBUTE_ID, ATTRNAME > AttributeNames
std::map< ROUTECODE_ID, ROUTECODE > RouteCodes
std::map< TEXTCODE_ID, TEXTCODE > TextCodes
Represents 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.
DOCUMENTATION_SYMBOL_ID ID
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.
GRID ScreenGrid
From CADSTAR Help: "There is one Screen Grid, which is visible as dots on the screen.
long Param1
Either Units or X step, depending on Type (see GRID_TYPE for more details)
long Param2
Either Divisor or Y step, depending on Type (see GRID_TYPE for more details)
wxString Name
This is undefined (wxEmptyString) if the net is unnamed.
long SignalNum
This is undefined if the net has been given a name.
std::map< TEXT_FIELD_NAME, wxString > TextFieldToValuesMap
Values for the text field elements used in the CADSTAR design extracted from the text element instanc...
std::map< wxString, wxString > FilenamesToTextMap
CADSTAR doesn't have user defined text fields but does allow loading text from a file.
std::set< TEXT_FIELD_NAME > InconsistentTextFields
Text fields need to be updated in CADSTAR and it is possible that they are not consistent across text...
std::map< PART_ID, PART > PartDefinitions
bool HidePinNames
Specifies whether to display the pin names/identifier in the schematic symbol or not.
std::map< GATE_ID, GATE > GateSymbols
std::map< ATTRIBUTE_ID, ATTRIBUTE_VALUE > AttributeValues
Some attributes are defined within the part definition, whilst others are defined in the part.
std::map< PART_DEFINITION_PIN_ID, PIN > Pins
std::map< ATTRIBUTE_ID, ATTRIBUTE_VALUE > AttributeValues
Some attributes are defined within the part definition, whilst others are defined in the part itself.
Represents a point in x,y coordinates.
SHAPE_POLY_SET ConvertToPolySet(const std::function< VECTOR2I(const VECTOR2I &)> aCadstarToKicadPointCallback, double aAccuracy) const
std::vector< VERTEX > Vertices
std::vector< CUTOUT > Cutouts
Not Applicable to OPENSHAPE Type.
std::map< FIGURE_ID, FIGURE > Figures
std::map< ATTRIBUTE_ID, TEXT_LOCATION > TextLocations
This contains location of any attributes, including designator position.
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
std::map< ATTRIBUTE_ID, ATTRIBUTE_VALUE > AttributeValues
These attributes might also have a location.
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...
JUSTIFICATION Justification
Note: Justification has no effect on single lines of text.
std::map< VARIANT_ID, VARIANT > Variants
< Nodename = "VARIANT" or "VMASTER" (master variant
Represents a vertex in a shape.
SHAPE_ARC BuildArc(const VECTOR2I &aPrevPoint, const std::function< VECTOR2I(const VECTOR2I &)> aCadstarToKicadPointCallback) const
CADSTAR Parts Library (*.lib) model - a data structure describing the contents of the file format.
std::vector< CADSTAR_PART_ENTRY > m_PartEntries
std::string m_ComponentStem
std::map< std::string, std::vector< CADSTAR_PART_PIN > > m_HiddenPins
Pins with an implied electrical connection to a net, not part of any symbol (Note: we probably will n...
std::map< std::string, CADSTAR_ATTRIBUTE_VALUE > m_SchAttributes
Dollar sign ($) line $[!]<SCM Attribute name>(<Attribute value>) Attributes related to the schematic ...
std::map< std::string, CADSTAR_ATTRIBUTE_VALUE > m_SchAndPcbAttributes
At symbol (@) line [@[!]<SCM/PCB Attribute name>(<Attribute value>)] Attributes related to the PCB co...
std::vector< CADSTAR_PART_SYMBOL_ENTRY > m_Symbols
Symbols that form this part.
std::map< std::string, std::string > m_UserAttributes
Star (*) line *<User-defined name> This line is ignored by CADSTAR.
std::map< long, std::string > m_PinNamesMap
Map of pin identifiers to alphanumeric pin names Pin names can be a maximum of 10 characters (Typical...
std::optional< std::string > m_AcceptancePartName
std::optional< std::string > m_Pcb_alternate
std::optional< std::string > m_Version
std::optional< std::string > m_Description
std::optional< std::string > m_Number
std::string m_Pcb_component
std::optional< std::string > m_SpiceModel
std::map< std::string, CADSTAR_ATTRIBUTE_VALUE > m_PcbAttributes
Percentage sign (%) line %[!]<PCB Attribute name>(<Attribute value>) Attributes related to the PCB co...
std::optional< std::string > m_Value
std::map< std::string, CADSTAR_ATTRIBUTE_VALUE > m_PartAttributes
Tilde (~) line ~[!]<Parts Library Attribute Name>(<Attribute Value>) Attributes related to the Part i...
std::map< long, std::string > m_PinLabelsMap
Map of pin identifiers to alphanumeric pin labels.
std::vector< CADSTAR_PART_PIN > m_Pins
std::optional< std::string > m_SymbolAlternateName
TYPE Type
Determines what the associated layer is, whether parent, child or clone.
ATTRIBUTE_LOCATION BlockLabel
LAYER_ID LayerID
The sheet block is on (TODO: verify this is true)
LAYER_ID AssocLayerID
Parent or Child linked sheet.
std::map< TERMINAL_ID, TERMINAL > Terminals
std::map< FIGURE_ID, FIGURE > Figures
LAYER_ID LayerID
Sheet on which bus is located.
std::map< SYMBOL_ID, SYMBOL > Symbols
std::map< REUSEBLOCK_ID, REUSEBLOCK > ReuseBlocks
VARIANT_HIERARCHY VariantHierarchy
std::map< DOCUMENTATION_SYMBOL_ID, DOCUMENTATION_SYMBOL > DocumentationSymbols
std::map< FIGURE_ID, FIGURE > Figures
std::map< TEXT_ID, TEXT > Texts
std::map< BLOCK_ID, BLOCK > Blocks
std::map< BUS_ID, BUS > Buses
std::map< GROUP_ID, GROUP > Groups
std::map< NET_ID, NET_SCH > Nets
ATTRIBUTE_LOCATION AttrLoc
std::map< SYMDEF_ID, SYMDEF_SCM > SymbolDefinitions
std::map< NETELEMENT_ID, DANGLER > Danglers
std::map< NETELEMENT_ID, SYM_TERM > Terminals
std::vector< CONNECTION_SCH > Connections
std::map< NETELEMENT_ID, BUS_TERM > BusTerminals
std::map< NETELEMENT_ID, BLOCK_TERM > BlockTerminals
std::map< NETELEMENT_ID, JUNCTION_SCH > Junctions
ATTRIBUTE_LOCATION AttrLoc
std::vector< LAYER_ID > SheetOrder
A vector to also store the order in which sheets are to be displayed.
std::map< LAYER_ID, SHEET_NAME > SheetNames
LAYER_ID LayerID
Sheet on which symbol is located.
SYMBOL_ID VariantParentSymbolID
std::map< ATTRIBUTE_ID, ATTRIBUTE_VALUE > AttributeValues
GATE_ID GateID
The gate this symbol represents within the associated Part.
long ScaleRatioNumerator
Symbols can be arbitrarily scaled in CADSTAR.
std::map< TERMINAL_ID, SYMPINNAME_LABEL > PinNames
Identifier of the pin in the PCB Equivalent to KiCad's Pin Number.
std::map< TERMINAL_ID, PIN_NUM > PinNumbers
This seems to only appear in older designs and is similar to PinNames but only allowing numerical val...
long ScaleRatioDenominator
SYMBOLVARIANT SymbolVariant
std::map< TERMINAL_ID, PIN_NUM_LABEL_LOC > PinLabelLocations
std::map< TERMINAL_ID, PIN_NUM_LABEL_LOC > PinNumberLocations
std::map< TERMINAL_ID, TERMINAL > Terminals
POINT Position
Pad position within the component's coordinate frame.
constexpr int IUToMils(int iu) const
constexpr int MilsToIU(int mils) const
@ VALUE_FIELD
Field Value of part, i.e. "3.3K".
@ REFERENCE_FIELD
Field Reference of part, i.e. "IC21".
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.
constexpr int sign(T val)
VECTOR2< int32_t > VECTOR2I
constexpr int LexicographicalCompare(const VECTOR2< T > &aA, const VECTOR2< T > &aB)
Definition of file extensions used in Kicad.