31#include <wx/filename.h>
33#include <wx/tokenzr.h>
34#include <wx/wfstream.h>
35#include <wx/txtstrm.h>
36#include <wx/xml/xml.h>
91 bbox.
Merge( item->GetBoundingBox() );
100 return aPinName.BeforeFirst(
'@' );
113 wxCHECK( currentSheet,
nullptr );
158 for(
const std::unique_ptr<ELAYER>& elayer : aLayers )
177 switch ( elayer->number)
207 int roti = int( eagleDegrees );
217 wxASSERT_MSG(
false, wxString::Format( wxT(
"Unhandled orientation (%d degrees)" ),
226 bool aMirror,
bool aSpin,
int aAbsDegress )
228 int align = aEagleAlignment;
230 if( aRelDegress == 90 )
234 else if( aRelDegress == 180 )
238 else if( aRelDegress == 270 )
244 if( aMirror ==
true )
246 if( aAbsDegress == 90 || aAbsDegress == 270 )
257 else if( aAbsDegress == 0 || aAbsDegress == 180 )
330 m_rootSheet( nullptr ),
331 m_schematic( nullptr ),
351 const std::map<std::string, UTF8>* aProperties )
353 wxASSERT( !aFileName || aSchematic !=
nullptr );
374 wxXmlNode* currentNode = xmlDocument.GetRoot();
380 unique_ptr<SCH_SHEET> deleter( aAppendToMe ?
nullptr :
m_rootSheet );
387 wxCHECK_MSG( aSchematic->
IsValid(),
nullptr,
388 wxT(
"Can't append to a schematic with no root!" ) );
399 if( sheetPath.Last() == aAppendToMe )
429 wxCHECK_MSG( libTable,
nullptr, wxT(
"Could not load symbol lib table." ) );
431 m_pi.reset( SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_KICAD ) );
439 wxString libTableUri = wxT(
"${KIPRJMOD}/" ) +
getLibFileName().GetFullName();
452 libTable->
Format( &formatter, 0 );
460 m_eagleDoc = std::make_unique<EAGLE_DOC>( currentNode,
this );
479 const wxString& aLibraryPath,
480 const std::map<std::string, UTF8>* aProperties )
491 for(
const auto& [symName, libSymbol] : it->second.KiCadSymbols )
492 aSymbolNameList.push_back( symName );
498 const wxString& aLibraryPath,
499 const std::map<std::string, UTF8>* aProperties )
510 for(
const auto& [symName, libSymbol] : it->second.KiCadSymbols )
511 aSymbolList.push_back( libSymbol.get() );
517 const std::map<std::string, UTF8>* aProperties )
528 auto it2 = it->second.KiCadSymbols.find( aAliasName );
530 if( it2 != it->second.KiCadSymbols.end() )
531 return it2->second.get();
540 wxFileName fn( aLibraryPath );
542 if( fn.IsFileReadable() && fn.GetModificationTime().IsValid() )
543 return fn.GetModificationTime().GetValue().GetValue();
545 return wxDateTime( 0.0 ).GetValue().GetValue();
576 std::unique_ptr<EAGLE_DOC> doc = std::make_unique<EAGLE_DOC>( xmlDocument.GetRoot(),
this );
580 m_version = ( doc->version.IsEmpty() ) ? wxString( wxS(
"0.0" ) ) : doc->version;
592 wxXmlDocument xmlDocument;
593 wxFFileInputStream stream(
m_filename.GetFullPath() );
598 wxString::Format(
_(
"Unable to read file '%s'." ),
m_filename.GetFullPath() ) );
602 wxTextInputStream
text( stream );
603 wxString line =
text.ReadLine();
605 if( !line.StartsWith( wxT(
"<?xml" ) ) && !line.StartsWith( wxT(
"<!--" ) ) )
607 THROW_IO_ERROR( wxString::Format(
_(
"'%s' is an Eagle binary-format file; "
608 "only Eagle XML-format files can be imported." ),
612 if( !xmlDocument.Load( stream ) )
615 wxString::Format(
_(
"Unable to read file '%s'." ),
m_filename.GetFullPath() ) );
624 wxCHECK( aDrawing, );
628 if( aDrawing->library )
636 if( aDrawing->schematic )
643 for(
const std::unique_ptr<ESHEET>& esheet : aSchematic.
sheets )
645 for(
const std::unique_ptr<ENET>& enet : esheet->nets )
647 wxString netName = enet->netname;
656 for(
const auto& [modname, emodule] : aSchematic.
modules )
658 for(
const std::unique_ptr<ESHEET>& esheet : emodule->sheets )
660 for(
const std::unique_ptr<ENET>& enet : esheet->nets )
662 wxString netName = enet->netname;
677 if( aSchematic.
sheets.empty() )
681 for(
const auto& [
name, epart] : aSchematic.
parts )
684 for(
const auto& [modName, emodule] : aSchematic.
modules )
686 for(
const auto& [partName, epart] : emodule->parts )
692 for(
const auto& [libName, elibrary] : aSchematic.
libraries )
695 elib->
name = elibrary->GetName();
707 size_t sheetCount = aSchematic.
sheets.size();
715 for(
const std::unique_ptr<ESHEET>& esheet : aSchematic.
sheets )
722 std::unique_ptr<SCH_SHEET> sheet = std::make_unique<SCH_SHEET>(
m_rootSheet, pos );
724 sheet->SetScreen( screen );
727 wxCHECK2( sheet && screen,
continue );
729 wxString pageNo = wxString::Format( wxT(
"%d" ),
m_sheetIndex );
739 wxCHECK2( currentScreen,
continue );
742 currentScreen->
Append( sheet.release() );
757 for(
const std::unique_ptr<ESHEET>& esheet : aSchematic.
sheets )
769 int maxY = sheetBbox.
GetY();
776 const SCH_SYMBOL* origSymbol = cmp.second.cmp;
778 for(
auto& unitEntry : cmp.second.units )
780 if( unitEntry.second ==
false )
784 int unit = unitEntry.first;
785 const wxString reference = origSymbol->
GetField( FIELD_T::REFERENCE )->
GetText();
788 symbol->SetUnitSelection( &sheetpath, unit );
789 symbol->SetUnit( unit );
790 symbol->SetOrientation( 0 );
791 symbol->AddHierarchicalReference( sheetpath.
Path(), reference, unit );
794 BOX2I cmpBbox = symbol->GetBoundingBox();
795 int posY = newCmpPosition.
y + cmpBbox.
GetHeight();
796 symbol->SetPosition(
VECTOR2I( newCmpPosition.
x, posY ) );
798 maxY = std::max( maxY, posY );
800 if( newCmpPosition.
x >= pageSizeIU.
x )
818 wxCHECK( sheet && screen, );
822 std::string filename;
831 replace( filename.begin(), filename.end(),
' ',
'_' );
833 fn.SetName( filename );
839 for(
const auto& [
name, moduleinst] : aSheet->moduleinsts )
846 for(
const std::unique_ptr<EPOLYGON>& epoly : aSheet->plain->polygons )
849 for(
const std::unique_ptr<EWIRE>& ewire : aSheet->plain->wires )
855 for(
const std::unique_ptr<ETEXT>& etext : aSheet->plain->texts )
858 for(
const std::unique_ptr<ECIRCLE>& ecircle : aSheet->plain->circles )
861 for(
const std::unique_ptr<ERECT>& erectangle : aSheet->plain->rectangles )
864 for(
const std::unique_ptr<EFRAME>& eframe : aSheet->plain->frames )
866 std::vector<SCH_ITEM*> frameItems;
877 for(
const std::unique_ptr<EINSTANCE>& einstance : aSheet->instances )
885 for(
const std::unique_ptr<EBUS>& ebus : aSheet->busses )
894 for(
const std::unique_ptr<ENET>& enet : aSheet->nets )
897 wxString netName = enet->netname;
898 wxString netClass = wxString::Format( wxS(
"%i" ), enet->netcode );
917 if( pageSizeIU.
x < targetSheetSize.
x )
920 if( pageSizeIU.
y < targetSheetSize.
y )
927 VECTOR2I sheetcentre( pageSizeIU.
x / 2, pageSizeIU.
y / 2 );
931 VECTOR2I translation = sheetcentre - itemsCentre;
945 std::vector<SCH_ITEM*> allItems;
947 std::copy( screen->
Items().
begin(), screen->
Items().
end(), std::back_inserter( allItems ) );
951 item->SetPosition( item->GetPosition() + translation );
969 wxCHECK( currentSheet &¤tScreen, );
975 auto it =
m_eagleDoc->drawing->schematic->modules.find( aModuleInstance->moduleinst );
978 if( it ==
m_eagleDoc->drawing->schematic->modules.end() )
980 THROW_IO_ERROR( wxString::Format(
_(
"No module instance '%s' found in schematic "
982 aModuleInstance->name,
m_filename.GetFullPath() ) );
986 fn.SetName( aModuleInstance->moduleinst );
990 VECTOR2I size( it->second->dx.ToSchUnits(), it->second->dy.ToSchUnits() );
992 int halfX =
KiROUND( size.
x / 2.0 );
993 int halfY =
KiROUND( size.
y / 2.0 );
995 VECTOR2I pos( aModuleInstance->x.ToSchUnits() - halfX,
996 -aModuleInstance->y.ToSchUnits() - halfY );
998 std::unique_ptr<SCH_SHEET> newSheet = std::make_unique<SCH_SHEET>( currentSheet, pos, size );
1006 if( schFile->GetFileName() == fn.GetFullPath() )
1008 newScreen = schFile;
1013 bool isNewSchFile = ( newScreen == nullptr );
1021 wxCHECK( newSheet && newScreen, );
1023 newSheet->SetScreen( newScreen );
1024 newSheet->SetFileName( fn.GetFullName() );
1025 newSheet->SetName( aModuleInstance->name );
1027 for(
const auto& [portName, port] : it->second->ports )
1030 int pinOffset = port->coord.ToSchUnits();
1033 if( port->side ==
"left" )
1035 side = SHEET_SIDE::LEFT;
1037 pinPos.
y = pos.
y + halfY - pinOffset;
1038 portExtWireEndpoint = pinPos;
1039 portExtWireEndpoint.
x -= portExtWireLength;
1041 else if( port->side ==
"right" )
1043 side = SHEET_SIDE::RIGHT;
1044 pinPos.
x = pos.
x + size.
x;
1045 pinPos.
y = pos.
y + halfY - pinOffset;
1046 portExtWireEndpoint = pinPos;
1047 portExtWireEndpoint.
x += portExtWireLength;
1049 else if( port->side ==
"top" )
1051 side = SHEET_SIDE::TOP;
1052 pinPos.
x = pos.
x + halfX + pinOffset;
1054 portExtWireEndpoint = pinPos;
1055 portExtWireEndpoint.
y -= portExtWireLength;
1057 else if( port->side ==
"bottom" )
1059 side = SHEET_SIDE::BOTTOM;
1060 pinPos.
x = pos.
x + halfX + pinOffset;
1061 pinPos.
y = pos.
y + size.
y;
1062 portExtWireEndpoint = pinPos;
1063 portExtWireEndpoint.
y += portExtWireLength;
1068 currentScreen->
Append( portExtWire );
1072 if( port->direction )
1074 if( *port->direction ==
"in" )
1075 pinType = LABEL_FLAG_SHAPE::L_INPUT;
1076 else if( *port->direction ==
"out" )
1077 pinType = LABEL_FLAG_SHAPE::L_OUTPUT;
1078 else if( *port->direction ==
"io" )
1079 pinType = LABEL_FLAG_SHAPE::L_BIDI;
1080 else if( *port->direction ==
"hiz" )
1081 pinType = LABEL_FLAG_SHAPE::L_TRISTATE;
1083 pinType = LABEL_FLAG_SHAPE::L_UNSPECIFIED;
1095 newSheet->AddPin( sheetPin );
1098 wxString pageNo = wxString::Format( wxT(
"%d" ),
m_sheetIndex );
1100 newSheet->SetParent( currentSheet );
1103 currentScreen->
Append( newSheet.release() );
1105 m_modules.push_back( it->second.get() );
1111 for(
const std::unique_ptr<ESHEET>& esheet : it->second->sheets )
1121 wxCHECK2( emoduleInst,
continue );
1123 refPrefix += emoduleInst->name + wxS(
":" );
1134 wxCHECK2( symbol && !symbol->
GetInstances().empty(),
continue );
1137 wxString newReference = refPrefix + inst.
m_Reference.AfterLast(
':' );
1151 std::vector<SCH_ITEM*>& aItems )
1153 int xMin = aFrame->x1.ToSchUnits();
1154 int xMax = aFrame->x2.ToSchUnits();
1155 int yMin = -aFrame->y1.ToSchUnits();
1156 int yMax = -aFrame->y2.ToSchUnits();
1159 std::swap( xMin, xMax );
1162 std::swap( yMin, yMax );
1170 aItems.push_back( lines );
1172 if( !( aFrame->border_left ==
false ) )
1179 aItems.push_back( lines );
1182 int height = yMax - yMin;
1186 double rowSpacing = height / double( aFrame->rows );
1187 double legendPosY = yMin + ( rowSpacing / 2 );
1189 for( i = 1; i < aFrame->rows; i++ )
1191 int newY =
KiROUND( yMin + ( rowSpacing * (
double) i ) );
1195 aItems.push_back( lines );
1198 char legendChar =
'A';
1200 for( i = 0; i < aFrame->rows; i++ )
1206 legendText->
SetText( wxString( legendChar ) );
1209 aItems.push_back( legendText );
1211 legendPosY += rowSpacing;
1215 if( !( aFrame->border_right ==
false ) )
1222 aItems.push_back( lines );
1225 int height = yMax - yMin;
1229 double rowSpacing = height / double( aFrame->rows );
1230 double legendPosY = yMin + ( rowSpacing / 2 );
1232 for( i = 1; i < aFrame->rows; i++ )
1234 int newY =
KiROUND( yMin + ( rowSpacing * (
double) i ) );
1238 aItems.push_back( lines );
1241 char legendChar =
'A';
1243 for( i = 0; i < aFrame->rows; i++ )
1249 legendText->
SetText( wxString( legendChar ) );
1252 aItems.push_back( legendText );
1254 legendPosY += rowSpacing;
1258 if( !( aFrame->border_top ==
false ) )
1265 aItems.push_back( lines );
1268 int width = xMax - xMin;
1272 double columnSpacing = width / double( aFrame->columns );
1273 double legendPosX = xMin + ( columnSpacing / 2 );
1275 for( i = 1; i < aFrame->columns; i++ )
1277 int newX =
KiROUND( xMin + ( columnSpacing * (
double) i ) );
1281 aItems.push_back( lines );
1284 char legendChar =
'1';
1286 for( i = 0; i < aFrame->columns; i++ )
1292 legendText->
SetText( wxString( legendChar ) );
1295 aItems.push_back( legendText );
1297 legendPosX += columnSpacing;
1301 if( !( aFrame->border_bottom ==
false ) )
1308 aItems.push_back( lines );
1311 int width = xMax - xMin;
1315 double columnSpacing = width / double( aFrame->columns );
1316 double legendPosX = xMin + ( columnSpacing / 2 );
1318 for( i = 1; i < aFrame->columns; i++ )
1320 int newX =
KiROUND( xMin + ( columnSpacing * (
double) i ) );
1324 aItems.push_back( lines );
1327 char legendChar =
'1';
1329 for( i = 0; i < aFrame->columns; i++ )
1335 legendText->
SetText( wxString( legendChar ) );
1338 aItems.push_back( legendText );
1340 legendPosX += columnSpacing;
1347 const wxString& netName,
1348 const wxString& aNetClass )
1355 size_t segmentCount = aSegments.size();
1357 for(
const std::unique_ptr<ESEGMENT>& esegment : aSegments )
1359 bool labelled =
false;
1360 bool firstWireFound =
false;
1366 for(
const std::unique_ptr<EWIRE>& ewire : esegment->wires )
1375 if( !firstWireFound )
1377 firstWire = thisWire;
1378 firstWireFound =
true;
1384 if( !desc.labels.empty() && desc.labels.front()->GetText() == netName )
1387 for(
const SEG& seg : desc.segs )
1396 segDesc.
segs.push_back( thisWire );
1400 for(
const std::unique_ptr<EJUNCTION>& ejunction : esegment->junctions )
1403 for(
const std::unique_ptr<ELABEL>& elabel : esegment->labels )
1408 wxASSERT( segDesc.
labels.empty()
1411 segDesc.
labels.push_back( label );
1415 for(
const std::unique_ptr<EPINREF>& epinref : esegment->pinRefs )
1417 wxString part = epinref->part;
1418 wxString
pin = epinref->pin;
1420 auto powerPort =
m_powerPorts.find( wxT(
"#" ) + part );
1432 if( !labelled && firstWireFound )
1434 std::unique_ptr<SCH_LABEL_BASE> label;
1439 else if( segmentCount > 1 )
1444 label->SetPosition( firstWire.
A );
1449 if( firstWire.
B.
x > firstWire.
A.
x )
1454 screen->
Append( label.release() );
1463 std::unique_ptr<SCH_SHAPE> poly = std::make_unique<SCH_SHAPE>( SHAPE_T::POLY );
1467 for(
const std::unique_ptr<EVERTEX>& evertex : aPolygon->vertices )
1469 pt =
VECTOR2I( evertex->x.ToSchUnits(), -evertex->y.ToSchUnits() );
1475 poly->GetPolyShape().Append( arc, -1, -1,
ARC_ACCURACY );
1479 poly->AddPoint( pt );
1483 prev_curve = evertex->curve;
1486 poly->SetLayer(
kiCadLayer( aPolygon->layer ) );
1487 poly->SetStroke(
STROKE_PARAMS( aPolygon->width.ToSchUnits(), LINE_STYLE::SOLID ) );
1488 poly->SetFillMode( FILL_T::FILLED_SHAPE );
1490 return poly.release();
1498 start.
x = aWire->x1.ToSchUnits();
1499 start.
y = -aWire->y1.ToSchUnits();
1500 end.
x = aWire->x2.ToSchUnits();
1501 end.
y = -aWire->y2.ToSchUnits();
1504 endpoints =
SEG( start,
end );
1508 std::unique_ptr<SCH_SHAPE> arc = std::make_unique<SCH_SHAPE>( SHAPE_T::ARC );
1511 arc->SetCenter(
center );
1512 arc->SetStart( start );
1517 arc->SetStroke(
STROKE_PARAMS( aWire->width.ToSchUnits(), LINE_STYLE::SOLID ) );
1519 return arc.release();
1523 std::unique_ptr<SCH_LINE> line = std::make_unique<SCH_LINE>();
1525 line->SetStartPoint( start );
1526 line->SetEndPoint(
end );
1527 line->SetLayer(
kiCadLayer( aWire->layer ) );
1528 line->SetStroke(
STROKE_PARAMS( aWire->width.ToSchUnits(), LINE_STYLE::SOLID ) );
1530 return line.release();
1537 std::unique_ptr<SCH_SHAPE>
circle = std::make_unique<SCH_SHAPE>( SHAPE_T::CIRCLE );
1538 VECTOR2I center( aCircle->x.ToSchUnits(), -aCircle->y.ToSchUnits() );
1551 std::unique_ptr<SCH_SHAPE> rectangle = std::make_unique<SCH_SHAPE>( SHAPE_T::RECTANGLE );
1553 rectangle->SetLayer(
kiCadLayer( aRectangle->layer ) );
1554 rectangle->SetPosition(
VECTOR2I( aRectangle->x1.ToSchUnits(), -aRectangle->y1.ToSchUnits() ) );
1555 rectangle->SetEnd(
VECTOR2I( aRectangle->x2.ToSchUnits(), -aRectangle->y2.ToSchUnits() ) );
1557 if( aRectangle->rot )
1559 VECTOR2I pos( rectangle->GetPosition() );
1566 rectangle->SetPosition( pos );
1567 rectangle->SetEnd(
end );
1571 rectangle->SetFillMode( FILL_T::FILLED_SHAPE );
1573 return rectangle.release();
1579 std::unique_ptr<SCH_JUNCTION> junction = std::make_unique<SCH_JUNCTION>();
1581 VECTOR2I pos( aJunction->x.ToSchUnits(), -aJunction->y.ToSchUnits() );
1583 junction->SetPosition( pos );
1585 return junction.release();
1590 const wxString& aNetName )
1592 VECTOR2I elabelpos( aLabel->x.ToSchUnits(), -aLabel->y.ToSchUnits() );
1597 std::unique_ptr<SCH_LABEL_BASE> label;
1600 KiROUND( aLabel->size.ToSchUnits() * 0.7 ) );
1606 label = std::make_unique<SCH_HIERLABEL>();
1609 const auto it =
m_modules.back()->ports.find( aNetName );
1613 if( it->second->direction )
1615 wxString direction = *it->second->direction;
1617 if( direction ==
"in" )
1618 type = LABEL_SHAPE::LABEL_INPUT;
1619 else if( direction ==
"out" )
1620 type = LABEL_SHAPE::LABEL_OUTPUT;
1621 else if( direction ==
"io" )
1622 type = LABEL_SHAPE::LABEL_BIDI;
1623 else if( direction ==
"hiz" )
1624 type = LABEL_SHAPE::LABEL_TRISTATE;
1626 type = LABEL_SHAPE::LABEL_PASSIVE;
1631 label->SetLabelShape( type );
1636 label = std::make_unique<SCH_LABEL>();
1642 label = std::make_unique<SCH_GLOBALLABEL>();
1647 label = std::make_unique<SCH_LABEL>();
1651 label->SetPosition( elabelpos );
1652 label->SetTextSize( textSize );
1657 for(
int i = 0; i <
KiROUND( aLabel->rot->degrees / 90 ) %4; ++i )
1658 label->Rotate90(
false );
1660 if( aLabel->rot->mirror )
1661 label->MirrorSpinStyle(
false );
1664 return label.release();
1668std::pair<VECTOR2I, const SEG*>
1670 const std::vector<SEG>& aLines )
const
1673 const SEG* nearestLine =
nullptr;
1675 double d, mindistance = std::numeric_limits<double>::max();
1678 for(
const SEG& line : aLines )
1683 if( d < mindistance )
1686 nearestPoint = testpoint;
1687 nearestLine = &line;
1690 testpoint = line.Center();
1693 if( d < mindistance )
1696 nearestPoint = testpoint;
1697 nearestLine = &line;
1703 if( d < mindistance )
1706 nearestPoint = testpoint;
1707 nearestLine = &line;
1711 return std::make_pair( nearestPoint, nearestLine );
1716 const std::map<wxString, std::unique_ptr<EPART>>& aParts )
1718 wxCHECK( aInstance, );
1724 const auto partIt = aParts.find( aInstance->part );
1726 if( partIt == aParts.end() )
1728 Report( wxString::Format(
_(
"Error parsing Eagle file. Could not find '%s' "
1729 "instance but it is referenced in the schematic." ),
1736 const std::unique_ptr<EPART>& epart = partIt->second;
1738 wxString libName = epart->library;
1741 if( epart->libraryUrn )
1742 libName += wxS(
"_" ) + epart->libraryUrn->assetId;
1744 wxString gatename = epart->deviceset + wxS(
"_" ) + epart->device + wxS(
"_" ) +
1746 wxString symbolname = wxString( epart->deviceset + epart->device );
1747 symbolname.Replace( wxT(
"*" ), wxEmptyString );
1755 wxString altSymbolName = libName + wxT(
"_" ) + symbolname;
1758 wxString libIdSymbolName = altSymbolName;
1764 Report( wxString::Format( wxS(
"Eagle library '%s' not found while looking up symbol for "
1765 "deviceset '%s', device '%s', and gate '%s." ),
1766 libName, epart->deviceset, epart->device, aInstance->gate ) );
1770 const auto gateIt = libIt->second.GateToUnitMap.find( gatename );
1772 if( gateIt == libIt->second.GateToUnitMap.end() )
1774 Report( wxString::Format( wxS(
"Symbol not found for deviceset '%s', device '%s', and "
1775 "gate '%s in library '%s'." ),
1776 epart->deviceset, epart->device, aInstance->gate, libName ) );
1780 int unit = gateIt->second;
1785 auto p = elib->
package.find( kisymbolname );
1787 if( p != elib->
package.end() )
1788 package = p->second;
1791 std::map<std::string, UTF8> properties;
1794 LIB_SYMBOL* part = m_pi->LoadSymbol( getLibFileName().GetFullPath(), altSymbolName, &properties );
1798 part = m_pi->LoadSymbol( getLibFileName().GetFullPath(), kisymbolname, &properties );
1799 libIdSymbolName = kisymbolname;
1804 Report( wxString::Format(
_(
"Could not find '%s' in the imported library." ),
1810 LIB_ID libId( getLibName(), libIdSymbolName );
1811 std::unique_ptr<SCH_SYMBOL> symbol = std::make_unique<SCH_SYMBOL>();
1812 symbol->SetLibId( libId );
1813 symbol->SetUnit( unit );
1814 symbol->SetPosition(
VECTOR2I( aInstance->x.ToSchUnits(), -aInstance->y.ToSchUnits() ) );
1817 if( !package.IsEmpty() )
1819 wxString footprint = m_schematic->Prj().GetProjectName() + wxT(
":" ) + package;
1820 symbol->GetField( FIELD_T::FOOTPRINT )->SetText( footprint );
1823 if( aInstance->rot )
1827 if( aInstance->rot->mirror )
1828 symbol->MirrorHorizontally( aInstance->x.ToSchUnits() );
1831 std::vector<SCH_FIELD*> partFields;
1834 for(
const SCH_FIELD* partField : partFields )
1838 if( partField->IsMandatory() )
1839 symbolField = symbol->GetField( partField->GetId() );
1841 symbolField = symbol->GetField( partField->GetName() );
1843 wxCHECK2( symbolField,
continue );
1846 symbolField->
SetTextPos( symbol->GetPosition() + partField->GetTextPos() );
1851 wxString reference = package.IsEmpty() ?
'#' + aInstance->part : aInstance->part;
1854 if( reference.find_last_not_of( wxT(
"0123456789" ) ) == ( reference.Length()-1 ) )
1855 reference.Append( wxT(
"0" ) );
1860 if( reference.find_first_not_of( wxT(
"0123456789" ) ) != 0 )
1861 reference.Prepend( wxT(
"UNK" ) );
1865 if( aInstance->part.find_first_not_of( wxT(
"#" ) ) != 0 )
1866 reference.Prepend( wxT(
"UNK" ) );
1868 SCH_FIELD* referenceField = symbol->GetField( FIELD_T::REFERENCE );
1869 referenceField->
SetText( reference );
1871 SCH_FIELD* valueField = symbol->GetField( FIELD_T::VALUE );
1872 bool userValue = m_userValue.at( libIdSymbolName );
1876 getEagleSymbolFieldAttributes( aInstance, wxS(
">NAME" ), referenceField );
1877 getEagleSymbolFieldAttributes( aInstance, wxS(
">VALUE" ), valueField );
1880 if( epart->value && !epart->value.CGet().IsEmpty() )
1882 valueField->
SetText( *epart->value );
1886 valueField->
SetText( kisymbolname );
1892 for(
const auto& [ attrName, attr ] : epart->attributes )
1894 SCH_FIELD newField( symbol.get(), FIELD_T::USER );
1898 if( !symbol->GetFields().empty() )
1899 newField.
SetTextPos( symbol->GetFields().back().GetPosition() );
1902 newField.
SetText( *attr->value );
1906 symbol->AddField( newField );
1909 for(
const auto& [variantName, variant] : epart->variants )
1911 SCH_FIELD* field = symbol->AddField( *symbol->GetField( FIELD_T::VALUE ) );
1912 field->
SetName( wxT(
"VARIANT_" ) + variant->name );
1914 if( variant->value )
1915 field->
SetText( *variant->value );
1920 bool valueAttributeFound =
false;
1921 bool nameAttributeFound =
false;
1924 for(
auto& [
name, eattr] : aInstance->attributes )
1928 if( eattr->name.Lower() == wxT(
"name" ) )
1930 field = symbol->GetField( FIELD_T::REFERENCE );
1931 nameAttributeFound =
true;
1933 else if( eattr->name.Lower() == wxT(
"value" ) )
1935 field = symbol->GetField( FIELD_T::VALUE );
1936 valueAttributeFound =
true;
1940 field = symbol->GetField( eattr->name );
1950 int absdegrees = eattr->rot ? eattr->rot->degrees : 0;
1951 bool mirror = eattr->rot ? eattr->rot->mirror :
false;
1953 if( aInstance->rot && aInstance->rot->mirror )
1956 bool spin = eattr->rot ? eattr->rot->spin :
false;
1961 int rotation = aInstance->rot ? aInstance->rot->degrees : 0;
1962 int reldegrees = ( absdegrees - rotation + 360.0 );
1970 if( aInstance->smashed && aInstance->smashed.Get() )
1972 symbol->GetField( FIELD_T::VALUE )->SetVisible( valueAttributeFound );
1973 symbol->GetField( FIELD_T::REFERENCE )->SetVisible( nameAttributeFound );
1982 for(
const EMODULEINST* emoduleInst : m_moduleInstances )
1984 wxCHECK2( emoduleInst,
continue );
1986 refPrefix += emoduleInst->name + wxS(
":" );
1989 symbol->AddHierarchicalReference( m_sheetPath.Path(), refPrefix + reference, unit );
1995 wxCHECK( libSymbol, );
1997 symbol->SetLibSymbol(
new LIB_SYMBOL( *libSymbol ) );
1999 for(
const SCH_PIN*
pin : symbol->GetLibPins() )
2000 m_connPoints[symbol->GetPinPhysicalPosition(
pin )].emplace(
pin );
2003 m_powerPorts[ reference ] = symbol->GetField( FIELD_T::VALUE )->GetText();
2005 symbol->ClearFlags();
2007 screen->
Append( symbol.release() );
2013 wxCHECK( aLibrary && aEagleLibrary,
nullptr );
2019 wxString prefix = edeviceset->prefix ? edeviceset->prefix.Get() : wxString( wxT(
"" ) );
2020 wxString deviceSetDescr;
2022 if( edeviceset->description )
2026 for(
const std::unique_ptr<EDEVICE>& edevice : edeviceset->devices )
2029 wxString symbolName = edeviceset->name + edevice->name;
2030 symbolName.Replace( wxT(
"*" ), wxEmptyString );
2031 wxASSERT( !symbolName.IsEmpty() );
2034 if( edevice->package )
2035 aEagleLibrary->
package[symbolName] = edevice->package.Get();
2038 std::unique_ptr<LIB_SYMBOL> libSymbol = std::make_unique<LIB_SYMBOL>( symbolName );
2041 int gate_count =
static_cast<int>( edeviceset->gates.size() );
2042 libSymbol->SetUnitCount( gate_count );
2043 libSymbol->LockUnits(
true );
2045 SCH_FIELD* reference = libSymbol->GetField( FIELD_T::REFERENCE );
2047 if( prefix.length() == 0 )
2055 reference->
SetText( edevice->package ? prefix :
'#' + prefix );
2058 libSymbol->GetValueField().SetVisible(
true );
2061 bool ispower =
false;
2063 for(
const auto& [gateName, egate] : edeviceset->gates )
2065 const auto it = aLibrary->
symbols.find( egate->symbol );
2067 if( it == aLibrary->
symbols.end() )
2069 Report( wxString::Format( wxS(
"Eagle symbol '%s' not found in library '%s'." ),
2070 egate->symbol, aLibrary->
GetName() ) );
2074 wxString gateMapName = edeviceset->name + wxS(
"_" ) + edevice->name +
2075 wxS(
"_" ) + egate->name;
2077 ispower =
loadSymbol( it->second, libSymbol, edevice, gateindex, egate->name );
2082 libSymbol->SetUnitCount( gate_count );
2084 if( gate_count == 1 && ispower )
2085 libSymbol->SetGlobalPower();
2088 if( edevice->package )
2102 wxString packageString = libName + wxT(
":" ) + aEagleLibrary->
package[symbolName];
2104 libSymbol->GetFootprintField().SetText( packageString );
2107 wxString libName = libSymbol->GetName();
2108 libSymbol->SetName( libName );
2109 libSymbol->SetDescription( deviceSetDescr );
2119 libName = aEagleLibrary->
name + wxT(
"_" ) + libName;
2121 libSymbol->SetName( libName );
2125 std::map<std::string, UTF8> properties;
2139 aEagleLibrary->
KiCadSymbols[ libName ] = std::move( libSymbol );
2143 m_userValue.emplace( std::make_pair( libName, edeviceset->uservalue ==
true ) );
2147 return aEagleLibrary;
2152 std::unique_ptr<LIB_SYMBOL>& aSymbol,
2153 const std::unique_ptr<EDEVICE>& aDevice,
int aGateNumber,
2154 const wxString& aGateName )
2156 wxCHECK( aEsymbol && aSymbol && aDevice,
false );
2158 wxString symbolName = aEsymbol->name;
2159 std::vector<SCH_ITEM*> items;
2161 bool showRefDes =
false;
2162 bool showValue =
false;
2163 bool ispower =
false;
2166 for(
const std::unique_ptr<ECIRCLE>& ecircle : aEsymbol->circles )
2169 for(
const std::unique_ptr<EPIN>& epin : aEsymbol->pins )
2171 std::unique_ptr<SCH_PIN>
pin(
loadPin( aSymbol, epin, aGateNumber ) );
2174 pin->SetType( ELECTRICAL_PINTYPE::PT_BIDI );
2176 if( epin->direction )
2180 if( epin->direction->Lower() == pinDir.first )
2182 pin->SetType( pinDir.second );
2184 if( pinDir.first == wxT(
"sup" ) )
2193 if( aDevice->connects.size() != 0 )
2195 for(
const std::unique_ptr<ECONNECT>& connect : aDevice->connects )
2197 if( connect->gate == aGateName &&
pin->GetName() == connect->pin )
2199 wxArrayString pads = wxSplit( wxString( connect->pad ),
' ' );
2201 pin->SetUnit( aGateNumber );
2204 if( pads.GetCount() > 1 )
2206 pin->SetNumberTextSize( 0 );
2209 for(
unsigned i = 0; i < pads.GetCount(); i++ )
2213 wxString padname( pads[i] );
2215 aSymbol->AddDrawItem( apin );
2224 pin->SetUnit( aGateNumber );
2225 pin->SetNumber( wxString::Format( wxT(
"%i" ), pincount ) );
2226 aSymbol->AddDrawItem(
pin.release() );
2230 for(
const std::unique_ptr<EPOLYGON>& epolygon : aEsymbol->polygons )
2233 for(
const std::unique_ptr<ERECT>& erectangle : aEsymbol->rectangles )
2236 for(
const std::unique_ptr<ETEXT>& etext : aEsymbol->texts )
2238 std::unique_ptr<SCH_TEXT> libtext(
loadSymbolText( aSymbol, etext, aGateNumber ) );
2240 if( libtext->GetText() == wxT(
"${REFERENCE}" ) )
2246 showRefDes = etext->text == wxT(
">NAME" );
2248 else if( libtext->GetText() == wxT(
"${VALUE}" ) )
2254 showValue = etext->text == wxT(
">VALUE" );
2258 aSymbol->AddDrawItem( libtext.release() );
2262 for(
const std::unique_ptr<EWIRE>& ewire : aEsymbol->wires )
2263 aSymbol->AddDrawItem(
loadSymbolWire( aSymbol, ewire, aGateNumber ) );
2265 for(
const std::unique_ptr<EFRAME>& eframe : aEsymbol->frames )
2267 std::vector<SCH_ITEM*> frameItems;
2273 item->SetParent( aSymbol.get() );
2274 item->SetUnit( aGateNumber );
2275 aSymbol->AddDrawItem( item );
2279 aSymbol->GetReferenceField().SetVisible( showRefDes );
2280 aSymbol->GetValueField().SetVisible( showValue );
2282 return pincount == 1 ? ispower :
false;
2287 const std::unique_ptr<ECIRCLE>& aCircle,
2290 wxCHECK( aSymbol && aCircle,
nullptr );
2294 VECTOR2I center( aCircle->x.ToSchUnits(), -aCircle->y.ToSchUnits() );
2296 circle->SetParent( aSymbol.get() );
2300 circle->SetUnit( aGateNumber );
2307 const std::unique_ptr<ERECT>& aRectangle,
2310 wxCHECK( aSymbol && aRectangle,
nullptr );
2315 rectangle->
SetPosition(
VECTOR2I( aRectangle->x1.ToSchUnits(), -aRectangle->y1.ToSchUnits() ) );
2316 rectangle->
SetEnd(
VECTOR2I( aRectangle->x2.ToSchUnits(), -aRectangle->y2.ToSchUnits() ) );
2318 if( aRectangle->rot )
2331 rectangle->
SetUnit( aGateNumber );
2341 const std::unique_ptr<EWIRE>& aWire,
int aGateNumber )
2343 wxCHECK( aSymbol && aWire,
nullptr );
2347 begin.
x = aWire->x1.ToSchUnits();
2348 begin.
y = -aWire->y1.ToSchUnits();
2349 end.
x = aWire->x2.ToSchUnits();
2350 end.
y = -aWire->y2.ToSchUnits();
2369 ( aWire->width.ToSchUnits() /
radius );
2370 begin =
center + centerStartVector;
2404 const std::unique_ptr<EPOLYGON>& aPolygon,
2407 wxCHECK( aSymbol && aPolygon,
nullptr );
2415 for(
const std::unique_ptr<EVERTEX>& evertex : aPolygon->vertices )
2417 pt =
VECTOR2I( evertex->x.ToSchUnits(), evertex->y.ToSchUnits() );
2431 prev_curve = evertex->curve;
2443 const std::unique_ptr<EPIN>& aPin,
int aGateNumber )
2445 wxCHECK( aSymbol && aPin,
nullptr );
2447 std::unique_ptr<SCH_PIN>
pin = std::make_unique<SCH_PIN>( aSymbol.get() );
2448 pin->SetPosition(
VECTOR2I( aPin->x.ToSchUnits(), -aPin->y.ToSchUnits() ) );
2449 pin->SetName( aPin->name );
2450 pin->SetUnit( aGateNumber );
2452 int roti = aPin->rot ? aPin->rot->degrees : 0;
2456 case 0:
pin->SetOrientation( PIN_ORIENTATION::PIN_RIGHT );
break;
2457 case 90:
pin->SetOrientation( PIN_ORIENTATION::PIN_UP );
break;
2458 case 180:
pin->SetOrientation( PIN_ORIENTATION::PIN_LEFT );
break;
2459 case 270:
pin->SetOrientation( PIN_ORIENTATION::PIN_DOWN );
break;
2460 default: wxFAIL_MSG( wxString::Format( wxT(
"Unhandled orientation (%d degrees)." ), roti ) );
2467 wxString length = aPin->length.Get();
2469 if( length == wxT(
"short" ) )
2471 else if( length == wxT(
"middle" ) )
2473 else if( length == wxT(
"long" ) )
2475 else if( length == wxT(
"point" ) )
2486 wxString visible = aPin->visible.Get();
2488 if( visible == wxT(
"off" ) )
2490 pin->SetNameTextSize( 0 );
2491 pin->SetNumberTextSize( 0 );
2493 else if( visible == wxT(
"pad" ) )
2495 pin->SetNameTextSize( 0 );
2497 else if( visible == wxT(
"pin" ) )
2499 pin->SetNumberTextSize( 0 );
2509 if( aPin->function )
2511 wxString function = aPin->function.Get();
2513 if( function == wxT(
"dot" ) )
2514 pin->SetShape( GRAPHIC_PINSHAPE::INVERTED );
2515 else if( function == wxT(
"clk" ) )
2516 pin->SetShape( GRAPHIC_PINSHAPE::CLOCK );
2517 else if( function == wxT(
"dotclk" ) )
2518 pin->SetShape( GRAPHIC_PINSHAPE::INVERTED_CLOCK );
2521 return pin.release();
2526 const std::unique_ptr<ETEXT>& aText,
int aGateNumber )
2528 wxCHECK( aSymbol && aText,
nullptr );
2530 std::unique_ptr<SCH_TEXT> libtext = std::make_unique<SCH_TEXT>();
2532 libtext->SetParent( aSymbol.get() );
2533 libtext->SetUnit( aGateNumber );
2534 libtext->SetPosition(
VECTOR2I( aText->x.ToSchUnits(), -aText->y.ToSchUnits() ) );
2536 const wxString& eagleText = aText->text;
2537 wxString adjustedText;
2538 wxStringTokenizer tokenizer( eagleText,
"\r\n" );
2541 while( tokenizer.HasMoreTokens() )
2543 wxString tmp =
interpretText( tokenizer.GetNextToken().Trim(
true ).Trim(
false ) );
2545 if( tokenizer.HasMoreTokens() )
2548 adjustedText += tmp;
2551 libtext->SetText( adjustedText.IsEmpty() ? wxString( wxS(
"~" ) ) : adjustedText );
2555 return libtext.release();
2561 wxCHECK( aText,
nullptr );
2563 std::unique_ptr<SCH_TEXT> schtext = std::make_unique<SCH_TEXT>();
2565 const wxString& eagleText = aText->text;
2566 wxString adjustedText;
2567 wxStringTokenizer tokenizer( eagleText,
"\r\n" );
2570 while( tokenizer.HasMoreTokens() )
2572 wxString tmp =
interpretText( tokenizer.GetNextToken().Trim(
true ).Trim(
false ) );
2574 if( tokenizer.HasMoreTokens() )
2577 adjustedText += tmp;
2580 schtext->SetText( adjustedText.IsEmpty() ? wxString( wxS(
"\" \"" ) )
2583 schtext->SetPosition(
VECTOR2I( aText->x.ToSchUnits(), -aText->y.ToSchUnits() ) );
2585 schtext->SetItalic(
false );
2587 return schtext.release();
2592 const std::unique_ptr<ETEXT>& aAttributes )
const
2594 wxCHECK( aText && aAttributes, );
2599 if( aAttributes->ratio && aAttributes->ratio.CGet() > 12 )
2603 int degrees = aAttributes->rot ? aAttributes->rot->degrees : 0;
2604 bool mirror = aAttributes->rot ? aAttributes->rot->mirror :
false;
2605 bool spin = aAttributes->rot ? aAttributes->rot->spin :
false;
2613 wxCHECK( aField && aText, );
2637 auto onIntersection =
2646 for(
SCH_TEXT* label : segDesc.labels )
2649 const SEG* segAttached = segDesc.LabelAttached( label );
2651 if( segAttached && !onIntersection( labelPos ) )
2665 VECTOR2I wireDirection( segAttached->
B - segAttached->
A );
2667 const VECTOR2I origPos( labelPos );
2670 bool checkPositive =
true, checkNegative =
true,
move =
false;
2674 while( ( !
move || onIntersection( labelPos ) ) && ( checkPositive || checkNegative ) )
2679 if( trial % 2 == 1 )
2681 labelPos =
VECTOR2I( origPos + wireDirection * trial / 2 );
2682 move = checkPositive = segAttached->
Contains( labelPos );
2686 labelPos =
VECTOR2I( origPos - wireDirection * trial / 2 );
2687 move = checkNegative = segAttached->
Contains( labelPos );
2723 wxFileInputStream input( aFileName );
2728 wxTextInputStream
text( input );
2730 for(
int i = 0; i < 8; i++ )
2735 if(
text.ReadLine().Contains( wxS(
"<eagle" ) ) )
2753 if( !item->IsType( { SCH_LABEL_LOCATE_ANY_T } ) )
2757 item->SetPosition( aNewEndPoint );
2770 std::vector<SCH_LINE*> buses;
2771 std::vector<SCH_LINE*> wires;
2782 buses.push_back( line );
2783 else if( line->
IsWire() )
2784 wires.push_back( line );
2789 VECTOR2I wireStart = wire->GetStartPoint();
2790 VECTOR2I wireEnd = wire->GetEndPoint();
2794 VECTOR2I busStart = bus->GetStartPoint();
2795 VECTOR2I busEnd = bus->GetEndPoint();
2798 [](
int signX,
int signY ) ->
VECTOR2I
2810 if( wireStart.
y == wireEnd.
y && busStart.
x == busEnd.
x )
2814 if( testBusHit( wireStart ) )
2818 if( wireEnd.
x < busStart.
x )
2825 VECTOR2I p = wireStart + entrySize( -1, 0 );
2827 if( testBusHit( wireStart + entrySize( 0, -1 ) ) )
2836 screen->
Append( busEntry );
2838 wire->SetStartPoint( p );
2840 else if( testBusHit( wireStart + entrySize( 0, 1 ) ) )
2849 screen->
Append( busEntry );
2851 wire->SetStartPoint( p );
2866 VECTOR2I p = wireStart + entrySize( 1, 0 );
2868 if( testBusHit( wireStart + entrySize( 0, -1 ) ) )
2877 screen->
Append( busEntry );
2879 wire->SetStartPoint( p );
2881 else if( testBusHit( wireStart + entrySize( 0, 1 ) ) )
2890 screen->
Append( busEntry );
2892 wire->SetStartPoint( p );
2903 else if( testBusHit( wireEnd ) )
2907 if( wireStart.
x < busStart.
x )
2914 VECTOR2I p = wireEnd + entrySize( -1, 0 );
2916 if( testBusHit( wireEnd + entrySize( 0, -1 ) ) )
2925 screen->
Append( busEntry );
2927 wire->SetEndPoint( p );
2929 else if( testBusHit( wireEnd + entrySize( 0, -1 ) ) )
2938 screen->
Append( busEntry );
2939 moveLabels( wire, wireEnd + entrySize( -1, 0 ) );
2940 wire->SetEndPoint( wireEnd + entrySize( -1, 0 ) );
2955 VECTOR2I p = wireEnd + entrySize( 1, 0 );
2957 if( testBusHit( wireEnd + entrySize( 0, -1 ) ) )
2966 screen->
Append( busEntry );
2968 wire->SetEndPoint( p );
2970 else if( testBusHit( wireEnd + entrySize( 0, 1 ) ) )
2979 screen->
Append( busEntry );
2981 wire->SetEndPoint( p );
2993 else if( wireStart.
x == wireEnd.
x && busStart.
y == busEnd.
y )
2997 if( testBusHit( wireStart ) )
3001 if( wireEnd.
y < busStart.
y )
3009 VECTOR2I p = wireStart + entrySize( 0, -1 );
3011 if( testBusHit( wireStart + entrySize( -1, 0 ) ) )
3021 screen->
Append( busEntry );
3023 wire->SetStartPoint( p );
3025 else if( testBusHit( wireStart + entrySize( 1, 0 ) ) )
3035 screen->
Append( busEntry );
3037 wire->SetStartPoint( p );
3053 VECTOR2I p = wireStart + entrySize( 0, 1 );
3055 if( testBusHit( wireStart + entrySize( -1, 0 ) ) )
3065 screen->
Append( busEntry );
3067 wire->SetStartPoint( p );
3069 else if( testBusHit( wireStart + entrySize( 1, 0 ) ) )
3079 screen->
Append( busEntry );
3081 wire->SetStartPoint( p );
3092 else if( testBusHit( wireEnd ) )
3096 if( wireStart.
y < busStart.
y )
3104 VECTOR2I p = wireEnd + entrySize( 0, -1 );
3106 if( testBusHit( wireEnd + entrySize( -1, 0 ) ) )
3116 screen->
Append( busEntry );
3118 wire->SetEndPoint( p );
3120 else if( testBusHit( wireEnd + entrySize( 1, 0 ) ) )
3130 screen->
Append( busEntry );
3132 wire->SetEndPoint( p );
3148 VECTOR2I p = wireEnd + entrySize( 0, 1 );
3150 if( testBusHit( wireEnd + entrySize( -1, 0 ) ) )
3160 screen->
Append( busEntry );
3162 wire->SetEndPoint( p );
3164 else if( testBusHit( wireEnd + entrySize( 1, 0 ) ) )
3174 screen->
Append( busEntry );
3176 wire->SetEndPoint( p );
3192 if( testBusHit( wireStart ) )
3194 VECTOR2I wirevector = wireStart - wireEnd;
3196 if( wirevector.
x > 0 )
3198 if( wirevector.
y > 0 )
3200 VECTOR2I p = wireStart + entrySize( -1, -1 );
3203 screen->
Append( busEntry );
3206 wire->SetStartPoint( p );
3210 VECTOR2I p = wireStart + entrySize( -1, 1 );
3213 screen->
Append( busEntry );
3216 wire->SetStartPoint( p );
3221 if( wirevector.
y > 0 )
3223 VECTOR2I p = wireStart + entrySize( 1, -1 );
3226 screen->
Append( busEntry );
3229 wire->SetStartPoint( p );
3233 VECTOR2I p = wireStart + entrySize( 1, 1 );
3236 screen->
Append( busEntry );
3239 wire->SetStartPoint( p );
3245 else if( testBusHit( wireEnd ) )
3247 VECTOR2I wirevector = wireStart - wireEnd;
3249 if( wirevector.
x > 0 )
3251 if( wirevector.
y > 0 )
3253 VECTOR2I p = wireEnd + entrySize( 1, 1 );
3256 screen->
Append( busEntry );
3259 wire->SetEndPoint( p );
3263 VECTOR2I p = wireEnd + entrySize( 1, -1 );
3266 screen->
Append( busEntry );
3269 wire->SetEndPoint( p );
3274 if( wirevector.
y > 0 )
3276 VECTOR2I p = wireEnd + entrySize( -1, 1 );
3279 screen->
Append( busEntry );
3282 wire->SetEndPoint( p );
3286 VECTOR2I p = wireEnd + entrySize( -1, -1 );
3289 screen->
Append( busEntry );
3292 wire->SetEndPoint( p );
3306 wxCHECK( aLabel,
nullptr );
3310 for(
const SEG& seg : segs )
3312 if( seg.Contains( labelPos ) )
3324 wxCHECK( aSymbol && aPin,
false );
3332 const auto& items = pointIt->second;
3334 wxCHECK( items.find( aPin ) != items.end(),
false );
3336 return items.size() > 1;
3350 int unit = aSymbol->
GetUnit();
3351 const wxString reference = aSymbol->
GetField( FIELD_T::REFERENCE )->
GetText();
3353 std::set<int> missingUnits;
3358 if(
pin->GetType() == ELECTRICAL_PINTYPE::PT_POWER_IN )
3360 bool pinInUnit = !unit ||
pin->GetUnit() == unit;
3374 switch(
pin->GetOrientation() )
3377 case PIN_ORIENTATION::PIN_RIGHT:
3380 case PIN_ORIENTATION::PIN_LEFT:
3383 case PIN_ORIENTATION::PIN_UP:
3386 case PIN_ORIENTATION::PIN_DOWN:
3391 aScreen->
Append( netLabel );
3394 else if( aUpdateSet )
3399 wxASSERT(
pin->GetUnit() );
3400 missingUnits.insert(
pin->GetUnit() );
3413 entry.
cmp = aSymbol;
3414 entry.
units.emplace( unit,
false );
3419 cmpIt->second.units[unit] =
false;
3422 if( !missingUnits.empty() )
3425 entry.
cmp = aSymbol;
3428 for(
int i : missingUnits )
3430 if( entry.
units.find( i ) != entry.
units.end() )
3431 entry.
units.emplace( i,
true );
3443 wxString ret = wxT(
"{" );
3445 wxStringTokenizer tokenizer( aEagleName, wxT(
"," ) );
3447 while( tokenizer.HasMoreTokens() )
3449 wxString member = tokenizer.GetNextToken();
3456 if( member.Freq(
'!' ) % 2 > 0 )
3457 member << wxT(
"!" );
3459 ret << member << wxS(
" " );
3474 std::unique_ptr<EPART>& epart =
m_eagleDoc->drawing->schematic->parts[aInstance->part];
3476 if( !epart || epart->deviceset.IsEmpty() )
3479 std::unique_ptr<ELIBRARY>& elibrary =
m_eagleDoc->drawing->schematic->libraries[epart->library];
3484 std::unique_ptr<EDEVICE_SET>& edeviceset = elibrary->devicesets[epart->deviceset];
3489 std::unique_ptr<EGATE>& egate = edeviceset->gates[aInstance->gate];
3494 std::unique_ptr<ESYMBOL>& esymbol = elibrary->symbols[egate->symbol];
3497 return esymbol.get();
3504 const wxString& aEagleFieldName,
3507 wxCHECK( aField && !aEagleFieldName.
IsEmpty(), );
3513 for(
const std::unique_ptr<ETEXT>&
text : esymbol->
texts )
3515 if(
text->text == aEagleFieldName )
3518 VECTOR2I pos(
text->x.ToSchUnits() + aInstance->x.ToSchUnits(),
3519 -
text->y.ToSchUnits() - aInstance->y.ToSchUnits() );
3521 bool mirror =
text->rot ?
text->rot->mirror :
false;
3523 if( aInstance->rot && aInstance->rot->mirror )
3527 pos.
y = -aInstance->y.ToSchUnits() +
text->y.ToSchUnits();
constexpr EDA_IU_SCALE schIUScale
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
constexpr coord_type GetY() const
constexpr size_type GetWidth() const
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 size_type GetHeight() const
constexpr coord_type GetLeft() const
constexpr const SizeVec & GetSize() const
constexpr coord_type GetBottom() const
void SetFlags(EDA_ITEM_FLAGS aMask)
virtual void SetParent(EDA_ITEM *aParent)
void SetCenter(const VECTOR2I &aCenter)
SHAPE_POLY_SET & GetPolyShape()
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
void SetStart(const VECTOR2I &aStart)
void SetEnd(const VECTOR2I &aEnd)
void SetArcAngleAndEnd(const EDA_ANGLE &aAngle, bool aCheckNegativeAngle=false)
Set the end point from the angle center and start.
void SetFillMode(FILL_T aFill)
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
const EDA_ANGLE & GetTextAngle() const
void SetTextSize(VECTOR2I aNewSize, bool aEnforceMinTextSize=true)
virtual const wxString & GetText() const
Return the string associated with the text object.
void SetTextPos(const VECTOR2I &aPoint)
void SetVertJustify(GR_TEXT_V_ALIGN_T aType)
GR_TEXT_H_ALIGN_T GetHorizJustify() const
virtual void SetVisible(bool aVisible)
void SetBold(bool aBold)
Set the text to be bold - this will also update the font if needed.
GR_TEXT_V_ALIGN_T GetVertJustify() 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.
VECTOR2I GetTextSize() const
void SetHorizJustify(GR_TEXT_H_ALIGN_T aType)
EE_TYPE Overlapping(const BOX2I &aRect) const
iterator end()
Return a read/write iterator that points to one past the last element in the EE_RTREE.
iterator begin()
Return a read/write iterator that points to the first.
EE_TYPE OfType(KICAD_T aType) const
static std::shared_ptr< ERC_ITEM > Create(int aErrorCode)
Constructs an ERC_ITEM for the given error code.
REPORTER * m_reporter
Reporter to log errors/warnings to, may be nullptr.
PROGRESS_REPORTER * m_progressReporter
Progress reporter to track the progress of the operation, may be nullptr.
virtual bool CanReadLibrary(const wxString &aFileName) const
Checks if this IO object can read the specified library file/directory.
virtual void Report(const wxString &aText, SEVERITY aSeverity=RPT_SEVERITY_UNDEFINED)
A logical library item identifier and consists of various portions much like a URI.
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.
bool IsGlobalPower() const override
int GetUnitCount() const override
bool HasLibrary(const wxString &aNickname, bool aCheckEnabled=false) const
Test for the existence of aNickname in the library table.
bool InsertRow(LIB_TABLE_ROW *aRow, bool doReplace=false)
Adds aRow if it does not already exist or if doReplace is true.
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
static bool ParseBusVector(const wxString &aBus, wxString *aName, std::vector< wxString > *aMemberList)
Parse a bus vector (e.g.
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 bool KeepRefreshing(bool aWait=false)=0
Update the UI (if any).
virtual void SetNumPhases(int aNumPhases)=0
Set the number of phases.
virtual void Report(const wxString &aMessage)=0
Display aMessage in the progress bar dialog.
static SYMBOL_LIB_TABLE * SchSymbolLibTable(PROJECT *aProject)
Accessor for project symbol library table.
virtual void SetElem(PROJECT::ELEM aIndex, _ELEM *aElem)
virtual const wxString GetProjectPath() const
Return the full path of the project.
virtual const wxString GetProjectName() const
Return the short name of the project.
Holds all the data relating to one schematic.
PROJECT & Prj() const
Return a reference to the project this schematic is part of.
void SetRoot(SCH_SHEET *aRootSheet)
Initialize the schematic with a new root sheet.
bool IsValid() const
A simple test if the schematic is loaded, not a complete one.
Class for a wire to bus entry.
void ImportValues(const SCH_FIELD &aSource)
Copy parameters from a SCH_FIELD source.
bool IsEmpty()
Return true if both the name and value of the field are empty.
void SetPosition(const VECTOR2I &aPosition) override
void SetName(const wxString &aName)
void SetText(const wxString &aText) override
void SetSpinStyle(SPIN_STYLE aSpinStyle) override
std::unique_ptr< EAGLE_DOC > m_eagleDoc
SCH_ITEM * loadWire(const std::unique_ptr< EWIRE > &aWire, SEG &endpoints)
void loadTextAttributes(EDA_TEXT *aText, const std::unique_ptr< ETEXT > &aAttributes) const
void loadModuleInstance(const std::unique_ptr< EMODULEINST > &aModuleInstance)
SCH_TEXT * loadLabel(const std::unique_ptr< ELABEL > &aLabel, const wxString &aNetName)
void ensureLoadedLibrary(const wxString &aLibraryPath)
void loadSchematic(const ESCHEMATIC &aSchematic)
SCH_TEXT * loadPlainText(const std::unique_ptr< ETEXT > &aSchText)
void loadSheet(const std::unique_ptr< ESHEET > &aSheet)
void loadLayerDefs(const std::vector< std::unique_ptr< ELAYER > > &aLayers)
const ESYMBOL * getEagleSymbol(const std::unique_ptr< EINSTANCE > &aInstance)
EAGLE_LIBRARY * loadLibrary(const ELIBRARY *aLibrary, EAGLE_LIBRARY *aEagleLib)
wxXmlDocument loadXmlDocument(const wxString &aFileName)
wxString translateEagleBusName(const wxString &aEagleName) const
Translate an Eagle-style bus name into one that is KiCad-compatible.
void loadFieldAttributes(SCH_FIELD *aField, const SCH_TEXT *aText) const
Move net labels that are detached from any wire to the nearest wire.
std::map< wxString, wxString > m_powerPorts
map from symbol reference to global label equivalent
SCH_SHEET_PATH m_sheetPath
The current sheet path of the schematic being loaded.
wxString m_libName
Library name to save symbols.
SCH_TEXT * loadSymbolText(std::unique_ptr< LIB_SYMBOL > &aSymbol, const std::unique_ptr< ETEXT > &aText, int aGateNumber)
std::pair< VECTOR2I, const SEG * > findNearestLinePoint(const VECTOR2I &aPoint, const std::vector< SEG > &aLines) const
std::map< wxString, long long > m_timestamps
void loadInstance(const std::unique_ptr< EINSTANCE > &aInstance, const std::map< wxString, std::unique_ptr< EPART > > &aParts)
LIB_SYMBOL * LoadSymbol(const wxString &aLibraryPath, const wxString &aAliasName, const std::map< std::string, UTF8 > *aProperties) override
Load a LIB_SYMBOL object having aPartName from the aLibraryPath containing a library format that this...
std::unordered_map< wxString, bool > m_userValue
deviceset/@uservalue for device.
int GetModifyHash() const override
Return the modification hash from the library cache.
std::map< wxString, int > m_netCounts
std::map< wxString, EAGLE_LIBRARY > m_eagleLibs
bool loadSymbol(const std::unique_ptr< ESYMBOL > &aEsymbol, std::unique_ptr< LIB_SYMBOL > &aSymbol, const std::unique_ptr< EDEVICE > &aDevice, int aGateNumber, const wxString &aGateName)
SCH_SHEET * getCurrentSheet()
void loadDrawing(const std::unique_ptr< EDRAWING > &aDrawing)
void EnumerateSymbolLib(wxArrayString &aSymbolNameList, const wxString &aLibraryPath, const std::map< std::string, UTF8 > *aProperties) override
Populate a list of LIB_SYMBOL alias names contained within the library aLibraryPath.
SCH_SHAPE * loadSymbolPolyLine(std::unique_ptr< LIB_SYMBOL > &aSymbol, const std::unique_ptr< EPOLYGON > &aPolygon, int aGateNumber)
std::vector< VECTOR2I > m_wireIntersections
Wires and labels of a single connection (segment in Eagle nomenclature)
std::map< VECTOR2I, std::set< const EDA_ITEM * > > m_connPoints
The fully parsed Eagle schematic file.
void loadSegments(const std::vector< std::unique_ptr< ESEGMENT > > &aSegments, const wxString &aNetName, const wxString &aNetClass)
bool checkConnections(const SCH_SYMBOL *aSymbol, const SCH_PIN *aPin) const
IO_RELEASER< SCH_IO > m_pi
PI to create KiCad symbol library.
SCH_SHAPE * loadRectangle(const std::unique_ptr< ERECT > &aRect)
void addBusEntries()
This function finds best way to place a bus entry symbol for when an Eagle wire segment ends on an Ea...
bool CanReadSchematicFile(const wxString &aFileName) const override
Checks if this SCH_IO can read the specified schematic file.
void addImplicitConnections(SCH_SYMBOL *aSymbol, SCH_SCREEN *aScreen, bool aUpdateSet)
Create net labels to emulate implicit connections in Eagle.
std::map< int, SCH_LAYER_ID > m_layerMap
SCH_LAYER_ID kiCadLayer(int aEagleLayer)
Return the matching layer or return LAYER_NOTES.
SCH_SHEET * LoadSchematicFile(const wxString &aFileName, SCHEMATIC *aSchematic, SCH_SHEET *aAppendToMe=nullptr, const std::map< std::string, UTF8 > *aProperties=nullptr) override
Load information from some input file format that this SCH_IO implementation knows about,...
SCH_PIN * loadPin(std::unique_ptr< LIB_SYMBOL > &aSymbol, const std::unique_ptr< EPIN > &aPin, int aGateNumber)
SCH_SHAPE * loadCircle(const std::unique_ptr< ECIRCLE > &aCircle)
wxFileName getLibFileName()
Checks if there are other wires or pins at the position of the tested pin.
SCH_SHAPE * loadSymbolRectangle(std::unique_ptr< LIB_SYMBOL > &aSymbol, const std::unique_ptr< ERECT > &aRectangle, int aGateNumber)
SCH_JUNCTION * loadJunction(const std::unique_ptr< EJUNCTION > &aJunction)
wxString m_version
Eagle file version.
void getEagleSymbolFieldAttributes(const std::unique_ptr< EINSTANCE > &aInstance, const wxString &aEagleFieldName, SCH_FIELD *aField)
std::map< wxString, const EPART * > m_partlist
void moveLabels(SCH_LINE *aWire, const VECTOR2I &aNewEndPoint)
Move any labels on the wire to the new end point of the wire.
bool checkHeader(const wxString &aFileName) const
SCHEMATIC * m_schematic
Passed to Load(), the schematic object being loaded.
void countNets(const ESCHEMATIC &aSchematic)
SCH_SHEET * m_rootSheet
The root sheet of the schematic being loaded.
SCH_SHAPE * loadPolyLine(const std::unique_ptr< EPOLYGON > &aPolygon)
SCH_SHAPE * loadSymbolCircle(std::unique_ptr< LIB_SYMBOL > &aSymbol, const std::unique_ptr< ECIRCLE > &aCircle, int aGateNumber)
SCH_SCREEN * getCurrentScreen()
bool CanReadLibrary(const wxString &aFileName) const override
Checks if this IO object can read the specified library file/directory.
std::map< wxString, EAGLE_MISSING_CMP > m_missingCmps
void loadFrame(const std::unique_ptr< EFRAME > &aFrame, std::vector< SCH_ITEM * > &aItems)
std::vector< SEG_DESC > m_segments
Nets as defined in the <nets> sections of an Eagle schematic file.
std::vector< EMODULE * > m_modules
The current module stack being loaded.
std::vector< EMODULEINST * > m_moduleInstances
SCH_ITEM * loadSymbolWire(std::unique_ptr< LIB_SYMBOL > &aSymbol, const std::unique_ptr< EWIRE > &aWire, int aGateNumber)
long long getLibraryTimestamp(const wxString &aLibraryPath) const
static const char * PropBuffering
The property used internally by the plugin to enable cache buffering which prevents the library file ...
Base class that schematic file and library loading and saving plugins should derive from.
virtual bool CanReadSchematicFile(const wxString &aFileName) const
Checks if this SCH_IO can read the specified schematic file.
Base class for any item which can be embedded within the SCHEMATIC container class,...
SCH_ITEM * Duplicate(bool addToParentGroup, SCH_COMMIT *aCommit=nullptr, bool doClone=false) const
Routine to create a new copy of given item.
virtual void SetUnit(int aUnit)
void SetShape(LABEL_FLAG_SHAPE aShape)
void SetPosition(const VECTOR2I &aPosition) override
Segment description base class to describe items which have 2 end points (track, wire,...
bool IsWire() const
Return true if the line is a wire.
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
VECTOR2I GetEndPoint() const
VECTOR2I GetStartPoint() const
bool IsBus() const
Return true if the line is a bus.
void SetEndPoint(const VECTOR2I &aPosition)
void SetNumber(const wxString &aNumber)
Container class that holds multiple SCH_SCREEN objects in a hierarchy.
void UpdateSymbolLinks(REPORTER *aReporter=nullptr)
Initialize the LIB_SYMBOL reference for each SCH_SYMBOL found in the full schematic.
const PAGE_INFO & GetPageSettings() const
void Append(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
void SetPageSettings(const PAGE_INFO &aPageSettings)
EE_RTREE & Items()
Get the full RTree, usually for iterating.
const KIID & GetUuid() const
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
VECTOR2I GetCenter() const
void AddPoint(const VECTOR2I &aPosition)
VECTOR2I GetPosition() const override
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
KIID_PATH Path() const
Get the sheet path as an KIID_PATH.
SCH_SCREEN * LastScreen()
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.
void pop_back()
Forwarded method from std::vector.
Define a sheet pin (label) used in sheets to create hierarchical schematics.
void SetPosition(const VECTOR2I &aPosition) override
void SetSide(SHEET_SIDE aEdge)
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
void SetFileName(const wxString &aFilename)
wxString GetFileName() const
Return the filename corresponding to this sheet.
bool LocatePathOfScreen(SCH_SCREEN *aScreen, SCH_SHEET_PATH *aList)
Search the existing hierarchy for an instance of screen loaded from aFileName.
void SetName(const wxString &aName)
SCH_SCREEN * GetScreen() const
void SetScreen(SCH_SCREEN *aScreen)
Set the SCH_SCREEN associated with this sheet to aScreen.
void AutoplaceFields(SCH_SCREEN *aScreen, AUTOPLACE_ALGO aAlgo) override
const std::vector< SCH_SYMBOL_INSTANCE > & GetInstances() const
void AddHierarchicalReference(const KIID_PATH &aPath, const wxString &aRef, int aUnit)
Add a full hierarchical reference to this symbol.
std::unique_ptr< LIB_SYMBOL > & GetLibSymbolRef()
VECTOR2I GetPinPhysicalPosition(const SCH_PIN *Pin) const
SCH_FIELD * GetField(FIELD_T aFieldType)
Return a mandatory field in this symbol.
VECTOR2I GetPosition() const override
void SetPosition(const VECTOR2I &aPosition) override
OPT_VECTOR2I Intersect(const SEG &aSeg, bool aIgnoreEndpoints=false, bool aLines=false) const
Compute intersection point of segment (this) with segment aSeg.
bool Contains(const SEG &aSeg) const
SHAPE_ARC & ConstructFromStartEndAngle(const VECTOR2I &aStart, const VECTOR2I &aEnd, const EDA_ANGLE &aAngle, double aWidth=0)
Construct this arc from the given start, end and angle.
int Append(int x, int y, int aOutline=-1, int aHole=-1, bool aAllowDuplication=false)
Appends a vertex at the end of the given outline/hole (default: the last outline)
Simple container to manage line stroke parameters.
Hold a record identifying a symbol library accessed by the appropriate symbol library SCH_IO object i...
static const wxString GetSymbolLibTableFileName()
virtual void Format(OUTPUTFORMATTER *aOutput, int aIndentLevel) const override
Generate the table in s-expression format to aOutput with an indentation level of aIndentLevel.
LIB_SYMBOL * LoadSymbol(const wxString &aNickname, const wxString &aName)
Load a LIB_SYMBOL having aName from the library given by aNickname.
double Distance(const VECTOR2< extended_type > &aVector) const
Compute the distance between two vectors.
VECTOR2< T > Resize(T aNewLength) const
Return a vector of the same direction, but length specified in aNewLength.
static REPORTER & GetInstance()
static void SetReporter(REPORTER *aReporter)
Set the reporter to use for reporting font substitution warnings.
#define DEFAULT_SCH_ENTRY_SIZE
The default text size in mils. (can be changed in preference menu)
wxString escapeName(const wxString &aNetName)
Translates Eagle special characters to their counterparts in KiCad.
wxString interpretText(const wxString &aText)
Interprets special characters in Eagle text and converts them to KiCAD notation.
size_t GetNodeCount(const wxXmlNode *aNode)
Fetch the number of XML nodes within aNode.
VECTOR2I ConvertArcCenter(const VECTOR2I &aStart, const VECTOR2I &aEnd, double aAngle)
Convert an Eagle curve end to a KiCad center for S_ARC.
wxString convertDescription(wxString aDescr)
Converts Eagle's HTML description into KiCad description format.
static constexpr EDA_ANGLE ANGLE_VERTICAL
#define IGNORE_PARENT_GROUP
#define IS_NEW
New item, just created.
@ ERCE_BUS_ENTRY_NEEDED
Importer failed to auto-place a bus entry.
static const std::string KiCadSchematicFileExtension
static const std::string KiCadSymbolLibFileExtension
#define THROW_IO_ERROR(msg)
SCH_LAYER_ID
Eeschema drawing layers.
@ PT_INPUT
usual pin input: must be connected
@ PT_NC
not connected (must be left open)
@ PT_TRISTATE
tri state bus pin
@ 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_PASSIVE
pin for passive symbols: must be connected, and can be connected to any pin.
static wxString extractNetName(const wxString &aPinName)
static const std::map< wxString, ELECTRICAL_PINTYPE > pinDirectionsMap
Map of EAGLE pin type values to KiCad pin type values.
static SYMBOL_ORIENTATION_T kiCadComponentRotation(float eagleDegrees)
static void eagleToKicadAlignment(EDA_TEXT *aText, int aEagleAlignment, int aRelDegress, bool aMirror, bool aSpin, int aAbsDegress)
static BOX2I getSheetBbox(SCH_SHEET *aSheet)
Extract the net name part from a pin name (e.g. return 'GND' for pin named 'GND@2')
Definition of the SCH_SHEET_PATH and SCH_SHEET_LIST classes for Eeschema.
SHEET_SIDE
Define the edge of the sheet that the sheet pin is positioned.
std::optional< VECTOR2I > OPT_VECTOR2I
wxString UnescapeString(const wxString &aSource)
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:...
wxString UnescapeHTML(const wxString &aString)
Return a new wxString unescaped from HTML format.
std::map< wxString, std::unique_ptr< LIB_SYMBOL > > KiCadSymbols
std::unordered_map< wxString, wxString > package
std::unordered_map< wxString, int > GateToUnitMap
Map Eagle gate unit number (which are strings) to KiCad library symbol unit number.
constexpr int IUToMils(int iu) const
constexpr int MilsToIU(int mils) const
constexpr int mmToIU(double mm) const
std::map< wxString, std::unique_ptr< EDEVICE_SET > > devicesets
wxString GetName() const
Fetch the fully unique library name.
std::map< wxString, std::unique_ptr< ESYMBOL > > symbols
std::map< wxString, std::unique_ptr< EMODULE > > modules
std::vector< std::unique_ptr< ESHEET > > sheets
std::map< wxString, std::unique_ptr< EPART > > parts
std::map< wxString, std::unique_ptr< ELIBRARY > > libraries
std::vector< std::unique_ptr< ETEXT > > texts
Map references to missing symbol units data.
std::map< int, bool > units
Segments representing wires for intersection checking.
std::vector< SCH_TEXT * > labels
const SEG * LabelAttached(const SCH_TEXT *aLabel) const
< Test if a particular label is attached to any of the stored segments
A simple container for schematic symbol instance information.
SYMBOL_ORIENTATION_T
enum used in RotationMiroir()
SHAPE_CIRCLE circle(c.m_circle_center, c.m_circle_radius)
bool TestSegmentHit(const VECTOR2I &aRefPoint, const VECTOR2I &aStart, const VECTOR2I &aEnd, int aDist)
Test if aRefPoint is with aDistance on the line defined by aStart and aEnd.
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.
VECTOR2< int32_t > VECTOR2I
Definition of file extensions used in Kicad.