309 lines
11 KiB
C++
309 lines
11 KiB
C++
/*
|
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
|
*
|
|
* Copyright (C) 2022 Chetan Subhash Shinde<chetanshinde2001@gmail.com>
|
|
* Copyright (C) 2023 CERN
|
|
* Copyright (C) 2022-2023 KiCad Developers, see AUTHORS.txt for contributors.
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the
|
|
* Free Software Foundation, either version 3 of the License, or (at your
|
|
* option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/**
|
|
* @brief Parses the datastructure produced by the LTSPICE_SCHEMATIC into a KiCad
|
|
* schematic file.
|
|
*/
|
|
|
|
#ifndef LTSPICE_SCH_PARSER_H
|
|
#define LTSPICE_SCH_PARSER_H
|
|
|
|
#include <sch_io_mgr.h>
|
|
#include <pin_type.h>
|
|
#include <layer_ids.h>
|
|
#include <wx/filename.h>
|
|
#include <plotters/plotter.h>
|
|
#include <sch_plugins/ltspice/ltspice_schematic.h>
|
|
|
|
|
|
class LIB_SHAPE;
|
|
class LIB_PIN;
|
|
class SCH_LABEL_BASE;
|
|
class SCH_SYMBOL;
|
|
class SCH_TEXT;
|
|
class SCH_SHAPE;
|
|
|
|
/**
|
|
* The class is been used for loading the asc and asy files in intermediate data structure.
|
|
* <p>
|
|
* The intermediate data structure is a structure, from where the kicad objects will be
|
|
* initialised.
|
|
* <p>
|
|
* The intermediate datastructure is been defined below in the class, with comments for
|
|
* individual struct is in place.
|
|
* <p>
|
|
* parser() - This is the main function responsible for parsing the data into intermediate
|
|
* datastructure.
|
|
* <p>
|
|
* Data Processing Methods - The individual comments for function are given. In general.
|
|
* these methods are been used for manipulating the data.
|
|
* <p>
|
|
* Data Check Methods - The individual comments for functions under this section is given.
|
|
* In general these methods are been used for validating the data.
|
|
* <p>
|
|
* Enum Conversion Methods - The individual comments for functions under this section is
|
|
* given. In general these methods are used to convert the string into enum.
|
|
*/
|
|
class LTSPICE_SCH_PARSER
|
|
{
|
|
public:
|
|
// Size of tiny net labels which none present in original design
|
|
const int SMALL_LABEL_SIZE = KiROUND( (double) SCH_IU_PER_MM * 0.4 );
|
|
|
|
explicit LTSPICE_SCH_PARSER( const wxString& aFilename, LTSPICE_SCHEMATIC* aLTSchematic ) :
|
|
m_lt_schematic( aLTSchematic ),
|
|
m_powerSymbolIndex( 0 )
|
|
{ }
|
|
|
|
~LTSPICE_SCH_PARSER() {}
|
|
|
|
/**
|
|
* Method converts ltspice coordinate(i.e scale) to kicad coordinates
|
|
*
|
|
* @param aCoordinate coordinate(i.e scale) in ltspice.
|
|
*/
|
|
int ToKicadCoords( int aCoordinate );
|
|
VECTOR2I ToKicadCoords( const VECTOR2I& aPos );
|
|
VECTOR2I ToInvertedKicadCoords( const VECTOR2I& aPos );
|
|
|
|
VECTOR2I ToKicadFontSize( int aLTFontSize );
|
|
|
|
/**
|
|
* Method converts kicad coordinate(i.e scale) to ltspice coordinates
|
|
*
|
|
* @param aCoordinate coordinate(i.e scale) in ltspice.
|
|
*/
|
|
int ToLtSpiceCoords( int aCoordinate );
|
|
|
|
/**
|
|
* Function responsible for loading the .asc and .asy files in intermediate data structure.
|
|
*
|
|
* @param aSheet variable representing the current sheet.
|
|
* @param mapOfFiles a string map containing all the data from .asc and .asy files.
|
|
*/
|
|
void Parse( SCH_SHEET_PATH* aSheet, std::vector<LTSPICE_SCHEMATIC::LT_ASC>& outLT_ASCs,
|
|
const std::vector<wxString>& aAsyFileNames );
|
|
|
|
|
|
/**
|
|
* Method for plotting Lines from Asy files
|
|
*
|
|
* @param aAscfile object representing asc file.
|
|
* @param aIndex index.
|
|
*/
|
|
void CreateLines( LIB_SYMBOL* aSymbol, LTSPICE_SCHEMATIC::LT_SYMBOL& aLTSymbol, int aIndex,
|
|
LIB_SHAPE* aShape );
|
|
|
|
/**
|
|
* Method for plotting Schematic Lines from Asy files
|
|
*
|
|
* @param aAscfile object representing asc file.
|
|
* @param aIndex index.
|
|
* @param aSheet a object on which the circle is represented.
|
|
*/
|
|
void CreateLines( LTSPICE_SCHEMATIC::LT_SYMBOL& aLTSymbol, int aIndex, SCH_SHEET_PATH* aSheet );
|
|
|
|
/**
|
|
* Main Method for loading indermediate data to kicacd object from asy files
|
|
*
|
|
* @param aAscfiles array object representing asc files.
|
|
* @param aSheet a object on which the symbols are represented.
|
|
*/
|
|
void CreateKicadSYMBOLs( SCH_SHEET_PATH* aSheet,
|
|
std::vector<LTSPICE_SCHEMATIC::LT_ASC>& outLT_ASCs,
|
|
const std::vector<wxString>& aAsyFiles );
|
|
|
|
void CreateSymbol( LTSPICE_SCHEMATIC::LT_SYMBOL& aLtSymbol, LIB_SYMBOL* aLibSymbol );
|
|
|
|
/**
|
|
* Methods for rotating and mirroring objects
|
|
*/
|
|
void RotateMirror( LTSPICE_SCHEMATIC::LT_SYMBOL& aLTSymbol, SCH_SYMBOL* aSchSymbol );
|
|
void RotateMirrorShape( LTSPICE_SCHEMATIC::LT_SYMBOL& aLTSymbol, SCH_SHAPE* aShape );
|
|
|
|
/**
|
|
* Method for plotting wires
|
|
*
|
|
* @param aLTSymbol object representing asc file.
|
|
* @param aIndex index.
|
|
* @param aSheet a object on which the symbols is represented.
|
|
*/
|
|
void CreateWires( LTSPICE_SCHEMATIC::LT_SYMBOL& aLTSymbol, int aIndex,
|
|
SCH_SHEET_PATH* aSheet );
|
|
|
|
/**
|
|
* Main method for loading intermediate data structure from Asc file to kicad.
|
|
*
|
|
* @param outLT_ASCs
|
|
* @param aSheet a object on which the circle is represented.
|
|
*/
|
|
void CreateKicadSCH_ITEMs( SCH_SHEET_PATH* aSheet,
|
|
std::vector<LTSPICE_SCHEMATIC::LT_ASC>& outLT_ASCs );
|
|
|
|
/**
|
|
* Method for plotting Bustap from Asc files
|
|
*
|
|
* @param aAscfile object representing asc file.
|
|
* @param aIndex index.
|
|
* @param aSheet a object on which the circle is represented.
|
|
*/
|
|
void CreateBusEntry( LTSPICE_SCHEMATIC::LT_ASC& aAscfile, int aIndex, SCH_SHEET_PATH* aSheet );
|
|
|
|
/**
|
|
* Method for plotting Iopin from Asc files
|
|
*
|
|
* @param aAscfile object representing asc file.
|
|
* @param aIndex index.
|
|
* @param aSheet a object on which the circle is represented.
|
|
*/
|
|
void CreatePin( LTSPICE_SCHEMATIC::LT_ASC& aAscfile, int aIndex, SCH_SHEET_PATH* aSheet );
|
|
|
|
/**
|
|
* Method for plotting Line from Asc files
|
|
*
|
|
* @param aAscfile object representing asc file.
|
|
* @param aIndex index.
|
|
* @param aSheet a object on which the circle is represented.
|
|
*/
|
|
void CreateLine( LTSPICE_SCHEMATIC::LT_ASC& aAscfile, int aIndex, SCH_SHEET_PATH* aSheet );
|
|
|
|
/**
|
|
* Method for plotting circle from Asc files
|
|
*
|
|
* @param aAscfile object representing asc file.
|
|
* @param aIndex index.
|
|
* @param aSheet a object on which the circle is represented.
|
|
*/
|
|
void CreateCircle( LTSPICE_SCHEMATIC::LT_ASC& aAscfile, int aIndex, SCH_SHEET_PATH* aSheet );
|
|
|
|
/**
|
|
* Method for plotting Arc from Asc files
|
|
*
|
|
* @param aAscfile object representing asc file.
|
|
* @param aIndex index.
|
|
* @param aSheet a object on which the Arc is represented.
|
|
*/
|
|
void CreateArc( LTSPICE_SCHEMATIC::LT_ASC& aAscfile, int aIndex, SCH_SHEET_PATH* aSheet );
|
|
|
|
/**
|
|
* Method for setting Text Justification.
|
|
*
|
|
* @param aAscfile object representing asc file.
|
|
* @param aIndex index.
|
|
* @param aSheet a object on which the text is represented used for justification.
|
|
*/
|
|
void CreateRect( LTSPICE_SCHEMATIC::LT_ASC& aAscfile, int aIndex, SCH_SHEET_PATH* aSheet );
|
|
|
|
/**
|
|
* Create schematic text.
|
|
*/
|
|
SCH_TEXT* CreateSCH_TEXT( VECTOR2I aOffset, const wxString& aText, int aFontSize,
|
|
LTSPICE_SCHEMATIC::JUSTIFICATION aJustification );
|
|
|
|
/**
|
|
* Create a schematic wire.
|
|
*/
|
|
void CreateWire( LTSPICE_SCHEMATIC::LT_ASC& aAscfile, int aIndex, SCH_SHEET_PATH* aSheet,
|
|
SCH_LAYER_ID aLayer );
|
|
|
|
/**
|
|
* Create a power symbol.
|
|
* @param aWires Schematic wires. (Allows us to correctly orient the power symbol.)
|
|
*/
|
|
SCH_SYMBOL* CreatePowerSymbol( const VECTOR2I& aOffset, const wxString& aValue, int aFontSize,
|
|
SCH_SHEET_PATH* aSheet,
|
|
std::vector<LTSPICE_SCHEMATIC::WIRE>& aWires );
|
|
|
|
/**
|
|
* Create a label.
|
|
* @param aType Currently supported types: SCH_LABEL_T, SCH_DIRECTIVE_LABEL_T
|
|
*/
|
|
SCH_LABEL_BASE* CreateSCH_LABEL( KICAD_T aType, const VECTOR2I& aOffset, const wxString& aValue,
|
|
int aFontSize );
|
|
|
|
void CreateFields( LTSPICE_SCHEMATIC::LT_SYMBOL& aLTSymbol, SCH_SYMBOL* aSymbol,
|
|
SCH_SHEET_PATH* aSheet );
|
|
|
|
/**
|
|
* Create a symbol rect.
|
|
*/
|
|
void CreateRect( LTSPICE_SCHEMATIC::LT_SYMBOL& aLTSymbol, int aIndex, LIB_SHAPE* aRectangle );
|
|
|
|
/**
|
|
* Create a schematic rect.
|
|
*/
|
|
void CreateRect( LTSPICE_SCHEMATIC::LT_SYMBOL& aLTSymbol, int aIndex, SCH_SHEET_PATH* aSheet );
|
|
|
|
/**
|
|
* Create a pin from an asy file.
|
|
*/
|
|
void CreatePin( LTSPICE_SCHEMATIC::LT_SYMBOL& aLTSymbol, int aIndex, LIB_PIN* aPin );
|
|
|
|
/**
|
|
* Create a symbol arc.
|
|
*/
|
|
void CreateArc( LTSPICE_SCHEMATIC::LT_SYMBOL& aLTSymbol, int aIndex, LIB_SHAPE* aArc );
|
|
|
|
/**
|
|
* Create a schematic arc.
|
|
*/
|
|
void CreateArc( LTSPICE_SCHEMATIC::LT_SYMBOL& aLTSymbol, int aIndex, SCH_SHEET_PATH* aSheet );
|
|
|
|
/**
|
|
* Create a symbol circle.
|
|
*/
|
|
void CreateCircle( LTSPICE_SCHEMATIC::LT_SYMBOL& aLTSymbol, int aIndex, LIB_SHAPE* aCircle );
|
|
|
|
/**
|
|
* Create a schematic circle.
|
|
*/
|
|
void CreateCircle( LTSPICE_SCHEMATIC::LT_SYMBOL& aLTSymbol, int aIndex, SCH_SHEET_PATH* aSheet );
|
|
|
|
private:
|
|
/**
|
|
* Method for setting Text Justification.
|
|
*
|
|
* @param aLineWidth object representing line width from ltspice.
|
|
*/
|
|
int getLineWidth( const LTSPICE_SCHEMATIC::LINEWIDTH& aLineWidth );
|
|
|
|
/**
|
|
* Method to get line Style For kicad.
|
|
*
|
|
* @param aLineStyle lineStyle from ltspice.
|
|
*/
|
|
PLOT_DASH_TYPE getLineStyle( const LTSPICE_SCHEMATIC::LINESTYLE& aLineStyle );
|
|
|
|
STROKE_PARAMS getStroke( const LTSPICE_SCHEMATIC::LINEWIDTH& aLineWidth,
|
|
const LTSPICE_SCHEMATIC::LINESTYLE& aLineStyle );
|
|
|
|
void readIncludes( std::vector<LTSPICE_SCHEMATIC::LT_ASC>& outLT_ASCs );
|
|
|
|
private:
|
|
LTSPICE_SCHEMATIC* m_lt_schematic;
|
|
wxFileName m_libraryFileName;
|
|
VECTOR2I m_originOffset;
|
|
std::map<wxString, wxString> m_includes;
|
|
int m_powerSymbolIndex;
|
|
};
|
|
#endif // LTSPICE_SCH_PARSER_H
|