LCOV - code coverage report
Current view: top level - ogr/ogrsf_frmts/cad/libopencad - cadheader.cpp (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 114 154 74.0 %
Date: 2024-11-21 22:18:42 Functions: 32 41 78.0 %

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

Generated by: LCOV version 1.14