/****************************************************************************** ** libDXFrw - Library to read/write DXF files (ascii & binary) ** ** ** ** Copyright (C) 2011-2015 José F. Soriano, 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 . ** ******************************************************************************/ #ifndef DRW_OBJECTS_H #define DRW_OBJECTS_H #include #include #include #include "drw_base.h" class dxfReader; class dxfWriter; class dwgBuffer; namespace DRW { //! Table entries type. enum TTYPE { UNKNOWNT, LTYPE, LAYER, STYLE, DIMSTYLE, VPORT, BLOCK_RECORD, APPID, IMAGEDEF }; //@todo VIEW, UCS, APPID, VP_ENT_HDR, GROUP, MLINESTYLE, LONG_TRANSACTION, XRECORD, // ACDBPLACEHOLDER, VBA_PROJECT, ACAD_TABLE, CELLSTYLEMAP, DBCOLOR, DICTIONARYVAR, // DICTIONARYWDFLT, FIELD, IDBUFFER, IMAGEDEF, IMAGEDEFREACTOR, LAYER_INDEX, LAYOUT, // MATERIAL, PLACEHOLDER, PLOTSETTINGS, RASTERVARIABLES, SCALE, SORTENTSTABLE, // SPATIAL_INDEX, SPATIAL_FILTER, TABLEGEOMETRY, TABLESTYLES, VISUALSTYLE } #define SETOBJFRIENDS friend class dxfRW; \ friend class dwgReader; /** Base class for tables entries * @author Rallaz */ class DRW_TableEntry { public: //initializes default values DRW_TableEntry() : tType( DRW::UNKNOWNT ) , parentHandle( 0 ) , flags( 0 ) , curr( nullptr ) , xDictFlag( 0 ) , numReactors( 0 ) , objSize( 0 ) { } virtual ~DRW_TableEntry() { for ( std::vector::iterator it = extData.begin(); it != extData.end(); ++it ) delete *it; extData.clear(); } DRW_TableEntry( const DRW_TableEntry &e ) : tType( e.tType ) , handle( e.handle ) , parentHandle( e.parentHandle ) , name( e.name ) , flags( e.flags ) , curr( e.curr ) , xDictFlag( e.xDictFlag ) , numReactors( e.numReactors ) , objSize( e.objSize ) { for ( std::vector::const_iterator it = e.extData.begin(); it != e.extData.end(); ++it ) { extData.push_back( new DRW_Variant( *( *it ) ) ); } } protected: void parseCode( int code, dxfReader *reader ); virtual bool parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs = 0 ) = 0; bool parseDwg( DRW::Version version, dwgBuffer *buf, dwgBuffer *strBuf, duint32 bs = 0 ); void reset() { flags = 0; for ( std::vector::iterator it = extData.begin(); it != extData.end(); ++it ) delete *it; extData.clear(); } public: enum DRW::TTYPE tType; //!< Enum: entity type, code 0 duint32 handle; //!< Entity identifier, code 5 int parentHandle; //!< Soft-pointer ID/handle to owner object, code 330 UTF8STRING name; //!< Entry name, code 2 int flags; //!< Flags relevant to entry, code 70 std::vector extData; //!< FIFO list of extended data, codes 1000 to 1071 private: DRW_Variant *curr = nullptr; //***** dwg parse ********/ protected: dint16 oType; duint8 xDictFlag; dint32 numReactors; // duint32 objSize; //RL 32bits object data size in bits }; /** Class to handle dim style symbol table entries * @author Rallaz */ class DRW_Dimstyle : public DRW_TableEntry { SETOBJFRIENDS public: DRW_Dimstyle() { reset();} void reset() { tType = DRW::DIMSTYLE; dimasz = dimtxt = dimexe = 0.18; dimexo = 0.0625; dimgap = dimcen = 0.09; dimtxsty = "Standard"; dimscale = dimlfac = dimtfac = dimfxl = 1.0; dimdli = 0.38; dimrnd = dimdle = dimtp = dimtm = dimtsz = dimtvp = 0.0; dimaltf = 25.4; dimtol = dimlim = dimse1 = dimse2 = dimtad = dimzin = 0; dimtoh = dimtolj = 1; dimalt = dimtofl = dimsah = dimtix = dimsoxd = dimfxlon = 0; dimaltd = dimunit = dimaltu = dimalttd = dimlunit = 2; dimclrd = dimclre = dimclrt = dimjust = dimupt = 0; dimazin = dimaltz = dimaltttz = dimtzin = dimfrac = 0; dimtih = dimadec = dimaunit = dimsd1 = dimsd2 = dimtmove = 0; dimaltrnd = 0.0; dimdec = dimtdec = 4; dimfit = dimatfit = 3; dimdsep = '.'; dimlwd = dimlwe = -2; DRW_TableEntry::reset(); } protected: void parseCode( int code, dxfReader *reader ); bool parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs = 0 ); public: //V12 UTF8STRING dimpost; //!< Code 3 UTF8STRING dimapost; //!< Code 4 /* handle are code 105 */ UTF8STRING dimblk; //!< Code 5, code 342 V2000+ UTF8STRING dimblk1; //!< Code 6, code 343 V2000+ UTF8STRING dimblk2; //!< Code 7, code 344 V2000+ double dimscale; //!< Code 40 double dimasz; //!< Code 41 double dimexo; //!< Code 42 double dimdli; //!< Code 43 double dimexe; //!< Code 44 double dimrnd; //!< Code 45 double dimdle; //!< Code 46 double dimtp; //!< Code 47 double dimtm; //!< Code 48 double dimfxl; //!< Code 49 V2007+ double dimtxt; //!< Code 140 double dimcen; //!< Code 141 double dimtsz; //!< Code 142 double dimaltf; //!< Code 143 double dimlfac; //!< Code 144 double dimtvp; //!< Code 145 double dimtfac; //!< Code 146 double dimgap; //!< Code 147 double dimaltrnd; //!< Code 148 V2000+ int dimtol; //!< Code 71 int dimlim; //!< Code 72 int dimtih; //!< Code 73 int dimtoh; //!< Code 74 int dimse1; //!< Code 75 int dimse2; //!< Code 76 int dimtad; //!< Code 77 int dimzin; //!< Code 78 int dimazin; //!< Code 79 V2000+ int dimalt; //!< Code 170 int dimaltd; //!< Code 171 int dimtofl; //!< Code 172 int dimsah; //!< Code 173 int dimtix; //!< Code 174 int dimsoxd; //!< Code 175 int dimclrd; //!< Code 176 int dimclre; //!< Code 177 int dimclrt; //!< Code 178 int dimadec; //!< Code 179 V2000+ int dimunit; //!< Code 270 R13+ (obsolete 2000+, use dimlunit & dimfrac) int dimdec; //!< Code 271 R13+ int dimtdec; //!< Code 272 R13+ int dimaltu; //!< Code 273 R13+ int dimalttd; //!< Code 274 R13+ int dimaunit; //!< Code 275 R13+ int dimfrac; //!< Code 276 V2000+ int dimlunit; //!< Code 277 V2000+ int dimdsep; //!< Code 278 V2000+ int dimtmove; //!< Code 279 V2000+ int dimjust; //!< Code 280 R13+ int dimsd1; //!< Code 281 R13+ int dimsd2; //!< Code 282 R13+ int dimtolj; //!< Code 283 R13+ int dimtzin; //!< Code 284 R13+ int dimaltz; //!< Code 285 R13+ int dimaltttz; //!< Code 286 R13+ int dimfit; //!< Code 287 R13+ (obsolete 2000+, use dimatfit & dimtmove) int dimupt; //!< Code 288 R13+ int dimatfit; //!< Code 289 V2000+ int dimfxlon; //!< Code 290 V2007+ UTF8STRING dimtxsty; //!< Code 340 R13+ UTF8STRING dimldrblk; //!< Code 341 V2000+ int dimlwd; //!< Code 371 V2000+ int dimlwe; //!< Code 372 V2000+ }; /** Class to handle line type symbol table entries * @author Rallaz * @todo handle complex lineType */ class DRW_LType : public DRW_TableEntry { SETOBJFRIENDS public: DRW_LType() { reset();} void reset() { tType = DRW::LTYPE; desc = ""; size = 0; length = 0.0; pathIdx = 0; DRW_TableEntry::reset(); } protected: void parseCode( int code, dxfReader *reader ); bool parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs = 0 ); void update(); public: UTF8STRING desc; //!< Descriptive string, code 3 // int align; //!< Align code, always 65 ('A') code 72 std::vector::size_type size; //!< Element number, code 73 double length; //!< Total length of pattern, code 40 // int haveShape; //!< Complex linetype type, code 74 std::vector path; //!< Trace, point or space length sequence, code 49 private: int pathIdx; }; /** Class to handle layer symbol table entries * @author Rallaz */ class DRW_Layer : public DRW_TableEntry { SETOBJFRIENDS public: DRW_Layer() { reset(); } void reset() { tType = DRW::LAYER; lineType = "CONTINUOUS"; color = 7; // default BYLAYER (256) plotF = true; // default TRUE (plot yes) lWeight = DRW_LW_Conv::widthDefault; // default BYDEFAULT (dxf -3, dwg 31) color24 = -1; //default -1 not set DRW_TableEntry::reset(); } protected: void parseCode( int code, dxfReader *reader ); bool parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs = 0 ); public: UTF8STRING lineType; //!< Line type, code 6 int color; //!< Layer color, code 62 int color24; //!< 24-bit color, code 420 int transparency; //!< Transparency, code 440 bool plotF; //!< Plot flag, code 290 enum DRW_LW_Conv::lineWidth lWeight; //!< Layer lineweight, code 370 std::string handlePlotS; //!< Hard-pointer ID/handle of plotstyle, code 390 std::string handleMaterialS; //!< Hard-pointer ID/handle of materialstyle, code 347 /*only used for read dwg*/ dwgHandle lTypeH; }; /** Class to handle block record table entries * @author Rallaz */ class DRW_Block_Record : public DRW_TableEntry { SETOBJFRIENDS public: DRW_Block_Record() { reset();} void reset() { tType = DRW::BLOCK_RECORD; flags = 0; firstEH = lastEH = DRW::NoHandle; DRW_TableEntry::reset(); } protected: // void parseCode(int code, dxfReader *reader); bool parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs = 0 ); public: //Note: int DRW_TableEntry::flags; contains code 70 of block int insUnits; //!< Block insertion units, code 70 of block_record DRW_Coord basePoint; //!< Block insertion base point dwg only protected: //dwg parser private: duint32 block; // handle for block entity duint32 endBlock; // handle for end block entity duint32 firstEH; // handle of first entity, only in pre-2004 duint32 lastEH; // handle of last entity, only in pre-2004 std::vectorentMap; }; /** Class to handle text style symbol table entries * @author Rallaz */ class DRW_Textstyle : public DRW_TableEntry { SETOBJFRIENDS public: DRW_Textstyle() { reset();} void reset() { tType = DRW::STYLE; height = oblique = 0.0; width = lastHeight = 1.0; font = "txt"; genFlag = 0; //2= X mirror, 4= Y mirror fontFamily = 0; DRW_TableEntry::reset(); } protected: void parseCode( int code, dxfReader *reader ); bool parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs = 0 ); public: double height; //!< Fixed text height (0 not set), code 40 double width; //!< Width factor, code 41 double oblique; //!< Oblique angle, code 50 int genFlag; //!< Text generation flags, code 71 double lastHeight; //!< Last height used, code 42 UTF8STRING font; //!< Primary font file name, code 3 UTF8STRING bigFont; //!< Bigfont file name or blank if none, code 4 int fontFamily; //!< Ttf font family, italic and bold flags, code 1071 }; /** Class to handle vport symbol table entries * @author Rallaz */ class DRW_Vport : public DRW_TableEntry { SETOBJFRIENDS public: DRW_Vport() { reset();} void reset() { tType = DRW::VPORT; UpperRight.x = UpperRight.y = 1.0; snapSpacing.x = snapSpacing.y = 10.0; gridSpacing = snapSpacing; center.x = 0.651828; center.y = -0.16; viewDir.z = 1; height = 5.13732; ratio = 2.4426877; lensHeight = 50; frontClip = backClip = snapAngle = twistAngle = 0.0; viewMode = snap = grid = snapStyle = snapIsopair = 0; fastZoom = 1; circleZoom = 100; ucsIcon = 3; gridBehavior = 7; DRW_TableEntry::reset(); } protected: void parseCode( int code, dxfReader *reader ); bool parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs = 0 ); public: DRW_Coord lowerLeft; //!< Lower left corner, code 10 & 20 DRW_Coord UpperRight; //!< Upper right corner, code 11 & 21 DRW_Coord center; //!< Center point in WCS, code 12 & 22 DRW_Coord snapBase; //!< Snap base point in DCS, code 13 & 23 DRW_Coord snapSpacing; //!< Snap Spacing, code 14 & 24 DRW_Coord gridSpacing; //!< Grid Spacing, code 15 & 25 DRW_Coord viewDir; //!< View direction from target point, code 16, 26 & 36 DRW_Coord viewTarget; //!< View target point, code 17, 27 & 37 double height; //!< View height, code 40 double ratio; //!< Viewport aspect ratio, code 41 double lensHeight; //!< Lens height, code 42 double frontClip; //!< Front clipping plane, code 43 double backClip; //!< Back clipping plane, code 44 double snapAngle; //!< Snap rotation angle, code 50 double twistAngle; //!< View twist angle, code 51 int viewMode; //!< View mode, code 71 int circleZoom; //!< Circle zoom percent, code 72 int fastZoom; //!< Fast zoom setting, code 73 int ucsIcon; //!< UCSICON setting, code 74 int snap; //!< Snap on/off, code 75 int grid; //!< Grid on/off, code 76 int snapStyle; //!< Snap style, code 77 int snapIsopair; //!< Snap isopair, code 78 int gridBehavior; //!< Grid behavior, code 60, undocumented /** Code 60, bit coded possible value are * bit 1 (1) show out of limits * bit 2 (2) adaptive grid * bit 3 (4) allow subdivision * bit 4 (8) follow dynamic SCP **/ }; /** Class to handle image definitions object entries * @author Rallaz */ class DRW_ImageDef : public DRW_TableEntry // { SETOBJFRIENDS public: DRW_ImageDef() { reset(); } void reset() { tType = DRW::IMAGEDEF; imgVersion = 0; DRW_TableEntry::reset(); } protected: void parseCode( int code, dxfReader *reader ); bool parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs = 0 ); public: // std::string handle; //!< Entity identifier, code 5 UTF8STRING name; //!< File name of image, code 1 int imgVersion; //!< Class version, code 90, 0=R14 version double u; //!< Image size in pixels U value, code 10 double v; //!< Image size in pixels V value, code 20 double up; //!< Default size of one pixel U value, code 11 double vp; //!< Default size of one pixel V value, code 12 really is 21 int loaded; //!< Image is loaded flag, code 280, 0=unloaded, 1=loaded int resolution; //!< Resolution units, code 281, 0=no, 2=centimeters, 5=inch std::map reactors; }; /** Class to handle AppId symbol table entries * @author Rallaz */ class DRW_AppId : public DRW_TableEntry { SETOBJFRIENDS public: DRW_AppId() { reset();} void reset() { tType = DRW::APPID; flags = 0; name = ""; } protected: void parseCode( int code, dxfReader *reader ) {DRW_TableEntry::parseCode( code, reader );} bool parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs = 0 ); }; namespace DRW { // Extended color palette: // The first entry is only for direct indexing starting with [1] // Color 1 is red (1,0,0) const unsigned char dxfColors[][3] = { { 0, 0, 0}, // unused {255, 0, 0}, // 1 red {255, 255, 0}, // 2 yellow { 0, 255, 0}, // 3 green { 0, 255, 255}, // 4 cyan { 0, 0, 255}, // 5 blue {255, 0, 255}, // 6 magenta { 0, 0, 0}, // 7 black or white {128, 128, 128}, // 8 50% gray {192, 192, 192}, // 9 75% gray {255, 0, 0}, // 10 {255, 127, 127}, {204, 0, 0}, {204, 102, 102}, {153, 0, 0}, {153, 76, 76}, // 15 {127, 0, 0}, {127, 63, 63}, { 76, 0, 0}, { 76, 38, 38}, {255, 63, 0}, // 20 {255, 159, 127}, {204, 51, 0}, {204, 127, 102}, {153, 38, 0}, {153, 95, 76}, // 25 {127, 31, 0}, {127, 79, 63}, { 76, 19, 0}, { 76, 47, 38}, {255, 127, 0}, // 30 {255, 191, 127}, {204, 102, 0}, {204, 153, 102}, {153, 76, 0}, {153, 114, 76}, // 35 {127, 63, 0}, {127, 95, 63}, { 76, 38, 0}, { 76, 57, 38}, {255, 191, 0}, // 40 {255, 223, 127}, {204, 153, 0}, {204, 178, 102}, {153, 114, 0}, {153, 133, 76}, // 45 {127, 95, 0}, {127, 111, 63}, { 76, 57, 0}, { 76, 66, 38}, {255, 255, 0}, // 50 {255, 255, 127}, {204, 204, 0}, {204, 204, 102}, {153, 153, 0}, {153, 153, 76}, // 55 {127, 127, 0}, {127, 127, 63}, { 76, 76, 0}, { 76, 76, 38}, {191, 255, 0}, // 60 {223, 255, 127}, {153, 204, 0}, {178, 204, 102}, {114, 153, 0}, {133, 153, 76}, // 65 { 95, 127, 0}, {111, 127, 63}, { 57, 76, 0}, { 66, 76, 38}, {127, 255, 0}, // 70 {191, 255, 127}, {102, 204, 0}, {153, 204, 102}, { 76, 153, 0}, {114, 153, 76}, // 75 { 63, 127, 0}, { 95, 127, 63}, { 38, 76, 0}, { 57, 76, 38}, { 63, 255, 0}, // 80 {159, 255, 127}, { 51, 204, 0}, {127, 204, 102}, { 38, 153, 0}, { 95, 153, 76}, // 85 { 31, 127, 0}, { 79, 127, 63}, { 19, 76, 0}, { 47, 76, 38}, { 0, 255, 0}, // 90 {127, 255, 127}, { 0, 204, 0}, {102, 204, 102}, { 0, 153, 0}, { 76, 153, 76}, // 95 { 0, 127, 0}, { 63, 127, 63}, { 0, 76, 0}, { 38, 76, 38}, { 0, 255, 63}, // 100 {127, 255, 159}, { 0, 204, 51}, {102, 204, 127}, { 0, 153, 38}, { 76, 153, 95}, // 105 { 0, 127, 31}, { 63, 127, 79}, { 0, 76, 19}, { 38, 76, 47}, { 0, 255, 127}, // 110 {127, 255, 191}, { 0, 204, 102}, {102, 204, 153}, { 0, 153, 76}, { 76, 153, 114}, // 115 { 0, 127, 63}, { 63, 127, 95}, { 0, 76, 38}, { 38, 76, 57}, { 0, 255, 191}, // 120 {127, 255, 223}, { 0, 204, 153}, {102, 204, 178}, { 0, 153, 114}, { 76, 153, 133}, // 125 { 0, 127, 95}, { 63, 127, 111}, { 0, 76, 57}, { 38, 76, 66}, { 0, 255, 255}, // 130 {127, 255, 255}, { 0, 204, 204}, {102, 204, 204}, { 0, 153, 153}, { 76, 153, 153}, // 135 { 0, 127, 127}, { 63, 127, 127}, { 0, 76, 76}, { 38, 76, 76}, { 0, 191, 255}, // 140 {127, 223, 255}, { 0, 153, 204}, {102, 178, 204}, { 0, 114, 153}, { 76, 133, 153}, // 145 { 0, 95, 127}, { 63, 111, 127}, { 0, 57, 76}, { 38, 66, 76}, { 0, 127, 255}, // 150 {127, 191, 255}, { 0, 102, 204}, {102, 153, 204}, { 0, 76, 153}, { 76, 114, 153}, // 155 { 0, 63, 127}, { 63, 95, 127}, { 0, 38, 76}, { 38, 57, 76}, { 0, 66, 255}, // 160 {127, 159, 255}, { 0, 51, 204}, {102, 127, 204}, { 0, 38, 153}, { 76, 95, 153}, // 165 { 0, 31, 127}, { 63, 79, 127}, { 0, 19, 76}, { 38, 47, 76}, { 0, 0, 255}, // 170 {127, 127, 255}, { 0, 0, 204}, {102, 102, 204}, { 0, 0, 153}, { 76, 76, 153}, // 175 { 0, 0, 127}, { 63, 63, 127}, { 0, 0, 76}, { 38, 38, 76}, { 63, 0, 255}, // 180 {159, 127, 255}, { 50, 0, 204}, {127, 102, 204}, { 38, 0, 153}, { 95, 76, 153}, // 185 { 31, 0, 127}, { 79, 63, 127}, { 19, 0, 76}, { 47, 38, 76}, {127, 0, 255}, // 190 {191, 127, 255}, {102, 0, 204}, {153, 102, 204}, { 76, 0, 153}, {114, 76, 153}, // 195 { 63, 0, 127}, { 95, 63, 127}, { 38, 0, 76}, { 57, 38, 76}, {191, 0, 255}, // 200 {223, 127, 255}, {153, 0, 204}, {178, 102, 204}, {114, 0, 153}, {133, 76, 153}, // 205 { 95, 0, 127}, {111, 63, 127}, { 57, 0, 76}, { 66, 38, 76}, {255, 0, 255}, // 210 {255, 127, 255}, {204, 0, 204}, {204, 102, 204}, {153, 0, 153}, {153, 76, 153}, // 215 {127, 0, 127}, {127, 63, 127}, { 76, 0, 76}, { 76, 38, 76}, {255, 0, 191}, // 220 {255, 127, 223}, {204, 0, 153}, {204, 102, 178}, {153, 0, 114}, {153, 76, 133}, // 225 {127, 0, 95}, {127, 63, 11}, { 76, 0, 57}, { 76, 38, 66}, {255, 0, 127}, // 230 {255, 127, 191}, {204, 0, 102}, {204, 102, 153}, {153, 0, 76}, {153, 76, 114}, // 235 {127, 0, 63}, {127, 63, 95}, { 76, 0, 38}, { 76, 38, 57}, {255, 0, 63}, // 240 {255, 127, 159}, {204, 0, 51}, {204, 102, 127}, {153, 0, 38}, {153, 76, 95}, // 245 {127, 0, 31}, {127, 63, 79}, { 76, 0, 19}, { 76, 38, 47}, { 51, 51, 51}, // 250 { 91, 91, 91}, {132, 132, 132}, {173, 173, 173}, {214, 214, 214}, {255, 255, 255} // 255 }; } #endif // EOF