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