KiCad PCB EDA Suite
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
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 <iostream>
6#include <fstream>
7#include <vector>
8#include <string>
9#include <wx/string.h>
10#include "pcb_shape.h"
11#include <wx/filename.h>
12
13
14enum class ODB_POLARITY
15{
18};
19
20enum class ODB_CONTEXT
21{
22 BOARD,
23 MISC
24};
25
27{
28 NONE,
29 PREPREG,
30 CORE
31};
32
33enum class ODB_TYPE
34{
36
37 SIGNAL,
40 MIXED,
44 DRILL,
45 ROUT,
48 MASK,
50};
51
52enum class ODB_SUBTYPE
53{
60 PSA,
63};
64
65enum class ODB_FID_TYPE
66{
67 COPPER,
69 HOLE
70};
71
73{
76 TENTING,
77 FILLING,
78 CAPPING,
79};
80
81
82namespace ODB
83{
84wxString GenODBString( const wxString& aStr );
85
86wxString GenLegalNetName( const wxString& aStr );
87
88wxString GenLegalEntityName( const wxString& aStr );
89
90void RemoveWhitespace( wxString& aStr );
91
92wxString Double2String( double aVal );
93
94std::string Double2String( double aVal, int32_t aDigits );
95
96wxString Data2String( double aVal );
97
98wxString SymDouble2String( double aVal );
99
100std::pair<wxString, wxString> AddXY( const VECTOR2I& aVec );
101
102VECTOR2I GetShapePosition( const PCB_SHAPE& aShape );
103
104template <typename T>
106{
107public:
108 static std::map<T, std::string>& GetMap()
109 {
110 static_assert( std::is_enum_v<T>, "Template parameter T must be an enum type" );
111
112 static std::map<T, std::string> map = []()
113 {
114 std::map<T, std::string> result;
115
116 if constexpr( std::is_same_v<T, ODB_POLARITY> )
117 {
118 result[ODB_POLARITY::POSITIVE] = "POSITIVE";
119 result[ODB_POLARITY::NEGATIVE] = "NEGATIVE";
120 }
121
122 if constexpr( std::is_same_v<T, ODB_CONTEXT> )
123 {
124 result[ODB_CONTEXT::BOARD] = "BOARD";
125 result[ODB_CONTEXT::MISC] = "MISC";
126 }
127
128 if constexpr( std::is_same_v<T, ODB_TYPE> )
129 {
130 //just for logical reasons.TYPE field must be defined.
131 result[ODB_TYPE::UNDEFINED] = "";
132
133 result[ODB_TYPE::SIGNAL] = "SIGNAL";
134 result[ODB_TYPE::POWER_GROUND] = "POWER_GROUND";
135 result[ODB_TYPE::DIELECTRIC] = "DIELECTRIC";
136 result[ODB_TYPE::MIXED] = "MIXED";
137 result[ODB_TYPE::SOLDER_MASK] = "SOLDER_MASK";
138 result[ODB_TYPE::SOLDER_PASTE] = "SOLDER_PASTE";
139 result[ODB_TYPE::SILK_SCREEN] = "SILK_SCREEN";
140 result[ODB_TYPE::DRILL] = "DRILL";
141 result[ODB_TYPE::ROUT] = "ROUT";
142 result[ODB_TYPE::DOCUMENT] = "DOCUMENT";
143 result[ODB_TYPE::COMPONENT] = "COMPONENT";
144 result[ODB_TYPE::MASK] = "MASK";
145 result[ODB_TYPE::CONDUCTIVE_PASTE] = "CONDUCTIVE_PASTE";
146 }
147
148 if constexpr( std::is_same_v<T, ODB_SUBTYPE> )
149 {
150 result[ODB_SUBTYPE::COVERLAY] = "COVERLAY";
151 result[ODB_SUBTYPE::COVERCOAT] = "COVERCOAT";
152 result[ODB_SUBTYPE::STIFFENER] = "STIFFENER";
153 result[ODB_SUBTYPE::BEND_AREA] = "BEND_AREA";
154 result[ODB_SUBTYPE::FLEX_AREA] = "FLEX_AREA";
155 result[ODB_SUBTYPE::RIGID_AREA] = "RIGID_AREA";
156 result[ODB_SUBTYPE::PSA] = "PSA";
157 result[ODB_SUBTYPE::SILVER_MASK] = "SILVER_MASK";
158 result[ODB_SUBTYPE::CARBON_MASK] = "CARBON_MASK";
159 }
160
161 if constexpr( std::is_same_v<T, ODB_DIELECTRIC_TYPE> )
162 {
163 result[ODB_DIELECTRIC_TYPE::NONE] = "NONE";
164 result[ODB_DIELECTRIC_TYPE::PREPREG] = "PREPREG";
165 result[ODB_DIELECTRIC_TYPE::CORE] = "CORE";
166 }
167
168 if constexpr( std::is_same_v<T, ODB_FID_TYPE> )
169 {
170 result[ODB_FID_TYPE::COPPER] = "C";
171 result[ODB_FID_TYPE::LAMINATE] = "L";
172 result[ODB_FID_TYPE::HOLE] = "H";
173 }
174
175 return result;
176 }();
177
178 return map;
179 }
180};
181
182template <typename T>
183std::string Enum2String( T value )
184{
185 const auto& map = EnumStringMap<T>::GetMap();
186 auto it = map.find( value );
187 if( it != map.end() )
188 {
189 return it->second;
190 }
191 else
192 {
193 throw std::out_of_range( "Enum value not found in map" );
194 }
195}
196
198{
199public:
201 {
202 if( first )
203 {
204 first = false;
205 return true;
206 }
207 return false;
208 }
209
210private:
211 bool first = true;
212};
213
214} // namespace ODB
215
216class ODB_TREE_WRITER;
218{
219public:
220 ODB_FILE_WRITER( ODB_TREE_WRITER& aTreeWriter, const wxString& aFileName );
221
223
226
229
230 void CreateFile( const wxString& aFileName );
231 bool CloseFile();
232 inline std::ostream& GetStream() { return m_ostream; }
233
234private:
236 std::ofstream m_ostream;
237};
238
239
241{
242public:
243 ODB_TREE_WRITER( const wxString& aDir ) : m_currentPath( aDir ) {}
244
245 ODB_TREE_WRITER( const wxString& aPareDir, const wxString& aSubDir )
246 {
247 CreateEntityDirectory( aPareDir, aSubDir );
248 }
249
250 virtual ~ODB_TREE_WRITER() {}
251
252 [[nodiscard]] ODB_FILE_WRITER CreateFileProxy( const wxString& aFileName )
253 {
254 return ODB_FILE_WRITER( *this, aFileName );
255 }
256
257 void CreateEntityDirectory( const wxString& aPareDir, const wxString& aSubDir = wxEmptyString );
258
259 inline const wxString GetCurrentPath() const { return m_currentPath; }
260
261 inline void SetCurrentPath( const wxString& aDir ) { m_currentPath = aDir; }
262
263 inline void SetRootPath( const wxString& aDir ) { m_rootPath = aDir; }
264
265 inline const wxString GetRootPath() const { return m_rootPath; }
266
267
268private:
270 wxString m_rootPath;
271};
272
273
275{
276public:
277 ODB_TEXT_WRITER( std::ostream& aStream ) : m_ostream( aStream ) {}
278 virtual ~ODB_TEXT_WRITER() {}
279
280 // void WriteEquationLine( const std::string &var, const std::string &value );
281 void WriteEquationLine( const std::string& var, int value );
282 void WriteEquationLine( const wxString& var, const wxString& value );
283 template <typename T>
284 void write_line_enum( const std::string& var, const T& value )
285 {
286 WriteEquationLine( var, ODB::Enum2String( value ) );
287 }
288
290 {
292
293 public:
294 ~ARRAY_PROXY();
295
296 private:
297 ARRAY_PROXY( ODB_TEXT_WRITER& aWriter, const std::string& aStr );
298
300
302
304
305 ARRAY_PROXY( ARRAY_PROXY const& ) = delete;
306
307 ARRAY_PROXY& operator=( ARRAY_PROXY const& ) = delete;
308 };
309
310 [[nodiscard]] ARRAY_PROXY MakeArrayProxy( const std::string& aStr )
311 {
312 return ARRAY_PROXY( *this, aStr );
313 }
314
315private:
316 void WriteIndent();
317
318 void BeginArray( const std::string& a );
319
320 void EndArray();
321
322 std::ostream& m_ostream;
323 bool in_array = false;
324};
325
326
328{
329public:
330 struct TOOLS
331 {
332 uint32_t m_num;
333 wxString m_type;
334 wxString m_type2 = wxT( "STANDARD" );
335 uint32_t m_minTol;
336 uint32_t m_maxTol;
337 wxString m_bit = wxEmptyString;
338 wxString m_finishSize;
339 wxString m_drillSize;
340
341 TOOLS() : m_num( 0 ), m_minTol( 0 ), m_maxTol( 0 ) {}
342 };
343
344 ODB_DRILL_TOOLS( const wxString& aUnits, const wxString& aThickness = "0",
345 const wxString& aUserParams = wxEmptyString );
346
347 void AddDrillTools( const wxString& aType, const wxString& aFinishSize )
348 {
349 TOOLS tool;
350 tool.m_num = m_tools.size() + 1;
351 tool.m_type = aType;
352 tool.m_finishSize = aFinishSize;
353 tool.m_drillSize = aFinishSize;
354
355 m_tools.push_back( tool );
356 }
357
358 void GenerateFile( std::ostream& aStream );
359
360 wxString m_units;
361 wxString m_thickness;
362 wxString m_userParams;
363 std::vector<ODB_DRILL_TOOLS::TOOLS> m_tools;
364};
365
366#endif // _ODB_UTIL_H_
bool operator()()
Definition: odb_util.h:200
static std::map< T, std::string > & GetMap()
Definition: odb_util.h:108
wxString m_units
Definition: odb_util.h:360
void GenerateFile(std::ostream &aStream)
Definition: odb_util.cpp:344
wxString m_thickness
Definition: odb_util.h:361
void AddDrillTools(const wxString &aType, const wxString &aFinishSize)
Definition: odb_util.h:347
wxString m_userParams
Definition: odb_util.h:362
std::vector< ODB_DRILL_TOOLS::TOOLS > m_tools
Definition: odb_util.h:363
void CreateFile(const wxString &aFileName)
Definition: odb_util.cpp:235
ODB_FILE_WRITER & operator=(ODB_FILE_WRITER const &)=delete
ODB_TREE_WRITER & m_treeWriter
Definition: odb_util.h:235
ODB_FILE_WRITER(ODB_FILE_WRITER &&)=delete
virtual ~ODB_FILE_WRITER()
Definition: odb_util.h:222
ODB_FILE_WRITER & operator=(ODB_FILE_WRITER &&)=delete
ODB_FILE_WRITER(ODB_FILE_WRITER const &)=delete
bool CloseFile()
Definition: odb_util.cpp:268
std::ostream & GetStream()
Definition: odb_util.h:232
std::ofstream m_ostream
Definition: odb_util.h:236
ARRAY_PROXY(ARRAY_PROXY &&)=delete
ARRAY_PROXY & operator=(ARRAY_PROXY const &)=delete
ARRAY_PROXY & operator=(ARRAY_PROXY &&)=delete
ARRAY_PROXY(ARRAY_PROXY const &)=delete
ODB_TEXT_WRITER & m_writer
Definition: odb_util.h:299
void WriteEquationLine(const std::string &var, int value)
Definition: odb_util.cpp:285
ARRAY_PROXY MakeArrayProxy(const std::string &aStr)
Definition: odb_util.h:310
virtual ~ODB_TEXT_WRITER()
Definition: odb_util.h:278
void write_line_enum(const std::string &var, const T &value)
Definition: odb_util.h:284
ODB_TEXT_WRITER(std::ostream &aStream)
Definition: odb_util.h:277
std::ostream & m_ostream
Definition: odb_util.h:322
void BeginArray(const std::string &a)
Definition: odb_util.cpp:306
void WriteIndent()
Definition: odb_util.cpp:299
wxString m_rootPath
Definition: odb_util.h:270
const wxString GetRootPath() const
Definition: odb_util.h:265
void CreateEntityDirectory(const wxString &aPareDir, const wxString &aSubDir=wxEmptyString)
Definition: odb_util.cpp:206
ODB_FILE_WRITER CreateFileProxy(const wxString &aFileName)
Definition: odb_util.h:252
wxString m_currentPath
Definition: odb_util.h:269
void SetRootPath(const wxString &aDir)
Definition: odb_util.h:263
ODB_TREE_WRITER(const wxString &aPareDir, const wxString &aSubDir)
Definition: odb_util.h:245
virtual ~ODB_TREE_WRITER()
Definition: odb_util.h:250
void SetCurrentPath(const wxString &aDir)
Definition: odb_util.h:261
const wxString GetCurrentPath() const
Definition: odb_util.h:259
ODB_TREE_WRITER(const wxString &aDir)
Definition: odb_util.h:243
Definition: odb_util.cpp:33
std::string Enum2String(T value)
Definition: odb_util.h:183
wxString Data2String(double aVal)
Definition: odb_util.cpp:161
void RemoveWhitespace(wxString &aStr)
Definition: odb_util.cpp:119
wxString GenODBString(const wxString &aStr)
Definition: odb_util.cpp:35
std::pair< wxString, wxString > AddXY(const VECTOR2I &aVec)
Definition: odb_util.cpp:167
wxString GenLegalEntityName(const wxString &aStr)
Definition: odb_util.cpp:82
wxString GenLegalNetName(const wxString &aStr)
Definition: odb_util.cpp:57
wxString Double2String(double aVal)
Definition: odb_util.cpp:127
wxString SymDouble2String(double aVal)
Definition: odb_util.cpp:155
VECTOR2I GetShapePosition(const PCB_SHAPE &aShape)
Definition: odb_util.cpp:178
ODB_SUBTYPE
Definition: odb_util.h:53
ODB_DIELECTRIC_TYPE
Definition: odb_util.h:27
ODB_AUX_LAYER_TYPE
Definition: odb_util.h:73
ODB_TYPE
Definition: odb_util.h:34
@ CONDUCTIVE_PASTE
ODB_POLARITY
Definition: odb_util.h:15
ODB_CONTEXT
Definition: odb_util.h:21
ODB_FID_TYPE
Definition: odb_util.h:66