Line data Source code
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 4994 : CADHandle::CADHandle( unsigned char codeIn ) : code( codeIn )
151 : {
152 4994 : }
153 :
154 2746 : CADHandle::CADHandle( const CADHandle& other ) :
155 2746 : code( other.code ),
156 2746 : handleOrOffset( other.handleOrOffset )
157 : {
158 2746 : }
159 :
160 1511 : CADHandle& CADHandle::operator=( const CADHandle& other )
161 : {
162 1511 : if( this == & other )
163 0 : return * this;
164 1511 : code = other.code;
165 1511 : handleOrOffset = other.handleOrOffset;
166 1511 : return * this;
167 : }
168 :
169 2350 : void CADHandle::addOffset( unsigned char val )
170 : {
171 2350 : handleOrOffset.push_back( val );
172 2350 : }
173 :
174 26 : long CADHandle::getAsLong( const CADHandle& ref_handle ) const
175 : {
176 : // FIXME: Remove GDAL specific code. The library cannot compile as separate project.
177 : try
178 : {
179 26 : switch( code )
180 : {
181 5 : case 0x06:
182 : {
183 5 : return static_cast<long>((CPLSM(static_cast<GInt64>(getAsLong(ref_handle.handleOrOffset))) +
184 10 : CPLSM(static_cast<GInt64>(1))).v());
185 : }
186 0 : case 0x08:
187 : {
188 0 : return static_cast<long>((CPLSM(static_cast<GInt64>(getAsLong(ref_handle.handleOrOffset))) -
189 0 : CPLSM(static_cast<GInt64>(1))).v());
190 : }
191 0 : case 0x0A:
192 : {
193 0 : return static_cast<long>((CPLSM(static_cast<GInt64>(getAsLong(ref_handle.handleOrOffset))) +
194 0 : CPLSM(static_cast<GInt64>(getAsLong(handleOrOffset)))).v());
195 : }
196 0 : case 0x0C:
197 : {
198 0 : return static_cast<long>((CPLSM(static_cast<GInt64>(getAsLong(ref_handle.handleOrOffset))) -
199 0 : CPLSM(static_cast<GInt64>(getAsLong(handleOrOffset)))).v());
200 : }
201 : }
202 : }
203 0 : catch( const CPLSafeIntOverflow& )
204 : {
205 : // TODO: handle this differently ?
206 0 : return 0;
207 : }
208 :
209 21 : return getAsLong(handleOrOffset);
210 : }
211 :
212 318 : long CADHandle::getAsLong() const
213 : {
214 318 : return getAsLong(handleOrOffset);
215 : }
216 :
217 344 : long CADHandle::getAsLong(const std::vector<unsigned char>& handle)
218 : {
219 344 : unsigned long result = 0;
220 344 : if( handle.empty() )
221 48 : return result;
222 296 : size_t copySize = handle.size();
223 296 : if( copySize > sizeof(long) )
224 0 : copySize = sizeof(long);
225 679 : for( size_t i = 0; i < copySize; ++i )
226 383 : result = result * 256U + handle[i];
227 296 : return static_cast<long>(result);
228 : }
229 :
230 10 : bool CADHandle::isNull() const
231 : {
232 10 : return handleOrOffset.empty() ? true : false;
233 : }
234 :
235 : //------------------------------------------------------------------------------
236 : // CADVariant
237 : //------------------------------------------------------------------------------
238 :
239 1136 : CADVariant::CADVariant() :
240 : type ( DataType::INVALID ),
241 : decimalVal ( 0 ),
242 : xVal ( 0 ),
243 : yVal ( 0 ),
244 : zVal ( 0 ),
245 1136 : dateTimeVal ( 0 )
246 : {
247 1136 : }
248 :
249 16 : CADVariant::CADVariant( const char * val ) :
250 : type ( DataType::STRING ),
251 : decimalVal ( 0 ),
252 : xVal ( 0 ),
253 : yVal ( 0 ),
254 : zVal ( 0 ),
255 : stringVal ( string( val ) ),
256 16 : dateTimeVal ( 0 )
257 : {
258 16 : }
259 :
260 16 : CADVariant::CADVariant( int val ) :
261 : type ( DataType::DECIMAL ),
262 16 : decimalVal ( val ),
263 : xVal ( 0 ),
264 : yVal ( 0 ),
265 : zVal ( 0 ),
266 : stringVal ( to_string( val ) ),
267 16 : dateTimeVal ( 0 )
268 : {
269 16 : }
270 :
271 64 : CADVariant::CADVariant( short val ) :
272 : type ( DataType::DECIMAL ),
273 64 : decimalVal ( val ),
274 : xVal ( 0 ),
275 : yVal ( 0 ),
276 : zVal ( 0 ),
277 : stringVal ( to_string( val ) ),
278 64 : dateTimeVal ( 0 )
279 : {
280 64 : }
281 :
282 96 : CADVariant::CADVariant( double val ) :
283 : type ( DataType::REAL ),
284 : decimalVal ( 0 ),
285 : xVal ( val ),
286 : yVal ( 0 ),
287 : zVal ( 0 ),
288 : stringVal ( to_string( val ) ),
289 96 : dateTimeVal ( 0 )
290 : {
291 96 : }
292 :
293 224 : CADVariant::CADVariant( double x, double y, double z ) :
294 : type ( DataType::COORDINATES ),
295 : decimalVal ( 0 ),
296 : xVal ( x ),
297 : yVal ( y ),
298 : zVal ( z ),
299 224 : dateTimeVal ( 0 )
300 : {
301 : char str_buff[256];
302 224 : snprintf( str_buff, sizeof(str_buff), "[%.15g,%.15g,%.15g]", x, y, z );
303 224 : str_buff[sizeof(str_buff)-1] = '\0';
304 224 : stringVal = str_buff;
305 224 : }
306 :
307 32 : CADVariant::CADVariant( const string& val ) :
308 : type ( DataType::STRING ),
309 : decimalVal ( 0 ),
310 : xVal ( 0 ),
311 : yVal ( 0 ),
312 : zVal ( 0 ),
313 : stringVal ( val ),
314 32 : dateTimeVal ( 0 )
315 : {
316 32 : }
317 :
318 32 : CADVariant::CADVariant( long julianday, long milliseconds ) :
319 : type ( DataType::DATETIME ),
320 : decimalVal ( 0 ),
321 : xVal ( 0 ),
322 : yVal ( 0 ),
323 32 : zVal ( 0 )
324 : {
325 32 : double dfSeconds = double( milliseconds ) / 1000;
326 32 : double dfUnix = 0;
327 32 : if(julianday != 0)
328 16 : dfUnix = ( double( julianday ) - 2440587.5 ) * 86400.0;
329 32 : dateTimeVal = static_cast<time_t>( dfUnix + dfSeconds );
330 :
331 32 : char str_buff[256] = "Invalid date";
332 : #if HAVE_LOCALTIME_R
333 : struct tm localtime_tm;
334 32 : 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 32 : if(poLocaltime)
342 32 : strftime(str_buff, 255, "%Y-%m-%d %H:%M:%S", poLocaltime);
343 32 : stringVal = str_buff;
344 32 : }
345 :
346 96 : CADVariant::CADVariant( const CADHandle& val ) :
347 : type ( DataType::HANDLE ),
348 : decimalVal ( 0 ),
349 : xVal ( 0 ),
350 : yVal ( 0 ),
351 : zVal ( 0 ),
352 : stringVal ( to_string( val.getAsLong() ) ),
353 : handleVal ( val ),
354 96 : dateTimeVal ( 0 )
355 : {
356 96 : }
357 :
358 8 : long CADVariant::getDecimal() const
359 : {
360 8 : return decimalVal;
361 : }
362 :
363 0 : double CADVariant::getReal() const
364 : {
365 0 : return xVal;
366 : }
367 :
368 568 : const string& CADVariant::getString() const
369 : {
370 568 : return stringVal;
371 : }
372 :
373 0 : CADVariant::DataType CADVariant::getType() const
374 : {
375 0 : return type;
376 : }
377 :
378 0 : double CADVariant::getX() const
379 : {
380 0 : return xVal;
381 : }
382 :
383 0 : double CADVariant::getY() const
384 : {
385 0 : return yVal;
386 : }
387 :
388 0 : double CADVariant::getZ() const
389 : {
390 0 : return zVal;
391 : }
392 :
393 0 : const CADHandle& CADVariant::getHandle() const
394 : {
395 0 : return handleVal;
396 : }
397 :
398 : //------------------------------------------------------------------------------
399 : // CADHeader
400 : //------------------------------------------------------------------------------
401 :
402 8 : CADHeader::CADHeader()
403 : {
404 8 : }
405 :
406 568 : int CADHeader::addValue( short code, const CADVariant& val )
407 : {
408 568 : if( valuesMap.find( code ) != valuesMap.end() )
409 0 : return CADErrorCodes::VALUE_EXISTS;
410 :
411 568 : valuesMap[code] = val;
412 568 : return CADErrorCodes::SUCCESS;
413 : }
414 :
415 16 : int CADHeader::addValue( short code, const char * val )
416 : {
417 16 : return addValue( code, CADVariant( val ) );
418 : }
419 : /*
420 : int CADHeader::addValue( short code, long val )
421 : {
422 : return addValue( code, CADVariant( val ) );
423 : }
424 : */
425 8 : int CADHeader::addValue( short code, int val )
426 : {
427 8 : return addValue( code, CADVariant( val ) );
428 : }
429 :
430 64 : int CADHeader::addValue( short code, short val )
431 : {
432 64 : return addValue( code, CADVariant( val ) );
433 : }
434 :
435 96 : int CADHeader::addValue( short code, double val )
436 : {
437 96 : return addValue( code, CADVariant( val ) );
438 : }
439 :
440 32 : int CADHeader::addValue( short code, const string& val )
441 : {
442 32 : return addValue( code, CADVariant( val ) );
443 : }
444 :
445 0 : int CADHeader::addValue( short code, bool val )
446 : {
447 0 : return addValue( code, CADVariant( val ? 1 : 0 ) );
448 : }
449 :
450 224 : int CADHeader::addValue( short code, double x, double y, double z )
451 : {
452 224 : return addValue( code, CADVariant( x, y, z ) );
453 : }
454 :
455 32 : int CADHeader::addValue( short code, long julianday, long milliseconds )
456 : {
457 : // unix -> julian return ( unixSecs / 86400.0 ) + 2440587.5;
458 : // julian -> unix return (julian - 2440587.5) * 86400.0
459 :
460 32 : return addValue( code, CADVariant( julianday, milliseconds ) );
461 : }
462 :
463 0 : int CADHeader::getGroupCode( short code )
464 : {
465 0 : for( CADHeaderConstantDetail detail : CADHeaderConstantDetails )
466 : {
467 0 : if( detail.nConstant == code )
468 0 : return detail.nGroupCode;
469 : }
470 :
471 0 : return -1;
472 : }
473 :
474 576 : const CADVariant CADHeader::getValue( short code, const CADVariant& val ) const
475 : {
476 576 : auto it = valuesMap.find( code );
477 576 : if( it != valuesMap.end() )
478 576 : return it->second;
479 : else
480 0 : return val;
481 : }
482 :
483 568 : const char * CADHeader::getValueName( short code )
484 : {
485 75040 : for( CADHeaderConstantDetail detail : CADHeaderConstantDetails )
486 : {
487 75032 : if( detail.nConstant == code )
488 560 : return detail.pszValueName;
489 : }
490 8 : return "Undefined";
491 : }
492 :
493 0 : void CADHeader::print() const
494 : {
495 0 : cout << "============ HEADER Section ============\n";
496 0 : for( const auto& it : valuesMap )
497 : {
498 0 : cout << getValueName( it.first ) << ": " << it.second.getString() << "\n";
499 : }
500 0 : cout << "\n";
501 0 : }
502 :
503 576 : size_t CADHeader::getSize() const
504 : {
505 576 : return valuesMap.size();
506 : }
507 :
508 568 : short CADHeader::getCode( int index ) const
509 : {
510 568 : auto it = valuesMap.begin();
511 568 : advance( it, index );
512 568 : return it->first;
513 : }
|