summaryrefslogtreecommitdiff
path: root/lib_dxf/drw_objects.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib_dxf/drw_objects.cpp')
-rw-r--r--lib_dxf/drw_objects.cpp1435
1 files changed, 1435 insertions, 0 deletions
diff --git a/lib_dxf/drw_objects.cpp b/lib_dxf/drw_objects.cpp
new file mode 100644
index 0000000..128ab8d
--- /dev/null
+++ b/lib_dxf/drw_objects.cpp
@@ -0,0 +1,1435 @@
+/******************************************************************************
+** 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/>. **
+******************************************************************************/
+
+#include <iostream>
+#include <math.h>
+#include "drw_objects.h"
+#include "intern/dxfreader.h"
+#include "intern/dxfwriter.h"
+
+// ! Base class for tables entries
+/*!
+ * Base class for tables entries
+ * @author Rallaz
+ */
+void DRW_TableEntry::parseCode( int code, dxfReader* reader )
+{
+ switch( code )
+ {
+ case 5:
+ handle = reader->getHandleString();
+ break;
+
+ case 330:
+ handleBlock = reader->getHandleString();
+ break;
+
+ case 2:
+ name = reader->getUtf8String();
+ break;
+
+ case 70:
+ flags = reader->getInt32();
+ break;
+
+ case 1000:
+ case 1001:
+ case 1002:
+ case 1003:
+ case 1004:
+ case 1005:
+ extData.push_back( new DRW_Variant( code, reader->getString() ) );
+ break;
+
+ case 1010:
+ case 1011:
+ case 1012:
+ case 1013:
+ curr = new DRW_Variant();
+ curr->addCoord();
+ curr->setCoordX( reader->getDouble() );
+ curr->code = code;
+ extData.push_back( curr );
+ break;
+
+ case 1020:
+ case 1021:
+ case 1022:
+ case 1023:
+
+ if( curr )
+ curr->setCoordY( reader->getDouble() );
+
+ break;
+
+ case 1030:
+ case 1031:
+ case 1032:
+ case 1033:
+
+ if( curr )
+ curr->setCoordZ( reader->getDouble() );
+
+ curr = NULL;
+ break;
+
+ case 1040:
+ case 1041:
+ case 1042:
+ extData.push_back( new DRW_Variant( code, reader->getDouble() ) );
+ break;
+
+ case 1070:
+ case 1071:
+ extData.push_back( new DRW_Variant( code, reader->getInt32() ) );
+ break;
+
+ default:
+ break;
+ }
+}
+
+
+// ! Class to handle dimstyle entries
+/*!
+ * Class to handle ldim style symbol table entries
+ * @author Rallaz
+ */
+void DRW_Dimstyle::parseCode( int code, dxfReader* reader )
+{
+ switch( code )
+ {
+ case 105:
+ handle = reader->getHandleString();
+ break;
+
+ case 3:
+ dimpost = reader->getUtf8String();
+ break;
+
+ case 4:
+ dimapost = reader->getUtf8String();
+ break;
+
+ case 5:
+ dimblk = reader->getUtf8String();
+ break;
+
+ case 6:
+ dimblk1 = reader->getUtf8String();
+ break;
+
+ case 7:
+ dimblk2 = reader->getUtf8String();
+ break;
+
+ case 40:
+ dimscale = reader->getDouble();
+ break;
+
+ case 41:
+ dimasz = reader->getDouble();
+ break;
+
+ case 42:
+ dimexo = reader->getDouble();
+ break;
+
+ case 43:
+ dimdli = reader->getDouble();
+ break;
+
+ case 44:
+ dimexe = reader->getDouble();
+ break;
+
+ case 45:
+ dimrnd = reader->getDouble();
+ break;
+
+ case 46:
+ dimdle = reader->getDouble();
+ break;
+
+ case 47:
+ dimtp = reader->getDouble();
+ break;
+
+ case 48:
+ dimtm = reader->getDouble();
+ break;
+
+ case 140:
+ dimtxt = reader->getDouble();
+ break;
+
+ case 141:
+ dimcen = reader->getDouble();
+ break;
+
+ case 142:
+ dimtsz = reader->getDouble();
+ break;
+
+ case 143:
+ dimaltf = reader->getDouble();
+ break;
+
+ case 144:
+ dimlfac = reader->getDouble();
+ break;
+
+ case 145:
+ dimtvp = reader->getDouble();
+ break;
+
+ case 146:
+ dimtfac = reader->getDouble();
+ break;
+
+ case 147:
+ dimgap = reader->getDouble();
+ break;
+
+ case 148:
+ dimaltrnd = reader->getDouble();
+ break;
+
+ case 71:
+ dimtol = reader->getInt32();
+ break;
+
+ case 72:
+ dimlim = reader->getInt32();
+ break;
+
+ case 73:
+ dimtih = reader->getInt32();
+ break;
+
+ case 74:
+ dimtoh = reader->getInt32();
+ break;
+
+ case 75:
+ dimse1 = reader->getInt32();
+ break;
+
+ case 76:
+ dimse2 = reader->getInt32();
+ break;
+
+ case 77:
+ dimtad = reader->getInt32();
+ break;
+
+ case 78:
+ dimzin = reader->getInt32();
+ break;
+
+ case 79:
+ dimazin = reader->getInt32();
+ break;
+
+ case 170:
+ dimalt = reader->getInt32();
+ break;
+
+ case 171:
+ dimaltd = reader->getInt32();
+ break;
+
+ case 172:
+ dimtofl = reader->getInt32();
+ break;
+
+ case 173:
+ dimsah = reader->getInt32();
+ break;
+
+ case 174:
+ dimtix = reader->getInt32();
+ break;
+
+ case 175:
+ dimsoxd = reader->getInt32();
+ break;
+
+ case 176:
+ dimclrd = reader->getInt32();
+ break;
+
+ case 177:
+ dimclre = reader->getInt32();
+ break;
+
+ case 178:
+ dimclrt = reader->getInt32();
+ break;
+
+ case 179:
+ dimadec = reader->getInt32();
+ break;
+
+ case 270:
+ dimunit = reader->getInt32();
+ break;
+
+ case 271:
+ dimdec = reader->getInt32();
+ break;
+
+ case 272:
+ dimtdec = reader->getInt32();
+ break;
+
+ case 273:
+ dimaltu = reader->getInt32();
+ break;
+
+ case 274:
+ dimalttd = reader->getInt32();
+ break;
+
+ case 275:
+ dimaunit = reader->getInt32();
+ break;
+
+ case 276:
+ dimfrac = reader->getInt32();
+ break;
+
+ case 277:
+ dimlunit = reader->getInt32();
+ break;
+
+ case 278:
+ dimdsep = reader->getInt32();
+ break;
+
+ case 279:
+ dimtmove = reader->getInt32();
+ break;
+
+ case 280:
+ dimjust = reader->getInt32();
+ break;
+
+ case 281:
+ dimsd1 = reader->getInt32();
+ break;
+
+ case 282:
+ dimsd2 = reader->getInt32();
+ break;
+
+ case 283:
+ dimtolj = reader->getInt32();
+ break;
+
+ case 284:
+ dimtzin = reader->getInt32();
+ break;
+
+ case 285:
+ dimaltz = reader->getInt32();
+ break;
+
+ case 286:
+ dimaltttz = reader->getInt32();
+ break;
+
+ case 287:
+ dimfit = reader->getInt32();
+ break;
+
+ case 288:
+ dimupt = reader->getInt32();
+ break;
+
+ case 289:
+ dimatfit = reader->getInt32();
+ break;
+
+ case 340:
+ dimtxsty = reader->getUtf8String();
+ break;
+
+ case 341:
+ dimldrblk = reader->getUtf8String();
+ break;
+
+ case 342:
+ dimblk = reader->getUtf8String();
+ break;
+
+ case 343:
+ dimblk1 = reader->getUtf8String();
+ break;
+
+ case 344:
+ dimblk2 = reader->getUtf8String();
+ break;
+
+ default:
+ DRW_TableEntry::parseCode( code, reader );
+ break;
+ }
+}
+
+
+// ! Class to handle line type entries
+/*!
+ * Class to handle line type symbol table entries
+ * @author Rallaz
+ */
+void DRW_LType::parseCode( int code, dxfReader* reader )
+{
+ switch( code )
+ {
+ case 3:
+ desc = reader->getUtf8String();
+ break;
+
+ case 73:
+ size = reader->getInt32();
+ path.reserve( size );
+ break;
+
+ case 40:
+ length = reader->getDouble();
+ break;
+
+ case 49:
+ path.push_back( reader->getDouble() );
+ pathIdx++;
+ break;
+
+/* case 74:
+ * haveShape = reader->getInt32();
+ * break;*/
+ default:
+ DRW_TableEntry::parseCode( code, reader );
+ break;
+ }
+}
+
+
+// ! Update line type
+/*!
+ * Update the size and length of line type acording to the path
+ * @author Rallaz
+ */
+/*TODO: control max length permited */
+void DRW_LType::update()
+{
+ double d = 0;
+
+ size = path.size();
+
+ for( int i = 0; i< size; i++ )
+ {
+ d += fabs( path.at( i ) );
+ }
+
+ length = d;
+}
+
+
+// ! Class to handle layer entries
+/*!
+ * Class to handle layer symbol table entries
+ * @author Rallaz
+ */
+void DRW_Layer::parseCode( int code, dxfReader* reader )
+{
+ switch( code )
+ {
+ case 6:
+ lineType = reader->getUtf8String();
+ break;
+
+ case 62:
+ color = reader->getInt32();
+ break;
+
+ case 290:
+ plotF = reader->getBool();
+ break;
+
+ case 370:
+ lWeight = DRW_LW_Conv::dxfInt2lineWidth( reader->getInt32() );
+ break;
+
+ case 390:
+ handlePlotS = reader->getString();
+ break;
+
+ case 347:
+ handlePlotM = reader->getString();
+ break;
+
+ case 420:
+ color24 = reader->getInt32();
+ break;
+
+ default:
+ DRW_TableEntry::parseCode( code, reader );
+ break;
+ }
+}
+
+
+// ! Class to handle text style entries
+/*!
+ * Class to handle text style symbol table entries
+ * @author Rallaz
+ */
+void DRW_Textstyle::parseCode( int code, dxfReader* reader )
+{
+ switch( code )
+ {
+ case 3:
+ font = reader->getUtf8String();
+ break;
+
+ case 4:
+ bigFont = reader->getUtf8String();
+ break;
+
+ case 40:
+ height = reader->getDouble();
+ break;
+
+ case 41:
+ width = reader->getDouble();
+ break;
+
+ case 50:
+ oblique = reader->getDouble();
+ break;
+
+ case 42:
+ lastHeight = reader->getDouble();
+ break;
+
+ case 71:
+ genFlag = reader->getInt32();
+ break;
+
+ case 1071:
+ fontFamily = reader->getInt32();
+ break;
+
+ default:
+ DRW_TableEntry::parseCode( code, reader );
+ break;
+ }
+}
+
+
+// ! Class to handle vport entries
+/*!
+ * Class to handle vport symbol table entries
+ * @author Rallaz
+ */
+void DRW_Vport::parseCode( int code, dxfReader* reader )
+{
+ switch( code )
+ {
+ case 10:
+ lowerLeft.x = reader->getDouble();
+ break;
+
+ case 20:
+ lowerLeft.y = reader->getDouble();
+ break;
+
+ case 11:
+ UpperRight.x = reader->getDouble();
+ break;
+
+ case 21:
+ UpperRight.y = reader->getDouble();
+ break;
+
+ case 12:
+ center.x = reader->getDouble();
+ break;
+
+ case 22:
+ center.y = reader->getDouble();
+ break;
+
+ case 13:
+ snapBase.x = reader->getDouble();
+ break;
+
+ case 23:
+ snapBase.y = reader->getDouble();
+ break;
+
+ case 14:
+ snapSpacing.x = reader->getDouble();
+ break;
+
+ case 24:
+ snapSpacing.y = reader->getDouble();
+ break;
+
+ case 15:
+ gridSpacing.x = reader->getDouble();
+ break;
+
+ case 25:
+ gridSpacing.y = reader->getDouble();
+ break;
+
+ case 16:
+ viewDir.x = reader->getDouble();
+ break;
+
+ case 26:
+ viewDir.y = reader->getDouble();
+ break;
+
+ case 36:
+ viewDir.z = reader->getDouble();
+ break;
+
+ case 17:
+ viewTarget.x = reader->getDouble();
+ break;
+
+ case 27:
+ viewTarget.y = reader->getDouble();
+ break;
+
+ case 37:
+ viewTarget.z = reader->getDouble();
+ break;
+
+ case 40:
+ height = reader->getDouble();
+ break;
+
+ case 41:
+ ratio = reader->getDouble();
+ break;
+
+ case 42:
+ lensHeight = reader->getDouble();
+ break;
+
+ case 43:
+ frontClip = reader->getDouble();
+ break;
+
+ case 44:
+ backClip = reader->getDouble();
+ break;
+
+ case 50:
+ snapAngle = reader->getDouble();
+ break;
+
+ case 51:
+ twistAngle = reader->getDouble();
+ break;
+
+ case 71:
+ viewMode = reader->getInt32();
+ break;
+
+ case 72:
+ circleZoom = reader->getInt32();
+ break;
+
+ case 73:
+ fastZoom = reader->getInt32();
+ break;
+
+ case 74:
+ ucsIcon = reader->getInt32();
+ break;
+
+ case 75:
+ snap = reader->getInt32();
+ break;
+
+ case 76:
+ grid = reader->getInt32();
+ break;
+
+ case 77:
+ snapStyle = reader->getInt32();
+ break;
+
+ case 78:
+ snapIsopair = reader->getInt32();
+ break;
+
+ default:
+ DRW_TableEntry::parseCode( code, reader );
+ break;
+ }
+}
+
+
+void DRW_ImageDef::parseCode( int code, dxfReader* reader )
+{
+ switch( code )
+ {
+ case 1:
+ name = reader->getUtf8String();
+ break;
+
+ case 5:
+ handle = reader->getString();
+ break;
+
+ case 10:
+ u = reader->getDouble();
+ break;
+
+ case 20:
+ v = reader->getDouble();
+ break;
+
+ case 11:
+ up = reader->getDouble();
+ break;
+
+ case 12:
+ vp = reader->getDouble();
+ break;
+
+ case 21:
+ vp = reader->getDouble();
+ break;
+
+ case 280:
+ loaded = reader->getInt32();
+ break;
+
+ case 281:
+ resolution = reader->getInt32();
+ break;
+
+ default:
+ break;
+ }
+}
+
+
+void DRW_Header::addComment( std::string c )
+{
+ if( !comments.empty() )
+ comments += '\n';
+
+ comments += c;
+}
+
+
+void DRW_Header::parseCode( int code, dxfReader* reader )
+{
+ switch( code )
+ {
+ case 9:
+ curr = new DRW_Variant();
+ name = reader->getString();
+
+ if( version < DRW::AC1015 && name == "$DIMUNIT" )
+ name = "$DIMLUNIT";
+
+ vars[name] = curr;
+ break;
+
+ case 1:
+ curr->addString( reader->getUtf8String() );
+
+ if( name =="$ACADVER" )
+ {
+ reader->setVersion( curr->content.s );
+ version = reader->getVersion();
+ }
+
+ curr->code = code;
+ break;
+
+ case 2:
+ curr->addString( reader->getUtf8String() );
+ curr->code = code;
+ break;
+
+ case 3:
+ curr->addString( reader->getUtf8String() );
+
+ if( name =="$DWGCODEPAGE" )
+ {
+ reader->setCodePage( curr->content.s );
+ curr->addString( reader->getCodePage() );
+ }
+
+ curr->code = code;
+ break;
+
+ case 6:
+ curr->addString( reader->getUtf8String() );
+ curr->code = code;
+ break;
+
+ case 7:
+ curr->addString( reader->getUtf8String() );
+ curr->code = code;
+ break;
+
+ case 8:
+ curr->addString( reader->getUtf8String() );
+ curr->code = code;
+ break;
+
+ case 10:
+ curr->addCoord();
+ curr->setCoordX( reader->getDouble() );
+ curr->code = code;
+ break;
+
+ case 20:
+ curr->setCoordY( reader->getDouble() );
+ break;
+
+ case 30:
+ curr->setCoordZ( reader->getDouble() );
+ curr->code = code;
+ break;
+
+ case 40:
+ curr->addDouble( reader->getDouble() );
+ curr->code = code;
+ break;
+
+ case 50:
+ curr->addDouble( reader->getDouble() );
+ curr->code = code;
+ break;
+
+ case 62:
+ curr->addInt( reader->getInt32() );
+ curr->code = code;
+ break;
+
+ case 70:
+ curr->addInt( reader->getInt32() );
+ curr->code = code;
+ break;
+
+ case 280:
+ curr->addInt( reader->getInt32() );
+ curr->code = code;
+ break;
+
+ case 290:
+ curr->addInt( reader->getInt32() );
+ curr->code = code;
+ break;
+
+ case 370:
+ curr->addInt( reader->getInt32() );
+ curr->code = code;
+ break;
+
+ case 380:
+ curr->addInt( reader->getInt32() );
+ curr->code = code;
+ break;
+
+ case 390:
+ curr->addString( reader->getUtf8String() );
+ curr->code = code;
+ break;
+
+ default:
+ break;
+ }
+}
+
+
+void DRW_Header::write( dxfWriter* writer, DRW::Version ver )
+{
+/*RLZ: TODO complete all vars to AC1024*/
+ double varDouble;
+ int varInt;
+ std::string varStr;
+ DRW_Coord varCoord;
+
+ writer->writeString( 2, "HEADER" );
+ writer->writeString( 9, "$ACADVER" );
+
+ switch( ver )
+ {
+ case DRW::AC1006: // unsupported version acad 10
+ case DRW::AC1009: // acad 11 & 12
+ varStr = "AC1009";
+ break;
+
+ case DRW::AC1012: // unsupported version acad 13
+ case DRW::AC1014: // acad 14
+ varStr = "AC1014";
+ break;
+
+ case DRW::AC1015: // acad 2000
+ varStr = "AC1015";
+ break;
+
+ case DRW::AC1018: // acad 2004
+ varStr = "AC1018";
+ break;
+
+/* case DRW::AC1021: //acad 2007
+ * varStr = "AC1021";
+ * break;*/
+ case DRW::AC1024: // acad 2010
+ varStr = "AC1024";
+ break;
+
+ default: // acad 2007 default version
+ varStr = "AC1021";
+ break;
+ }
+
+ writer->writeString( 1, varStr );
+ writer->setVersion( &varStr );
+
+ getStr( "$ACADVER", &varStr );
+ getStr( "$ACADMAINTVER", &varStr );
+
+ if( ver > DRW::AC1012 )
+ {
+ writer->writeString( 9, "$HANDSEED" );
+// RLZ dxfHex(5, 0xFFFF);
+ writer->writeString( 5, "20000" );
+ }
+
+ if( !getStr( "$DWGCODEPAGE", &varStr ) )
+ {
+ varStr = "ANSI_1252";
+ }
+
+ writer->writeString( 9, "$DWGCODEPAGE" );
+ writer->setCodePage( &varStr );
+ writer->writeString( 3, writer->getCodePage() );
+ writer->writeString( 9, "$INSBASE" );
+
+ if( getCoord( "$INSBASE", &varCoord ) )
+ {
+ writer->writeDouble( 10, varCoord.x );
+ writer->writeDouble( 20, varCoord.y );
+ writer->writeDouble( 30, varCoord.z );
+ }
+ else
+ {
+ writer->writeDouble( 10, 0.0 );
+ writer->writeDouble( 20, 0.0 );
+ writer->writeDouble( 30, 0.0 );
+ }
+
+ writer->writeString( 9, "$EXTMIN" );
+
+ if( getCoord( "$EXTMIN", &varCoord ) )
+ {
+ writer->writeDouble( 10, varCoord.x );
+ writer->writeDouble( 20, varCoord.y );
+ writer->writeDouble( 30, varCoord.z );
+ }
+ else
+ {
+ writer->writeDouble( 10, 1.0000000000000000E+020 );
+ writer->writeDouble( 20, 1.0000000000000000E+020 );
+ writer->writeDouble( 30, 1.0000000000000000E+020 );
+ }
+
+ writer->writeString( 9, "$EXTMAX" );
+
+ if( getCoord( "$EXTMAX", &varCoord ) )
+ {
+ writer->writeDouble( 10, varCoord.x );
+ writer->writeDouble( 20, varCoord.y );
+ writer->writeDouble( 30, varCoord.z );
+ }
+ else
+ {
+ writer->writeDouble( 10, -1.0000000000000000E+020 );
+ writer->writeDouble( 20, -1.0000000000000000E+020 );
+ writer->writeDouble( 30, -1.0000000000000000E+020 );
+ }
+
+ writer->writeString( 9, "$LIMMIN" );
+
+ if( getCoord( "$LIMMIN", &varCoord ) )
+ {
+ writer->writeDouble( 10, varCoord.x );
+ writer->writeDouble( 20, varCoord.y );
+ }
+ else
+ {
+ writer->writeDouble( 10, 0.0 );
+ writer->writeDouble( 20, 0.0 );
+ }
+
+ writer->writeString( 9, "$LIMMAX" );
+
+ if( getCoord( "$LIMMAX", &varCoord ) )
+ {
+ writer->writeDouble( 10, varCoord.x );
+ writer->writeDouble( 20, varCoord.y );
+ }
+ else
+ {
+ writer->writeDouble( 10, 420.0 );
+ writer->writeDouble( 20, 297.0 );
+ }
+
+ writer->writeString( 9, "$ORTHOMODE" );
+
+ if( getInt( "$ORTHOMODE", &varInt ) )
+ writer->writeInt16( 70, varInt );
+ else
+ writer->writeInt16( 70, 0 );
+
+ writer->writeString( 9, "$LTSCALE" );
+
+ if( getDouble( "$LTSCALE", &varDouble ) )
+ writer->writeDouble( 40, varDouble );
+ else
+ writer->writeDouble( 40, 1.0 );
+
+ writer->writeString( 9, "$TEXTSTYLE" );
+
+ if( getStr( "$TEXTSTYLE", &varStr ) )
+ if( ver == DRW::AC1009 )
+ writer->writeUtf8Caps( 7, varStr );
+ else
+ writer->writeUtf8String( 7, varStr );
+
+
+
+
+ else
+ writer->writeString( 7, "STANDARD" );
+
+ writer->writeString( 9, "$CLAYER" );
+
+ if( getStr( "$CLAYER", &varStr ) )
+ if( ver == DRW::AC1009 )
+ writer->writeUtf8Caps( 8, varStr );
+ else
+ writer->writeUtf8String( 8, varStr );
+
+
+
+
+ else
+ writer->writeString( 8, "0" );
+
+ writer->writeString( 9, "$DIMASZ" );
+
+ if( getDouble( "$DIMASZ", &varDouble ) )
+ writer->writeDouble( 40, varDouble );
+ else
+ writer->writeDouble( 40, 2.5 );
+
+ writer->writeString( 9, "$DIMLFAC" );
+
+ if( getDouble( "$DIMLFAC", &varDouble ) )
+ writer->writeDouble( 40, varDouble );
+ else
+ writer->writeDouble( 40, 1.0 );
+
+ writer->writeString( 9, "$DIMSCALE" );
+
+ if( getDouble( "$DIMSCALE", &varDouble ) )
+ writer->writeDouble( 40, varDouble );
+ else
+ writer->writeDouble( 40, 1.0 );
+
+ writer->writeString( 9, "$DIMEXO" );
+
+ if( getDouble( "$DIMEXO", &varDouble ) )
+ writer->writeDouble( 40, varDouble );
+ else
+ writer->writeDouble( 40, 0.625 );
+
+ writer->writeString( 9, "$DIMEXE" );
+
+ if( getDouble( "$DIMEXE", &varDouble ) )
+ writer->writeDouble( 40, varDouble );
+ else
+ writer->writeDouble( 40, 1.25 );
+
+ writer->writeString( 9, "$DIMTXT" );
+
+ if( getDouble( "$DIMTXT", &varDouble ) )
+ writer->writeDouble( 40, varDouble );
+ else
+ writer->writeDouble( 40, 2.5 );
+
+ writer->writeString( 9, "$DIMTSZ" );
+
+ if( getDouble( "$DIMTSZ", &varDouble ) )
+ writer->writeDouble( 40, varDouble );
+ else
+ writer->writeDouble( 40, 0.0 );
+
+ if( ver > DRW::AC1009 )
+ {
+ writer->writeString( 9, "$DIMAUNIT" );
+
+ if( getInt( "$DIMAUNIT", &varInt ) )
+ writer->writeInt16( 70, varInt );
+ else
+ writer->writeInt16( 70, 0 );
+
+ writer->writeString( 9, "$DIMADEC" );
+
+ if( getInt( "$DIMADEC", &varInt ) )
+ writer->writeInt16( 70, varInt );
+ else
+ writer->writeInt16( 70, 0 );
+ }
+
+ // verify if exist "$DIMLUNIT" or obsolete "$DIMUNIT" (pre v2000)
+ if( !getInt( "$DIMLUNIT", &varInt ) )
+ {
+ if( !getInt( "$DIMUNIT", &varInt ) )
+ varInt = 2;
+ }
+
+ // verify valid values from 1 to 6
+ if( varInt<1 || varInt>6 )
+ varInt = 2;
+
+ if( ver > DRW::AC1014 )
+ {
+ writer->writeString( 9, "$DIMLUNIT" );
+ writer->writeInt16( 70, varInt );
+ }
+ else
+ {
+ writer->writeString( 9, "$DIMUNIT" );
+ writer->writeInt16( 70, varInt );
+ }
+
+ writer->writeString( 9, "$DIMSTYLE" );
+
+ if( getStr( "$DIMSTYLE", &varStr ) )
+ if( ver == DRW::AC1009 )
+ writer->writeUtf8Caps( 2, varStr );
+ else
+ writer->writeUtf8String( 2, varStr );
+
+
+
+
+ else
+ writer->writeString( 2, "STANDARD" );
+
+ writer->writeString( 9, "$DIMGAP" );
+
+ if( getDouble( "$DIMGAP", &varDouble ) )
+ writer->writeDouble( 40, varDouble );
+ else
+ writer->writeDouble( 40, 0.625 );
+
+ writer->writeString( 9, "$DIMTIH" );
+
+ if( getInt( "$DIMTIH", &varInt ) )
+ writer->writeInt16( 70, varInt );
+ else
+ writer->writeInt16( 70, 0 );
+
+ writer->writeString( 9, "$LUNITS" );
+
+ if( getInt( "$LUNITS", &varInt ) )
+ writer->writeInt16( 70, varInt );
+ else
+ writer->writeInt16( 70, 2 );
+
+ writer->writeString( 9, "$LUPREC" );
+
+ if( getInt( "$LUPREC", &varInt ) )
+ writer->writeInt16( 70, varInt );
+ else
+ writer->writeInt16( 70, 4 );
+
+ writer->writeString( 9, "$AUNITS" );
+
+ if( getInt( "$AUNITS", &varInt ) )
+ writer->writeInt16( 70, varInt );
+ else
+ writer->writeInt16( 70, 0 );
+
+ writer->writeString( 9, "$AUPREC" );
+
+ if( getInt( "$AUPREC", &varInt ) )
+ writer->writeInt16( 70, varInt );
+ else
+ writer->writeInt16( 70, 2 );
+
+ if( ver > DRW::AC1009 )
+ {
+ writer->writeString( 9, "$SPLINESEGS" );
+
+ if( getInt( "$SPLINESEGS", &varInt ) )
+ {
+ writer->writeInt16( 70, varInt );
+ }
+ else
+ writer->writeInt16( 70, 8 );
+ }
+
+/* RLZ: moved to active VPORT, but can write in header if present*/
+ if( getInt( "$GRIDMODE", &varInt ) )
+ {
+ writer->writeString( 9, "$GRIDMODE" );
+ writer->writeInt16( 70, varInt );
+ }
+
+ if( getInt( "$SNAPSTYLE", &varInt ) )
+ {
+ writer->writeString( 9, "$SNAPSTYLE" );
+ writer->writeInt16( 70, varInt );
+ }
+
+ if( getCoord( "$GRIDUNIT", &varCoord ) )
+ {
+ writer->writeString( 9, "$GRIDUNIT" );
+ writer->writeDouble( 10, varCoord.x );
+ writer->writeDouble( 20, varCoord.y );
+ }
+
+ if( getCoord( "$VIEWCTR", &varCoord ) )
+ {
+ writer->writeString( 9, "$VIEWCTR" );
+ writer->writeDouble( 10, varCoord.x );
+ writer->writeDouble( 20, varCoord.y );
+ }
+
+/* RLZ: moved to active VPORT, but can write in header if present*/
+
+ if( ver > DRW::AC1009 )
+ {
+ writer->writeString( 9, "$PINSBASE" );
+
+ if( getCoord( "$PINSBASE", &varCoord ) )
+ {
+ writer->writeDouble( 10, varCoord.x );
+ writer->writeDouble( 20, varCoord.y );
+ writer->writeDouble( 30, varCoord.z );
+ }
+ else
+ {
+ writer->writeDouble( 10, 0.0 );
+ writer->writeDouble( 20, 0.0 );
+ writer->writeDouble( 30, 0.0 );
+ }
+ }
+
+ writer->writeString( 9, "$PLIMMIN" );
+
+ if( getCoord( "$PLIMMIN", &varCoord ) )
+ {
+ writer->writeDouble( 10, varCoord.x );
+ writer->writeDouble( 20, varCoord.y );
+ }
+ else
+ {
+ writer->writeDouble( 10, 0.0 );
+ writer->writeDouble( 20, 0.0 );
+ }
+
+ writer->writeString( 9, "$PLIMMAX" );
+
+ if( getCoord( "$PLIMMAX", &varCoord ) )
+ {
+ writer->writeDouble( 10, varCoord.x );
+ writer->writeDouble( 20, varCoord.y );
+ }
+ else
+ {
+ writer->writeDouble( 10, 297.0 );
+ writer->writeDouble( 20, 210.0 );
+ }
+
+ if( ver > DRW::AC1014 )
+ {
+ writer->writeString( 9, "$INSUNITS" );
+
+ if( getInt( "$INSUNITS", &varInt ) )
+ writer->writeInt16( 70, varInt );
+ else
+ writer->writeInt16( 70, 0 );
+ }
+
+ if( ver > DRW::AC1009 )
+ {
+ writer->writeString( 9, "$PSVPSCALE" );
+
+ if( getDouble( "$PSVPSCALE", &varDouble ) )
+ writer->writeDouble( 40, varDouble );
+ else
+ writer->writeDouble( 40, 0.0 );
+ }
+
+#ifdef DRW_DBG
+ std::map<std::string, DRW_Variant*>::const_iterator it;
+
+ for( it = vars.begin(); it != vars.end(); ++it )
+ {
+// QString key = QString::fromStdString((*it).first);
+ std::cerr << (*it).first << std::endl;
+ }
+
+#endif
+}
+
+
+void DRW_Header::addDouble( std::string key, double value, int code )
+{
+ curr = new DRW_Variant();
+ curr->addDouble( value );
+ curr->code = code;
+ vars[key] = curr;
+}
+
+
+void DRW_Header::addInt( std::string key, int value, int code )
+{
+ curr = new DRW_Variant();
+ curr->addInt( value );
+ curr->code = code;
+ vars[key] = curr;
+}
+
+
+void DRW_Header::addStr( std::string key, std::string value, int code )
+{
+ curr = new DRW_Variant();
+ curr->addString( value );
+ curr->code = code;
+ vars[key] = curr;
+}
+
+
+void DRW_Header::addCoord( std::string key, DRW_Coord value, int code )
+{
+ curr = new DRW_Variant();
+ curr->addCoord( value );
+ curr->code = code;
+ vars[key] = curr;
+}
+
+
+bool DRW_Header::getDouble( std::string key, double* varDouble )
+{
+ bool result = false;
+ std::map<std::string, DRW_Variant*>::iterator it;
+
+ it = vars.find( key );
+
+ if( it != vars.end() )
+ {
+ DRW_Variant* var = (*it).second;
+
+ if( var->type == DRW_Variant::DOUBLE )
+ {
+ *varDouble = var->content.d;
+ result = true;
+ }
+
+ vars.erase( it );
+ }
+
+ return result;
+}
+
+
+bool DRW_Header::getInt( std::string key, int* varInt )
+{
+ bool result = false;
+ std::map<std::string, DRW_Variant*>::iterator it;
+
+ it = vars.find( key );
+
+ if( it != vars.end() )
+ {
+ DRW_Variant* var = (*it).second;
+
+ if( var->type == DRW_Variant::INTEGER )
+ {
+ *varInt = var->content.i;
+ result = true;
+ }
+
+ vars.erase( it );
+ }
+
+ return result;
+}
+
+
+bool DRW_Header::getStr( std::string key, std::string* varStr )
+{
+ bool result = false;
+ std::map<std::string, DRW_Variant*>::iterator it;
+
+ it = vars.find( key );
+
+ if( it != vars.end() )
+ {
+ DRW_Variant* var = (*it).second;
+
+ if( var->type == DRW_Variant::STRING )
+ {
+ *varStr = *var->content.s;
+ result = true;
+ }
+
+ vars.erase( it );
+ }
+
+ return result;
+}
+
+
+bool DRW_Header::getCoord( std::string key, DRW_Coord* varCoord )
+{
+ bool result = false;
+ std::map<std::string, DRW_Variant*>::iterator it;
+
+ it = vars.find( key );
+
+ if( it != vars.end() )
+ {
+ DRW_Variant* var = (*it).second;
+
+ if( var->type == DRW_Variant::COORD )
+ {
+ *varCoord = *var->content.v;
+ result = true;
+ }
+
+ vars.erase( it );
+ }
+
+ return result;
+}