KiCad PCB EDA Suite
Loading...
Searching...
No Matches
odb_util.h
Go to the documentation of this file.
1#ifndef _ODB_UTIL_H_
2#define _ODB_UTIL_H_
3
4#include <map>
5#include <set>
6#include <optional>
7#include <iostream>
8#include <fstream>
9#include <vector>
10#include <string>
11#include <tuple>
12#include <layer_ids.h>
13#include <padstack.h>
14#include <base_units.h>
15#include <drill/drill_span.h>
18#include <wx/string.h>
19#include "pcb_shape.h"
20#include <wx/filename.h>
21
22
28
29namespace ODB
30{
31std::vector<wxString> UniqueNames( const std::vector<wxString>& aBases, const std::set<wxString>& aReserved,
32 size_t aMaxLength );
33
35{
36 static VARIANT_NAMES Build( const std::vector<wxString>& aNames );
37
38 wxString LegalName( const wxString& aName ) const;
39 wxString SelectedName( const wxString& aName ) const;
40 wxString Join( const std::vector<wxString>& aNames ) const;
41
42 std::vector<std::pair<wxString, wxString>> m_names;
43 std::vector<wxString> m_renamed;
44 bool m_listsFit = true;
45};
46} // namespace ODB
47
50{
51 bool m_inch = false;
52 int m_precision = 6;
54 std::optional<wxString> m_variant;
55 wxString m_mpnField;
58 bool m_anonymizeNets = false;
59 bool m_boardMetadata = true;
61 std::optional<FAB::SECTION_SET> m_sections;
62 std::vector<ODB_LAYER_OVERRIDE> m_layerOverrides;
63};
64
66{
67 // Internal units to output units for data values
68 double m_scale = 1.0 / PCB_IU_PER_MM;
69 // Internal units to thousandths of output units for symbols and drills
70 // This scale is 1000x m_scale
72 int m_sigfig = 6;
73 std::string m_unitsStr = "MM";
74 wxString m_variantName;
76 wxString m_mpnField;
78 bool m_anonymizeNets = false;
79 bool m_writeEdaNets = true;
80 bool m_boardMetadata = true;
81 std::optional<FAB::SECTION_SET> m_sections;
82 std::vector<ODB_LAYER_OVERRIDE> m_layerOverrides;
84
85 bool Includes( FAB::SECTION aSection ) const
86 {
87 return !m_sections || m_sections->Contains( aSection );
88 }
89};
90
91enum class ODB_CONTEXT
92{
95};
96
103
122
136
143
152
153using ODB_AUX_LAYER_KEY = std::tuple<ODB_AUX_LAYER_TYPE, PCB_LAYER_ID, PCB_LAYER_ID>;
154
164
165class PCB_VIA;
166struct DRILL_OPERATION;
167
168namespace ODB
169{
170int IpcViaType( const DRILL_OPERATION& aOperation, bool aTop );
171bool ViaInPad( const PCB_VIA& aVia );
172
174std::vector<ODB_TYPE> OverridableLayerTypes( PCB_LAYER_ID aLayer );
175
176wxString GenODBString( const wxString& aStr );
177
178wxString GenLegalNetName( const wxString& aStr );
179
180wxString GenLegalComponentName( const wxString& aStr );
181
182wxString GenLegalEntityName( const wxString& aStr );
183
184void RemoveWhitespace( wxString& aStr );
185
186wxString Double2String( const ODB_FORMAT& aFormat, double aVal );
187
188std::string Double2String( double aVal, int32_t aDigits );
189
190wxString Data2String( const ODB_FORMAT& aFormat, double aVal );
191
192wxString SymDouble2String( const ODB_FORMAT& aFormat, double aVal );
193
194std::pair<wxString, wxString> AddXY( const ODB_FORMAT& aFormat, const VECTOR2I& aVec );
195std::pair<wxString, wxString> AddRelativeXY( const ODB_FORMAT& aFormat, const VECTOR2I& aVec );
196
197VECTOR2I GetShapePosition( const PCB_SHAPE& aShape );
198
199template <typename T>
201{
202public:
203 static std::map<T, std::string>& GetMap()
204 {
205 static_assert( std::is_enum_v<T>, "Template parameter T must be an enum type" );
206
207 static std::map<T, std::string> map = []()
208 {
209 std::map<T, std::string> result;
210
211 if constexpr( std::is_same_v<T, ODB_POLARITY> )
212 {
213 result[ODB_POLARITY::POSITIVE] = "POSITIVE";
214 result[ODB_POLARITY::NEGATIVE] = "NEGATIVE";
215 }
216
217 if constexpr( std::is_same_v<T, ODB_CONTEXT> )
218 {
219 result[ODB_CONTEXT::BOARD] = "BOARD";
220 result[ODB_CONTEXT::MISC] = "MISC";
221 }
222
223 if constexpr( std::is_same_v<T, ODB_TYPE> )
224 {
225 //just for logical reasons.TYPE field must be defined.
227
228 result[ODB_TYPE::SIGNAL] = "SIGNAL";
229 result[ODB_TYPE::POWER_GROUND] = "POWER_GROUND";
230 result[ODB_TYPE::DIELECTRIC] = "DIELECTRIC";
231 result[ODB_TYPE::MIXED] = "MIXED";
232 result[ODB_TYPE::SOLDER_MASK] = "SOLDER_MASK";
233 result[ODB_TYPE::SOLDER_PASTE] = "SOLDER_PASTE";
234 result[ODB_TYPE::SILK_SCREEN] = "SILK_SCREEN";
235 result[ODB_TYPE::DRILL] = "DRILL";
236 result[ODB_TYPE::ROUT] = "ROUT";
237 result[ODB_TYPE::DOCUMENT] = "DOCUMENT";
238 result[ODB_TYPE::COMPONENT] = "COMPONENT";
239 result[ODB_TYPE::MASK] = "MASK";
240 result[ODB_TYPE::CONDUCTIVE_PASTE] = "CONDUCTIVE_PASTE";
241 }
242
243 if constexpr( std::is_same_v<T, ODB_SUBTYPE> )
244 {
245 result[ODB_SUBTYPE::COVERLAY] = "COVERLAY";
246 result[ODB_SUBTYPE::COVERCOAT] = "COVERCOAT";
247 result[ODB_SUBTYPE::STIFFENER] = "STIFFENER";
248 result[ODB_SUBTYPE::BEND_AREA] = "BEND_AREA";
249 result[ODB_SUBTYPE::FLEX_AREA] = "FLEX_AREA";
250 result[ODB_SUBTYPE::RIGID_AREA] = "RIGID_AREA";
251 result[ODB_SUBTYPE::PSA] = "PSA";
252 result[ODB_SUBTYPE::SILVER_MASK] = "SILVER_MASK";
253 result[ODB_SUBTYPE::CARBON_MASK] = "CARBON_MASK";
254 result[ODB_SUBTYPE::BACKDRILL] = "BACKDRILL";
255 }
256
257 if constexpr( std::is_same_v<T, ODB_DIELECTRIC_TYPE> )
258 {
262 }
263
264 if constexpr( std::is_same_v<T, ODB_FID_TYPE> )
265 {
269 }
270
271 return result;
272 }();
273
274 return map;
275 }
276};
277
278template <typename T>
279std::string Enum2String( T value )
280{
281 const auto& map = EnumStringMap<T>::GetMap();
282 auto it = map.find( value );
283 if( it != map.end() )
284 {
285 return it->second;
286 }
287 else
288 {
289 throw std::out_of_range( "Enum value not found in map" );
290 }
291}
292
294{
295public:
297 {
298 if( first )
299 {
300 first = false;
301 return true;
302 }
303 return false;
304 }
305
306private:
307 bool first = true;
308};
309
310} // namespace ODB
311
312class ODB_TREE_WRITER;
314{
315public:
316 ODB_FILE_WRITER( ODB_TREE_WRITER& aTreeWriter, const wxString& aFileName );
317
319
322
325
326 void CreateODBFile( const wxString& aFileName );
327 bool CloseFile();
328 inline std::ostream& GetStream() { return m_ostream; }
329
330private:
332 std::ofstream m_ostream;
333};
334
335
337{
338public:
339 ODB_TREE_WRITER( const wxString& aDir ) : m_currentPath( aDir ) {}
340
341 ODB_TREE_WRITER( const wxString& aPareDir, const wxString& aSubDir )
342 {
343 CreateEntityDirectory( aPareDir, aSubDir );
344 }
345
346 virtual ~ODB_TREE_WRITER() {}
347
348 [[nodiscard]] ODB_FILE_WRITER CreateFileProxy( const wxString& aFileName )
349 {
350 return ODB_FILE_WRITER( *this, aFileName );
351 }
352
353 void CreateEntityDirectory( const wxString& aPareDir, const wxString& aSubDir = wxEmptyString );
354
355 inline const wxString GetCurrentPath() const { return m_currentPath; }
356
357 inline void SetCurrentPath( const wxString& aDir ) { m_currentPath = aDir; }
358
359 inline void SetRootPath( const wxString& aDir ) { m_rootPath = aDir; }
360
361 inline const wxString GetRootPath() const { return m_rootPath; }
362
363
364private:
366 wxString m_rootPath;
367};
368
369
371{
372public:
373 ODB_TEXT_WRITER( std::ostream& aStream ) : m_ostream( aStream ) {}
374 virtual ~ODB_TEXT_WRITER() {}
375
376 // void WriteEquationLine( const std::string &var, const std::string &value );
377 void WriteEquationLine( const std::string& var, int value );
378 void WriteEquationLine( const wxString& var, const wxString& value );
379 template <typename T>
380 void write_line_enum( const std::string& var, const T& value )
381 {
382 WriteEquationLine( var, ODB::Enum2String( value ) );
383 }
384
386 {
388
389 public:
390 ~ARRAY_PROXY();
391
392 private:
393 ARRAY_PROXY( ODB_TEXT_WRITER& aWriter, const std::string& aStr );
394
396
398
400
401 ARRAY_PROXY( ARRAY_PROXY const& ) = delete;
402
403 ARRAY_PROXY& operator=( ARRAY_PROXY const& ) = delete;
404 };
405
406 [[nodiscard]] ARRAY_PROXY MakeArrayProxy( const std::string& aStr )
407 {
408 return ARRAY_PROXY( *this, aStr );
409 }
410
411private:
412 void WriteIndent();
413
414 void BeginArray( const std::string& a );
415
416 void EndArray();
417
418 std::ostream& m_ostream;
419 bool in_array = false;
420};
421
422
424{
425public:
426 struct TOOLS
427 {
428 uint32_t m_num;
429 wxString m_type;
430 wxString m_type2 = wxT( "STANDARD" );
431 uint32_t m_minTol;
432 uint32_t m_maxTol;
433 wxString m_bit = wxEmptyString;
434 wxString m_finishSize;
435 wxString m_drillSize;
436
437 TOOLS() : m_num( 0 ), m_minTol( 0 ), m_maxTol( 0 ) {}
438 };
439
440 ODB_DRILL_TOOLS( const wxString& aUnits, const wxString& aThickness = "0",
441 const wxString& aUserParams = wxEmptyString );
442
450 void AddDrillTool( const ODB_FORMAT& aFormat, const wxString& aType, int aDiameter,
451 const wxString& aType2 = wxT( "STANDARD" ) );
452
453 void GenerateFile( std::ostream& aStream );
454
455 wxString m_units;
456 wxString m_thickness;
457 wxString m_userParams;
458 std::vector<ODB_DRILL_TOOLS::TOOLS> m_tools;
459};
460
461#endif // _ODB_UTIL_H_
constexpr double PCB_IU_PER_MM
Pcbnew IU is 1 nanometer.
Definition base_units.h:68
constexpr double PL_IU_PER_MM
Internal units in micron (should be enough).
Definition base_units.h:69
Information pertinent to a Pcbnew printed circuit board.
Definition board.h:410
Store all of the related component information found in a netlist.
bool operator()()
Definition odb_util.h:296
static std::map< T, std::string > & GetMap()
Definition odb_util.h:203
wxString m_units
Definition odb_util.h:455
void GenerateFile(std::ostream &aStream)
Definition odb_util.cpp:624
ODB_DRILL_TOOLS(const wxString &aUnits, const wxString &aThickness="0", const wxString &aUserParams=wxEmptyString)
Definition odb_util.cpp:590
wxString m_thickness
Definition odb_util.h:456
wxString m_userParams
Definition odb_util.h:457
void AddDrillTool(const ODB_FORMAT &aFormat, const wxString &aType, int aDiameter, const wxString &aType2=wxT("STANDARD"))
Record the drill bit used for a hole.
Definition odb_util.cpp:597
std::vector< ODB_DRILL_TOOLS::TOOLS > m_tools
Definition odb_util.h:458
ODB_FILE_WRITER & operator=(ODB_FILE_WRITER const &)=delete
ODB_TREE_WRITER & m_treeWriter
Definition odb_util.h:331
ODB_FILE_WRITER(ODB_FILE_WRITER &&)=delete
virtual ~ODB_FILE_WRITER()
Definition odb_util.h:318
ODB_FILE_WRITER(ODB_TREE_WRITER &aTreeWriter, const wxString &aFileName)
Definition odb_util.cpp:478
ODB_FILE_WRITER & operator=(ODB_FILE_WRITER &&)=delete
ODB_FILE_WRITER(ODB_FILE_WRITER const &)=delete
void CreateODBFile(const wxString &aFileName)
Definition odb_util.cpp:485
std::ostream & GetStream()
Definition odb_util.h:328
std::ofstream m_ostream
Definition odb_util.h:332
ARRAY_PROXY(ARRAY_PROXY &&)=delete
ARRAY_PROXY & operator=(ARRAY_PROXY const &)=delete
ARRAY_PROXY & operator=(ARRAY_PROXY &&)=delete
ARRAY_PROXY(ARRAY_PROXY const &)=delete
ARRAY_PROXY(ODB_TEXT_WRITER &aWriter, const std::string &aStr)
Definition odb_util.cpp:577
ODB_TEXT_WRITER & m_writer
Definition odb_util.h:395
void WriteEquationLine(const std::string &var, int value)
Definition odb_util.cpp:538
ARRAY_PROXY MakeArrayProxy(const std::string &aStr)
Definition odb_util.h:406
virtual ~ODB_TEXT_WRITER()
Definition odb_util.h:374
void write_line_enum(const std::string &var, const T &value)
Definition odb_util.h:380
ODB_TEXT_WRITER(std::ostream &aStream)
Definition odb_util.h:373
std::ostream & m_ostream
Definition odb_util.h:418
void BeginArray(const std::string &a)
Definition odb_util.cpp:559
wxString m_rootPath
Definition odb_util.h:366
const wxString GetRootPath() const
Definition odb_util.h:361
void CreateEntityDirectory(const wxString &aPareDir, const wxString &aSubDir=wxEmptyString)
Definition odb_util.cpp:456
ODB_FILE_WRITER CreateFileProxy(const wxString &aFileName)
Definition odb_util.h:348
wxString m_currentPath
Definition odb_util.h:365
void SetRootPath(const wxString &aDir)
Definition odb_util.h:359
ODB_TREE_WRITER(const wxString &aPareDir, const wxString &aSubDir)
Definition odb_util.h:341
virtual ~ODB_TREE_WRITER()
Definition odb_util.h:346
void SetCurrentPath(const wxString &aDir)
Definition odb_util.h:357
const wxString GetCurrentPath() const
Definition odb_util.h:355
ODB_TREE_WRITER(const wxString &aDir)
Definition odb_util.h:339
Hole classification and drill span, shared by the drill model and the drill writers.
@ NONE
Definition eda_fill.h:42
PCB_LAYER_ID
A quick note on layer IDs:
Definition layer_ids.h:56
SECTION
Schema sections of the IPC-2581C function mode table, Table 4 p 80.
std::string Enum2String(T value)
Definition odb_util.h:279
wxString GenLegalComponentName(const wxString &aStr)
Definition odb_util.cpp:185
std::vector< ODB_TYPE > OverridableLayerTypes(PCB_LAYER_ID aLayer)
Matrix types a layer override may assign to aLayer.
Definition odb_util.cpp:110
std::pair< wxString, wxString > AddXY(const ODB_FORMAT &aFormat, const VECTOR2I &aVec)
Definition odb_util.cpp:412
void RemoveWhitespace(wxString &aStr)
Definition odb_util.cpp:374
std::vector< wxString > UniqueNames(const std::vector< wxString > &aBases, const std::set< wxString > &aReserved, size_t aMaxLength)
Definition odb_util.cpp:252
wxString GenODBString(const wxString &aStr)
Definition odb_util.cpp:121
wxString Data2String(const ODB_FORMAT &aFormat, double aVal)
Definition odb_util.cpp:406
int IpcViaType(const DRILL_OPERATION &aOperation, bool aTop)
Definition odb_util.cpp:43
std::pair< wxString, wxString > AddRelativeXY(const ODB_FORMAT &aFormat, const VECTOR2I &aVec)
Definition odb_util.cpp:419
wxString GenLegalEntityName(const wxString &aStr)
Definition odb_util.cpp:212
wxString GenLegalNetName(const wxString &aStr)
Definition odb_util.cpp:161
bool ViaInPad(const PCB_VIA &aVia)
Definition odb_util.cpp:68
VECTOR2I GetShapePosition(const PCB_SHAPE &aShape)
Definition odb_util.cpp:426
wxString SymDouble2String(const ODB_FORMAT &aFormat, double aVal)
Definition odb_util.cpp:400
wxString Double2String(const ODB_FORMAT &aFormat, double aVal)
Definition odb_util.cpp:382
ODB_SUBTYPE
Definition odb_util.h:124
std::tuple< ODB_AUX_LAYER_TYPE, PCB_LAYER_ID, PCB_LAYER_ID > ODB_AUX_LAYER_KEY
Definition odb_util.h:153
ODB_DIELECTRIC_TYPE
Definition odb_util.h:98
ODB_AUX_LAYER_TYPE
Definition odb_util.h:145
ODB_TYPE
Definition odb_util.h:105
@ UNDEFINED
Definition odb_util.h:106
@ CONDUCTIVE_PASTE
Definition odb_util.h:120
@ POWER_GROUND
Definition odb_util.h:109
@ COMPONENT
Definition odb_util.h:118
@ SOLDER_PASTE
Definition odb_util.h:113
@ SILK_SCREEN
Definition odb_util.h:114
@ SOLDER_MASK
Definition odb_util.h:112
@ DIELECTRIC
Definition odb_util.h:110
ODB_LAYER_ROLE
Definition odb_util.h:156
ODB_POLARITY
Definition odb_util.h:24
ODB_CONTEXT
Definition odb_util.h:92
ODB_FID_TYPE
Definition odb_util.h:138
#define MASK(x)
One machining action, which is also one NC hit and one tool assignment.
std::vector< std::pair< wxString, wxString > > m_names
Definition odb_util.h:42
wxString Join(const std::vector< wxString > &aNames) const
Definition odb_util.cpp:358
wxString LegalName(const wxString &aName) const
Definition odb_util.cpp:331
wxString SelectedName(const wxString &aName) const
Definition odb_util.cpp:343
std::vector< wxString > m_renamed
Definition odb_util.h:43
static VARIANT_NAMES Build(const std::vector< wxString > &aNames)
Definition odb_util.cpp:298
What a caller asks of one ODB++ export.
Definition odb_util.h:50
std::optional< wxString > m_variant
Unset exports the current variant of the board.
Definition odb_util.h:54
wxString m_mpnField
Definition odb_util.h:55
JOB_EXPORT_PCB_ODB::ORIGIN m_origin
Definition odb_util.h:57
std::optional< FAB::SECTION_SET > m_sections
Unset exports every section.
Definition odb_util.h:61
wxString m_productModelName
Definition odb_util.h:56
std::vector< ODB_LAYER_OVERRIDE > m_layerOverrides
Definition odb_util.h:62
double m_symbolScale
Definition odb_util.h:71
bool Includes(FAB::SECTION aSection) const
Definition odb_util.h:85
wxString m_productModelName
Definition odb_util.h:75
bool m_boardMetadata
Definition odb_util.h:80
ODB::VARIANT_NAMES m_variantNames
Definition odb_util.h:83
std::vector< ODB_LAYER_OVERRIDE > m_layerOverrides
Definition odb_util.h:82
std::optional< FAB::SECTION_SET > m_sections
Definition odb_util.h:81
VECTOR2I m_originOffset
Definition odb_util.h:77
double m_scale
Definition odb_util.h:68
bool m_anonymizeNets
Definition odb_util.h:78
std::string m_unitsStr
Definition odb_util.h:73
wxString m_mpnField
Definition odb_util.h:76
wxString m_variantName
Definition odb_util.h:74
bool m_writeEdaNets
Definition odb_util.h:79
int m_sigfig
Definition odb_util.h:72
wxString result
Test unit parsing edge cases and error handling.
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:708