37 const wxFileName& aLibraryFileName )
39 std::map<wxString, wxString> mapOfAscFiles;
40 std::map<wxString, wxString> mapOfAsyFiles;
56 std::queue<wxString> ascFileQueue;
57 ascFileQueue.push( aLibraryFileName.GetName().Lower() );
59 LTSPICE_FILE rootAscFile( ascFileQueue.front(), { 0, 0 } );
61 rootAscFile.
Sheet = aRootSheet;
64 int parentSheetIndex = 0;
67 std::vector<LTSPICE_FILE> ascFiles;
69 ascFiles.push_back( rootAscFile );
71 while( !ascFileQueue.empty() )
76 wxString ascFilePath = mapOfAscFiles[ ascFileQueue.front() ];
87 for(
LTSPICE_FILE& newSubSchematicElement : newSubSchematicElements )
89 wxString asyName = newSubSchematicElement.ElementName;
90 auto it = mapOfAsyFiles.find( asyName );
92 if( it == mapOfAsyFiles.end() )
99 newSubSchematicElement.ParentIndex = parentSheetIndex;
100 newSubSchematicElement.Screen = screen;
101 newSubSchematicElement.Sheet =
new SCH_SHEET();
103 ascFileQueue.push( newSubSchematicElement.ElementName );
104 ascFiles.push_back( newSubSchematicElement );
113 for(
unsigned int i = 0; i < ascFiles.size(); i++ )
116 wxString buffer =
SafeReadFile( mapOfAscFiles[ascFiles[i].ElementName], wxS(
"r" ) );
122 m_fileCache[ wxS(
"ascFiles" ) ][ wxS(
"parentFile" ) ] = buffer;
130 std::vector<LTSPICE_FILE> tempVector;
132 tempVector.push_back( ascFiles[i] );
133 curSheet = ascFiles[i].Sheet;
135 std::map tempAsyMap =
ReadAsyFiles( tempVector, mapOfAsyFiles );
136 wxString ascFileName = ascFiles[i].ElementName;
139 LIB_SYMBOL tempLibSymbol( ascFiles[i].ElementName );
147 curSheet->
SetParent( ascFiles[ascFiles[i].ParentIndex].Sheet );
151 wxString sheetName = wxString::Format( wxS(
"%s-subsheet-%d" ),
152 ascFiles[i].ElementName,
155 sheetNameField.
SetText( sheetName );
156 fileNameSheet.
SetText( sheetName +
".kicad_sch" );
158 curSheet->
SetScreen( ascFiles[i].Screen );
160 curSheetPath = ascFiles[ascFiles[i].ParentIndex].SheetPath;
163 ascFiles[i].SheetPath = curSheetPath;
165 ascFiles[ascFiles[i].ParentIndex].Sheet->GetScreen()->Append( curSheet );
172 curSheet = ascFiles[i].Sheet;
174 ascFiles[i].SheetPath.push_back( curSheet );
175 curSheetPath = ascFiles[i].SheetPath;
178 std::vector<wxString> subSchematicAsyFiles;
181 subSchematicAsyFiles.
push_back( ascFile.ElementName );
184 parser.
Parse( &curSheetPath, lt_ascs, subSchematicAsyFiles );
190 std::map<wxString, wxString>& aMapOfAscFiles,
191 std::map<wxString, wxString>& aMapOfAsyFiles,
192 const wxString& aBase )
197 bool cont = aDir.GetFirst( &filename, wxEmptyString, wxDIR_FILES | wxDIR_HIDDEN );
201 wxFileName
path( aDir.GetName(), filename );
203 auto logToMap = [&]( std::map<wxString, wxString>& aMapToLogTo,
const wxString& aKey )
205 if( aMapToLogTo.count( aKey ) )
210 _(
"File at '%s' was ignored. Using previously found "
211 "file at '%s' instead." ),
212 path.GetFullPath(), aMapToLogTo.at( aKey ) ) );
217 aMapToLogTo.emplace( aKey,
path.GetFullPath() );
221 wxString elementName1 = ( aBase +
path.GetName() ).Lower();
222 wxString elementName2 =
path.GetName().Lower();
223 wxString extension =
path.GetExt().Lower();
225 if( extension == wxS(
"asc" ) )
227 logToMap( aMapOfAscFiles, elementName1 );
229 if( !aBase.IsEmpty() )
230 logToMap( aMapOfAscFiles, elementName2 );
232 else if( extension == wxS(
"asy" ) )
234 logToMap( aMapOfAsyFiles, elementName1 );
236 if( !aBase.IsEmpty() )
237 logToMap( aMapOfAsyFiles, elementName2 );
240 cont = aDir.GetNext( &filename );
246 bool cont = aDir.GetFirst( &filename, wxEmptyString, wxDIR_DIRS | wxDIR_HIDDEN );
250 wxFileName
path( aDir.GetName(), filename );
251 wxDir subDir(
path.GetFullPath() );
254 filename + wxS(
"/" ) );
256 cont = aDir.GetNext( &filename );
262std::map<wxString, wxString>
264 const std::map<wxString, wxString>& aAsyFileMap )
266 std::map<wxString, wxString> resultantMap;
270 wxString fileName = source.ElementName;
272 if( aAsyFileMap.count( fileName ) )
273 resultantMap[fileName] =
SafeReadFile( aAsyFileMap.at( fileName ), wxS(
"r" ) );
282 std::vector<LTSPICE_FILE> resultantArray;
283 wxArrayString lines = wxSplit( aAscFile,
'\n' );
285 for(
const wxString& line : lines )
287 wxArrayString tokens = wxSplit( line,
' ' );
289 if( !tokens.IsEmpty() && tokens[0].Upper() == wxS(
"SYMBOL" ) )
291 wxString elementName( tokens[1] );
294 tokens[2].ToLong( &posX );
295 tokens[3].ToLong( &posY );
297 elementName.Replace(
'\\',
'/' );
301 resultantArray.push_back( asyFile );
305 return resultantArray;
311 wxStringTokenizer lines( aAsyFile,
"\n" );
313 while( lines.HasMoreTokens() )
315 wxStringTokenizer parts( lines.GetNextToken(),
" " );
317 if( parts.GetNextToken().IsSameAs( wxS(
"SYMATTR" ),
false )
318 && parts.GetNextToken().IsSameAs( wxS(
"Prefix" ),
false ) )
329 const wxString& aFileName )
333 if( !aToken.ToLong( &result ) )
335 THROW_IO_ERROR( wxString::Format(
_(
"Expecting integer at line %d in file %s" ),
345 int aLineNumber,
const wxString& aFileName )
353 int aExpectedMax,
int aLineNumber,
354 const wxString& aFileName )
356 if( (
int) aActualSize < aExpectedMin )
358 THROW_IO_ERROR( wxString::Format(
_(
"Expected data missing on line %d in file %s" ),
362 else if( (
int) aActualSize > aExpectedMax )
364 THROW_IO_ERROR( wxString::Format(
_(
"Extra data found on line %d in file %s" ),
374 for(
int i = aIndex + 1; i < (int) aTokens.GetCount(); i++ )
375 aTokens[ aIndex ] +=
" " + aTokens[i];
381 std::map<int, LINESTYLE> lineStyleMap;
389 if( lineStyleMap.find( aValue ) == lineStyleMap.end() )
392 return lineStyleMap[ aValue ];
398 std::map<wxString, LINEWIDTH> lineWidthMap;
403 if( lineWidthMap.find( aValue.Upper() ) == lineWidthMap.end() )
406 return lineWidthMap[ aValue.Upper() ];
412 std::map<wxString, POLARITY> polarityMap;
421 if( polarityMap.find( aValue.Upper() ) == polarityMap.end() )
424 return polarityMap[ aValue.Upper() ];
430 std::map<wxString, ORIENTATION> rotationMirrorMap;
442 if( rotationMirrorMap.find( aValue.Upper() ) == rotationMirrorMap.end() )
443 THROW_IO_ERROR(
_(
"Expecting R0, R90, R18, R270, M0, M90, M180 or M270" ) );
445 return rotationMirrorMap[ aValue.Upper() ];
451 std::map<wxString, JUSTIFICATION> justificationMap;
464 if( justificationMap.find( aValue.Upper() ) == justificationMap.end() )
465 THROW_IO_ERROR(
_(
"Expecting LEFT, CENTER, RIGHT, TOP, BOTTOM, VLEFT, VRIGHT, VCENTER, VTOP or VBOTTOM" ) );
467 return justificationMap[ aValue.Upper() ];
473 std::map<wxString, JUSTIFICATION> pinJustificationMap;
486 if( pinJustificationMap.find( aValue.Upper() ) == pinJustificationMap.end() )
487 THROW_IO_ERROR(
_(
"Expecting NONE, BOTTOM, TOP, LEFT, RIGHT, VBOTTOM, VTOP, VCENTER, VLEFT or VRIGHT" ) );
489 return pinJustificationMap[ aValue.Upper() ];
495 std::map<wxString, SYMBOLTYPE> symbolTypeMap;
500 if( symbolTypeMap.find( aValue.Upper() ) == symbolTypeMap.end() )
503 return symbolTypeMap[ aValue.Upper() ];
509 if( elementFromLine.EndsWith(
'\r' ) )
510 elementFromLine = elementFromLine.BeforeLast(
'\r' );
517 const std::map<wxString, wxString>& asyFiles =
m_fileCache[ wxS(
"asyFiles" ) ];
519 if( !asyFiles.count( aAscFileName.Lower() ) )
520 THROW_IO_ERROR( wxString::Format(
_(
"Symbol '%s.asy' not found" ), aAscFileName ) );
522 return SymbolBuilder( aAscFileName, asyFiles.at( aAscFileName.Lower() ), aAscFile );
526 const wxString& aAsyFileContent,
532 lt_symbol.
Name = aAscFileName;
536 for( wxString line : wxSplit( aAsyFileContent,
'\n' ) )
540 wxArrayString tokens = wxSplit( line,
' ' );
542 if( tokens.IsEmpty() )
545 wxString element = tokens[0].Upper();
547 if( element ==
"LINE" )
551 wxString lineWidth = tokens[1];
552 wxString startPointX = tokens[2];
553 wxString startPointY = tokens[3];
554 wxString endPointX = tokens[4];
555 wxString endPointY = tokens[5];
559 lt_line.
Start =
pointCheck( startPointX, startPointY, lineNumber, aAscFileName );
560 lt_line.
End =
pointCheck( endPointX, endPointY, lineNumber, aAscFileName );
562 int lineStyleNumber = 0;
564 if( tokens.size() == 7 )
566 wxString lineStyle = tokens[6];
567 lineStyleNumber =
integerCheck( lineStyle, lineNumber, aAscFileName );
572 lt_symbol.
Lines.push_back( lt_line );
574 else if( element ==
"RECTANGLE" )
578 wxString lineWidth = tokens[1];
579 wxString botRightX = tokens[2];
580 wxString botRightY = tokens[3];
581 wxString topLeftX = tokens[4];
582 wxString topRightY = tokens[5];
589 int lineStyleNumber = 0;
591 if( tokens.size() == 7 )
593 wxString lineStyle = tokens[6];
594 lineStyleNumber =
integerCheck( lineStyle, lineNumber, aAscFileName );
601 else if( element ==
"CIRCLE" )
609 wxString lineWidth = tokens[1];
610 wxString botRightX = tokens[2];
611 wxString botRightY = tokens[3];
612 wxString topLeftX = tokens[4];
613 wxString topRightY = tokens[5];
620 int lineStyleNumber = 0;
622 if( tokens.size() == 7 )
624 wxString lineStyle = tokens[6];
625 lineStyleNumber =
integerCheck( lineStyle, lineNumber, aAscFileName );
630 lt_symbol.
Circles.push_back( circle );
632 else if( element ==
"ARC" )
641 wxString lineWidth = tokens[1];
642 wxString botRightX = tokens[2];
643 wxString botRightY = tokens[3];
644 wxString topLeftX = tokens[4];
645 wxString topRightY = tokens[5];
646 wxString arcStartPointX = tokens[6];
647 wxString arcStartPointY = tokens[7];
648 wxString arcEndPointX = tokens[8];
649 wxString arcEndPointY = tokens[9];
655 arc.
ArcStart =
pointCheck( arcStartPointX, arcStartPointY, lineNumber, aAscFileName );
656 arc.
ArcEnd =
pointCheck( arcEndPointX, arcEndPointY, lineNumber, aAscFileName );
658 int lineStyleNumber = 0;
660 if( tokens.size() == 11 )
662 wxString lineStyle = tokens[10];
663 lineStyleNumber =
integerCheck( lineStyle, lineNumber, aAscFileName );
668 lt_symbol.
Arcs.push_back( arc );
670 else if( element ==
"WINDOW" )
674 wxString number = tokens[1];
675 wxString windowPosX = tokens[2];
676 wxString windowPosY = tokens[3];
677 wxString justification = tokens[4];
678 wxString fontSize = tokens[5];
690 lt_symbol.
Windows.push_back( window );
692 else if( element ==
"SYMATTR" )
698 wxString key = tokens[1];
699 wxString value = tokens[2];
703 else if( element ==
"PIN" )
707 wxString pinLocationX = tokens[1];
708 wxString pinLocationY = tokens[2];
709 wxString Justification = tokens[3];
710 wxString nameOffSet = tokens[4];
713 pin.PinLocation =
pointCheck( pinLocationX, pinLocationY, lineNumber,aAscFileName );
717 lt_symbol.
Pins.push_back(
pin );
719 else if( element ==
"PINATTR" )
725 wxString
name = tokens[1];
726 wxString Value = tokens[2];
728 lt_symbol.
Pins.back().PinAttribute.insert( {
name, Value } );
730 else if( element ==
"SYMBOLTYPE" )
734 wxString symbolType = tokens[1];
750 std::vector<LT_ASC> ascFiles;
752 for(
const auto& [ fileName, contents ] :
m_fileCache[ wxS(
"ascFiles" ) ] )
755 std::vector<LT_SYMBOL> symbolArray;
764 for( wxString line : wxSplit( contents,
'\n' ) )
768 wxArrayString tokens = wxSplit( line,
' ' );
770 if( tokens.IsEmpty() )
773 wxString element = tokens[0].Upper();
775 if( element ==
"SHEET" )
779 wxString sheetNumber = tokens[1];
780 wxString sheetWidth = tokens[2];
781 wxString sheetHeight = tokens[3];
786 else if( element ==
"SYMBOL" )
790 wxString symbolName = tokens[1];
791 wxString posX = tokens[2];
792 wxString posY = tokens[3];
793 wxString rotate_mirror_option = tokens[4];
795 symbolName.Replace(
'\\',
'/' );
801 ascFile.
Symbols.push_back( lt_symbol );
804 else if( element ==
"WIRE" )
808 wxString startPointX = tokens[1];
809 wxString startPointY = tokens[2];
810 wxString endPointX = tokens[3];
811 wxString endPointY = tokens[4];
814 wire.
Start =
pointCheck( startPointX, startPointY, lineNumber, fileName );
815 wire.
End =
pointCheck( endPointX, endPointY, lineNumber, fileName );
817 ascFile.
Wires.push_back( wire );
821 else if( element ==
"FLAG" )
825 wxString posX = tokens[1];
826 wxString posY = tokens[2];
827 wxString
name = tokens[3];
837 else if( element ==
"DATAFLAG" )
841 wxString posX = tokens[1];
842 wxString posY = tokens[2];
843 wxString expression = tokens[3];
847 flag.Expression = expression;
853 else if( element ==
"WINDOW" )
857 wxString number = tokens[1];
858 wxString windowPosX = tokens[2];
859 wxString windowPosY = tokens[3];
860 wxString justification = tokens[4];
861 wxString fontSize = tokens[5];
863 int windowNumber =
integerCheck( number, lineNumber, fileName );
869 if( candidate.WindowNumber == windowNumber )
879 window = &ascFile.
Symbols.back().Windows.back();
889 else if( element ==
"SYMATTR" )
895 wxString
name = tokens[1];
896 wxString value = tokens[2];
898 ascFile.
Symbols.back().SymAttributes[
name.Upper() ] = value;
900 else if( element ==
"LINE" )
904 wxString lineWidth = tokens[1];
905 wxString startPointX = tokens[2];
906 wxString startPointY = tokens[3];
907 wxString endPointX = tokens[4];
908 wxString endPointY = tokens[5];
912 lt_line.
Start =
pointCheck( startPointX, startPointY, lineNumber, fileName );
913 lt_line.
End =
pointCheck( endPointX, endPointY, lineNumber, fileName );
915 int lineStyleNumber = 0;
917 if( tokens.size() == 7 )
919 wxString lineStyle = tokens[6];
920 lineStyleNumber =
integerCheck( lineStyle, lineNumber, fileName );
925 ascFile.
Lines.push_back( lt_line );
929 else if( element ==
"RECTANGLE" )
933 wxString lineWidth = tokens[1];
934 wxString botRightX = tokens[2];
935 wxString botRightY = tokens[3];
936 wxString topLeftX = tokens[4];
937 wxString topRightY = tokens[5];
944 int lineStyleNumber = 0;
946 if( tokens.size() == 7 )
948 wxString lineStyle = tokens[6];
949 lineStyleNumber =
integerCheck( lineStyle, lineNumber, fileName );
958 else if( element ==
"CIRCLE" )
962 wxString lineWidth = tokens[1];
963 wxString botRightX = tokens[2];
964 wxString botRightY = tokens[3];
965 wxString topLeftX = tokens[4];
966 wxString topRightY = tokens[5];
973 int lineStyleNumber = 0;
975 if( tokens.size() == 7 )
977 wxString lineStyle = tokens[6];
978 lineStyleNumber =
integerCheck( lineStyle, lineNumber, fileName );
983 ascFile.
Circles.push_back( circle );
987 else if( element ==
"ARC" )
996 wxString lineWidth = tokens[1];
997 wxString botRightX = tokens[2];
998 wxString botRightY = tokens[3];
999 wxString topLeftX = tokens[4];
1000 wxString topRightY = tokens[5];
1001 wxString arcStartPointX = tokens[6];
1002 wxString arcStartPointY = tokens[7];
1003 wxString arcEndPointX = tokens[8];
1004 wxString arcEndPointY = tokens[9];
1010 arc.
ArcEnd =
pointCheck( arcStartPointX, arcStartPointY, lineNumber, fileName );
1013 int lineStyleNumber = 0;
1015 if( tokens.size() == 11 )
1017 wxString lineStyle = tokens[10];
1018 lineStyleNumber =
integerCheck( lineStyle, lineNumber, fileName );
1023 ascFile.
Arcs.push_back( arc );
1027 else if( element ==
"IOPIN" )
1031 wxString pinLocationX = tokens[1];
1032 wxString pinLocationY = tokens[2];
1033 wxString pinPolarity = tokens[3];
1039 ascFile.
Iopins.push_back( iopin );
1042 else if( element ==
"TEXT" )
1048 wxString positionX = tokens[1];
1049 wxString positionY = tokens[2];
1050 wxString justification = tokens[3];
1051 wxString fontSize = tokens[4];
1052 wxString value = tokens[5];
1055 text.Offset =
pointCheck( positionX, positionY, lineNumber, fileName );
1059 if( value.StartsWith( wxS(
"!" ), &
text.Value ) )
1060 text.Value.Replace( wxS(
"! " ), wxS(
"\n" ) );
1061 else if( value.StartsWith( wxS(
";" ), &
text.Value ) )
1062 text.Value.Replace( wxS(
"; " ), wxS(
"\n" ) );
1066 text.Value.Replace( wxS(
"\\n" ), wxS(
"\n" ) );
1071 else if( element ==
"BUSTAP" )
1075 wxString startPointX = tokens[1];
1076 wxString startPointY = tokens[2];
1077 wxString endPointX = tokens[3];
1078 wxString endPointY = tokens[4];
1081 bustap.
Start =
pointCheck( startPointX, startPointY, lineNumber, fileName );
1082 bustap.
End =
pointCheck( endPointX, endPointY, lineNumber, fileName );
1084 ascFile.
Bustap.push_back( bustap );
1088 else if( element ==
"VERSION" )
1090 wxString versionNumber = tokens[1];
1097 ascFiles.push_back( ascFile );
const Vec & GetOrigin() const
const Vec & GetSize() const
BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Modify the position and size of the rectangle in order to contain aRect.
virtual void SetParent(EDA_ITEM *aParent)
Define a library symbol object.
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
static VECTOR2I pointCheck(const wxString &aTokenX, const wxString &aTokenY, int aLineNumber, const wxString &aFileName)
static SYMBOLTYPE getSymbolType(const wxString &aValue)
std::vector< LT_ASC > StructureBuilder()
Build Intermediate data structure.
std::vector< LTSPICE_FILE > GetSchematicElements(const wxString &aAscFile)
Used to get symbols list present in asc file.
LT_SYMBOL SymbolBuilder(const wxString &aAscFileName, LT_ASC &aAscFile)
POLARITY
Polarity enum represents polarity of pin.
JUSTIFICATION
Defines in what ways the PIN or TEXT can be justified.
void GetAscAndAsyFilePaths(const wxDir &aDir, bool aRecursive, std::map< wxString, wxString > &aMapOfAscFiles, std::map< wxString, wxString > &aMapOfAsyFiles, const wxString &aBase=wxEmptyString)
Used to get file path for Asc and Asy files.
static ORIENTATION getSymbolRotationOrMirror(const wxString &aValue)
bool IsAsySubsheet(const wxString &aAsyFile)
Check if the asy file content indicates that we need to load subsheet.
void Load(SCHEMATIC *aSchematic, SCH_SHEET *aRootSheet, const wxFileName &aLibraryFileName)
The main function responsible for loading the .asc and .asy files.
static POLARITY getPolarity(const wxString &aValue)
static void tokensSizeRangeCheck(size_t aActualSize, int aExpectedMin, int aExpectedMax, int aLineNumber, const wxString &aFileName)
Used to check size of the token generated from split function.
static LINEWIDTH getLineWidth(const wxString &aValue)
ORIENTATION
Defines different types or rotation and mirror operation can be applied to a LT_SYMBOL.
static void aggregateAttributeValue(wxArrayString &aTokens, int aIndex)
Join value present across multiple tokens into one.
static int integerCheck(const wxString &aToken, int aLineNumber, const wxString &aFileName)
Used to check if the given token in integer or not.
wxFileName m_ltspiceDataDir
std::map< wxString, std::map< wxString, wxString > > m_fileCache
static JUSTIFICATION getTextJustification(const wxString &aValue)
static JUSTIFICATION getPinJustification(const wxString &aValue)
SYMBOLTYPE
Type of Symbol loaded from asc and asy file.
std::map< wxString, wxString > ReadAsyFiles(const std::vector< LTSPICE_FILE > &aSourceFiles, const std::map< wxString, wxString > &aAsyFileMap)
The function returns a map.
static void removeCarriageReturn(wxString &elementFromLine)
static LINESTYLE getLineStyle(int aValue)
The class is been used for loading the asc and asy files in intermediate data structure.
int ToKicadCoords(int aCoordinate)
Method converts ltspice coordinate(i.e scale) to kicad coordinates.
void Parse(SCH_SHEET_PATH *aSheet, std::vector< LTSPICE_SCHEMATIC::LT_ASC > &outLT_ASCs, const std::vector< wxString > &aAsyFileNames)
Function responsible for loading the .asc and .asy files in intermediate data structure.
void CreateSymbol(LTSPICE_SCHEMATIC::LT_SYMBOL &aLtSymbol, LIB_SYMBOL *aLibSymbol)
virtual const wxString GetProjectPath() const
Return the full path of the project.
virtual REPORTER & Report(const wxString &aText, SEVERITY aSeverity=RPT_SEVERITY_UNDEFINED)=0
Report a string with a given severity.
Holds all the data relating to one schematic.
PROJECT & Prj() const override
Return a reference to the project this schematic is part of.
Instances are attached to a symbol or sheet and provide a place for the symbol's value,...
void SetText(const wxString &aText) override
void SetFileName(const wxString &aFileName)
Set the file name for this screen to aFileName.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
void push_back(SCH_SHEET *aSheet)
Forwarded method from std::vector.
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
void SetSize(const VECTOR2I &aSize)
std::vector< SCH_FIELD > & GetFields()
void SetPosition(const VECTOR2I &aPosition) override
SCH_SCREEN * GetScreen() const
void SetScreen(SCH_SCREEN *aScreen)
Set the SCH_SCREEN associated with this sheet to aScreen.
#define THROW_IO_ERROR(msg)
void delete_if(_Container &__c, _Function &&__f)
Deletes all values from __c for which __f returns true.
wxString SafeReadFile(const wxString &aFilePath, const wxString &aReadType)
Nominally opens a file and reads it into a string.
The ARC is represented inside a rectangle whose opposite site are given.
The CIRCLE is represented in Ltpsice inside a rectangle whose two opposite points and line style are ...
IOPIN is special contact on symbol used for IO operations.
A struct to hold .asc file definition.
std::vector< CIRCLE > Circles
std::vector< IOPIN > Iopins
std::vector< BUSTAP > Bustap
std::vector< LT_SYMBOL > Symbols
std::vector< TEXT > Texts
std::vector< DATAFLAG > DataFlags
std::vector< LINE > Lines
std::vector< WIRE > Wires
std::vector< RECTANGLE > Rectangles
std::vector< FLAG > Flags
A struct to hold SYMBOL definition.
std::map< wxString, wxString > SymAttributes
std::vector< RECTANGLE > Rectangles
std::vector< LT_WINDOW > Windows
std::vector< LT_PIN > Pins
ORIENTATION SymbolOrientation
std::vector< CIRCLE > Circles
std::vector< LINE > Lines
JUSTIFICATION Justification
A 4-sided polygon with opposite equal sides, used in representing shapes.
A metallic connection, used for transfer, between two points or pin.
Definition of file extensions used in Kicad.