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, see <https://www.gnu.org/licenses/>.
19 */
20
21#ifndef PCB_IO_EAGLE_H_
22#define PCB_IO_EAGLE_H_
23
25#include <pcb_io/pcb_io.h>
26#include <pcb_io/pcb_io_mgr.h>
28
29#include <eda_units.h>
30#include <layer_ids.h>
31#include <lset.h>
32#include <netclass.h>
33
34#include <map>
35#include <tuple>
36#include <wx/xml/xml.h>
37
38class PAD;
39class PCB_TEXT;
40class ZONE;
41
42typedef std::map<wxString, FOOTPRINT*> FOOTPRINT_MAP;
43typedef std::vector<ZONE*> ZONES;
44typedef std::map<wxString, ENET> NET_MAP;
45typedef NET_MAP::const_iterator NET_MAP_CITER;
46
47
49struct ERULES
50{
52 psElongationLong ( 100 ),
54
55 mvStopFrame ( 1.0 ),
56 mvCreamFrame ( 0.0 ),
57 mlMinStopFrame ( EDA_UNIT_UTILS::Mils2IU( pcbIUScale, 4.0 ) ),
58 mlMaxStopFrame ( EDA_UNIT_UTILS::Mils2IU( pcbIUScale, 4.0 ) ),
59 mlMinCreamFrame ( EDA_UNIT_UTILS::Mils2IU( pcbIUScale, 0.0 ) ),
60 mlMaxCreamFrame ( EDA_UNIT_UTILS::Mils2IU( pcbIUScale, 0.0 ) ),
61
62 psTop ( EPAD::UNDEF ),
63 psBottom ( EPAD::UNDEF ),
64 psFirst ( EPAD::UNDEF ),
65
66 srRoundness ( 0.0 ),
67 srMinRoundness ( EDA_UNIT_UTILS::Mils2IU( pcbIUScale, 0.0 ) ),
68 srMaxRoundness ( EDA_UNIT_UTILS::Mils2IU( pcbIUScale, 0.0 ) ),
69
70 rvPadTop ( 0.25 ),
71 // rvPadBottom ( 0.25 ),
72 rlMinPadTop ( EDA_UNIT_UTILS::Mils2IU( pcbIUScale, 10 ) ),
73 rlMaxPadTop ( EDA_UNIT_UTILS::Mils2IU( pcbIUScale, 20 ) ),
74
75 rvViaOuter ( 0.25 ),
76 rlMinViaOuter ( EDA_UNIT_UTILS::Mils2IU( pcbIUScale, 10 ) ),
77 rlMaxViaOuter ( EDA_UNIT_UTILS::Mils2IU( pcbIUScale, 20 ) ),
78 mdWireWire ( 0 )
79 {}
80
81 void parse( wxXmlNode* aRules, std::function<void()> aCheckpoint );
82
86
88
91
98
99 int psTop;
102
103 double srRoundness;
104
107
110
111 double rvPadTop;
112 // double rvPadBottom; ///< bottom pad size as percent of drill size
113
114 double rlMinPadTop;
115 double rlMaxPadTop;
116
117 double rvViaOuter;
120 double mdWireWire;
121};
122
123
129{
130public:
132 {
133 return IO_BASE::IO_FILE_DESC( _HKI( "Eagle PCB files (6.x XML and pre-v6 binary)" ),
134 { "brd" } );
135 }
136
138 {
139 return IO_BASE::IO_FILE_DESC( _HKI( "Eagle ver. 6.x XML library files" ), { "lbr" } );
140 }
141
142 bool CanReadBoard( const wxString& aFileName ) const override;
143 bool CanReadLibrary( const wxString& aFileName ) const override;
144 bool CanReadFootprint( const wxString& aFileName ) const override;
145
146 BOARD* LoadBoard( const wxString& aFileName, BOARD* aAppendToMe,
147 const std::map<std::string, UTF8>* aProperties = nullptr, PROJECT* aProject = nullptr ) override;
148
149 std::vector<FOOTPRINT*> GetImportedCachedLibraryFootprints() override;
150
151 void FootprintEnumerate( wxArrayString& aFootprintNames, const wxString& aLibraryPath,
152 bool aBestEfforts, const std::map<std::string, UTF8>* aProperties = nullptr) override;
153
154 FOOTPRINT* FootprintLoad( const wxString& aLibraryPath, const wxString& aFootprintName,
155 bool aKeepUUID = false,
156 const std::map<std::string, UTF8>* aProperties = nullptr ) override;
157
158 long long GetLibraryTimestamp( const wxString& aLibraryPath ) const override;
159
160 bool IsLibraryWritable( const wxString& aLibraryPath ) override
161 {
162 return false; // until someone writes others like FootprintSave(), etc.
163 }
164
165 typedef int BIU;
166
167 PCB_IO_EAGLE();
169
180 std::map<wxString, PCB_LAYER_ID> DefaultLayerMappingCallback(
181 const std::vector<INPUT_LAYER_DESC>& aInputLayerDescriptionVector );
182
183private:
185 void init( const std::map<std::string, UTF8>* aProperties );
186
187 bool checkHeader( const wxString& aFileName ) const;
188
189 void checkpoint();
190
191 void clear_cu_map();
192
194 int kicad_y( const ECOORD& y ) const { return -y.ToPcbUnits(); }
195 int kicad_x( const ECOORD& x ) const { return x.ToPcbUnits(); }
196
198 VECTOR2I kicad_fontsize( const ECOORD& d, int aTextThickness ) const;
199
211 void mapEagleLayersToKicad( bool aIsLibraryCache = false );
212
214 PCB_LAYER_ID kicad_layer( int aLayer ) const;
215
233 std::tuple<PCB_LAYER_ID, LSET, bool> defaultKicadLayer( int aEagleLayer,
234 bool aIsLibraryCache = false ) const;
235
237 const wxString& eagle_layer_name( int aLayer ) const;
238
240 int eagle_layer_id( const wxString& aLayerName ) const;
241
242 void setKeepoutSettingsToZone( ZONE* aZone, int aLayer ) const;
243
245 void cacheLib( const wxString& aLibraryPath );
246
248 static wxDateTime getModificationTime( const wxString& aPath );
249
251 int getMinimumCopperLayerCount() const;
252
253 // all these loadXXX() throw IO_ERROR or ptree_error exceptions:
254
255 void loadAllSections( wxXmlNode* aDocument );
256 void loadDesignRules( wxXmlNode* aDesignRules );
257 void loadLayerDefs( wxXmlNode* aLayers );
258 void loadPlain( wxXmlNode* aPlain );
259 void loadClasses( wxXmlNode* aClasses );
260 void loadSignals( wxXmlNode* aSignals );
261
272 void loadLibrary( wxXmlNode* aLib, const wxString* aLibName );
273
274 void loadLibraries( wxXmlNode* aLibs );
275 void loadElements( wxXmlNode* aElements );
276
282 ZONE* loadPolygon( wxXmlNode* aPolyNode );
283
284 void orientFootprintAndText( FOOTPRINT* aFootprint, const EELEMENT& e, const EATTR* aNameAttr,
285 const EATTR* aValueAttr );
286
287 void orientFPText( FOOTPRINT* aFootprint, const EELEMENT& e, PCB_TEXT* aFPText,
288 const EATTR* aAttr );
289
290
292 void centerBoard();
293
297 FOOTPRINT* makeFootprint( wxXmlNode* aPackage, const wxString& aPkgName );
298
299 void packageWire( FOOTPRINT* aFootprint, wxXmlNode* aTree ) const;
300 void packagePad( FOOTPRINT* aFootprint, wxXmlNode* aTree );
301 void packageText( FOOTPRINT* aFootprint, wxXmlNode* aTree ) const;
302 void packageRectangle( FOOTPRINT* aFootprint, wxXmlNode* aTree ) const;
303 void packagePolygon( FOOTPRINT* aFootprint, wxXmlNode* aTree ) const;
304 void packageCircle( FOOTPRINT* aFootprint, wxXmlNode* aTree ) const;
305
311 void packageHole( FOOTPRINT* aFootprint, wxXmlNode* aTree, bool aCenter ) const;
312 void packageSMD( FOOTPRINT* aFootprint, wxXmlNode* aTree ) const;
313
315 void transferPad( const EPAD_COMMON& aEaglePad, PAD* aPad ) const;
316
318 void deleteTemplates();
319
320 typedef std::vector<ELAYER> ELAYERS;
321 typedef ELAYERS::const_iterator EITER;
322
323 int m_cu_map[17];
324 std::map<int, ELAYER> m_eagleLayers;
325 std::map<wxString, int> m_eagleLayersIds;
326 std::map<wxString, PCB_LAYER_ID> m_layer_map;
327
329 std::map<wxString, std::shared_ptr<NETCLASS>> m_classMap;
330
332
336
338
340
341 std::map<wxString, FOOTPRINT*> m_templates;
346
348 unsigned m_doneCount;
350 unsigned m_totalCount;
351
356
357 wxString m_lib_path;
358 long long m_timestamp;
359};
360
361#endif // PCB_IO_EAGLE_H_
constexpr EDA_IU_SCALE pcbIUScale
Definition base_units.h:121
Information pertinent to a Pcbnew printed circuit board.
Definition board.h:372
Plugin class for import plugins that support remappable layers.
Definition pad.h:61
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:342
A progress reporter interface for use in multi-threaded environments.
Container for project specific data.
Definition project.h:62
Keep track of what we are working on within a PTREE.
Handle a list of polygons defining a copper zone.
Definition zone.h:70
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:56
#define _HKI(x)
Definition page_info.cpp:40
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:683