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 The 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 bool IsLibraryWritable( const wxString& aLibraryPath ) override
164 {
165 return false; // until someone writes others like FootprintSave(), etc.
166 }
167
168 typedef int BIU;
169
170 PCB_IO_EAGLE();
172
183 std::map<wxString, PCB_LAYER_ID> DefaultLayerMappingCallback(
184 const std::vector<INPUT_LAYER_DESC>& aInputLayerDescriptionVector );
185
186private:
188 void init( const std::map<std::string, UTF8>* aProperties );
189
190 bool checkHeader( const wxString& aFileName ) const;
191
192 void checkpoint();
193
194 void clear_cu_map();
195
197 int kicad_y( const ECOORD& y ) const { return -y.ToPcbUnits(); }
198 int kicad_x( const ECOORD& x ) const { return x.ToPcbUnits(); }
199
201 VECTOR2I kicad_fontsize( const ECOORD& d, int aTextThickness ) const;
202
214 void mapEagleLayersToKicad( bool aIsLibraryCache = false );
215
217 PCB_LAYER_ID kicad_layer( int aLayer ) const;
218
236 std::tuple<PCB_LAYER_ID, LSET, bool> defaultKicadLayer( int aEagleLayer,
237 bool aIsLibraryCache = false ) const;
238
240 const wxString& eagle_layer_name( int aLayer ) const;
241
243 int eagle_layer_id( const wxString& aLayerName ) const;
244
245 void setKeepoutSettingsToZone( ZONE* aZone, int aLayer ) const;
246
248 void cacheLib( const wxString& aLibraryPath );
249
251 static wxDateTime getModificationTime( const wxString& aPath );
252
254 int getMinimumCopperLayerCount() const;
255
256 // all these loadXXX() throw IO_ERROR or ptree_error exceptions:
257
258 void loadAllSections( wxXmlNode* aDocument );
259 void loadDesignRules( wxXmlNode* aDesignRules );
260 void loadLayerDefs( wxXmlNode* aLayers );
261 void loadPlain( wxXmlNode* aPlain );
262 void loadClasses( wxXmlNode* aClasses );
263 void loadSignals( wxXmlNode* aSignals );
264
275 void loadLibrary( wxXmlNode* aLib, const wxString* aLibName );
276
277 void loadLibraries( wxXmlNode* aLibs );
278 void loadElements( wxXmlNode* aElements );
279
285 ZONE* loadPolygon( wxXmlNode* aPolyNode );
286
287 void orientFootprintAndText( FOOTPRINT* aFootprint, const EELEMENT& e, const EATTR* aNameAttr,
288 const EATTR* aValueAttr );
289
290 void orientFPText( FOOTPRINT* aFootprint, const EELEMENT& e, PCB_TEXT* aFPText,
291 const EATTR* aAttr );
292
293
295 void centerBoard();
296
300 FOOTPRINT* makeFootprint( wxXmlNode* aPackage, const wxString& aPkgName );
301
302 void packageWire( FOOTPRINT* aFootprint, wxXmlNode* aTree ) const;
303 void packagePad( FOOTPRINT* aFootprint, wxXmlNode* aTree );
304 void packageText( FOOTPRINT* aFootprint, wxXmlNode* aTree ) const;
305 void packageRectangle( FOOTPRINT* aFootprint, wxXmlNode* aTree ) const;
306 void packagePolygon( FOOTPRINT* aFootprint, wxXmlNode* aTree ) const;
307 void packageCircle( FOOTPRINT* aFootprint, wxXmlNode* aTree ) const;
308
314 void packageHole( FOOTPRINT* aFootprint, wxXmlNode* aTree, bool aCenter ) const;
315 void packageSMD( FOOTPRINT* aFootprint, wxXmlNode* aTree ) const;
316
318 void transferPad( const EPAD_COMMON& aEaglePad, PAD* aPad ) const;
319
321 void deleteTemplates();
322
323 typedef std::vector<ELAYER> ELAYERS;
324 typedef ELAYERS::const_iterator EITER;
325
326 int m_cu_map[17];
327 std::map<int, ELAYER> m_eagleLayers;
328 std::map<wxString, int> m_eagleLayersIds;
329 std::map<wxString, PCB_LAYER_ID> m_layer_map;
330
332 std::map<wxString, std::shared_ptr<NETCLASS>> m_classMap;
333
335
339
341
343
344 std::map<wxString, FOOTPRINT*> m_templates;
349
351 unsigned m_doneCount;
353 unsigned m_totalCount;
354
359
360 wxString m_lib_path;
361 long long m_timestamp;
362};
363
364#endif // PCB_IO_EAGLE_H_
constexpr EDA_IU_SCALE pcbIUScale
Definition base_units.h:112
Information pertinent to a Pcbnew printed circuit board.
Definition board.h:317
Plugin class for import plugins that support remappable layers.
Definition pad.h:54
const IO_BASE::IO_FILE_DESC GetLibraryDesc() const override
Get the descriptor for the library container that this IO plugin operates on.
static wxDateTime getModificationTime(const wxString &aPath)
get a file's or dir's modification time.
std::vector< ELAYER > ELAYERS
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.
int m_min_trace
smallest trace we find on Load(), in BIU.
std::map< wxString, PCB_LAYER_ID > m_layer_map
Map of Eagle layers to KiCad layers.
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.
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().
unsigned m_totalCount
for progress reporting
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.
std::map< wxString, FOOTPRINT * > m_templates
is part of a FOOTPRINT factory that operates using copy construction.
std::map< wxString, int > m_eagleLayersIds
Eagle layer ids stored by layer name.
void mapEagleLayersToKicad(bool aIsLibraryCache=false)
Generate mapping between Eagle and KiCad layers.
std::map< wxString, std::shared_ptr< NETCLASS > > m_classMap
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
long long m_timestamp
void packageRectangle(FOOTPRINT *aFootprint, wxXmlNode *aTree) const
int kicad_y(const ECOORD &y) const
Convert an Eagle distance to a KiCad distance.
void loadClasses(wxXmlNode *aClasses)
std::map< int, ELAYER > m_eagleLayers
Eagle layer data stored by layer number.
wxString m_customRules
NET_MAP m_pads_to_nets
net list
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
int m_cu_map[17]
map eagle to KiCad, cu layers only.
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.
bool CanReadLibrary(const wxString &aFileName) const override
Checks if this IO object can read the specified library file/directory.
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.
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)
long long GetLibraryTimestamp(const wxString &aLibraryPath) const override
Generate a timestamp representing all the files in the library (including the library directory).
int m_min_annulus
smallest via annulus we find on Load(), in BIU.
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.
void setKeepoutSettingsToZone(ZONE *aZone, int aLayer) const
void transferPad(const EPAD_COMMON &aEaglePad, PAD *aPad) const
Deletes the footprint templates list.
int kicad_x(const ECOORD &x) const
void loadDesignRules(wxXmlNode *aDesignRules)
PROGRESS_REPORTER * m_progressReporter
optional; may be nullptr
unsigned m_doneCount
wxString m_lib_path
PCB_IO(const wxString &aName)
Definition pcb_io.h:318
A progress reporter interface for use in multi-threaded environments.
Container for project specific data.
Definition project.h:65
Keep track of what we are working on within a PTREE.
Handle a list of polygons defining a copper zone.
Definition zone.h:74
std::unordered_map< NET_NAME_CODE_CACHE_KEY, std::vector< CONNECTION_SUBGRAPH * > > NET_MAP
Associate a #NET_CODE_NAME with all the subgraphs in that net.
PCB_LAYER_ID
A quick note on layer IDs:
Definition layer_ids.h:60
#define _HKI(x)
Definition page_info.cpp:44
std::vector< ZONE * > ZONES
NET_MAP::const_iterator NET_MAP_CITER
std::map< wxString, FOOTPRINT * > FOOTPRINT_MAP
std::map< wxString, ENET > NET_MAP
Parse an Eagle "attribute" XML element.
int ToPcbUnits() const
Eagle element element.
Structure holding common properties for through-hole and SMD pads.
Eagle thru hole pad.
subset of eagle.drawing.board.designrules in the XML document
int psBottom
Shape of the bottom pads.
int psElongationLong
double mvStopFrame
solderpaste mask, expressed as percentage of the smaller pad/via dimension
double srRoundness
corner rounding ratio for SMD pads (percentage)
double rlMinViaOuter
minimum copper annulus on via
int mlMaxCreamFrame
solder paste mask, maximum size (Eagle mils, here nanometers)
int mlMinCreamFrame
solder paste mask, minimum size (Eagle mils, here nanometers)
int psTop
Shape of the top pads.
double rlMaxViaOuter
maximum copper annulus on via
void parse(wxXmlNode *aRules, std::function< void()> aCheckpoint)
percent over 100%.
double mdWireWire
wire to wire spacing I presume.
double rvPadTop
top pad size as percent of drill size
int srMaxRoundness
double rvViaOuter
copper annulus is this percent of via hole
double rlMinPadTop
minimum copper annulus on through hole pads
double mvCreamFrame
int psElongationOffset
the offset of the hole within the "long" pad.
int mlMinStopFrame
solder mask, minimum size (Eagle mils, here nanometers)
int srMinRoundness
corner rounding radius, maximum size (Eagle mils, here nanometers)
int mlMaxStopFrame
solder mask, maximum size (Eagle mils, here nanometers)
double rlMaxPadTop
maximum copper annulus on through hole pads
int psFirst
Shape of the first pads.
Container that describes file type info.
Definition io_base.h:43
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:695