KiCad PCB EDA Suite
legacy_plugin.h
Go to the documentation of this file.
1 #ifndef LEGACY_PLUGIN_H_
2 #define LEGACY_PLUGIN_H_
3 
4 /*
5  * This program source code file is part of KiCad, a free EDA CAD application.
6  *
7  * Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
8  * Copyright (C) 2016 KiCad Developers, see AUTHORS.txt for contributors.
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License
12  * as published by the Free Software Foundation; either version 2
13  * of the License, or (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, you may find one here:
22  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
23  * or you may search the http://www.gnu.org website for the version 2 license,
24  * or you may write to the Free Software Foundation, Inc.,
25  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
26  */
27 
28 #include <io_mgr.h>
29 #include <string>
31 #include <memory>
32 
33 
34 // FOOTPRINT_LIBRARY_HEADER_CNT gives the number of characters to compare to detect
35 // a footprint library. A few variants may have been used, and so we can only be
36 // sure that the header contains "PCBNEW-LibModule-V", not "PCBNEW-LibModule-V1".
37 
38 #define FOOTPRINT_LIBRARY_HEADER "PCBNEW-LibModule-V1"
39 #define FOOTPRINT_LIBRARY_HEADER_CNT 18
40 
41 class PCB_TARGET;
42 class MODULE;
43 class DRAWSEGMENT;
44 class NETINFO;
45 class TEXTE_PCB;
46 class TRACK;
47 class NETCLASS;
48 class NETCLASSES;
49 class ZONE_CONTAINER;
50 class DIMENSION;
51 class NETINFO_ITEM;
52 class NETINFO_MAPPING;
53 class TEXTE_MODULE;
54 class EDGE_MODULE;
55 class TRACK;
56 class SEGZONE;
57 class D_PAD;
58 struct LP_CACHE;
59 
60 
66 class LEGACY_PLUGIN : public PLUGIN
67 {
68  friend struct LP_CACHE;
69 
70 public:
71 
72  //-----<PLUGIN IMPLEMENTATION>----------------------------------------------
73 
74  const wxString PluginName() const override
75  {
76  return wxT( "KiCad-Legacy" );
77  }
78 
79  const wxString GetFileExtension() const override
80  {
81  return wxT( "brd" );
82  }
83 
84  BOARD* Load( const wxString& aFileName, BOARD* aAppendToMe,
85  const PROPERTIES* aProperties = NULL ) override;
86 
87  wxArrayString FootprintEnumerate( const wxString& aLibraryPath,
88  const PROPERTIES* aProperties = NULL ) override;
89 
90  MODULE* FootprintLoad( const wxString& aLibraryPath, const wxString& aFootprintName,
91  const PROPERTIES* aProperties = NULL ) override;
92 
93  bool FootprintLibDelete( const wxString& aLibraryPath, const PROPERTIES* aProperties = NULL ) override;
94 
95  bool IsFootprintLibWritable( const wxString& aLibraryPath ) override;
96 
97  //-----</PLUGIN IMPLEMENTATION>---------------------------------------------
98 
99  typedef int BIU;
100 
101  LEGACY_PLUGIN();
102  ~LEGACY_PLUGIN();
103 
104  void SetReader( LINE_READER* aReader ) { m_reader = aReader; }
105  void SetFilePtr( FILE* aFile ) { m_fp = aFile; }
106 
107  void SaveModule3D( const MODULE* aModule ) const;
108 
109  // return the new .kicad_pcb layer id from the old (legacy) layer id
110  static LAYER_ID leg_layer2new( int cu_count, LAYER_NUM aLayerNum );
111 
112  static LSET leg_mask2new( int cu_count, unsigned aMask );
113 
114 protected:
115 
117 
118  wxString m_error;
121 
123  FILE* m_fp;
124 
125  wxString m_field;
128 
130  std::vector<int> m_netCodes;
132 
134  void init( const PROPERTIES* aProperties );
135 
136  double biuToDisk;
137 
139  double diskToBiu;
140 
144  inline int getNetCode( int aNetCode )
145  {
146  if( (unsigned int) aNetCode < m_netCodes.size() )
147  return m_netCodes[aNetCode];
148 
149  return aNetCode;
150  }
151 
165  BIU biuParse( const char* aValue, const char** nptrptr = NULL );
166 
181  double degParse( const char* aValue, const char** nptrptr = NULL );
182 
183  //-----<load/parse functions>-----------------------------------------------
184 
185  void checkVersion();
186 
187  void loadAllSections( bool doAppend );
188 
189 
190  void loadGENERAL();
191  void loadSETUP();
192  void loadSHEET();
193 
194  void load3D( MODULE* aModule );
195  void loadPAD( MODULE* aModule );
196  void loadMODULE_TEXT( TEXTE_MODULE* aText );
197  void loadMODULE_EDGE( MODULE* aModule );
198 
199  void loadPCB_LINE();
200  void loadNETINFO_ITEM();
201  void loadPCB_TEXT();
202  void loadNETCLASS();
203  void loadMODULE( MODULE* aModule );
204 
212  void loadTrackList( int aStructType );
213 
214  void loadZONE_CONTAINER(); // "$CZONE_OUTLINE"
215  void loadDIMENSION(); // "$COTATION"
216  void loadPCB_TARGET(); // "$PCB_TARGET"
217 
218  //-----</ load/parse functions>---------------------------------------------
219 
221  void cacheLib( const wxString& aLibraryPath );
222 };
223 
224 #endif // LEGACY_PLUGIN_H_
Class ZONE_CONTAINER handles a list of polygons defining a copper zone.
Definition: class_zone.h:78
Class LINE_READER is an abstract class from which implementation specific LINE_READERs may be derived...
Definition: richio.h:81
void cacheLib(const wxString &aLibraryPath)
we only cache one footprint library for now, this determines which one.
void loadMODULE_TEXT(TEXTE_MODULE *aText)
void loadMODULE(MODULE *aModule)
BOARD * Load(const wxString &aFileName, BOARD *aAppendToMe, const PROPERTIES *aProperties=NULL) override
Function Load loads information from some input file format that this PLUGIN implementation knows abo...
bool FootprintLibDelete(const wxString &aLibraryPath, const PROPERTIES *aProperties=NULL) override
Function FootprintLibDelete deletes an existing footprint library and returns true, or if library does not exist returns false, or throws an exception if library exists but is read only or cannot be deleted for some other reason.
wxString m_field
reused to stuff MODULE fields.
Class PROPERTIES is a name/value tuple with unique names and optional values.
Definition: properties.h:34
int m_loading_format_version
which BOARD_FORMAT_VERSION am I Load()ing?
void SetReader(LINE_READER *aReader)
FILE * m_fp
no ownership here.
void load3D(MODULE *aModule)
double biuToDisk
convert from BIUs to disk engineering units with this scale factor
Class LP_CACHE assists only for the footprint portion of the PLUGIN API, and only for the LEGACY_PLUG...
void SaveModule3D(const MODULE *aModule) const
BIU biuParse(const char *aValue, const char **nptrptr=NULL)
Function biuParse parses an ASCII decimal floating point value and scales it into a BIU according to ...
std::vector< int > m_netCodes
net codes mapping for boards being loaded
LINE_READER * m_reader
no ownership here.
Class LSET is a set of LAYER_IDs.
Class NETCLASSES is a container for NETCLASS instances.
void init(const PROPERTIES *aProperties)
initialize PLUGIN like a constructor would, and futz with fresh BOARD if needed.
bool IsFootprintLibWritable(const wxString &aLibraryPath) override
Function IsFootprintLibWritable returns true iff the library at aLibraryPath is writable.
Class LEGACY_PLUGIN is a PLUGIN derivation which could possibly be put into a DLL/DSO.
Definition: legacy_plugin.h:66
void loadMODULE_EDGE(MODULE *aModule)
Class NETCLASS handles a collection of nets and the parameters used to route or test these nets...
double diskToBiu
convert from disk engineering units to BIUs with this scale factor
void SetFilePtr(FILE *aFile)
BOARD * m_board
which BOARD, no ownership here
void loadAllSections(bool doAppend)
int LAYER_NUM
Type LAYER_NUM can be replaced with int and removed.
void loadZONE_CONTAINER()
double degParse(const char *aValue, const char **nptrptr=NULL)
Function degParse parses an ASCII decimal floating point value which is certainly an angle...
static LSET leg_mask2new(int cu_count, unsigned aMask)
Class NETINFO_ITEM handles the data for a net.
Board layer functions and definitions.
Class BOARD holds information pertinent to a Pcbnew printed circuit board.
Definition: class_board.h:166
const wxString PluginName() const override
Function PluginName returns a brief hard coded name for this PLUGIN.
Definition: legacy_plugin.h:74
LAYER_ID
Enum LAYER_ID is the set of PCB layers.
wxString m_error
for throwing exceptions
Class PLUGIN is a base class that BOARD loading and saving plugins should derive from.
Definition: io_mgr.h:193
static LAYER_ID leg_layer2new(int cu_count, LAYER_NUM aLayerNum)
wxArrayString FootprintEnumerate(const wxString &aLibraryPath, const PROPERTIES *aProperties=NULL) override
Function FootprintEnumerate returns a list of footprint names contained within the library at aLibrar...
void loadPAD(MODULE *aModule)
int getNetCode(int aNetCode)
Converts net code using the mapping table if available, otherwise returns unchanged net code ...
void loadTrackList(int aStructType)
Function loadTrackList reads a list of segments (Tracks and Vias, or Segzones)
Class DIMENSION.
NETINFO_MAPPING * m_mapping
mapping for net codes, so only not empty nets are stored with consecutive integers as net codes ...
LP_CACHE * m_cache
MODULE * FootprintLoad(const wxString &aLibraryPath, const wxString &aFootprintName, const PROPERTIES *aProperties=NULL) override
Function FootprintLoad loads a footprint having aFootprintName from the aLibraryPath containing a lib...
const wxString GetFileExtension() const override
Function GetFileExtension returns the file extension for the PLUGIN.
Definition: legacy_plugin.h:79
const PROPERTIES * m_props
passed via Save() or Load(), no ownership, may be NULL.