KiCad PCB EDA Suite
Loading...
Searching...
No Matches
pcb_io_eagle.h
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <[email protected]>
5 * Copyright (C) 2012-2023 KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, you may find one here:
19 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20 * or you may search the http://www.gnu.org website for the version 2 license,
21 * or you may write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 */
24
25#ifndef PCB_IO_EAGLE_H_
26#define PCB_IO_EAGLE_H_
27
29#include <pcb_io/pcb_io.h>
30#include <pcb_io/pcb_io_mgr.h>
32
33#include <eda_units.h>
34#include <layer_ids.h>
35#include <lset.h>
36#include <netclass.h>
37
38#include <map>
39#include <tuple>
40#include <wx/xml/xml.h>
41
42class PAD;
43class PCB_TEXT;
44class ZONE;
45
46typedef std::map<wxString, FOOTPRINT*> FOOTPRINT_MAP;
47typedef std::vector<ZONE*> ZONES;
48typedef std::map<wxString, ENET> NET_MAP;
49typedef NET_MAP::const_iterator NET_MAP_CITER;
50
51
53struct ERULES
54{
56 psElongationLong ( 100 ),
58
59 mvStopFrame ( 1.0 ),
60 mvCreamFrame ( 0.0 ),
61 mlMinStopFrame ( EDA_UNIT_UTILS::Mils2IU( pcbIUScale, 4.0 ) ),
62 mlMaxStopFrame ( EDA_UNIT_UTILS::Mils2IU( pcbIUScale, 4.0 ) ),
63 mlMinCreamFrame ( EDA_UNIT_UTILS::Mils2IU( pcbIUScale, 0.0 ) ),
64 mlMaxCreamFrame ( EDA_UNIT_UTILS::Mils2IU( pcbIUScale, 0.0 ) ),
65
66 psTop ( EPAD::UNDEF ),
67 psBottom ( EPAD::UNDEF ),
68 psFirst ( EPAD::UNDEF ),
69
70 srRoundness ( 0.0 ),
71 srMinRoundness ( EDA_UNIT_UTILS::Mils2IU( pcbIUScale, 0.0 ) ),
72 srMaxRoundness ( EDA_UNIT_UTILS::Mils2IU( pcbIUScale, 0.0 ) ),
73
74 rvPadTop ( 0.25 ),
75 // rvPadBottom ( 0.25 ),
76 rlMinPadTop ( EDA_UNIT_UTILS::Mils2IU( pcbIUScale, 10 ) ),
77 rlMaxPadTop ( EDA_UNIT_UTILS::Mils2IU( pcbIUScale, 20 ) ),
78
79 rvViaOuter ( 0.25 ),
80 rlMinViaOuter ( EDA_UNIT_UTILS::Mils2IU( pcbIUScale, 10 ) ),
81 rlMaxViaOuter ( EDA_UNIT_UTILS::Mils2IU( pcbIUScale, 20 ) ),
82 mdWireWire ( 0 )
83 {}
84
85 void parse( wxXmlNode* aRules, std::function<void()> aCheckpoint );
86
90
92
95
102
103 int psTop;
106
107 double srRoundness;
108
111
114
115 double rvPadTop;
116 // double rvPadBottom; ///< bottom pad size as percent of drill size
117
118 double rlMinPadTop;
119 double rlMaxPadTop;
120
121 double rvViaOuter;
124 double mdWireWire;
125};
126
127
133{
134public:
136 {
137 return IO_BASE::IO_FILE_DESC( _HKI( "Eagle ver. 6.x XML PCB files" ), { "brd" } );
138 }
139
141 {
142 return IO_BASE::IO_FILE_DESC( _HKI( "Eagle ver. 6.x XML library files" ), { "lbr" } );
143 }
144
145 bool CanReadBoard( const wxString& aFileName ) const override;
146 bool CanReadLibrary( const wxString& aFileName ) const override;
147 bool CanReadFootprint( const wxString& aFileName ) const override;
148
149 BOARD* LoadBoard( const wxString& aFileName, BOARD* aAppendToMe,
150 const std::map<std::string, UTF8>* aProperties = nullptr, PROJECT* aProject = nullptr ) override;
151
152 std::vector<FOOTPRINT*> GetImportedCachedLibraryFootprints() override;
153
154 void FootprintEnumerate( wxArrayString& aFootprintNames, const wxString& aLibraryPath,
155 bool aBestEfforts, const std::map<std::string, UTF8>* aProperties = nullptr) override;
156
157 FOOTPRINT* FootprintLoad( const wxString& aLibraryPath, const wxString& aFootprintName,
158 bool aKeepUUID = false,
159 const std::map<std::string, UTF8>* aProperties = nullptr ) override;
160
161 long long GetLibraryTimestamp( const wxString& aLibraryPath ) const override
162 {
163 return getModificationTime( aLibraryPath ).GetValue().GetValue();
164 }
165
166 bool IsLibraryWritable( const wxString& aLibraryPath ) override
167 {
168 return false; // until someone writes others like FootprintSave(), etc.
169 }
170
171 typedef int BIU;
172
173 PCB_IO_EAGLE();
175
186 std::map<wxString, PCB_LAYER_ID> DefaultLayerMappingCallback(
187 const std::vector<INPUT_LAYER_DESC>& aInputLayerDescriptionVector );
188
189private:
191 void init( const std::map<std::string, UTF8>* aProperties );
192
193 bool checkHeader( const wxString& aFileName ) const;
194
195 void checkpoint();
196
197 void clear_cu_map();
198
200 int kicad_y( const ECOORD& y ) const { return -y.ToPcbUnits(); }
201 int kicad_x( const ECOORD& x ) const { return x.ToPcbUnits(); }
202
204 VECTOR2I kicad_fontsize( const ECOORD& d, int aTextThickness ) const;
205
217 void mapEagleLayersToKicad( bool aIsLibraryCache = false );
218
220 PCB_LAYER_ID kicad_layer( int aLayer ) const;
221
239 std::tuple<PCB_LAYER_ID, LSET, bool> defaultKicadLayer( int aEagleLayer,
240 bool aIsLibraryCache = false ) const;
241
243 const wxString& eagle_layer_name( int aLayer ) const;
244
246 int eagle_layer_id( const wxString& aLayerName ) const;
247
248 void setKeepoutSettingsToZone( ZONE* aZone, int aLayer ) const;
249
251 void cacheLib( const wxString& aLibraryPath );
252
254 static wxDateTime getModificationTime( const wxString& aPath );
255
257 int getMinimumCopperLayerCount() const;
258
259 // all these loadXXX() throw IO_ERROR or ptree_error exceptions:
260
261 void loadAllSections( wxXmlNode* aDocument );
262 void loadDesignRules( wxXmlNode* aDesignRules );
263 void loadLayerDefs( wxXmlNode* aLayers );
264 void loadPlain( wxXmlNode* aPlain );
265 void loadClasses( wxXmlNode* aClasses );
266 void loadSignals( wxXmlNode* aSignals );
267
278 void loadLibrary( wxXmlNode* aLib, const wxString* aLibName );
279
280 void loadLibraries( wxXmlNode* aLibs );
281 void loadElements( wxXmlNode* aElements );
282
288 ZONE* loadPolygon( wxXmlNode* aPolyNode );
289
290 void orientFootprintAndText( FOOTPRINT* aFootprint, const EELEMENT& e, const EATTR* aNameAttr,
291 const EATTR* aValueAttr );
292
293 void orientFPText( FOOTPRINT* aFootprint, const EELEMENT& e, PCB_TEXT* aFPText,
294 const EATTR* aAttr );
295
296
298 void centerBoard();
299
303 FOOTPRINT* makeFootprint( wxXmlNode* aPackage, const wxString& aPkgName );
304
305 void packageWire( FOOTPRINT* aFootprint, wxXmlNode* aTree ) const;
306 void packagePad( FOOTPRINT* aFootprint, wxXmlNode* aTree );
307 void packageText( FOOTPRINT* aFootprint, wxXmlNode* aTree ) const;
308 void packageRectangle( FOOTPRINT* aFootprint, wxXmlNode* aTree ) const;
309 void packagePolygon( FOOTPRINT* aFootprint, wxXmlNode* aTree ) const;
310 void packageCircle( FOOTPRINT* aFootprint, wxXmlNode* aTree ) const;
311
317 void packageHole( FOOTPRINT* aFootprint, wxXmlNode* aTree, bool aCenter ) const;
318 void packageSMD( FOOTPRINT* aFootprint, wxXmlNode* aTree ) const;
319
321 void transferPad( const EPAD_COMMON& aEaglePad, PAD* aPad ) const;
322
324 void deleteTemplates();
325
326 typedef std::vector<ELAYER> ELAYERS;
327 typedef ELAYERS::const_iterator EITER;
328
329 int m_cu_map[17];
330 std::map<int, ELAYER> m_eagleLayers;
331 std::map<wxString, int> m_eagleLayersIds;
332 std::map<wxString, PCB_LAYER_ID> m_layer_map;
333
335 std::map<wxString, std::shared_ptr<NETCLASS>> m_classMap;
336
338
342
344
346
347 std::map<wxString, FOOTPRINT*> m_templates;
352
354 unsigned m_doneCount;
356 unsigned m_totalCount;
357
362
363 wxString m_lib_path;
364 wxDateTime m_mod_time;
365};
366
367#endif // PCB_IO_EAGLE_H_
constexpr EDA_IU_SCALE pcbIUScale
Definition: base_units.h:108
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:290
Plugin class for import plugins that support remappable layers.
Definition: pad.h:54
Works with Eagle 6.x XML board files and footprints to implement the Pcbnew #PLUGIN API or a portion ...
Definition: pcb_io_eagle.h:133
const IO_BASE::IO_FILE_DESC GetLibraryDesc() const override
Get the descriptor for the library container that this IO plugin operates on.
Definition: pcb_io_eagle.h:140
std::vector< ELAYER > ELAYERS
Definition: pcb_io_eagle.h:326
void packageSMD(FOOTPRINT *aFootprint, wxXmlNode *aTree) const
Handles common pad properties.
void loadPlain(wxXmlNode *aPlain)
bool IsLibraryWritable(const wxString &aLibraryPath) override
Return true if the library at aLibraryPath is writable.
Definition: pcb_io_eagle.h:166
int m_min_trace
smallest trace we find on Load(), in BIU.
Definition: pcb_io_eagle.h:358
std::map< wxString, PCB_LAYER_ID > m_layer_map
Map of Eagle layers to KiCad layers.
Definition: pcb_io_eagle.h:332
void orientFPText(FOOTPRINT *aFootprint, const EELEMENT &e, PCB_TEXT *aFPText, const EATTR *aAttr)
VECTOR2I kicad_fontsize(const ECOORD &d, int aTextThickness) const
create a font size (fontz) from an eagle font size scalar and KiCad font thickness
std::map< wxString, PCB_LAYER_ID > DefaultLayerMappingCallback(const std::vector< INPUT_LAYER_DESC > &aInputLayerDescriptionVector)
Return the automapped layers.
bool checkHeader(const wxString &aFileName) const
void loadElements(wxXmlNode *aElements)
FOOTPRINT * makeFootprint(wxXmlNode *aPackage, const wxString &aPkgName)
Create a FOOTPRINT from an Eagle package.
int m_min_hole
smallest diameter hole we find on Load(), in BIU.
Definition: pcb_io_eagle.h:359
std::vector< FOOTPRINT * > GetImportedCachedLibraryFootprints() override
Return a container with the cached library footprints generated in the last call to Load.
XPATH * m_xpath
keeps track of what we are working on within XML document during a Load().
Definition: pcb_io_eagle.h:340
unsigned m_totalCount
for progress reporting
Definition: pcb_io_eagle.h:356
void cacheLib(const wxString &aLibraryPath)
This PLUGIN only caches one footprint library, this determines which one.
int m_hole_count
generates unique footprint names from eagle "hole"s.
Definition: pcb_io_eagle.h:343
std::map< wxString, FOOTPRINT * > m_templates
is part of a FOOTPRINT factory that operates using copy construction.
Definition: pcb_io_eagle.h:347
std::map< wxString, int > m_eagleLayersIds
Eagle layer ids stored by layer name.
Definition: pcb_io_eagle.h:331
void mapEagleLayersToKicad(bool aIsLibraryCache=false)
Generate mapping between Eagle and KiCad layers.
std::map< wxString, std::shared_ptr< NETCLASS > > m_classMap
Definition: pcb_io_eagle.h:335
std::tuple< PCB_LAYER_ID, LSET, bool > defaultKicadLayer(int aEagleLayer, bool aIsLibraryCache=false) const
Get the default KiCad layer corresponding to an Eagle layer of the board, a set of sensible layer map...
BOARD * LoadBoard(const wxString &aFileName, BOARD *aAppendToMe, const std::map< std::string, UTF8 > *aProperties=nullptr, PROJECT *aProject=nullptr) override
Load information from some input file format that this PCB_IO implementation knows about into either ...
void loadLibraries(wxXmlNode *aLibs)
void init(const std::map< std::string, UTF8 > *aProperties)
initialize PLUGIN like a constructor would, and futz with fresh BOARD if needed.
FOOTPRINT * FootprintLoad(const wxString &aLibraryPath, const wxString &aFootprintName, bool aKeepUUID=false, const std::map< std::string, UTF8 > *aProperties=nullptr) override
Load a footprint having aFootprintName from the aLibraryPath containing a library format that this PC...
int eagle_layer_id(const wxString &aLayerName) const
Get Eagle layer number by its name.
void loadAllSections(wxXmlNode *aDocument)
bool CanReadFootprint(const wxString &aFileName) const override
Checks if this PCB_IO can read a footprint from specified file or directory.
void packageWire(FOOTPRINT *aFootprint, wxXmlNode *aTree) const
bool CanReadBoard(const wxString &aFileName) const override
Checks if this PCB_IO can read the specified board file.
const wxString & eagle_layer_name(int aLayer) const
Get Eagle layer name by its number.
ELAYERS::const_iterator EITER
Definition: pcb_io_eagle.h:327
void packageRectangle(FOOTPRINT *aFootprint, wxXmlNode *aTree) const
int kicad_y(const ECOORD &y) const
Convert an Eagle distance to a KiCad distance.
Definition: pcb_io_eagle.h:200
void loadClasses(wxXmlNode *aClasses)
std::map< int, ELAYER > m_eagleLayers
Eagle layer data stored by layer number.
Definition: pcb_io_eagle.h:330
wxString m_customRules
Definition: pcb_io_eagle.h:337
NET_MAP m_pads_to_nets
net list
Definition: pcb_io_eagle.h:345
void packageText(FOOTPRINT *aFootprint, wxXmlNode *aTree) const
int getMinimumCopperLayerCount() const
Determines the minimum copper layer stackup count that includes all mapped layers.
void packageHole(FOOTPRINT *aFootprint, wxXmlNode *aTree, bool aCenter) const
void packagePolygon(FOOTPRINT *aFootprint, wxXmlNode *aTree) const
void centerBoard()
move the BOARD into the center of the page
unsigned m_lastProgressCount
Definition: pcb_io_eagle.h:355
int m_cu_map[17]
map eagle to KiCad, cu layers only.
Definition: pcb_io_eagle.h:329
ZONE * loadPolygon(wxXmlNode *aPolyNode)
Load a copper or keepout polygon and adds it to the board.
int m_min_via
smallest via we find on Load(), in BIU.
Definition: pcb_io_eagle.h:360
bool CanReadLibrary(const wxString &aFileName) const override
Checks if this IO object can read the specified library file/directory.
void clear_cu_map()
void packageCircle(FOOTPRINT *aFootprint, wxXmlNode *aTree) const
void loadLibrary(wxXmlNode *aLib, const wxString *aLibName)
Load the Eagle "library" XML element, which can occur either under a "libraries" element (if a *....
void packagePad(FOOTPRINT *aFootprint, wxXmlNode *aTree)
void loadSignals(wxXmlNode *aSignals)
ERULES * m_rules
Eagle design rules.
Definition: pcb_io_eagle.h:339
wxDateTime m_mod_time
Definition: pcb_io_eagle.h:364
PCB_LAYER_ID kicad_layer(int aLayer) const
Convert an Eagle layer to a KiCad layer.
void orientFootprintAndText(FOOTPRINT *aFootprint, const EELEMENT &e, const EATTR *aNameAttr, const EATTR *aValueAttr)
static wxDateTime getModificationTime(const wxString &aPath)
get a file's or dir's modification time.
long long GetLibraryTimestamp(const wxString &aLibraryPath) const override
Generate a timestamp representing all the files in the library (including the library directory).
Definition: pcb_io_eagle.h:161
int m_min_annulus
smallest via annulus we find on Load(), in BIU.
Definition: pcb_io_eagle.h:361
void loadLayerDefs(wxXmlNode *aLayers)
void FootprintEnumerate(wxArrayString &aFootprintNames, const wxString &aLibraryPath, bool aBestEfforts, const std::map< std::string, UTF8 > *aProperties=nullptr) override
Return a list of footprint names contained within the library at aLibraryPath.
const IO_BASE::IO_FILE_DESC GetBoardFileDesc() const override
Returns board file description for the PCB_IO.
Definition: pcb_io_eagle.h:135
void setKeepoutSettingsToZone(ZONE *aZone, int aLayer) const
void transferPad(const EPAD_COMMON &aEaglePad, PAD *aPad) const
Deletes the footprint templates list.
void deleteTemplates()
int kicad_x(const ECOORD &x) const
Definition: pcb_io_eagle.h:201
void loadDesignRules(wxXmlNode *aDesignRules)
PROGRESS_REPORTER * m_progressReporter
optional; may be nullptr
Definition: pcb_io_eagle.h:353
unsigned m_doneCount
Definition: pcb_io_eagle.h:354
wxString m_lib_path
Definition: pcb_io_eagle.h:363
A base class that BOARD loading and saving plugins should derive from.
Definition: pcb_io.h:71
A progress reporter interface for use in multi-threaded environments.
Container for project specific data.
Definition: project.h:64
Keep track of what we are working on within a PTREE.
Definition: eagle_parser.h:124
Handle a list of polygons defining a copper zone.
Definition: zone.h:73
#define _HKI(x)
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:60
std::vector< ZONE * > ZONES
Definition: pcb_io_eagle.h:47
NET_MAP::const_iterator NET_MAP_CITER
Definition: pcb_io_eagle.h:49
std::map< wxString, FOOTPRINT * > FOOTPRINT_MAP
Definition: pcb_io_eagle.h:46
std::map< wxString, ENET > NET_MAP
Definition: pcb_io_eagle.h:48
Parse an Eagle "attribute" XML element.
Definition: eagle_parser.h:793
int ToPcbUnits() const
Definition: eagle_parser.h:489
Eagle element element.
Structure holding common properties for through-hole and SMD pads.
Definition: eagle_parser.h:985
Eagle thru hole pad.
Definition: eagle_parser.h:998
subset of eagle.drawing.board.designrules in the XML document
Definition: pcb_io_eagle.h:54
int psBottom
Shape of the bottom pads.
Definition: pcb_io_eagle.h:104
int psElongationLong
Definition: pcb_io_eagle.h:89
double mvStopFrame
solderpaste mask, expressed as percentage of the smaller pad/via dimension
Definition: pcb_io_eagle.h:94
double srRoundness
corner rounding ratio for SMD pads (percentage)
Definition: pcb_io_eagle.h:107
double rlMinViaOuter
minimum copper annulus on via
Definition: pcb_io_eagle.h:122
int mlMaxCreamFrame
solder paste mask, maximum size (Eagle mils, here nanometers)
Definition: pcb_io_eagle.h:101
int mlMinCreamFrame
solder paste mask, minimum size (Eagle mils, here nanometers)
Definition: pcb_io_eagle.h:100
int psTop
Shape of the top pads.
Definition: pcb_io_eagle.h:103
double rlMaxViaOuter
maximum copper annulus on via
Definition: pcb_io_eagle.h:123
void parse(wxXmlNode *aRules, std::function< void()> aCheckpoint)
percent over 100%.
double mdWireWire
wire to wire spacing I presume.
Definition: pcb_io_eagle.h:124
double rvPadTop
top pad size as percent of drill size
Definition: pcb_io_eagle.h:115
int srMaxRoundness
Definition: pcb_io_eagle.h:113
double rvViaOuter
copper annulus is this percent of via hole
Definition: pcb_io_eagle.h:121
double rlMinPadTop
minimum copper annulus on through hole pads
Definition: pcb_io_eagle.h:118
double mvCreamFrame
Definition: pcb_io_eagle.h:97
int psElongationOffset
the offset of the hole within the "long" pad.
Definition: pcb_io_eagle.h:91
int mlMinStopFrame
solder mask, minimum size (Eagle mils, here nanometers)
Definition: pcb_io_eagle.h:98
int srMinRoundness
corner rounding radius, maximum size (Eagle mils, here nanometers)
Definition: pcb_io_eagle.h:110
int mlMaxStopFrame
solder mask, maximum size (Eagle mils, here nanometers)
Definition: pcb_io_eagle.h:99
double rlMaxPadTop
maximum copper annulus on through hole pads
Definition: pcb_io_eagle.h:119
int psFirst
Shape of the first pads.
Definition: pcb_io_eagle.h:105
Container that describes file type info.
Definition: io_base.h:43