Coverage Report

Created: 2025-08-11 09:23

/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
}