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 <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
19
20enum class ODB_CONTEXT
21{
24};
25
32
51
65
72
81
82
83namespace ODB
84{
85wxString GenODBString( const wxString& aStr );
86
87wxString GenLegalNetName( const wxString& aStr );
88
89wxString GenLegalComponentName( const wxString& aStr );
90
91wxString GenLegalEntityName( const wxString& aStr );
92
93void RemoveWhitespace( wxString& aStr );
94
95wxString Double2String( double aVal );
96
97std::string Double2String( double aVal, int32_t aDigits );
98
99wxString Data2String( double aVal );
100
101wxString SymDouble2String( double aVal );
102
103std::pair<wxString, wxString> AddXY( const VECTOR2I& aVec );
104
105VECTOR2I GetShapePosition( const PCB_SHAPE& aShape );
106
107template <typename T>
109{
110public:
111 static std::map<T, std::string>& GetMap()
112 {
113 static_assert( std::is_enum_v<T>, "Template parameter T must be an enum type" );
114
115 static std::map<T, std::string> map = []()
116 {
117 std::map<T, std::string> result;
118
119 if constexpr( std::is_same_v<T, ODB_POLARITY> )
120 {
121 result[ODB_POLARITY::POSITIVE] = "POSITIVE";
122 result[ODB_POLARITY::NEGATIVE] = "NEGATIVE";
123 }
124
125 if constexpr( std::is_same_v<T, ODB_CONTEXT> )
126 {
127 result[ODB_CONTEXT::BOARD] = "BOARD";
128 result[ODB_CONTEXT::MISC] = "MISC";
129 }
130
131 if constexpr( std::is_same_v<T, ODB_TYPE> )
132 {
133 //just for logical reasons.TYPE field must be defined.
135
136 result[ODB_TYPE::SIGNAL] = "SIGNAL";
137 result[ODB_TYPE::POWER_GROUND] = "POWER_GROUND";
138 result[ODB_TYPE::DIELECTRIC] = "DIELECTRIC";
139 result[ODB_TYPE::MIXED] = "MIXED";
140 result[ODB_TYPE::SOLDER_MASK] = "SOLDER_MASK";
141 result[ODB_TYPE::SOLDER_PASTE] = "SOLDER_PASTE";
142 result[ODB_TYPE::SILK_SCREEN] = "SILK_SCREEN";
143 result[ODB_TYPE::DRILL] = "DRILL";
144 result[ODB_TYPE::ROUT] = "ROUT";
145 result[ODB_TYPE::DOCUMENT] = "DOCUMENT";
146 result[ODB_TYPE::COMPONENT] = "COMPONENT";
147 result[ODB_TYPE::MASK] = "MASK";
148 result[ODB_TYPE::CONDUCTIVE_PASTE] = "CONDUCTIVE_PASTE";
149 }
150
151 if constexpr( std::is_same_v<T, ODB_SUBTYPE> )
152 {
153 result[ODB_SUBTYPE::COVERLAY] = "COVERLAY";
154 result[ODB_SUBTYPE::COVERCOAT] = "COVERCOAT";
155 result[ODB_SUBTYPE::STIFFENER] = "STIFFENER";
156 result[ODB_SUBTYPE::BEND_AREA] = "BEND_AREA";
157 result[ODB_SUBTYPE::FLEX_AREA] = "FLEX_AREA";
158 result[ODB_SUBTYPE::RIGID_AREA] = "RIGID_AREA";
159 result[ODB_SUBTYPE::PSA] = "PSA";
160 result[ODB_SUBTYPE::SILVER_MASK] = "SILVER_MASK";
161 result[ODB_SUBTYPE::CARBON_MASK] = "CARBON_MASK";
162 result[ODB_SUBTYPE::BACKDRILL] = "BACKDRILL";
163 }
164
165 if constexpr( std::is_same_v<T, ODB_DIELECTRIC_TYPE> )
166 {
170 }
171
172 if constexpr( std::is_same_v<T, ODB_FID_TYPE> )
173 {
177 }
178
179 return result;
180 }();
181
182 return map;
183 }
184};
185
186template <typename T>
187std::string Enum2String( T value )
188{
189 const auto& map = EnumStringMap<T>::GetMap();
190 auto it = map.find( value );
191 if( it != map.end() )
192 {
193 return it->second;
194 }
195 else
196 {
197 throw std::out_of_range( "Enum value not found in map" );
198 }
199}
200
202{
203public:
205 {
206 if( first )
207 {
208 first = false;
209 return true;
210 }
211 return false;
212 }
213
214private:
215 bool first = true;
216};
217
218} // namespace ODB
219
220class ODB_TREE_WRITER;
222{
223public:
224 ODB_FILE_WRITER( ODB_TREE_WRITER& aTreeWriter, const wxString& aFileName );
225
227
230
233
234 void CreateFile( const wxString& aFileName );
235 bool CloseFile();
236 inline std::ostream& GetStream() { return m_ostream; }
237
238private:
240 std::ofstream m_ostream;
241};
242
243
245{
246public:
247 ODB_TREE_WRITER( const wxString& aDir ) : m_currentPath( aDir ) {}
248
249 ODB_TREE_WRITER( const wxString& aPareDir, const wxString& aSubDir )
250 {
251 CreateEntityDirectory( aPareDir, aSubDir );
252 }
253
254 virtual ~ODB_TREE_WRITER() {}
255
256 [[nodiscard]] ODB_FILE_WRITER CreateFileProxy( const wxString& aFileName )
257 {
258 return ODB_FILE_WRITER( *this, aFileName );
259 }
260
261 void CreateEntityDirectory( const wxString& aPareDir, const wxString& aSubDir = wxEmptyString );
262
263 inline const wxString GetCurrentPath() const { return m_currentPath; }
264
265 inline void SetCurrentPath( const wxString& aDir ) { m_currentPath = aDir; }
266
267 inline void SetRootPath( const wxString& aDir ) { m_rootPath = aDir; }
268
269 inline const wxString GetRootPath() const { return m_rootPath; }
270
271
272private:
274 wxString m_rootPath;
275};
276
277
279{
280public:
281 ODB_TEXT_WRITER( std::ostream& aStream ) : m_ostream( aStream ) {}
282 virtual ~ODB_TEXT_WRITER() {}
283
284 // void WriteEquationLine( const std::string &var, const std::string &value );
285 void WriteEquationLine( const std::string& var, int value );
286 void WriteEquationLine( const wxString& var, const wxString& value );
287 template <typename T>
288 void write_line_enum( const std::string& var, const T& value )
289 {
290 WriteEquationLine( var, ODB::Enum2String( value ) );
291 }
292
294 {
296
297 public:
298 ~ARRAY_PROXY();
299
300 private:
301 ARRAY_PROXY( ODB_TEXT_WRITER& aWriter, const std::string& aStr );
302
304
306
308
309 ARRAY_PROXY( ARRAY_PROXY const& ) = delete;
310
311 ARRAY_PROXY& operator=( ARRAY_PROXY const& ) = delete;
312 };
313
314 [[nodiscard]] ARRAY_PROXY MakeArrayProxy( const std::string& aStr )
315 {
316 return ARRAY_PROXY( *this, aStr );
317 }
318
319private:
320 void WriteIndent();
321
322 void BeginArray( const std::string& a );
323
324 void EndArray();
325
326 std::ostream& m_ostream;
327 bool in_array = false;
328};
329
330
332{
333public:
334 struct TOOLS
335 {
336 uint32_t m_num;
337 wxString m_type;
338 wxString m_type2 = wxT( "STANDARD" );
339 uint32_t m_minTol;
340 uint32_t m_maxTol;
341 wxString m_bit = wxEmptyString;
342 wxString m_finishSize;
343 wxString m_drillSize;
344
345 TOOLS() : m_num( 0 ), m_minTol( 0 ), m_maxTol( 0 ) {}
346 };
347
348 ODB_DRILL_TOOLS( const wxString& aUnits, const wxString& aThickness = "0",
349 const wxString& aUserParams = wxEmptyString );
350
351 void AddDrillTools( const wxString& aType, const wxString& aFinishSize,
352 const wxString& aType2 = wxT( "STANDARD" ) )
353 {
354 TOOLS tool;
355 tool.m_num = m_tools.size() + 1;
356 tool.m_type = aType;
357 tool.m_type2 = aType2;
358 tool.m_finishSize = aFinishSize;
359 tool.m_drillSize = aFinishSize;
360
361 m_tools.push_back( tool );
362 }
363
364 void GenerateFile( std::ostream& aStream );
365
366 wxString m_units;
367 wxString m_thickness;
368 wxString m_userParams;
369 std::vector<ODB_DRILL_TOOLS::TOOLS> m_tools;
370};
371
372#endif // _ODB_UTIL_H_
Information pertinent to a Pcbnew printed circuit board.
Definition board.h:322
Store all of the related component information found in a netlist.
bool operator()()
Definition odb_util.h:204
static std::map< T, std::string > & GetMap()
Definition odb_util.h:111
wxString m_units
Definition odb_util.h:366
void GenerateFile(std::ostream &aStream)
Definition odb_util.cpp:368
ODB_DRILL_TOOLS(const wxString &aUnits, const wxString &aThickness="0", const wxString &aUserParams=wxEmptyString)
Definition odb_util.cpp:361
void AddDrillTools(const wxString &aType, const wxString &aFinishSize, const wxString &aType2=wxT("STANDARD"))
Definition odb_util.h:351
wxString m_thickness
Definition odb_util.h:367
wxString m_userParams
Definition odb_util.h:368
std::vector< ODB_DRILL_TOOLS::TOOLS > m_tools
Definition odb_util.h:369
void CreateFile(const wxString &aFileName)
Definition odb_util.cpp:259
ODB_FILE_WRITER & operator=(ODB_FILE_WRITER const &)=delete
ODB_TREE_WRITER & m_treeWriter
Definition odb_util.h:239
ODB_FILE_WRITER(ODB_FILE_WRITER &&)=delete
virtual ~ODB_FILE_WRITER()
Definition odb_util.h:226
ODB_FILE_WRITER(ODB_TREE_WRITER &aTreeWriter, const wxString &aFileName)
Definition odb_util.cpp:252
ODB_FILE_WRITER & operator=(ODB_FILE_WRITER &&)=delete
ODB_FILE_WRITER(ODB_FILE_WRITER const &)=delete
std::ostream & GetStream()
Definition odb_util.h:236
std::ofstream m_ostream
Definition odb_util.h:240
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:348
ODB_TEXT_WRITER & m_writer
Definition odb_util.h:303
void WriteEquationLine(const std::string &var, int value)
Definition odb_util.cpp:309
ARRAY_PROXY MakeArrayProxy(const std::string &aStr)
Definition odb_util.h:314
virtual ~ODB_TEXT_WRITER()
Definition odb_util.h:282
void write_line_enum(const std::string &var, const T &value)
Definition odb_util.h:288
ODB_TEXT_WRITER(std::ostream &aStream)
Definition odb_util.h:281
std::ostream & m_ostream
Definition odb_util.h:326
void BeginArray(const std::string &a)
Definition odb_util.cpp:330
wxString m_rootPath
Definition odb_util.h:274
const wxString GetRootPath() const
Definition odb_util.h:269
void CreateEntityDirectory(const wxString &aPareDir, const wxString &aSubDir=wxEmptyString)
Definition odb_util.cpp:230
ODB_FILE_WRITER CreateFileProxy(const wxString &aFileName)
Definition odb_util.h:256
wxString m_currentPath
Definition odb_util.h:273
void SetRootPath(const wxString &aDir)
Definition odb_util.h:267
ODB_TREE_WRITER(const wxString &aPareDir, const wxString &aSubDir)
Definition odb_util.h:249
virtual ~ODB_TREE_WRITER()
Definition odb_util.h:254
void SetCurrentPath(const wxString &aDir)
Definition odb_util.h:265
const wxString GetCurrentPath() const
Definition odb_util.h:263
ODB_TREE_WRITER(const wxString &aDir)
Definition odb_util.h:247
@ NONE
Definition eda_shape.h:69
std::string Enum2String(T value)
Definition odb_util.h:187
wxString GenLegalComponentName(const wxString &aStr)
Definition odb_util.cpp:79
wxString Data2String(double aVal)
Definition odb_util.cpp:185
void RemoveWhitespace(wxString &aStr)
Definition odb_util.cpp:143
wxString GenODBString(const wxString &aStr)
Definition odb_util.cpp:35
std::pair< wxString, wxString > AddXY(const VECTOR2I &aVec)
Definition odb_util.cpp:191
wxString GenLegalEntityName(const wxString &aStr)
Definition odb_util.cpp:106
wxString GenLegalNetName(const wxString &aStr)
Definition odb_util.cpp:57
wxString Double2String(double aVal)
Definition odb_util.cpp:151
wxString SymDouble2String(double aVal)
Definition odb_util.cpp:179
VECTOR2I GetShapePosition(const PCB_SHAPE &aShape)
Definition odb_util.cpp:202
ODB_SUBTYPE
Definition odb_util.h:53
ODB_DIELECTRIC_TYPE
Definition odb_util.h:27
ODB_AUX_LAYER_TYPE
Definition odb_util.h:74
ODB_TYPE
Definition odb_util.h:34
@ UNDEFINED
Definition odb_util.h:35
@ CONDUCTIVE_PASTE
Definition odb_util.h:49
@ POWER_GROUND
Definition odb_util.h:38
@ COMPONENT
Definition odb_util.h:47
@ SOLDER_PASTE
Definition odb_util.h:42
@ SILK_SCREEN
Definition odb_util.h:43
@ DOCUMENT
Definition odb_util.h:46
@ SOLDER_MASK
Definition odb_util.h:41
@ DIELECTRIC
Definition odb_util.h:39
ODB_POLARITY
Definition odb_util.h:15
ODB_CONTEXT
Definition odb_util.h:21
ODB_FID_TYPE
Definition odb_util.h:67
#define MASK(x)
wxString result
Test unit parsing edge cases and error handling.
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:695