diff --git a/src/libs/vdxf/libdxfrw/drw_header.cpp b/src/libs/vdxf/libdxfrw/drw_header.cpp index 73f65acba..b95432368 100644 --- a/src/libs/vdxf/libdxfrw/drw_header.cpp +++ b/src/libs/vdxf/libdxfrw/drw_header.cpp @@ -1368,7 +1368,11 @@ void DRW_Header::write(dxfWriter *writer, DRW::Version ver){ writer->writeInt16(70, varInt); else writer->writeInt16(70, 1); + int insunits {Units::None}; + getInt("$INSUNITS", &insunits); // get $INSUNITS now to evaluate $MEASUREMENT + getInt("$MEASUREMENT", &varInt); // just remove the variable from list writer->writeString(9, "$MEASUREMENT"); + writer->writeInt16(70, measurement( insunits)); if (getInt("$MEASUREMENT", &varInt)) writer->writeInt16(70, varInt); else @@ -1395,10 +1399,7 @@ void DRW_Header::write(dxfWriter *writer, DRW::Version ver){ writer->writeInt16(290, 0); if (ver > DRW::AC1014) { writer->writeString(9, "$INSUNITS"); - if (getInt("$INSUNITS", &varInt)) - writer->writeInt16(70, varInt); - else - writer->writeInt16(70, 0); + writer->writeInt16(70, insunits); // already fetched above for $MEASUREMENT } writer->writeString(9, "$HYPERLINKBASE"); if (getStr("$HYPERLINKBASE", &varStr)) @@ -1752,3 +1753,20 @@ bool DRW_Header::getCoord(const std::string &key, DRW_Coord *varCoord){ } return result; } + +int DRW_Header::measurement(const int unit) { + switch (unit) { + case Units::Inch: + case Units::Foot: + case Units::Mile: + case Units::Microinch: + case Units::Mil: + case Units::Yard: + return Units::English; + + default: + break; + } + + return Units::Metric; +} diff --git a/src/libs/vdxf/libdxfrw/drw_header.h b/src/libs/vdxf/libdxfrw/drw_header.h index 34883a213..f2c453e4b 100644 --- a/src/libs/vdxf/libdxfrw/drw_header.h +++ b/src/libs/vdxf/libdxfrw/drw_header.h @@ -39,6 +39,36 @@ public: clearVars(); } + enum Units { + /** $ISUNITS header variable, since ACAD2000/AC1015 */ + None = 0, ///< No unit (unit from parent) + Inch = 1, ///< 25.4 mm + Foot = 2, ///< 12 Inches = 0.3048 m + Mile = 3, ///< 1760 Yards = 1609 m + Millimeter = 4, ///< 0.001 m + Centimeter = 5, ///< 0.01 m + Meter = 6, + Kilometer = 7, ///< 1000 m + Microinch = 8, ///< 0.000001 Inch = 0.0000254 mm = 25.4 Nanometer + Mil = 9, ///< 0.001 Inch = 0.0254 mm = 25.4 Micron + Yard = 10, ///< 3 Feet = 0.9144 m + Angstrom = 11, ///< 10^-10 m + Nanometer = 12, ///< 10^-9 m + Micron = 13, ///< 10^-6 m + Decimeter = 14, ///< 0.1 m + Decameter = 15, ///< 10 m + Hectometer = 16, ///< 100 m + Gigameter = 17, ///< 10^9 m + Astro = 18, ///< ~149.6 x 10^9 m + Lightyear = 19, ///< ~9.46 x 10^15 m + Parsec = 20, ///< ~3.0857 x 10^16 m + UnitCount = 21, ///< Used to iterate through units + + /** $MEASUREMENT header variable, since R14/AC1014 */ + English = 0, ///< English/Imperial drawing */ + Metric = 1, ///< Metric drawing */ + }; + DRW_Header(const DRW_Header& h) : vars(), comments(h.comments), @@ -119,6 +149,8 @@ private: duint32 ucsCtrl; duint32 vportCtrl; duint32 vpEntHeaderCtrl; + + int measurement(const int unit); }; #endif