/src/gdal/ogr/ogrsf_frmts/cad/libopencad/cadheader.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | /******************************************************************************* |
2 | | * Project: libopencad |
3 | | * Purpose: OpenSource CAD formats support library |
4 | | * Author: Alexandr Borzykh, mush3d at gmail.com |
5 | | * Author: Dmitry Baryshnikov, bishop.dev@gmail.com |
6 | | * Language: C++ |
7 | | ******************************************************************************* |
8 | | * The MIT License (MIT) |
9 | | * |
10 | | * Copyright (c) 2016 Alexandr Borzykh |
11 | | * Copyright (c) 2016 NextGIS, <info@nextgis.com> |
12 | | * |
13 | | * SPDX-License-Identifier: MIT |
14 | | *******************************************************************************/ |
15 | | |
16 | | #include "cpl_port.h" |
17 | | #include "cpl_safemaths.hpp" |
18 | | #include "cadheader.h" |
19 | | #include "opencad_api.h" |
20 | | #include "dwg/io.h" |
21 | | |
22 | | #include <cstring> |
23 | | #include <iostream> |
24 | | #include <time.h> |
25 | | |
26 | | #if ((defined(__sun__) || defined(__FreeBSD__)) && __GNUC__ == 4 && __GNUC_MINOR__ == 8) || defined(__ANDROID__) |
27 | | // gcc 4.8 on Solaris 11.3 or FreeBSD 11 doesn't have std::string |
28 | | #include <sstream> |
29 | | template <typename T> std::string to_string(T val) |
30 | | { |
31 | | std::ostringstream os; |
32 | | os << val; |
33 | | return os.str(); |
34 | | } |
35 | | #endif |
36 | | |
37 | | using namespace std; |
38 | | |
39 | | typedef struct |
40 | | { |
41 | | short nConstant; |
42 | | short nGroupCode; |
43 | | const char * pszValueName; |
44 | | } CADHeaderConstantDetail; |
45 | | |
46 | | #define FillCADConstantDetail( x, y ) {CADHeader::x, y, "$"#x} |
47 | | |
48 | | static const CADHeaderConstantDetail CADHeaderConstantDetails[]{ |
49 | | FillCADConstantDetail( OPENCADVER, 777), |
50 | | FillCADConstantDetail( ACADMAINTVER, 70 ), FillCADConstantDetail( ACADVER, 1 ), |
51 | | FillCADConstantDetail( ANGBASE, 50 ), FillCADConstantDetail( ANGDIR, 70 ), FillCADConstantDetail( ATTMODE, 70 ), |
52 | | FillCADConstantDetail( AUNITS, 70 ), FillCADConstantDetail( AUPREC, 70 ), FillCADConstantDetail( CECOLOR, 62 ), |
53 | | FillCADConstantDetail( CELTSCALE, 40 ), FillCADConstantDetail( CELTYPE, 6 ), |
54 | | FillCADConstantDetail( CELWEIGHT, 370 ), FillCADConstantDetail( CEPSNID, 390 ), |
55 | | FillCADConstantDetail( CEPSNTYPE, 380 ), FillCADConstantDetail( CHAMFERA, 40 ), |
56 | | FillCADConstantDetail( CHAMFERB, 40 ), FillCADConstantDetail( CHAMFERC, 40 ), |
57 | | FillCADConstantDetail( CHAMFERD, 40 ), FillCADConstantDetail( CLAYER, 8 ), FillCADConstantDetail( CMLJUST, 70 ), |
58 | | FillCADConstantDetail( CMLSCALE, 40 ), FillCADConstantDetail( CMLSTYLE, 2 ), |
59 | | FillCADConstantDetail( CSHADOW, 280 ), FillCADConstantDetail( DIMADEC, 70 ), |
60 | | FillCADConstantDetail( DIMALT, 70 ), FillCADConstantDetail( DIMALTD, 70 ), FillCADConstantDetail( DIMALTF, 40 ), |
61 | | FillCADConstantDetail( DIMALTRND, 40 ), FillCADConstantDetail( DIMALTTD, 70 ), |
62 | | FillCADConstantDetail( DIMALTTZ, 70 ), FillCADConstantDetail( DIMALTU, 70 ), |
63 | | FillCADConstantDetail( DIMALTZ, 70 ), FillCADConstantDetail( DIMAPOST, 1 ), FillCADConstantDetail( DIMASO, 70 ), |
64 | | FillCADConstantDetail( DIMASSOC, 280 ), FillCADConstantDetail( DIMASZ, 40 ), |
65 | | FillCADConstantDetail( DIMATFIT, 70 ), FillCADConstantDetail( DIMAUNIT, 70 ), |
66 | | FillCADConstantDetail( DIMAZIN, 70 ), FillCADConstantDetail( DIMBLK, 1 ), FillCADConstantDetail( DIMBLK1, 1 ), |
67 | | FillCADConstantDetail( DIMBLK2, 1 ), FillCADConstantDetail( DIMCEN, 40 ), FillCADConstantDetail( DIMCLRD, 70 ), |
68 | | FillCADConstantDetail( DIMCLRE, 70 ), FillCADConstantDetail( DIMCLRT, 70 ), FillCADConstantDetail( DIMDEC, 70 ), |
69 | | FillCADConstantDetail( DIMDLE, 40 ), FillCADConstantDetail( DIMDLI, 40 ), FillCADConstantDetail( DIMDSEP, 70 ), |
70 | | FillCADConstantDetail( DIMEXE, 40 ), FillCADConstantDetail( DIMEXO, 40 ), FillCADConstantDetail( DIMFAC, 40 ), |
71 | | FillCADConstantDetail( DIMGAP, 40 ), FillCADConstantDetail( DIMJUST, 70 ), |
72 | | FillCADConstantDetail( DIMLDRBLK, 1 ), FillCADConstantDetail( DIMLFAC, 40 ), |
73 | | FillCADConstantDetail( DIMLIM, 70 ), FillCADConstantDetail( DIMLUNIT, 70 ), FillCADConstantDetail( DIMLWD, 70 ), |
74 | | FillCADConstantDetail( DIMLWE, 70 ), FillCADConstantDetail( DIMPOST, 1 ), FillCADConstantDetail( DIMRND, 40 ), |
75 | | FillCADConstantDetail( DIMSAH, 70 ), FillCADConstantDetail( DIMSCALE, 40 ), FillCADConstantDetail( DIMSD1, 70 ), |
76 | | FillCADConstantDetail( DIMSD2, 70 ), FillCADConstantDetail( DIMSE1, 70 ), FillCADConstantDetail( DIMSE2, 70 ), |
77 | | FillCADConstantDetail( DIMSHO, 70 ), FillCADConstantDetail( DIMSOXD, 70 ), FillCADConstantDetail( DIMSTYLE, 2 ), |
78 | | FillCADConstantDetail( DIMTAD, 70 ), FillCADConstantDetail( DIMTDEC, 70 ), FillCADConstantDetail( DIMTFAC, 40 ), |
79 | | FillCADConstantDetail( DIMTIH, 70 ), FillCADConstantDetail( DIMTIX, 70 ), FillCADConstantDetail( DIMTM, 40 ), |
80 | | FillCADConstantDetail( DIMTMOVE, 70 ), FillCADConstantDetail( DIMTOFL, 70 ), |
81 | | FillCADConstantDetail( DIMTOH, 70 ), FillCADConstantDetail( DIMTOL, 70 ), FillCADConstantDetail( DIMTOLJ, 70 ), |
82 | | FillCADConstantDetail( DIMTP, 40 ), FillCADConstantDetail( DIMTSZ, 40 ), FillCADConstantDetail( DIMTVP, 40 ), |
83 | | FillCADConstantDetail( DIMTXSTY, 7 ), FillCADConstantDetail( DIMTXT, 40 ), FillCADConstantDetail( DIMTZIN, 70 ), |
84 | | FillCADConstantDetail( DIMUPT, 70 ), FillCADConstantDetail( DIMZIN, 70 ), FillCADConstantDetail( DISPSILH, 70 ), |
85 | | FillCADConstantDetail( DRAGVS, 349 ), FillCADConstantDetail( DWGCODEPAGE, 3 ), |
86 | | FillCADConstantDetail( ELEVATION, 40 ), FillCADConstantDetail( ENDCAPS, 280 ), |
87 | | FillCADConstantDetail( EXTMAX, 123 ), FillCADConstantDetail( EXTMIN, 123 ), |
88 | | FillCADConstantDetail( EXTNAMES, 290 ), FillCADConstantDetail( FILLETRAD, 40 ), |
89 | | FillCADConstantDetail( FILLMODE, 70 ), FillCADConstantDetail( FINGERPRINTGUID, 2 ), |
90 | | FillCADConstantDetail( HALOGAP, 280 ), FillCADConstantDetail( HANDSEED, 5 ), |
91 | | FillCADConstantDetail( HIDETEXT, 290 ), FillCADConstantDetail( HYPERLINKBASE, 1 ), |
92 | | FillCADConstantDetail( INDEXCTL, 280 ), FillCADConstantDetail( INSBASE, 123 ), |
93 | | FillCADConstantDetail( INSUNITS, 70 ), FillCADConstantDetail( INTERFERECOLOR, 62 ), |
94 | | FillCADConstantDetail( INTERFEREOBJVS, 345 ), FillCADConstantDetail( INTERFEREVPVS, 346 ), |
95 | | FillCADConstantDetail( INTERSECTIONCOLOR, 70 ), FillCADConstantDetail( INTERSECTIONDISPLAY, 290 ), |
96 | | FillCADConstantDetail( JOINSTYLE, 280 ), FillCADConstantDetail( LIMCHECK, 70 ), |
97 | | FillCADConstantDetail( LIMMAX, 1020 ), FillCADConstantDetail( LIMMIN, 1020 ), |
98 | | FillCADConstantDetail( LTSCALE, 40 ), FillCADConstantDetail( LUNITS, 70 ), FillCADConstantDetail( LUPREC, 70 ), |
99 | | FillCADConstantDetail( LWDISPLAY, 290 ), FillCADConstantDetail( MAXACTVP, 70 ), |
100 | | FillCADConstantDetail( MEASUREMENT, 70 ), FillCADConstantDetail( MENU, 1 ), |
101 | | FillCADConstantDetail( MIRRTEXT, 70 ), FillCADConstantDetail( OBSCOLOR, 70 ), |
102 | | FillCADConstantDetail( OBSLTYPE, 280 ), FillCADConstantDetail( ORTHOMODE, 70 ), |
103 | | FillCADConstantDetail( PDMODE, 70 ), FillCADConstantDetail( PDSIZE, 40 ), |
104 | | FillCADConstantDetail( PELEVATION, 40 ), FillCADConstantDetail( PEXTMAX, 123 ), |
105 | | FillCADConstantDetail( PEXTMIN, 123 ), FillCADConstantDetail( PINSBASE, 123 ), |
106 | | FillCADConstantDetail( PLIMCHECK, 70 ), FillCADConstantDetail( PLIMMAX, 1020 ), |
107 | | FillCADConstantDetail( PLIMMIN, 1020 ), FillCADConstantDetail( PLINEGEN, 70 ), |
108 | | FillCADConstantDetail( PLINEWID, 40 ), FillCADConstantDetail( PROJECTNAME, 1 ), |
109 | | FillCADConstantDetail( PROXYGRAPHICS, 70 ), FillCADConstantDetail( PSLTSCALE, 70 ), |
110 | | FillCADConstantDetail( PSTYLEMODE, 290 ), FillCADConstantDetail( PSVPSCALE, 40 ), |
111 | | FillCADConstantDetail( PUCSBASE, 2 ), FillCADConstantDetail( PUCSNAME, 2 ), |
112 | | FillCADConstantDetail( PUCSORG, 123 ), FillCADConstantDetail( PUCSORGBACK, 123 ), |
113 | | FillCADConstantDetail( PUCSORGBOTTOM, 123 ), FillCADConstantDetail( PUCSORGFRONT, 123 ), |
114 | | FillCADConstantDetail( PUCSORGLEFT, 123 ), FillCADConstantDetail( PUCSORGRIGHT, 123 ), |
115 | | FillCADConstantDetail( PUCSORGTOP, 123 ), FillCADConstantDetail( PUCSORTHOREF, 2 ), |
116 | | FillCADConstantDetail( PUCSORTHOVIEW, 70 ), FillCADConstantDetail( PUCSXDIR, 123 ), |
117 | | FillCADConstantDetail( PUCSYDIR, 123 ), FillCADConstantDetail( QTEXTMODE, 70 ), |
118 | | FillCADConstantDetail( REGENMODE, 70 ), FillCADConstantDetail( SHADEDGE, 70 ), |
119 | | FillCADConstantDetail( SHADEDIF, 70 ), FillCADConstantDetail( SHADOWPLANELOCATION, 40 ), |
120 | | FillCADConstantDetail( SKETCHINC, 40 ), FillCADConstantDetail( SKPOLY, 70 ), |
121 | | FillCADConstantDetail( SORTENTS, 280 ), FillCADConstantDetail( SPLINESEGS, 70 ), |
122 | | FillCADConstantDetail( SPLINETYPE, 70 ), FillCADConstantDetail( SURFTAB1, 70 ), |
123 | | FillCADConstantDetail( SURFTAB2, 70 ), FillCADConstantDetail( SURFTYPE, 70 ), |
124 | | FillCADConstantDetail( SURFU, 70 ), FillCADConstantDetail( SURFV, 70 ), FillCADConstantDetail( TDCREATE, 40 ), |
125 | | FillCADConstantDetail( TDINDWG, 40 ), FillCADConstantDetail( TDUCREATE, 40 ), |
126 | | FillCADConstantDetail( TDUPDATE, 40 ), FillCADConstantDetail( TDUSRTIMER, 40 ), |
127 | | FillCADConstantDetail( TDUUPDATE, 40 ), FillCADConstantDetail( TEXTSIZE, 40 ), |
128 | | FillCADConstantDetail( TEXTSTYLE, 7 ), FillCADConstantDetail( THICKNESS, 40 ), |
129 | | FillCADConstantDetail( TILEMODE, 70 ), FillCADConstantDetail( TRACEWID, 40 ), |
130 | | FillCADConstantDetail( TREEDEPTH, 70 ), FillCADConstantDetail( UCSBASE, 2 ), |
131 | | FillCADConstantDetail( UCSNAME, 2 ), FillCADConstantDetail( UCSORG, 123 ), |
132 | | FillCADConstantDetail( UCSORGBACK, 123 ), FillCADConstantDetail( UCSORGBOTTOM, 123 ), |
133 | | FillCADConstantDetail( UCSORGFRONT, 123 ), FillCADConstantDetail( UCSORGLEFT, 123 ), |
134 | | FillCADConstantDetail( UCSORGRIGHT, 123 ), FillCADConstantDetail( UCSORGTOP, 123 ), |
135 | | FillCADConstantDetail( UCSORTHOREF, 2 ), FillCADConstantDetail( UCSORTHOVIEW, 70 ), |
136 | | FillCADConstantDetail( UCSXDIR, 123 ), FillCADConstantDetail( UCSYDIR, 123 ), |
137 | | FillCADConstantDetail( UNITMODE, 70 ), FillCADConstantDetail( USERI1, 70 ), FillCADConstantDetail( USERI2, 70 ), |
138 | | FillCADConstantDetail( USERI3, 70 ), FillCADConstantDetail( USERI4, 70 ), FillCADConstantDetail( USERI5, 70 ), |
139 | | FillCADConstantDetail( USERR1, 40 ), FillCADConstantDetail( USERR2, 40 ), FillCADConstantDetail( USERR3, 40 ), |
140 | | FillCADConstantDetail( USERR4, 40 ), FillCADConstantDetail( USERR5, 40 ), FillCADConstantDetail( USRTIMER, 70 ), |
141 | | FillCADConstantDetail( VERSIONGUID, 2 ), FillCADConstantDetail( VISRETAIN, 70 ), |
142 | | FillCADConstantDetail( WORLDVIEW, 70 ), FillCADConstantDetail( XCLIPFRAME, 290 ), |
143 | | FillCADConstantDetail( XEDIT, 290 ), { -1, -1, nullptr } |
144 | | }; |
145 | | |
146 | | //------------------------------------------------------------------------------ |
147 | | // CADHandle |
148 | | //------------------------------------------------------------------------------ |
149 | | |
150 | 8.75M | CADHandle::CADHandle( unsigned char codeIn ) : code( codeIn ) |
151 | 8.75M | { |
152 | 8.75M | } |
153 | | |
154 | | CADHandle::CADHandle( const CADHandle& other ) : |
155 | 15.2M | code( other.code ), |
156 | 15.2M | handleOrOffset( other.handleOrOffset ) |
157 | 15.2M | { |
158 | 15.2M | } |
159 | | |
160 | | CADHandle& CADHandle::operator=( const CADHandle& other ) |
161 | 1.17M | { |
162 | 1.17M | if( this == & other ) |
163 | 0 | return * this; |
164 | 1.17M | code = other.code; |
165 | 1.17M | handleOrOffset = other.handleOrOffset; |
166 | 1.17M | return * this; |
167 | 1.17M | } |
168 | | |
169 | | void CADHandle::addOffset( unsigned char val ) |
170 | 11.4M | { |
171 | 11.4M | handleOrOffset.push_back( val ); |
172 | 11.4M | } |
173 | | |
174 | | long CADHandle::getAsLong( const CADHandle& ref_handle ) const |
175 | 14.4k | { |
176 | | // FIXME: Remove GDAL specific code. The library cannot compile as separate project. |
177 | 14.4k | try |
178 | 14.4k | { |
179 | 14.4k | switch( code ) |
180 | 14.4k | { |
181 | 1.64k | case 0x06: |
182 | 1.64k | { |
183 | 1.64k | return static_cast<long>((CPLSM(static_cast<int64_t>(getAsLong(ref_handle.handleOrOffset))) + |
184 | 1.64k | CPLSM(static_cast<int64_t>(1))).v()); |
185 | 0 | } |
186 | 1.74k | case 0x08: |
187 | 1.74k | { |
188 | 1.74k | return static_cast<long>((CPLSM(static_cast<int64_t>(getAsLong(ref_handle.handleOrOffset))) - |
189 | 1.74k | CPLSM(static_cast<int64_t>(1))).v()); |
190 | 0 | } |
191 | 3.65k | case 0x0A: |
192 | 3.65k | { |
193 | 3.65k | return static_cast<long>((CPLSM(static_cast<int64_t>(getAsLong(ref_handle.handleOrOffset))) + |
194 | 3.65k | CPLSM(static_cast<int64_t>(getAsLong(handleOrOffset)))).v()); |
195 | 0 | } |
196 | 1.92k | case 0x0C: |
197 | 1.92k | { |
198 | 1.92k | return static_cast<long>((CPLSM(static_cast<int64_t>(getAsLong(ref_handle.handleOrOffset))) - |
199 | 1.92k | CPLSM(static_cast<int64_t>(getAsLong(handleOrOffset)))).v()); |
200 | 0 | } |
201 | 14.4k | } |
202 | 14.4k | } |
203 | 14.4k | catch( const CPLSafeIntOverflow& ) |
204 | 14.4k | { |
205 | | // TODO: handle this differently ? |
206 | 3.62k | return 0; |
207 | 3.62k | } |
208 | | |
209 | 5.44k | return getAsLong(handleOrOffset); |
210 | 14.4k | } |
211 | | |
212 | | long CADHandle::getAsLong() const |
213 | 562k | { |
214 | 562k | return getAsLong(handleOrOffset); |
215 | 562k | } |
216 | | |
217 | | long CADHandle::getAsLong(const std::vector<unsigned char>& handle) |
218 | 582k | { |
219 | 582k | unsigned long result = 0; |
220 | 582k | if( handle.empty() ) |
221 | 89.3k | return result; |
222 | 493k | size_t copySize = handle.size(); |
223 | 493k | if( copySize > sizeof(long) ) |
224 | 110k | copySize = sizeof(long); |
225 | 2.74M | for( size_t i = 0; i < copySize; ++i ) |
226 | 2.25M | result = result * 256U + handle[i]; |
227 | 493k | return static_cast<long>(result); |
228 | 582k | } |
229 | | |
230 | | bool CADHandle::isNull() const |
231 | 907k | { |
232 | 907k | return handleOrOffset.empty() ? true : false; |
233 | 907k | } |
234 | | |
235 | | //------------------------------------------------------------------------------ |
236 | | // CADVariant |
237 | | //------------------------------------------------------------------------------ |
238 | | |
239 | | CADVariant::CADVariant() : |
240 | 585k | type ( DataType::INVALID ), |
241 | 585k | decimalVal ( 0 ), |
242 | 585k | xVal ( 0 ), |
243 | 585k | yVal ( 0 ), |
244 | 585k | zVal ( 0 ), |
245 | 585k | dateTimeVal ( 0 ) |
246 | 585k | { |
247 | 585k | } |
248 | | |
249 | | CADVariant::CADVariant( const char * val ) : |
250 | 13.8k | type ( DataType::STRING ), |
251 | 13.8k | decimalVal ( 0 ), |
252 | 13.8k | xVal ( 0 ), |
253 | 13.8k | yVal ( 0 ), |
254 | 13.8k | zVal ( 0 ), |
255 | 13.8k | stringVal ( string( val ) ), |
256 | 13.8k | dateTimeVal ( 0 ) |
257 | 13.8k | { |
258 | 13.8k | } |
259 | | |
260 | | CADVariant::CADVariant( int val ) : |
261 | 8.46k | type ( DataType::DECIMAL ), |
262 | 8.46k | decimalVal ( val ), |
263 | 8.46k | xVal ( 0 ), |
264 | 8.46k | yVal ( 0 ), |
265 | 8.46k | zVal ( 0 ), |
266 | 8.46k | stringVal ( to_string( val ) ), |
267 | 8.46k | dateTimeVal ( 0 ) |
268 | 8.46k | { |
269 | 8.46k | } |
270 | | |
271 | | CADVariant::CADVariant( short val ) : |
272 | 53.7k | type ( DataType::DECIMAL ), |
273 | 53.7k | decimalVal ( val ), |
274 | 53.7k | xVal ( 0 ), |
275 | 53.7k | yVal ( 0 ), |
276 | 53.7k | zVal ( 0 ), |
277 | 53.7k | stringVal ( to_string( val ) ), |
278 | 53.7k | dateTimeVal ( 0 ) |
279 | 53.7k | { |
280 | 53.7k | } |
281 | | |
282 | | CADVariant::CADVariant( double val ) : |
283 | 80.2k | type ( DataType::REAL ), |
284 | 80.2k | decimalVal ( 0 ), |
285 | 80.2k | xVal ( val ), |
286 | 80.2k | yVal ( 0 ), |
287 | 80.2k | zVal ( 0 ), |
288 | 80.2k | stringVal ( to_string( val ) ), |
289 | 80.2k | dateTimeVal ( 0 ) |
290 | 80.2k | { |
291 | 80.2k | } |
292 | | |
293 | | CADVariant::CADVariant( double x, double y, double z ) : |
294 | 187k | type ( DataType::COORDINATES ), |
295 | 187k | decimalVal ( 0 ), |
296 | 187k | xVal ( x ), |
297 | 187k | yVal ( y ), |
298 | 187k | zVal ( z ), |
299 | 187k | dateTimeVal ( 0 ) |
300 | 187k | { |
301 | 187k | char str_buff[256]; |
302 | 187k | snprintf( str_buff, sizeof(str_buff), "[%.15g,%.15g,%.15g]", x, y, z ); |
303 | 187k | str_buff[sizeof(str_buff)-1] = '\0'; |
304 | 187k | stringVal = str_buff; |
305 | 187k | } |
306 | | |
307 | | CADVariant::CADVariant( const string& val ) : |
308 | 26.7k | type ( DataType::STRING ), |
309 | 26.7k | decimalVal ( 0 ), |
310 | 26.7k | xVal ( 0 ), |
311 | 26.7k | yVal ( 0 ), |
312 | 26.7k | zVal ( 0 ), |
313 | 26.7k | stringVal ( val ), |
314 | 26.7k | dateTimeVal ( 0 ) |
315 | 26.7k | { |
316 | 26.7k | } |
317 | | |
318 | | CADVariant::CADVariant( long julianday, long milliseconds ) : |
319 | 26.7k | type ( DataType::DATETIME ), |
320 | 26.7k | decimalVal ( 0 ), |
321 | 26.7k | xVal ( 0 ), |
322 | 26.7k | yVal ( 0 ), |
323 | 26.7k | zVal ( 0 ) |
324 | 26.7k | { |
325 | 26.7k | double dfSeconds = double( milliseconds ) / 1000; |
326 | 26.7k | double dfUnix = 0; |
327 | 26.7k | if(julianday != 0) |
328 | 2.11k | dfUnix = ( double( julianday ) - 2440587.5 ) * 86400.0; |
329 | 26.7k | dateTimeVal = static_cast<time_t>( dfUnix + dfSeconds ); |
330 | | |
331 | 26.7k | char str_buff[256] = "Invalid date"; |
332 | 26.7k | #if HAVE_LOCALTIME_R |
333 | 26.7k | struct tm localtime_tm; |
334 | 26.7k | const struct tm *poLocaltime = localtime_r(&dateTimeVal, &localtime_tm); |
335 | | #elif defined(_WIN32) |
336 | | struct tm localtime_tm; |
337 | | const struct tm *poLocaltime = localtime_s(&localtime_tm, &dateTimeVal) == 0 ? &localtime_tm : nullptr; |
338 | | #else |
339 | | const struct tm *poLocaltime = localtime(&dateTimeVal); |
340 | | #endif |
341 | 26.7k | if(poLocaltime) |
342 | 26.7k | strftime(str_buff, 255, "%Y-%m-%d %H:%M:%S", poLocaltime); |
343 | 26.7k | stringVal = str_buff; |
344 | 26.7k | } |
345 | | |
346 | | CADVariant::CADVariant( const CADHandle& val ) : |
347 | 80.2k | type ( DataType::HANDLE ), |
348 | 80.2k | decimalVal ( 0 ), |
349 | 80.2k | xVal ( 0 ), |
350 | 80.2k | yVal ( 0 ), |
351 | 80.2k | zVal ( 0 ), |
352 | 80.2k | stringVal ( to_string( val.getAsLong() ) ), |
353 | 80.2k | handleVal ( val ), |
354 | 80.2k | dateTimeVal ( 0 ) |
355 | 80.2k | { |
356 | 80.2k | } |
357 | | |
358 | | long CADVariant::getDecimal() const |
359 | 1.54k | { |
360 | 1.54k | return decimalVal; |
361 | 1.54k | } |
362 | | |
363 | | double CADVariant::getReal() const |
364 | 0 | { |
365 | 0 | return xVal; |
366 | 0 | } |
367 | | |
368 | | const string& CADVariant::getString() const |
369 | 109k | { |
370 | 109k | return stringVal; |
371 | 109k | } |
372 | | |
373 | | CADVariant::DataType CADVariant::getType() const |
374 | 0 | { |
375 | 0 | return type; |
376 | 0 | } |
377 | | |
378 | | double CADVariant::getX() const |
379 | 0 | { |
380 | 0 | return xVal; |
381 | 0 | } |
382 | | |
383 | | double CADVariant::getY() const |
384 | 0 | { |
385 | 0 | return yVal; |
386 | 0 | } |
387 | | |
388 | | double CADVariant::getZ() const |
389 | 0 | { |
390 | 0 | return zVal; |
391 | 0 | } |
392 | | |
393 | | const CADHandle& CADVariant::getHandle() const |
394 | 0 | { |
395 | 0 | return handleVal; |
396 | 0 | } |
397 | | |
398 | | //------------------------------------------------------------------------------ |
399 | | // CADHeader |
400 | | //------------------------------------------------------------------------------ |
401 | | |
402 | | CADHeader::CADHeader() |
403 | 6.91k | { |
404 | 6.91k | } |
405 | | |
406 | | int CADHeader::addValue( short code, const CADVariant& val ) |
407 | 475k | { |
408 | 475k | if( valuesMap.find( code ) != valuesMap.end() ) |
409 | 0 | return CADErrorCodes::VALUE_EXISTS; |
410 | | |
411 | 475k | valuesMap[code] = val; |
412 | 475k | return CADErrorCodes::SUCCESS; |
413 | 475k | } |
414 | | |
415 | | int CADHeader::addValue( short code, const char * val ) |
416 | 13.8k | { |
417 | 13.8k | return addValue( code, CADVariant( val ) ); |
418 | 13.8k | } |
419 | | /* |
420 | | int CADHeader::addValue( short code, long val ) |
421 | | { |
422 | | return addValue( code, CADVariant( val ) ); |
423 | | } |
424 | | */ |
425 | | int CADHeader::addValue( short code, int val ) |
426 | 6.91k | { |
427 | 6.91k | return addValue( code, CADVariant( val ) ); |
428 | 6.91k | } |
429 | | |
430 | | int CADHeader::addValue( short code, short val ) |
431 | 53.7k | { |
432 | 53.7k | return addValue( code, CADVariant( val ) ); |
433 | 53.7k | } |
434 | | |
435 | | int CADHeader::addValue( short code, double val ) |
436 | 80.2k | { |
437 | 80.2k | return addValue( code, CADVariant( val ) ); |
438 | 80.2k | } |
439 | | |
440 | | int CADHeader::addValue( short code, const string& val ) |
441 | 26.7k | { |
442 | 26.7k | return addValue( code, CADVariant( val ) ); |
443 | 26.7k | } |
444 | | |
445 | | int CADHeader::addValue( short code, bool val ) |
446 | 0 | { |
447 | 0 | return addValue( code, CADVariant( val ? 1 : 0 ) ); |
448 | 0 | } |
449 | | |
450 | | int CADHeader::addValue( short code, double x, double y, double z ) |
451 | 187k | { |
452 | 187k | return addValue( code, CADVariant( x, y, z ) ); |
453 | 187k | } |
454 | | |
455 | | int CADHeader::addValue( short code, long julianday, long milliseconds ) |
456 | 26.7k | { |
457 | | // unix -> julian return ( unixSecs / 86400.0 ) + 2440587.5; |
458 | | // julian -> unix return (julian - 2440587.5) * 86400.0 |
459 | | |
460 | 26.7k | return addValue( code, CADVariant( julianday, milliseconds ) ); |
461 | 26.7k | } |
462 | | |
463 | | int CADHeader::getGroupCode( short code ) |
464 | 0 | { |
465 | 0 | for( CADHeaderConstantDetail detail : CADHeaderConstantDetails ) |
466 | 0 | { |
467 | 0 | if( detail.nConstant == code ) |
468 | 0 | return detail.nGroupCode; |
469 | 0 | } |
470 | | |
471 | 0 | return -1; |
472 | 0 | } |
473 | | |
474 | | const CADVariant CADHeader::getValue( short code, const CADVariant& val ) const |
475 | 111k | { |
476 | 111k | auto it = valuesMap.find( code ); |
477 | 111k | if( it != valuesMap.end() ) |
478 | 111k | return it->second; |
479 | 0 | else |
480 | 0 | return val; |
481 | 111k | } |
482 | | |
483 | | const char * CADHeader::getValueName( short code ) |
484 | 109k | { |
485 | 109k | for( CADHeaderConstantDetail detail : CADHeaderConstantDetails ) |
486 | 14.5M | { |
487 | 14.5M | if( detail.nConstant == code ) |
488 | 108k | return detail.pszValueName; |
489 | 14.5M | } |
490 | 1.54k | return "Undefined"; |
491 | 109k | } |
492 | | |
493 | | void CADHeader::print() const |
494 | 0 | { |
495 | 0 | cout << "============ HEADER Section ============\n"; |
496 | 0 | for( const auto& it : valuesMap ) |
497 | 0 | { |
498 | 0 | cout << getValueName( it.first ) << ": " << it.second.getString() << "\n"; |
499 | 0 | } |
500 | 0 | cout << "\n"; |
501 | 0 | } |
502 | | |
503 | | size_t CADHeader::getSize() const |
504 | 111k | { |
505 | 111k | return valuesMap.size(); |
506 | 111k | } |
507 | | |
508 | | short CADHeader::getCode( int index ) const |
509 | 109k | { |
510 | 109k | auto it = valuesMap.begin(); |
511 | 109k | advance( it, index ); |
512 | 109k | return it->first; |
513 | 109k | } |