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;
131 if( !
Library.SymbolDefinitions.count( symbolID ) )
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 std::vector<SCH_PIN*> pins = kiSymDef->GetPinsByNumber( storedPinNum );
165 size_t termIdx = size_t( termID ) - 1;
174 wxString partPinNum = wxString::Format(
"%ld", sym.
m_Pins[termIdx].m_Identifier );
178 pin->SetNumber( partPinNum );
193 wxCHECK( kiSymDef->GetUnitCount() == 1,
nullptr );
195 retSym = std::move( kiSymDef );
197 retSym->SetUnitCount( aPart.
m_Symbols.size(),
true );
199 retSym->SetName( escapedPartName );
201 retSym->GetValueField().SetText( aPart.
m_Value.value_or(
"" ) );
203 retSym->SetDescription( aPart.
m_Description.value_or(
"" ) );
205 auto addFieldIfHasValue =
206 [&](
const wxString&
name,
const std::optional<std::string>& value )
208 if( value.has_value() )
221 wxString modelVal = wxString::Format(
"model=\"%s\"", aPart.
m_SpiceModel.value() );
248 VECTOR2I symCenter = retSym->GetBodyBoundingBox( unit, 0,
false,
false ).GetCenter();
249 symCenter.
y = -symCenter.
y;
255 for(
auto& [signalName, csPinVector] : aPart.
m_HiddenPins )
259 std::unique_ptr<SCH_PIN>
pin = std::make_unique<SCH_PIN>( retSym.get() );
261 long pinNum = csPin.m_Identifier;
262 pin->SetNumber( wxString::Format(
"%ld", pinNum ) );
263 pin->SetName( signalName );
266 pin->SetVisible(
false );
276 direction = { -direction.
y, direction.
x };
281 pin->SetPosition( symCenter + offset );
284 pin->SetUnit( unit );
285 retSym->AddDrawItem(
pin.release() );
305 int aDestUnit,
bool aOverrideFields )
316 itemCopy->
SetUnit( aDestUnit );
321 if( aOverrideFields )
323 std::vector<SCH_FIELD*> fieldsToCopy;
326 for(
SCH_FIELD* templateField : fieldsToCopy )
329 templateField->Copy( appliedField );
337 wxCHECK( aSchematic, );
358 numSteps +=
Parts.PartDefinitions.size();
385 if(
Schematic.VariantHierarchy.Variants.size() > 0 )
388 m_reporter->Report( wxString::Format(
_(
"The CADSTAR design contains variants are not currently "
389 "supported. Only the master variant ('%s') was loaded." ),
390 Schematic.VariantHierarchy.Variants.at(
"V0" ).Name ),
397 m_reporter->Report(
_(
"The CADSTAR design contains grouped items which are not currently supported. "
398 "Any grouped items have been ungrouped." ),
405 m_reporter->Report(
_(
"The CADSTAR design contains re-use blocks which are not curretly supported. "
406 "The re-use block information has been discarded during the import." ),
412 for( std::pair<LAYER_ID, SCH_SHEET*> sheetPair :
m_sheetMap )
417 BOX2I sheetBoundingBox;
428 bbox =
comp->GetBodyAndPinsBoundingBox();
432 if( field.IsVisible() )
433 bbox.
Merge( field.GetBoundingBox() );
439 wxString txt = txtItem->
GetText();
441 if( txt.Contains(
"${" ) )
448 bbox = item->GetBoundingBox();
451 sheetBoundingBox.
Merge( bbox );
470 auto roundToNearestGrid =
471 [&](
int aNumber ) ->
int
473 int error = aNumber %
grid;
474 int absError =
sign( error ) * error;
476 if( absError > (
grid / 2 ) )
477 return aNumber + (
sign( error ) *
grid ) - error;
479 return aNumber - error;
486 int longestSide = std::max( targetSheetSize.
x, targetSheetSize.
y );
487 int margin = ( (double) longestSide * 0.03 );
488 margin = roundToNearestGrid( margin );
489 targetSheetSize += margin * 2;
500 VECTOR2I sheetcentre( pageSizeIU.
x / 2, pageSizeIU.
y / 2 );
504 VECTOR2I translation = sheetcentre - itemsCentre;
505 translation.
x = roundToNearestGrid( translation.
x );
506 translation.
y = roundToNearestGrid( translation.
y );
509 std::vector<SCH_ITEM*> allItems;
512 std::back_inserter( allItems ) );
516 item->Move( translation );
524 m_reporter->Report(
_(
"CADSTAR fonts are different to the ones in KiCad. This will likely "
525 "result in alignment issues. Please review the imported text elements "
526 "carefully and correct manually if required." ),
529 m_reporter->Report(
_(
"The CADSTAR design has been imported successfully.\n"
530 "Please review the import errors and warnings (if any)." ) );
543 constexpr long long maxDesignSizekicad = std::numeric_limits<int>::max();
545 if( designSizeXkicad > maxDesignSizekicad || designSizeYkicad > maxDesignSizekicad )
547 THROW_IO_ERRORF(
_(
"The design is too large and cannot be imported into KiCad. \n"
548 "Please reduce the maximum design size in CADSTAR by navigating to: \n"
549 "Design Tab -> Properties -> Design Options -> Maximum Design Size. \n"
550 "Current Design size: %.2f, %.2f millimeters. \n"
551 "Maximum permitted design size: %.2f, %.2f millimeters.\n" ),
567 if( orphanSheets.size() > 1 )
572 for(
LAYER_ID sheetID : orphanSheets )
588 else if( orphanSheets.size() > 0 )
590 LAYER_ID rootSheetID = orphanSheets.at( 0 );
592 wxFileName loadedFilePath = wxFileName(
Filename );
594 std::string filename = wxString::Format(
"%s_%02d", loadedFilePath.GetName(),
600 wxFileName fn(
m_schematic->Project().GetProjectPath() + filename );
601 m_rootSheet->GetScreen()->SetFileName( fn.GetFullPath() );
606 else if(
Header.Format.Type ==
"SYMBOL" )
608 THROW_IO_ERROR(
_(
"The selected file is a CADSTAR symbol library. It does not contain a "
609 "schematic design so cannot be imported/opened in this way." ) );
613 THROW_IO_ERROR(
_(
"The CADSTAR schematic might be corrupt: there is no root sheet." ) );
620 for( std::pair<BLOCK_ID, BLOCK> blockPair :
Schematic.Blocks )
622 BLOCK& block = blockPair.second;
625 if( block.
Type == BLOCK::TYPE::PARENT )
627 else if( block.
Type == BLOCK::TYPE::CHILD )
636 for( std::pair<TERMINAL_ID, TERMINAL> termPair : block.
Terminals )
639 wxString
name =
"YOU SHOULDN'T SEE THIS TEXT. THIS IS A BUG.";
643 if( block.
Type == BLOCK::TYPE::PARENT )
645 else if( block.
Type == BLOCK::TYPE::CHILD )
668 for( std::pair<PART_ID, PART> partPair :
Parts.PartDefinitions )
670 PART_ID partID = partPair.first;
671 PART part = partPair.second;
674 std::unique_ptr<LIB_SYMBOL> kiSym = std::make_unique<LIB_SYMBOL>( escapedPartName );
681 GATE_ID gateID = gatePair.first;
682 PART::DEFINITION::GATE gate = gatePair.second;
685 if( symbolID.IsEmpty() )
687 m_reporter->Report( wxString::Format(
_(
"Part definition '%s' references symbol "
688 "'%s' (alternate '%s') which could not be "
689 "found in the symbol library. The part has "
690 "not been loaded into the KiCad library." ),
710 m_reporter->Report( wxString::Format(
_(
"Part definition '%s' has an incomplete "
711 "definition (no symbol definitions are "
712 "associated with it). The part has not "
713 "been loaded into the KiCad library." ),
727 bool inserted =
m_partMap.insert( { partID, symbol } ).second;
728 wxCHECK2( inserted,
continue );
740 for( std::pair<SYMBOL_ID, SYMBOL> symPair :
Schematic.Symbols )
742 SYMBOL sym = symPair.second;
751 m_reporter->Report( wxString::Format(
_(
"Symbol '%s' references part '%s' which could not be "
752 "found in the library. The symbol was not loaded." ),
760 if( sym.
GateID.IsEmpty() )
765 std::unique_ptr<LIB_SYMBOL> kiSymCopy;
773 kiSymCopy = std::make_unique<LIB_SYMBOL>( *kiSym );
774 kiSym = kiSymCopy.get();
808 partname.Replace( wxT(
"\n" ), wxT(
"\\n" ) );
809 partname.Replace( wxT(
"\r" ), wxT(
"\\r" ) );
810 partname.Replace( wxT(
"\t" ), wxT(
"\\t" ) );
811 partField->
SetText( partname );
830 wxASSERT( attrField->
GetName() == attrName );
832 attrVal.
Value.Replace( wxT(
"\n" ), wxT(
"\\n" ) );
833 attrVal.
Value.Replace( wxT(
"\r" ), wxT(
"\\r" ) );
834 attrVal.
Value.Replace( wxT(
"\t" ), wxT(
"\\t" ) );
847 THROW_IO_ERRORF(
_(
"Symbol ID '%s' references library symbol '%s' which could not be found "
848 "in the library. Did you export all items of the design?" ),
857 THROW_IO_ERRORF(
_(
"Symbol ID '%s' is a signal reference or global signal but it has too "
858 "many pins. The expected number of pins is 1 but %d were found." ),
871 wxString libraryNetName =
Library.SymbolDefinitions.at( symID ).Alternate;
881 wxString libPartName = libraryNetName;
887 if( libPartName != symbolInstanceNetName )
889 libPartName += wxT(
" (" ) + symbolInstanceNetName + wxT(
")" );
895 wxCHECK( templatePart, );
897 auto ownedPart = std::make_unique<LIB_SYMBOL>( *templatePart );
898 kiPart = ownedPart.get();
902 kiPart->
SetName( libPartName );
908 wxCHECK( pins.size() == 1, );
911 pins.at( 0 )->SetName( symbolInstanceNetName );
962 netLabel->
SetText(
"***UNKNOWN NET****" );
976 if( libSymDef.
Alternate.Lower().Contains(
"in" ) )
978 else if( libSymDef.
Alternate.Lower().Contains(
"bi" ) )
980 else if( libSymDef.
Alternate.Lower().Contains(
"out" ) )
990 screen->
Append( netLabel );
995 wxASSERT_MSG(
false,
"Unknown Symbol Variant." );
1000 m_reporter->Report( wxString::Format(
_(
"Symbol ID '%s' is of an unknown type. It is neither a "
1001 "symbol or a net power / symbol. The symbol was not loaded." ),
1010 if( symbolName.empty() )
1011 symbolName = wxString::Format(
"ID: %s", sym.
ID );
1013 symbolName += sym.
GateID;
1015 m_reporter->Report( wxString::Format(
_(
"Symbol '%s' is scaled in the original CADSTAR schematic "
1016 "but this is not supported in KiCad. When the symbol is "
1017 "reloaded from the library, it will revert to the original "
1029 for( std::pair<BUS_ID, BUS> busPair :
Schematic.Buses )
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 );
1048 label->
SetText( wxT(
"{" ) + busname + wxT(
"}" ) );
1097 label->
SetText( wxT(
"{" ) + busname + wxT(
"}" ) );
1109 for( std::pair<NET_ID, NET_SCH> netPair :
Schematic.Nets )
1112 wxString netName = net.
Name;
1113 std::map<NETELEMENT_ID, SCH_LABEL*> netlabels;
1115 if( netName.IsEmpty() )
1116 netName = wxString::Format(
"$%ld", net.
SignalNum );
1120 for( std::pair<NETELEMENT_ID, NET_SCH::SYM_TERM> terminalPair : net.
Terminals )
1122 NET_SCH::SYM_TERM netTerm = terminalPair.second;
1131 if( netTerm.HasNetLabel )
1136 applyTextSettings( val, netTerm.NetLabel.TextCodeID, netTerm.NetLabel.Alignment,
1137 netTerm.NetLabel.Justification, netTerm.NetLabel.OrientAngle,
1138 netTerm.NetLabel.Mirror );
1155 else if( !net.
Name.IsEmpty() &&
Schematic.Symbols.count( netTerm.SymbolID )
1156 && netTerm.HasNetLabel )
1166 applyTextSettings( label, netTerm.NetLabel.TextCodeID, netTerm.NetLabel.Alignment,
1167 netTerm.NetLabel.Justification );
1169 netlabels.insert( { netTerm.ID, label } );
1172 m_sheetMap.at( sheet )->GetScreen()->Append( label );
1176 auto getHierarchicalLabel =
1179 if( aNode.Contains(
"BLKT" ) )
1182 BLOCK_PIN_ID blockPinID = std::make_pair( blockTerm.BlockID, blockTerm.TerminalID );
1192 for( std::pair<NETELEMENT_ID, NET_SCH::BLOCK_TERM> blockPair : net.
BlockTerminals )
1194 SCH_HIERLABEL* label = getHierarchicalLabel( blockPair.first );
1201 for( std::pair<NETELEMENT_ID, NET_SCH::BUS_TERM> busPair : net.
BusTerminals )
1203 NET_SCH::BUS_TERM busTerm = busPair.second;
1225 if( busTerm.HasNetLabel )
1227 applyTextSettings( label, busTerm.NetLabel.TextCodeID, busTerm.NetLabel.Alignment,
1228 busTerm.NetLabel.Justification );
1235 netlabels.insert( { busTerm.ID, label } );
1239 for( std::pair<NETELEMENT_ID, NET_SCH::DANGLER> danglerPair : net.
Danglers )
1241 NET_SCH::DANGLER dangler = danglerPair.second;
1247 if( dangler.HasNetLabel )
1249 applyTextSettings( label, dangler.NetLabel.TextCodeID, dangler.NetLabel.Alignment,
1250 dangler.NetLabel.Justification );
1254 netlabels.insert( { dangler.ID, label } );
1256 m_sheetMap.at( dangler.LayerID )->GetScreen()->Append( label );
1259 for( NET_SCH::CONNECTION_SCH conn : net.
Connections )
1261 if( conn.LayerID == wxT(
"NO_SHEET" ) )
1272 if( conn.Path.size() < 1 || conn.Path.front().End != start )
1275 if( conn.Path.size() < 2 || conn.Path.back().End !=
end )
1278 bool firstPt =
true;
1279 bool secondPt =
false;
1290 for(
const VERTEX& vertex : conn.Path )
1298 std::vector<NETELEMENT_ID> nodes;
1299 nodes.push_back( conn.StartNode );
1300 nodes.push_back( conn.EndNode );
1315 int leftSide = sheetPosition.
x;
1316 int rightSide = sheetPosition.
x + sheetSize.
x;
1317 int topSide = sheetPosition.
y;
1318 int botSide = sheetPosition.
y + sheetSize.
y;
1322 sheetEdge.
Append( leftSide, topSide );
1323 sheetEdge.
Append( rightSide, topSide );
1324 sheetEdge.
Append( rightSide, botSide );
1325 sheetEdge.
Append( leftSide, botSide );
1326 sheetEdge.
Append( leftSide, topSide );
1328 std::vector<SHAPE_LINE_CHAIN::INTERSECTION> wireToSheetIntersects;
1330 if( !wireChain.
Intersect( sheetEdge, wireToSheetIntersects ) )
1335 if( node == conn.StartNode )
1336 wireChain = wireChain.
Reverse();
1340 if( node == conn.StartNode )
1341 wireChain = wireChain.
Reverse();
1347 VECTOR2I intsctPt = wireToSheetIntersects.at( 0 ).p;
1348 int intsctIndx = wireChain.
FindSegment( intsctPt );
1349 wxASSERT_MSG( intsctIndx != -1,
"Can't find intersecting segment" );
1351 if( node == conn.StartNode )
1352 wireChain.
Replace( 0, intsctIndx, intsctPt );
1354 wireChain.
Replace( intsctIndx + 1, -1, intsctPt );
1362 auto fixNetLabelsAndSheetPins =
1367 if( netlabels.find( aNetEleID ) != netlabels.end() )
1368 netlabels.at( aNetEleID )->SetSpinStyle( spin.
MirrorY() );
1370 SCH_HIERLABEL* sheetPin = getHierarchicalLabel( aNetEleID );
1392 fixNetLabelsAndSheetPins( wireAngle, conn.StartNode );
1401 if( !conn.ConnectionLineCode.IsEmpty() )
1406 m_sheetMap.at( conn.LayerID )->GetScreen()->Append( wire );
1413 fixNetLabelsAndSheetPins( wireAngle, conn.EndNode );
1417 for( std::pair<NETELEMENT_ID, NET_SCH::JUNCTION_SCH> juncPair : net.
Junctions )
1419 NET_SCH::JUNCTION_SCH junc = juncPair.second;
1424 m_sheetMap.at( junc.LayerID )->GetScreen()->Append( kiJunc );
1426 if( junc.HasNetLabel )
1440 m_sheetMap.at( junc.LayerID )->GetScreen()->Append( label );
1449 for( std::pair<FIGURE_ID, FIGURE> figPair :
Schematic.Figures )
1451 FIGURE fig = figPair.second;
1460 for( std::pair<TEXT_ID, TEXT> textPair :
Schematic.Texts )
1462 TEXT txt = textPair.second;
1472 for( std::pair<DOCUMENTATION_SYMBOL_ID, DOCUMENTATION_SYMBOL> docSymPair :
1479 m_reporter->Report( wxString::Format(
_(
"Documentation Symbol '%s' refers to symbol definition "
1480 "ID '%s' which does not exist in the library. The symbol "
1481 "was not loaded." ),
1494 bool mirrorInvert = docSym.
Mirror;
1496 for( std::pair<FIGURE_ID, FIGURE> figPair : docSymDef.
Figures )
1498 FIGURE fig = figPair.second;
1501 centreOfTransform, mirrorInvert );
1504 for( std::pair<TEXT_ID, TEXT> textPair : docSymDef.
Texts )
1506 TEXT txt = textPair.second;
1508 txt.
Mirror = ( txt.
Mirror ) ? !mirrorInvert : mirrorInvert;
1514 scalingFactor, centreOfTransform, mirrorInvert );
1533 auto findAndReplaceTextField =
1536 if(
m_context.TextFieldToValuesMap.find( aField ) !=
m_context.TextFieldToValuesMap.end() )
1538 if(
m_context.TextFieldToValuesMap.at( aField ) != aValue )
1540 m_context.TextFieldToValuesMap.at( aField ) = aValue;
1541 m_context.InconsistentTextFields.insert( aField );
1547 m_context.TextFieldToValuesMap.insert( { aField, aValue } );
1557 std::map<wxString, wxString>& txtVars = pj->
GetTextVars();
1560 if(
Schematic.VariantHierarchy.Variants.size() > 0 )
1570 for( std::pair<TEXT_FIELD_NAME, wxString> txtvalue :
m_context.TextFieldToValuesMap )
1573 wxString varValue = txtvalue.second;
1575 txtVars.insert( { varName, varValue } );
1578 for( std::pair<wxString, wxString> txtvalue :
m_context.FilenamesToTextMap )
1580 wxString varName = txtvalue.first;
1581 wxString varValue = txtvalue.second;
1583 txtVars.insert( { varName, varValue } );
1588 m_reporter->Report(
_(
"Text Variables could not be set as there is no project attached." ),
1599 return existingField;
1603 aKiCadSymbol->
AddField( newfield );
1616 wxCHECK(
Library.SymbolDefinitions.find( aSymdefID ) !=
Library.SymbolDefinitions.end(),
nullptr );
1622 std::unique_ptr<LIB_SYMBOL> kiSym = std::make_unique<LIB_SYMBOL>( csSym.
BuildLibName() );
1623 const int gateNumber = 1;
1626 for( std::pair<FIGURE_ID, FIGURE> figPair : csSym.
Figures )
1628 FIGURE fig = figPair.second;
1635 lineThickness, linestyle );
1643 return getKiCadLibraryPoint( aPt, csSym.Origin );
1658 kiSym->AddDrawItem( shape );
1665 for( std::pair<TERMINAL_ID, TERMINAL> termPair : csSym.
Terminals )
1668 wxString pinNum = wxString::Format(
"%ld", term.
ID );
1669 wxString pinName = wxEmptyString;
1670 std::unique_ptr<SCH_PIN>
pin = std::make_unique<SCH_PIN>( kiSym.get() );
1676 pin->SetLength( 0 );
1678 pin->SetUnit( gateNumber );
1679 pin->SetNumber( pinNum );
1680 pin->SetName( pinName );
1698 pin->SetNumberTextSize( pinNumberHeight );
1699 pin->SetNameTextSize( pinNameHeight );
1701 pinNumToTerminals.insert( {
pin->GetNumber(), term.
ID } );
1702 kiSym->AddDrawItem(
pin.release() );
1710 for( std::pair<TEXT_ID, TEXT> textPair : csSym.
Texts )
1712 TEXT csText = textPair.second;
1714 auto libtext = std::make_unique<SCH_TEXT>( pos, csText.
Text,
LAYER_DEVICE );
1716 libtext->SetUnit( gateNumber );
1718 libtext->SetMultilineAllowed(
true );
1724 if( csText.
Text.Contains(
"\n" ) )
1726 wxArrayString strings;
1729 for(
size_t ii = 0; ii < strings.size(); ++ii )
1731 BOX2I bbox = libtext->GetTextBox(
nullptr, ii );
1734 RotatePoint( linePos, libtext->GetTextPos(), -libtext->GetTextAngle() );
1737 textLine->
SetText( strings[ii] );
1744 kiSym->AddDrawItem( textLine );
1750 libtext->SetMultilineAllowed(
false );
1751 kiSym->AddDrawItem( libtext.release() );
1773 wxCHECK( partField,
nullptr );
1789 for(
auto& [attributeId, textLocation] : csSym.
TextLocations )
1814 if( attrValue.HasLocation )
1821 m_symDefMap.insert( { aSymdefID, std::move( kiSym ) } );
1828 const PART& aCadstarPart,
1832 wxCHECK(
Library.SymbolDefinitions.find( aSymdefID ) !=
Library.SymbolDefinitions.end(), );
1834 std::unique_ptr<LIB_SYMBOL> kiSymDef(
loadSymdef( aSymdefID )->Duplicate() );
1835 wxCHECK( kiSymDef, );
1843 std::vector<SCH_PIN*> pins = kiSymDef->GetPinsByNumber( storedPinNum );
1848 if( pinNum.IsEmpty() )
1850 if( !csPin.Identifier.IsEmpty() )
1851 pinNum = csPin.Identifier;
1853 pinNum = wxString::Format(
"%ld", termID );
1855 pinNum = wxString::Format(
"%ld", csPin.ID );
1861 pin->SetNumber( pinNum );
1862 pin->SetName( pinName );
1865 pinNumMap.insert( { termID, pinNum } );
1882 const POINT& symDefOrigin =
Library.SymbolDefinitions.at( aSymdefID ).Origin;
1883 wxString footprintRefName = wxEmptyString;
1884 wxString footprintAlternateName = wxEmptyString;
1891 wxString attributeValue = aAttributeVal.Value;
1892 attributeValue.Replace( wxT(
"\n" ), wxT(
"\\n" ) );
1893 attributeValue.Replace( wxT(
"\r" ), wxT(
"\\r" ) );
1894 attributeValue.Replace( wxT(
"\t" ), wxT(
"\\t" ) );
1900 if( attrName == wxT(
"(PartDefinitionNameStem)" ) )
1903 attributeValue.Replace( wxT(
" " ),
"_" );
1907 else if( attrName == wxT(
"(PartDescription)" ) )
1912 else if( attrName == wxT(
"(PartDefinitionReferenceName)" ) )
1914 footprintRefName = attributeValue;
1917 else if( attrName == wxT(
"(PartDefinitionAlternateName)" ) )
1919 footprintAlternateName = attributeValue;
1923 bool attrIsNew = aSymbol->
GetField( attrName ) ==
nullptr;
1926 wxASSERT( attrField->
GetName() == attrName );
1927 attrField->
SetText( attributeValue );
1928 attrField->
SetUnit( gateNumber );
1930 const ATTRIBUTE_ID& attrid = aAttributeVal.AttributeID;
1933 if( aAttributeVal.HasLocation )
1938 else if( attrIsNew )
1947 loadLibraryField( attrVal );
1951 loadLibraryField( attrVal );
1964 const wxString& aFootprintName,
1965 const wxString& aFootprintAlternate )
1967 wxString fpNameInLibrary =
generateLibName( aFootprintName, aFootprintAlternate );
1969 if( !fpNameInLibrary.IsEmpty() )
1971 wxArrayString fpFilters;
1972 fpFilters.Add( aFootprintName );
1974 if( !aFootprintAlternate.IsEmpty() )
1975 fpFilters.Add( fpNameInLibrary );
1990 const VERTEX* prev = aCadstarVertices.empty() ? nullptr : &aCadstarVertices.at( 0 );
1995 for(
size_t i = 1; i < aCadstarVertices.size(); i++ )
1997 cur = &aCadstarVertices.at( i );
2006 centerPoint = ( startPoint + endPoint ) / 2;
2032 shape->
SetEnd( startPoint );
2037 shape->
SetEnd( endPoint );
2043 shape->
SetUnit( aGateNumber );
2062 aCadstarAttrLoc.
Mirror );
2080 m_reporter->Report( wxString::Format(
_(
"Symbol '%s' references sheet ID '%s' which does not exist "
2081 "in the design. The symbol was not loaded." ),
2101 int compOrientation = 0;
2103 if( aCadstarSymbol.
Mirror )
2105 compAngle = -compAngle;
2111 EDA_ANGLE test2( aComponentOrientation );
2115 m_reporter->Report( wxString::Format(
_(
"Symbol '%s' is rotated by an angle of %.1f "
2116 "degrees in the original CADSTAR design but "
2117 "KiCad only supports rotation angles multiples "
2118 "of 90 degrees. The connecting wires will need "
2127 wxString gate = ( aCadstarSymbol.
GateID.IsEmpty() ) ? wxString( wxT(
"A" ) ) : aCadstarSymbol.
GateID;
2128 wxString partGateIndex = aCadstarSymbol.
PartRef.
RefID + gate;
2135 std::map<wxString, std::vector<SCH_PIN*>> pinNumToLibPinsMap;
2137 for(
auto& term : termNumMap )
2139 wxString pinNum = term.second;
2140 std::vector<SCH_PIN*> pins =
2142 pinNumToLibPinsMap.insert( { pinNum, pins } );
2145 auto replacePinNumber =
2146 [&](
const wxString& aOldPinNum,
const wxString& aNewPinNum )
2148 if( aOldPinNum == aNewPinNum )
2151 for(
SCH_PIN* libpin : pinNumToLibPinsMap.at( aOldPinNum ) )
2156 for(
auto& pinPair : aCadstarSymbol.
PinNumbers )
2158 SYMBOL::PIN_NUM
pin = pinPair.second;
2160 replacePinNumber( termNumMap.at(
pin.TerminalID ),
2161 wxString::Format(
"%ld",
pin.PinNum ) );
2165 for(
auto& pinPair : aCadstarSymbol.
PinNames )
2168 replacePinNumber( termNumMap.at(
pin.TerminalID ),
pin.NameOrLabel );
2198 if( textIsVertical )
2201 alignment =
mirrorX( alignment );
2207 aCadstarAttrLoc.
Mirror );
2222 aReturnedOrientation =
ANGLE_0;
2240 return compOrientation;
2247 auto logUnknownNetElementError =
2250 m_reporter->Report( wxString::Format(
_(
"Net %s references unknown net element %s. The net was "
2251 "not properly loaded and may require manual fixing." ),
2259 if( aNetElementID.Contains(
"J" ) )
2262 return logUnknownNetElementError();
2264 return aNet.
Junctions.at( aNetElementID ).Location;
2266 else if( aNetElementID.Contains(
"P" ) )
2269 return logUnknownNetElementError();
2275 return logUnknownNetElementError();
2281 if(
Library.SymbolDefinitions.find( symdefid ) ==
Library.SymbolDefinitions.end() )
2282 return logUnknownNetElementError();
2289 m_reporter->Report( wxString::Format(
_(
"Net %s references unknown terminal %s on symbol %s. "
2290 "The net was not properly loaded and may require manual "
2303 VECTOR2I pinOffset = libpinPosition - libOrigin;
2307 VECTOR2I pinPosition = symbolOrigin + pinOffset;
2311 pinPosition.
x = ( 2 * symbolOrigin.
x ) - pinPosition.
x;
2316 RotatePoint( pinPosition, symbolOrigin, -adjustedOrientation );
2319 retval.
x = pinPosition.
x;
2320 retval.
y = pinPosition.
y;
2324 else if( aNetElementID.Contains(
"BT" ) )
2327 return logUnknownNetElementError();
2329 return aNet.
BusTerminals.at( aNetElementID ).SecondPoint;
2331 else if( aNetElementID.Contains(
"BLKT" ) )
2334 return logUnknownNetElementError();
2340 return logUnknownNetElementError();
2346 m_reporter->Report( wxString::Format(
_(
"Net %s references unknown terminal %s on block %s. The net "
2347 "was not properly loaded and may require manual fixing." ),
2356 return block.
Terminals.at( termid ).Position;
2358 else if( aNetElementID.Contains(
"D" ) )
2361 return logUnknownNetElementError();
2363 return aNet.
Danglers.at( aNetElementID ).Position;
2367 return logUnknownNetElementError();
2374 wxString netname = aNet.
Name;
2376 if( netname.IsEmpty() )
2377 netname = wxString::Format(
"$%ld", aNet.
SignalNum );
2389 const double& aScalingFactor,
2391 const bool& aMirrorInvert )
2396 const VERTEX* prev = aCadstarVertices.empty() ? nullptr : &aCadstarVertices.at( 0 );
2401 auto pointTransform =
2405 aScalingFactor, aTransformCentre, aMirrorInvert );
2408 for(
size_t ii = 1; ii < aCadstarVertices.size(); ii++ )
2410 cur = &aCadstarVertices.at( ii );
2412 VECTOR2I transformedStartPoint = pointTransform( prev->
End );
2413 VECTOR2I transformedEndPoint = pointTransform( cur->
End );
2436 segment->
SetLayer( aKiCadSchLayerID );
2448 wxFAIL_MSG(
"Unknown CADSTAR Vertex type" );
2457 const LAYER_ID& aCadstarSheetIDOverride,
2461 const double& aScalingFactor,
2463 const bool& aMirrorInvert )
2466 aCadstarSheetIDOverride, aKiCadSchLayerID, aMoveVector, aRotation,
2467 aScalingFactor, aTransformCentre, aMirrorInvert );
2472 aKiCadSchLayerID, aMoveVector, aRotation, aScalingFactor,
2473 aTransformCentre, aMirrorInvert );
2484 "Sheet already loaded!" );
2487 aParentSheet.
Last(),
2495 wxString
name =
Sheets.SheetNames.at( aCadstarSheetID );
2500 wxString loadedFilename = wxFileName(
Filename ).GetName();
2501 std::string filename = wxString::Format(
"%s_%02d", loadedFilename, sheetNum ).ToStdString();
2508 wxFileName fn(
m_schematic->Project().GetProjectPath() + 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" );
2530 for( std::pair<BLOCK_ID, BLOCK> blockPair :
Schematic.Blocks )
2532 BLOCK& block = blockPair.second;
2534 if( block.
LayerID == aCadstarSheetID && block.
Type == BLOCK::TYPE::CHILD )
2538 if( block.
Figures.size() > 0 )
2540 m_reporter->Report( wxString::Format(
_(
"The block ID %s (Block name: '%s') is drawn on sheet "
2541 "'%s' but is not linked to another sheet in the design. "
2542 "KiCad requires all sheet symbols to be associated to a "
2543 "sheet, so the block was not loaded." ),
2545 Sheets.SheetNames.at( aCadstarSheetID ) ),
2555 std::pair<VECTOR2I, VECTOR2I> blockExtents;
2557 if( block.
Figures.size() > 0 )
2563 THROW_IO_ERROR( wxString::Format(
_(
"The CADSTAR schematic might be corrupt: Block %s references "
2564 "a child sheet but has no Figure defined." ),
2573 std::vector<SCH_FIELD> fields = loadedSheet->
GetFields();
2577 field.SetVisible(
false );
2621 std::vector<LAYER_ID> childSheets, orphanSheets;
2624 for( std::pair<BLOCK_ID, BLOCK> blockPair :
Schematic.Blocks )
2626 BLOCK& block = blockPair.second;
2629 if( block.
Type == BLOCK::TYPE::CHILD )
2630 childSheets.push_back( assocSheetID );
2636 if( std::find( childSheets.begin(), childSheets.end(), sheetID ) == childSheets.end() )
2637 orphanSheets.push_back( sheetID );
2640 return orphanSheets;
2650 if( sheetID == aCadstarSheetID )
2663 wxCHECK_MSG( aItem, , wxT(
"aItem is null" ) );
2665 if( aCadstarSheetID ==
"ALL_SHEETS" )
2667 for( std::pair<LAYER_ID, SHEET_NAME> sheetPair :
Sheets.SheetNames )
2669 LAYER_ID sheetID = sheetPair.first;
2675 else if( aCadstarSheetID ==
"NO_SHEET" )
2677 wxFAIL_MSG( wxT(
"Trying to add an item to NO_SHEET? This might be a documentation symbol." ) );
2683 m_sheetMap.at( aCadstarSheetID )->GetScreen()->Append( aItem );
2688 wxFAIL_MSG( wxT(
"Unknown Sheet ID." ) );
2696 const wxString& aSymDefAlternate )
2705 for(
auto& [
id, symdef] :
Library.SymbolDefinitions )
2707 wxString refKey = symdef.ReferenceName.Lower();
2708 wxString altKey = symdef.Alternate.Lower();
2720 else if( altKey.IsEmpty() )
2728 wxString refKeyToFind = aSymdefName.Lower();
2729 wxString altKeyToFind = aSymDefAlternate.Lower();
2747 if(
AttrColors.AttributeColors.find( aCadstarAttributeID ) !=
AttrColors.AttributeColors.end() )
2748 return AttrColors.AttributeColors.at( aCadstarAttributeID ).IsVisible;
2756 wxCHECK(
Assignments.Codedefs.LineCodes.find( aCadstarLineCodeID ) !=
Assignments.Codedefs.LineCodes.end(),
2765 wxCHECK(
Assignments.Codedefs.LineCodes.find( aCadstarLineCodeID ) !=
Assignments.Codedefs.LineCodes.end(),
2768 switch(
Assignments.Codedefs.LineCodes.at( aCadstarLineCodeID ).Style )
2783 wxCHECK(
Assignments.Codedefs.TextCodes.find( aCadstarTextCodeID ) !=
Assignments.Codedefs.TextCodes.end(),
2786 return Assignments.Codedefs.TextCodes.at( aCadstarTextCodeID );
2800 wxCHECK(
Assignments.Codedefs.AttributeNames.find( aCadstarAttributeID )
2802 aCadstarAttributeID );
2804 return Assignments.Codedefs.AttributeNames.at( aCadstarAttributeID ).Name;
2811 wxCHECK(
Parts.PartDefinitions.find( aCadstarPartID ) !=
Parts.PartDefinitions.end(),
PART() );
2813 return Parts.PartDefinitions.at( aCadstarPartID );
2820 wxCHECK(
Assignments.Codedefs.RouteCodes.find( aCadstarRouteCodeID ) !=
Assignments.Codedefs.RouteCodes.end(),
2823 return Assignments.Codedefs.RouteCodes.at( aCadstarRouteCodeID );
2827CADSTAR_SCH_ARCHIVE_LOADER::PART::DEFINITION::PIN
2831 for( std::pair<PART_DEFINITION_PIN_ID, PART::DEFINITION::PIN> pinPair :
2834 PART::DEFINITION::PIN partPin = pinPair.second;
2836 if( partPin.TerminalGate == aGateID && partPin.TerminalPin == aTerminalID )
2840 return PART::DEFINITION::PIN();
2865 if( aCadstarGateID.IsEmpty() )
2868 return (
int) aCadstarGateID.Upper().GetChar( 0 ) - (int) wxUniChar(
'A' ) + 1;
2910 switch( aCadstarAlignment )
2929 default: wxFAIL_MSG(
"Unknown Cadstar Alignment" );
return aCadstarAlignment;
2937 switch( aCadstarAlignment )
2951 default: wxFAIL_MSG(
"Unknown Cadstar Alignment" );
return aCadstarAlignment;
2961 aKiCadTextItem->
SetText( escapedText );
2963 if( !
Assignments.Codedefs.TextCodes.count( aCadstarTextCodeID ) )
2972 if( textWidth == 0 )
2993 const long long aCadstarOrientAngle,
3002 ALIGNMENT textAlignment = aCadstarAlignment;
3008 textAlignment =
mirrorX( aCadstarAlignment );
3013 switch( aAlignment )
3068 wxCHECK( textEdaItem, );
3090 textAlignment =
rotate180( textAlignment );
3094 textAlignment =
rotate180( textAlignment );
3097 wxFAIL_MSG(
"Unknown Quadrant" );
3101 setAlignment( aKiCadTextItem, textAlignment );
3108 setAlignment( aKiCadTextItem, textAlignment );
3110 int off =
static_cast<SCH_TEXT*
>( aKiCadTextItem )->GetTextOffset();
3121 default: wxFAIL_MSG(
"Unexpected Spin Style" );
break;
3149 wxFAIL_MSG(
"Unexpected Spin Style" );
3158 label->SetSpinStyle( spin );
3162 wxFAIL_MSG(
"Unexpected item type" );
3177 aCadstarTextElement.
Mirror );
3184 long long aScalingFactorNumerator,
3185 long long aScalingFactorDenominator )
3189 if( aScalingFactorNumerator == aScalingFactorDenominator )
3193 [&](
int aLength ) ->
int
3195 return( aLength * aScalingFactorNumerator ) / aScalingFactorDenominator;
3201 return VECTOR2I( scaleLen( aCoord.x ), scaleLen( aCoord.y ) );
3207 return VECTOR2I( scaleLen( aSize.x ), scaleLen( aSize.y ) );
3214 switch( item.Type() )
3241 pin.SetPosition( scalePt(
pin.GetPosition() ) );
3242 pin.SetLength( scaleLen(
pin.GetLength() ) );
3282 if( aGateNumber > 0 && shape.
GetUnit() != aGateNumber )
3295 if( pt0 != pt1 && uniqueSegments.count( pt0 ) == 0 && uniqueSegments.count( pt1 ) == 0 )
3298 if( pt0.
x == pt1.
x || pt0.
y == pt1.
y )
3300 uniqueSegments.insert( { pt0, poly } );
3301 uniqueSegments.insert( { pt1, poly } );
3309 auto setPinOrientation =
3325 if( uniqueSegments.count(
pin->GetPosition() ) )
3331 if( otherPt ==
pin->GetPosition() )
3332 otherPt = poly.
CPoint( 1 );
3343std::pair<VECTOR2I, VECTOR2I>
3351 if( upperLeft.
x > v.
End.
x )
3352 upperLeft.
x = v.
End.
x;
3354 if( upperLeft.
y < v.
End.
y )
3355 upperLeft.
y = v.
End.
y;
3357 if( lowerRight.
x < v.
End.
x )
3358 lowerRight.
x = v.
End.
x;
3360 if( lowerRight.
y > v.
End.
y )
3361 lowerRight.
y = v.
End.
y;
3368 if( upperLeft.
x > v.
End.
x )
3369 upperLeft.
x = v.
End.
x;
3371 if( upperLeft.
y < v.
End.
y )
3372 upperLeft.
y = v.
End.
y;
3374 if( lowerRight.
x < v.
End.
x )
3375 lowerRight.
x = v.
End.
x;
3377 if( lowerRight.
y > v.
End.
y )
3378 lowerRight.
y = v.
End.
y;
3385 VECTOR2I size = lowerRightKiCad - upperLeftKiCad;
3387 return { upperLeftKiCad,
VECTOR2I( abs( size.
x ), abs( size.
y ) ) };
3417 const double& aScalingFactor,
3419 const bool& aMirrorInvert )
3423 if( aScalingFactor != 1.0 )
3426 retVal -= aTransformCentre;
3427 retVal.
x =
KiROUND( retVal.
x * aScalingFactor );
3428 retVal.
y =
KiROUND( retVal.
y * aScalingFactor );
3429 retVal += aTransformCentre;
3433 MIRROR( retVal.
x, aTransformCentre.
x );
3435 if( !aRotation.
IsZero() )
3436 RotatePoint( retVal, aTransformCentre, aRotation );
3438 if( aMoveVector !=
VECTOR2I{ 0, 0 } )
3439 retVal += aMoveVector;
3447 return sqrt( ( (
double) aPoint.
x * (
double) aPoint.
x )
3448 + ( (
double) aPoint.
y * (
double) aPoint.
y ) );
constexpr EDA_IU_SCALE schIUScale
constexpr double SCH_IU_PER_MM
Schematic internal units 1=100nm.
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
@ OUTPUT_NOT_OR
Output pin not OR tieable.
@ TRISTATE_DRIVER
Tristate output pin.
@ OUTPUT_OR
Output pin OR tieable.
@ UNCOMMITTED
Uncommitted pin (default)
@ TRISTATE_INPUT
Tristate input pin.
@ TRISTATE_BIDIR
Tristate bi-directional driver pin.
@ OUTPUT_NOT_NORM_OR
Output pin not normally OR tieable.
#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)
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.
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
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.
static SCH_FIELD * addNewFieldToSymbol(const wxString &aFieldName, LIB_SYMBOL *aKiCadSymbol)
PART getPart(const PART_ID &aCadstarPartID)
std::vector< LAYER_ID > findOrphanSheets()
void setFootprintOnSymbol(LIB_SYMBOL *aKiCadSymbol, const wxString &aFootprintName, const wxString &aFootprintAlternate)
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)
std::vector< std::unique_ptr< LIB_SYMBOL > > m_ownedSymbols
Owns every LIB_SYMBOL the loader allocates while loading a design.
int getKiCadLength(long long aCadstarLength, double aDefaultInMils)
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 applyTextCodeIfExists(EDA_TEXT *aKiCadTextItem, const TEXTCODE_ID &aCadstarTextCodeID)
int getSheetNumber(const LAYER_ID &aCadstarSheetID)
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.
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.
void copySymbolItems(LIB_SYMBOL *aSourceSym, LIB_SYMBOL *aDestSym, int aDestUnit, bool aOverrideFields=true)
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)
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)
void loadLibrarySymbolShapeVertices(const std::vector< VERTEX > &aCadstarVertices, const VECTOR2I &aSymbolOrigin, LIB_SYMBOL *aSymbol, int aGateNumber, int aLineThickness, LINE_STYLE aLineStyle)
int getKiCadOffset(long long aCadstarOffset)
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.
EDA_ITEM * GetParent() const
virtual void SetParent(EDA_ITEM *aParent)
virtual void SetEnd(const VECTOR2I &aEnd)
void SetLineStyle(const LINE_STYLE aStyle)
SHAPE_POLY_SET & GetPolyShape()
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
virtual void SetArcGeometry(const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd)
Set the three controlling points for an arc.
void SetFillMode(FILL_T aFill)
virtual void SetPolyShape(const SHAPE_POLY_SET &aShape)
virtual void SetStart(const VECTOR2I &aStart)
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
virtual VECTOR2I GetTextSize() const
virtual void SetTextSize(VECTOR2I aNewSize, bool aEnforceMinTextSize=true)
virtual const wxString & GetText() const
Return the string associated with the text object.
virtual void SetTextPos(const VECTOR2I &aPoint)
virtual int GetTextHeight() const
void SetVertJustify(GR_TEXT_V_ALIGN_T aType)
virtual int GetTextWidth() const
virtual void SetTextWidth(int aWidth)
virtual void SetVisible(bool aVisible)
virtual void SetTextThickness(int aWidth)
The TextThickness is that set by the user.
virtual void SetTextHeight(int aHeight)
virtual EDA_ANGLE GetTextAngle() const
void SetBold(bool aBold)
Set the text to be bold - this will also update the font if needed.
virtual int GetTextThickness() const
virtual void SetText(const wxString &aText)
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
void SetItalic(bool aItalic)
Set the text to be italic - this will also update the font if needed.
void SetMultilineAllowed(bool aAllow)
void SetHorizJustify(GR_TEXT_H_ALIGN_T aType)
ee_rtree::Iterator begin() const
Return a read/write iterator that points to the first.
ee_rtree::Iterator end() const
Return a read/write iterator that points to one past the last element in the EE_RTREE.
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.
void GetFields(std::vector< SCH_FIELD * > &aList, bool aVisibleOnly=false) const override
Populate a std::vector with SCH_FIELDs, sorted in ordinal order.
std::vector< struct LIB_SYMBOL_UNIT > GetUnitDrawItems()
Return a list of SCH_ITEM objects separated by unit and convert number.
SCH_FIELD * GetField(const wxString &aFieldName)
Find a field within this symbol matching aFieldName; return nullptr if not found.
SCH_FIELD & GetFootprintField()
LIB_ITEMS_CONTAINER & GetDrawItems()
Return a reference to the draw item list.
wxString GetName() const override
void SetDescription(const wxString &aDescription)
Set the Description field text value.
SCH_FIELD & GetValueField()
void RemoveDrawItem(SCH_ITEM *aItem)
Remove draw aItem from list.
void SetFPFilters(const wxArrayString &aFilters)
std::vector< SCH_PIN * > GetPinsByNumber(const wxString &aNumber, int aUnit=0, int aBodyStyle=0)
Return all pin objects with the requested pin aNumber.
void AddField(SCH_FIELD *aField)
Add a field.
std::vector< SCH_PIN * > GetGraphicalPins(int aUnit=0, int aBodyStyle=0) const override
Graphical pins: Return schematic pin objects as drawn (unexpanded), filtered by unit/body.
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)
SCH_FIELD & GetReferenceField()
ITERATOR_BASE< SCH_ITEM, MULTIVECTOR< SCH_ITEM, FIRST_TYPE_VAL, LAST_TYPE_VAL >, typename ITEM_PTR_VECTOR::iterator > ITERATOR
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)
Container for project specific data.
virtual std::map< wxString, wxString > & GetTextVars() const
Holds all the data relating to one schematic.
void SetSize(const VECTOR2I &aSize)
Class for a wire to bus entry.
virtual const wxString & GetText() const override
Return the string associated with the text object.
wxString GetName(bool aUseDefaultName=true) const
Return the field name (not translated).
void SetPosition(const VECTOR2I &aPosition) override
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,...
SCH_ITEM * Duplicate(bool addToParentGroup, SCH_COMMIT *aCommit=nullptr, bool aDoClone=false) const
Routine to create a new copy of given item.
void SetLayer(SCH_LAYER_ID aLayer)
virtual void SetUnit(int aUnit)
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)
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.
void SetPageSettings(const PAGE_INFO &aPageSettings)
EE_RTREE & Items()
Get 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)
Refresh a changed item in the tree and invalidate connectivity.
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()
Return a reference to the vector holding the sheet's fields.
SCH_FIELD * GetField(FIELD_T aFieldType)
Return a mandatory field in this sheet.
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
void SetPosition(const VECTOR2I &aPosition) override
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()
SCH_FIELD * GetField(FIELD_T aFieldType)
Return a mandatory field in this symbol.
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...
int Intersect(const SEG &aSeg, std::vector< INTERSECTION > &aIp) const
Find all intersection points between our line chain and the segment aSeg.
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.
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.
const std::vector< VECTOR2I > & CPoints() const
bool IsEmpty() const
Return true if the set is empty (no polygons at all)
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
Spin style for labels of all kinds on schematics.
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 wire 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
@ FILLED_WITH_BG_BODYCOLOR
@ FILLED_SHAPE
Fill with object color.
#define IGNORE_PARENT_GROUP
#define THROW_IO_ERROR(msg)
macro which captures the "call site" values of FILE_, __FUNCTION & LINE
#define THROW_IO_ERRORF(msg,...)
static const std::string KiCadSchematicFileExtension
SCH_LAYER_ID
Eeschema drawing layers.
MULTIVECTOR< SCH_ITEM, SCH_SHAPE_T, SCH_PIN_T > LIB_ITEMS_CONTAINER
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.
@ PT_INPUT
usual pin input: must be connected
@ PT_BIDI
input or output (like port for a microprocessor)
@ PT_OPENCOLLECTOR
pin type open collector
@ PT_POWER_IN
power input (GND, VCC for ICs). Must be connected to a power output.
@ PT_UNSPECIFIED
unknown electrical properties: creates always a warning when connected
@ PT_PASSIVE
pin for passive symbols: must be connected, and can be connected to any pin.
@ PIN_UP
The pin extends upwards from the connection point: Probably on the bottom side of the symbol.
@ PIN_RIGHT
The pin extends rightwards from the connection point.
@ PIN_LEFT
The pin extends leftwards from the connection point: Probably on the right side of the symbol.
@ PIN_DOWN
The pin extends downwards from the connection: Probably on the top side of the symbol.
Definition of the SCH_SHEET_PATH and SCH_SHEET_LIST classes for Eeschema.
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.
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.
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.
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.
wxString Name
This is undefined (wxEmptyString) if the net is unnamed.
long SignalNum
This is undefined if the net has been given a name.
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.
Represent a point in x,y coordinates.
SHAPE_POLY_SET ConvertToPolySet(const std::function< VECTOR2I(const VECTOR2I &)> aCadstarToKicadPointCallback, int 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, defaults to equal height (1:1 aspect r...
Corresponds to CADSTAR "origin".
ALIGNMENT Alignment
In CADSTAR The default alignment for a TEXT object (when "(No Alignment)" is selected) Bottom Left of...
JUSTIFICATION Justification
Note: has no effect on single lines of text.
< 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
void AppendToChain(SHAPE_LINE_CHAIN *aChainToAppendTo, const std::function< VECTOR2I(const VECTOR2I &)> aCadstarToKicadPointCallback, int aAccuracy) 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> <Value> This line is ignored by CADSTAR.
std::map< long, std::string > m_PinNamesMap
Map of pin identifiers to alphanumeric pin names.
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.
ATTRIBUTE_LOCATION AttrLoc
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
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.
@ USER
The field ID hasn't been set yet; field is invalid.
@ REFERENCE
Field Reference of part, i.e. "IC21".
@ VALUE
Field Value of part, i.e. "3.3K".
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.