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