diff options
Diffstat (limited to 'lib_dxf/drw_base.h')
-rw-r--r-- | lib_dxf/drw_base.h | 493 |
1 files changed, 493 insertions, 0 deletions
diff --git a/lib_dxf/drw_base.h b/lib_dxf/drw_base.h new file mode 100644 index 0000000..df8f155 --- /dev/null +++ b/lib_dxf/drw_base.h @@ -0,0 +1,493 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011 Rallaz, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see <http://www.gnu.org/licenses/>. ** +******************************************************************************/ + +#ifndef DRW_BASE_H +#define DRW_BASE_H + +#define DRW_VERSION "0.5.13" + +#include <string> +#include <cmath> + +#define UTF8STRING std::string +#define DRW_UNUSED( x ) (void) x + +#if defined(WIN64) || defined(_WIN64) || defined(__WIN64__) +# define DRW_WIN +#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__) +# define DRW_WIN +#elif defined(__MWERKS__) && defined(__INTEL__) +# define DRW_WIN +#else +# define DRW_POSIX +#endif + +#ifndef M_PI + #define M_PI 3.141592653589793238462643 +#endif +#ifndef M_PI_2 + #define M_PI_2 1.57079632679489661923 +#endif +#define M_PIx2 6.283185307179586 // 2*PI +#define ARAD 57.29577951308232 + +namespace DRW { +// ! Version numbers for the DXF Format. +enum Version +{ + UNKNOWNV, /*!< UNKNOWN VERSION. */ + AC1006, /*!< R10. */ + AC1009, /*!< R11 & R12. */ + AC1012, /*!< R13. */ + AC1014, /*!< R14. */ + AC1015, /*!< ACAD 2000. */ + AC1018, /*!< ACAD 2004. */ + AC1021, /*!< ACAD 2007. */ + AC1024 /*!< ACAD 2010. */ +}; + +enum error +{ + BAD_NONE, /*!< No error. */ + BAD_UNKNOWN, /*!< UNKNOWN. */ + BAD_OPEN, /*!< error opening file. */ + BAD_VERSION, /*!< unsupported version. */ + BAD_READ_FILE_HEADER, /*!< error in file header read process. */ + BAD_READ_HEADER, /*!< error in header vars read process. */ + BAD_READ_OFFSETS, /*!< error in object map read process. */ + BAD_READ_CLASSES, /*!< error in classes read process. */ + BAD_READ_TABLES, /*!< error in tables read process. */ + BAD_READ_ENTITIES /*!< error in entities read process. */ +}; +} + +// ! Class to handle 3D coordinate point +/*! + * Class to handle 3D coordinate point + * @author Rallaz + */ +class DRW_Coord +{ +public: + DRW_Coord(): x(0), y(0), z(0) {} + DRW_Coord( double ix, double iy, double iz ) + { + x = ix; y = iy; z = iz; + } + + DRW_Coord operator =( const DRW_Coord& data ) + { + x = data.x; y = data.y; z = data.z; + return *this; + } + +/*!< convert to unitary vector */ + void unitize() + { + double dist; + + dist = sqrt( x * x + y * y + z * z ); + + if( dist > 0.0 ) + { + x = x / dist; + y = y / dist; + z = z / dist; + } + } + +public: + double x; + double y; + double z; +}; + + +// ! Class to handle vertex +/*! + * Class to handle vertex for lwpolyline entity + * @author Rallaz + */ +class DRW_Vertex2D +{ +public: + DRW_Vertex2D() + { +// eType = DRW::LWPOLYLINE; + x = y = stawidth = endwidth = bulge = 0.0; + } + + DRW_Vertex2D( double sx, double sy, double b ) + { + stawidth = endwidth = 0; + x = sx; + y = sy; + bulge = b; + } + +public: + double x; /*!< x coordinate, code 10 */ + double y; /*!< y coordinate, code 20 */ + double stawidth; /*!< Start width, code 40 */ + double endwidth; /*!< End width, code 41 */ + double bulge; /*!< bulge, code 42 */ +}; + + +// ! Class to handle header vars +/*! + * Class to handle header vars + * @author Rallaz + */ +class DRW_Variant +{ +public: + enum TYPE + { + STRING, + INTEGER, + DOUBLE, + COORD, + INVALID + }; + + DRW_Variant() + { + type = INVALID; + code = 0; + } + + DRW_Variant( const DRW_Variant& d ) + { + code = d.code; + type = d.type; + + if( d.type == COORD ) vdata = d.vdata; + + if( d.type == STRING ) sdata = d.sdata; + + content = d.content; + } + + DRW_Variant( int c, UTF8STRING s ) { addString( s ); code = c; } + DRW_Variant( int c, int i ) { addInt( i ); code = c; } + DRW_Variant( int c, double d ) { addDouble( d ); code = c; } + DRW_Variant( int c, double x, double y, double z ) + { + setType( COORD ); vdata.x = x; vdata.y = y; + vdata.z = z; content.v = &vdata; code = c; + } + + ~DRW_Variant() + { + } + + void addString( UTF8STRING s ) { setType( STRING ); sdata = s; content.s = &sdata; } + void addInt( int i ) { setType( INTEGER ); content.i = i; } + void addDouble( double d ) { setType( DOUBLE ); content.d = d; } + void addCoord() + { + setType( COORD ); vdata.x = 0.0; vdata.y = 0.0; vdata.z = 0.0; content.v = + &vdata; + } + + void addCoord( DRW_Coord v ) { setType( COORD ); vdata = v; content.v = &vdata; } + void setType( enum TYPE t ) { type = t; } + void setCoordX( double d ) { if( type == COORD ) vdata.x = d; } + void setCoordY( double d ) { if( type == COORD ) vdata.y = d; } + void setCoordZ( double d ) { if( type == COORD ) vdata.z = d; } + +private: + typedef union + { + UTF8STRING* s; + int i; + double d; + DRW_Coord* v; + } DRW_VarContent; + +public: + DRW_VarContent content; + enum TYPE type; + int code; /*!< dxf code of this value*/ + +private: + std::string sdata; + DRW_Coord vdata; +}; + + +// ! Class to convert between line width and integer +/*! + * Class to convert between line width and integer + * verifing valid values, if value is not valid + * returns widthDefault. + * @author Rallaz + */ +class DRW_LW_Conv +{ +public: + enum lineWidth + { + width00 = 0, /*!< 0.00mm (dxf 0)*/ + width01 = 1, /*!< 0.05mm (dxf 5)*/ + width02 = 2, /*!< 0.09mm (dxf 9)*/ + width03 = 3, /*!< 0.13mm (dxf 13)*/ + width04 = 4, /*!< 0.15mm (dxf 15)*/ + width05 = 5, /*!< 0.18mm (dxf 18)*/ + width06 = 6, /*!< 0.20mm (dxf 20)*/ + width07 = 7, /*!< 0.25mm (dxf 25)*/ + width08 = 8, /*!< 0.30mm (dxf 30)*/ + width09 = 9, /*!< 0.35mm (dxf 35)*/ + width10 = 10, /*!< 0.40mm (dxf 40)*/ + width11 = 11, /*!< 0.50mm (dxf 50)*/ + width12 = 12, /*!< 0.53mm (dxf 53)*/ + width13 = 13, /*!< 0.60mm (dxf 60)*/ + width14 = 14, /*!< 0.70mm (dxf 70)*/ + width15 = 15, /*!< 0.80mm (dxf 80)*/ + width16 = 16, /*!< 0.90mm (dxf 90)*/ + width17 = 17, /*!< 1.00mm (dxf 100)*/ + width18 = 18, /*!< 1.06mm (dxf 106)*/ + width19 = 19, /*!< 1.20mm (dxf 120)*/ + width20 = 20, /*!< 1.40mm (dxf 140)*/ + width21 = 21, /*!< 1.58mm (dxf 158)*/ + width22 = 22, /*!< 2.00mm (dxf 200)*/ + width23 = 23, /*!< 2.11mm (dxf 211)*/ + widthByLayer = 29, /*!< by layer (dxf -1) */ + widthByBlock = 30, /*!< by block (dxf -2) */ + widthDefault = 31 /*!< by default (dxf -3) */ + }; + + static int lineWidth2dxfInt( enum lineWidth lw ) + { + switch( lw ) + { + case widthByLayer: + return -1; + + case widthByBlock: + return -2; + + case widthDefault: + return -3; + + case width00: + return 0; + + case width01: + return 5; + + case width02: + return 9; + + case width03: + return 13; + + case width04: + return 15; + + case width05: + return 18; + + case width06: + return 20; + + case width07: + return 25; + + case width08: + return 30; + + case width09: + return 35; + + case width10: + return 40; + + case width11: + return 50; + + case width12: + return 53; + + case width13: + return 60; + + case width14: + return 70; + + case width15: + return 80; + + case width16: + return 90; + + case width17: + return 100; + + case width18: + return 106; + + case width19: + return 120; + + case width20: + return 140; + + case width21: + return 158; + + case width22: + return 200; + + case width23: + return 211; + + default: + return -3; + } + + return static_cast<int> (lw); + } + + static int lineWidth2dwgInt( enum lineWidth lw ) + { + return static_cast<int> (lw); + } + + static enum lineWidth dxfInt2lineWidth( int i ) + { + if( i<0 ) + { + if( i==-1 ) + return widthByLayer; + else if( i==-2 ) + return widthByBlock; + else if( i==-3 ) + return widthDefault; + } + else if( i<3 ) + { + return width00; + } + else if( i<7 ) + { + return width01; + } + else if( i<11 ) + { + return width02; + } + else if( i<14 ) + { + return width03; + } + else if( i<16 ) + { + return width04; + } + else if( i<19 ) + { + return width05; + } + else if( i<22 ) + { + return width06; + } + else if( i<27 ) + { + return width07; + } + else if( i<32 ) + { + return width08; + } + else if( i<37 ) + { + return width09; + } + else if( i<45 ) + { + return width10; + } + else if( i<52 ) + { + return width11; + } + else if( i<57 ) + { + return width12; + } + else if( i<65 ) + { + return width13; + } + else if( i<75 ) + { + return width14; + } + else if( i<85 ) + { + return width15; + } + else if( i<95 ) + { + return width16; + } + else if( i<103 ) + { + return width17; + } + else if( i<112 ) + { + return width18; + } + else if( i<130 ) + { + return width19; + } + else if( i<149 ) + { + return width20; + } + else if( i<180 ) + { + return width21; + } + else if( i<205 ) + { + return width22; + } + else + { + return width23; + } + + // default by default + return widthDefault; + } + + static enum lineWidth dwgInt2lineWidth( int i ) + { + if( (i>-1 && i<24) || (i>28 && i<32) ) + { + return static_cast<lineWidth> (i); + } + + // default by default + return widthDefault; + } +}; + +#endif + +// EOF |