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-2021 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 FOOTPRINT;
43 class TRACK;
44 class NETCLASS;
45 class NETCLASSES;
46 class ZONE;
47 class DIMENSION_BASE;
48 class NETINFO_ITEM;
49 class NETINFO_MAPPING;
50 class FP_TEXT;
51 class TRACK;
52 class PAD;
53 struct LP_CACHE;
54 
55 
61 class LEGACY_PLUGIN : public PLUGIN
62 {
63  friend struct LP_CACHE;
64 
65 public:
66  LEGACY_PLUGIN();
68 
69  const wxString PluginName() const override
70  {
71  return wxT( "KiCad-Legacy" );
72  }
73 
74  const wxString GetFileExtension() const override
75  {
76  return wxT( "brd" );
77  }
78 
79  BOARD* Load( const wxString& aFileName, BOARD* aAppendToMe,
80  const PROPERTIES* aProperties = nullptr, PROJECT* aProject = nullptr ) override;
81 
82  void FootprintEnumerate( wxArrayString& aFootprintNames, const wxString& aLibraryPath,
83  bool aBestEfforts,
84  const PROPERTIES* aProperties = nullptr ) override;
85 
86  FOOTPRINT* FootprintLoad( const wxString& aLibraryPath, const wxString& aFootprintName,
87  bool aKeepUUID = false,
88  const PROPERTIES* aProperties = nullptr ) override;
89 
90  bool FootprintLibDelete( const wxString& aLibraryPath,
91  const PROPERTIES* aProperties = nullptr ) override;
92 
93  long long GetLibraryTimestamp( const wxString& aLibraryPath ) const override;
94 
95  bool IsFootprintLibWritable( const wxString& aLibraryPath ) override;
96 
97  typedef int BIU;
98 
99  void SetReader( LINE_READER* aReader ) { m_reader = aReader; }
100 
101  // return the new .kicad_pcb layer id from the old (legacy) layer id
102  static PCB_LAYER_ID leg_layer2new( int cu_count, LAYER_NUM aLayerNum );
103 
104  static LSET leg_mask2new( int cu_count, unsigned aMask );
105 
106 protected:
109  inline int getNetCode( int aNetCode )
110  {
111  if( (unsigned int) aNetCode < m_netCodes.size() )
112  return m_netCodes[aNetCode];
113 
114  return aNetCode;
115  }
116 
128  BIU biuParse( const char* aValue, const char** nptrptr = nullptr );
129 
142  double degParse( const char* aValue, const char** nptrptr = nullptr );
143 
144  void checkVersion();
145 
146  void loadAllSections( bool doAppend );
147 
148 
149  void loadGENERAL();
150  void loadSETUP();
151  void loadSHEET();
152 
153  void load3D( FOOTPRINT* aFootprint );
154  void loadPAD( FOOTPRINT* aFootprint );
155  void loadMODULE_TEXT( FP_TEXT* aText );
156  void loadFP_SHAPE( FOOTPRINT* aFootprint );
157 
158  void loadPCB_LINE();
159  void loadNETINFO_ITEM();
160  void loadPCB_TEXT();
161  void loadNETCLASS();
162  void loadFOOTPRINT( FOOTPRINT* aFootprint );
163 
170  void loadTrackList( int aStructType );
171 
172  void loadZONE_CONTAINER(); // "$CZONE_OUTLINE"
173  void loadDIMENSION(); // "$COTATION"
174  void loadPCB_TARGET(); // "$PCB_TARGET"
175 
177  void cacheLib( const wxString& aLibraryPath );
178 
179 protected:
181 
182  wxString m_error;
185 
187  FILE* m_fp;
188 
189  wxString m_field;
193 
195  std::vector<int> m_netCodes;
197 
199  void init( const PROPERTIES* aProperties );
200 
201  double biuToDisk;
202 
204  double diskToBiu;
205 };
207 
208 #endif // LEGACY_PLUGIN_H_
long long GetLibraryTimestamp(const wxString &aLibraryPath) const override
Generate a timestamp representing all the files in the library (including the library directory).
An abstract class from which implementation specific LINE_READERs may be derived to read single lines...
Definition: richio.h:80
void FootprintEnumerate(wxArrayString &aFootprintNames, const wxString &aLibraryPath, bool aBestEfforts, const PROPERTIES *aProperties=nullptr) override
Return a list of footprint names contained within the library at aLibraryPath.
Container for project specific data.
Definition: project.h:62
void cacheLib(const wxString &aLibraryPath)
we only cache one footprint library for now, this determines which one.
bool m_showLegacyZoneWarning
BOARD * Load(const wxString &aFileName, BOARD *aAppendToMe, const PROPERTIES *aProperties=nullptr, PROJECT *aProject=nullptr) override
Load information from some input file format that this PLUGIN implementation knows about into either ...
BIU biuParse(const char *aValue, const char **nptrptr=nullptr)
Parse an ASCII decimal floating point value and scales it into a BIU according to the current value o...
static PCB_LAYER_ID leg_layer2new(int cu_count, LAYER_NUM aLayerNum)
wxString m_field
reused to stuff FOOTPRINT fields.
A name/value tuple with unique names and optional values.
Definition: properties.h:33
int m_loading_format_version
which BOARD_FORMAT_VERSION am I Load()ing?
bool FootprintLibDelete(const wxString &aLibraryPath, const PROPERTIES *aProperties=nullptr) override
Delete an existing footprint library and returns true, or if library does not exist returns false,...
void SetReader(LINE_READER *aReader)
Definition: legacy_plugin.h:99
FILE * m_fp
no ownership here.
double degParse(const char *aValue, const char **nptrptr=nullptr)
Parse an ASCII decimal floating point value which is certainly an angle.
double biuToDisk
convert from BIUs to disk engineering units with this scale factor
LP_CACHE assists only for the footprint portion of the PLUGIN API, and only for the LEGACY_PLUGIN,...
std::vector< int > m_netCodes
net codes mapping for boards being loaded
PCB_LAYER_ID
A quick note on layer IDs:
LINE_READER * m_reader
no ownership here.
LSET is a set of PCB_LAYER_IDs.
A container for NETCLASS instances.
Definition: netclass.h:218
void init(const PROPERTIES *aProperties)
initialize PLUGIN like a constructor would, and futz with fresh BOARD if needed.
bool IsFootprintLibWritable(const wxString &aLibraryPath) override
Return true if the library at aLibraryPath is writable.
A PLUGIN derivation which could possibly be put into a DLL/DSO.
Definition: legacy_plugin.h:61
A collection of nets and the parameters used to route or test these nets.
Definition: netclass.h:46
void loadFP_SHAPE(FOOTPRINT *aFootprint)
void loadMODULE_TEXT(FP_TEXT *aText)
FOOTPRINT * FootprintLoad(const wxString &aLibraryPath, const wxString &aFootprintName, bool aKeepUUID=false, const PROPERTIES *aProperties=nullptr) override
Load a footprint having aFootprintName from the aLibraryPath containing a library format that this PL...
Handle a list of polygons defining a copper zone.
Definition: zone.h:57
LEGACY_PLUGIN::BIU BIU
double diskToBiu
convert from disk engineering units to BIUs with this scale factor
BOARD * m_board
which BOARD, no ownership here
void loadAllSections(bool doAppend)
int LAYER_NUM
This can be replaced with int and removed.
void loadFOOTPRINT(FOOTPRINT *aFootprint)
void loadZONE_CONTAINER()
static LSET leg_mask2new(int cu_count, unsigned aMask)
Handle the data for a net.
Definition: netinfo.h:64
Board layer functions and definitions.
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:190
const wxString PluginName() const override
Return a brief hard coded name for this PLUGIN.
Definition: legacy_plugin.h:69
wxString m_error
for throwing exceptions
A base class that BOARD loading and saving plugins should derive from.
Definition: io_mgr.h:267
void load3D(FOOTPRINT *aFootprint)
Definition: pad.h:60
Abstract dimension API.
Definition: dimension.h:95
int getNetCode(int aNetCode)
< Converts net code using the mapping table if available, otherwise returns unchanged net code
void loadPAD(FOOTPRINT *aFootprint)
void loadTrackList(int aStructType)
Read a list of segments (Tracks and Vias, or Segzones)
NETINFO_MAPPING * m_mapping
mapping for net codes, so only not empty nets are stored with consecutive integers as net codes
Definition: track.h:83
LP_CACHE * m_cache
const wxString GetFileExtension() const override
Returns the file extension for the PLUGIN.
Definition: legacy_plugin.h:74
const PROPERTIES * m_props
passed via Save() or Load(), no ownership, may be NULL.