diff --git a/src/libs/vdxf/libdxfrw/drw_base.cpp b/src/libs/vdxf/libdxfrw/drw_base.cpp new file mode 100644 index 000000000..219c1b643 --- /dev/null +++ b/src/libs/vdxf/libdxfrw/drw_base.cpp @@ -0,0 +1,19 @@ +/****************************************************************************** +** 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 . ** +******************************************************************************/ + +#include "drw_base.h" +#include "intern/drw_dbg.h" + +void DRW::setCustomDebugPrinter(DebugPrinter *printer) +{ + DRW_dbg::getInstance()->setCustomDebugPrinter(std::unique_ptr(printer)); +} diff --git a/src/libs/vdxf/libdxfrw/drw_base.h b/src/libs/vdxf/libdxfrw/drw_base.h index ea395e919..2c5c17a74 100644 --- a/src/libs/vdxf/libdxfrw/drw_base.h +++ b/src/libs/vdxf/libdxfrw/drw_base.h @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -100,16 +101,46 @@ 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. */ - AC1027 /*!< ACAD 2013. */ + UNKNOWNV, //!< UNKNOWN VERSION. + MC00, //!< DWG Release 1.1 + AC12, //!< DWG Release 1.2 + AC14, //!< DWG Release 1.4 + AC150, //!< DWG Release 2.0 + AC210, //!< DWG Release 2.10 + AC1002, //!< DWG Release 2.5 + AC1003, //!< DWG Release 2.6 + AC1004, //!< DWG Relase 9 + AC1006, //!< DWG Release 10 (R10) + AC1009, //!< DWG Release 11/12 (LT R1/R2) (R11 & R12) + AC1012, //!< DWG Release 13 (LT95) (R13) + AC1014, //!< DWG Release 14/14.01 (LT97/LT98) (R14) + AC1015, //!< AutoCAD 2000/2000i/2002 (ACAD 2000) + AC1018, //!< AutoCAD 2004/2005/2006 (ACAD 2004) + AC1021, //!< AutoCAD 2007/2008/2009 (ACAD 2007) + AC1024, //!< AutoCAD 2010/2011/2012 (ACAD 2010) + AC1027, //!< AutoCAD 2013/2014/2015/2016/2017 (ACAD 2013) + AC1032, //!< AutoCAD 2018/2019/2020 (ACAD 2018) +}; + +const std::unordered_map< const char*, DRW::Version > dwgVersionStrings { + { "MC0.0", DRW::MC00 }, + { "AC1.2", DRW::AC12 }, + { "AC1.4", DRW::AC14 }, + { "AC1.50", DRW::AC150 }, + { "AC2.10", DRW::AC210 }, + { "AC1002", DRW::AC1002 }, + { "AC1003", DRW::AC1003 }, + { "AC1004", DRW::AC1004 }, + { "AC1006", DRW::AC1006 }, + { "AC1009", DRW::AC1009 }, + { "AC1012", DRW::AC1012 }, + { "AC1014", DRW::AC1014 }, + { "AC1015", DRW::AC1015 }, + { "AC1018", DRW::AC1018 }, + { "AC1021", DRW::AC1021 }, + { "AC1024", DRW::AC1024 }, + { "AC1027", DRW::AC1027 }, + { "AC1032", DRW::AC1032 }, }; enum error { @@ -133,6 +164,32 @@ enum class DebugLevel { Debug }; +/** + * Interface for debug printers. + * + * The base class is silent and ignores all debugging. + */ +class DebugPrinter { +public: + virtual void printS(const std::string &s){(void)s;} + virtual void printI(long long int i){(void)i;} + virtual void printUI(long long unsigned int i){(void)i;} + virtual void printD(double d){(void)d;} + virtual void printH(long long int i){(void)i;} + virtual void printB(int i){(void)i;} + virtual void printHL(int c, int s, int h){(void)c;(void)s;(void)h;} + virtual void printPT(double x, double y, double z){(void)x;(void)y;(void)z;} + DebugPrinter()=default; + virtual ~DebugPrinter()=default; +}; + +/** + * Sets a custom debug printer to use when outputting debug messages. + * + * Ownership of `printer` is transferred. + */ +void setCustomDebugPrinter( DebugPrinter* printer ); + //! Special codes for colors enum ColorCodes { black = 250, diff --git a/src/libs/vdxf/libdxfrw/intern/drw_dbg.cpp b/src/libs/vdxf/libdxfrw/intern/drw_dbg.cpp index 52cd204a2..4a99e0921 100644 --- a/src/libs/vdxf/libdxfrw/intern/drw_dbg.cpp +++ b/src/libs/vdxf/libdxfrw/intern/drw_dbg.cpp @@ -18,21 +18,8 @@ DRW_dbg *DRW_dbg::instance{nullptr}; /*********private clases*************/ -class print_none { -public: - virtual void printS(const std::string &s){(void)s;} - virtual void printI(long long int i){(void)i;} - virtual void printUI(long long unsigned int i){(void)i;} - virtual void printD(double d){(void)d;} - virtual void printH(long long int i){(void)i;} - virtual void printB(int i){(void)i;} - virtual void printHL(int c, int s, int h){(void)c;(void)s;(void)h;} - virtual void printPT(double x, double y, double z){(void)x;(void)y;(void)z;} - print_none()= default; - virtual ~print_none()=default; -}; -class print_debug : public print_none { +class print_debug : public DRW::DebugPrinter { public: void printS(const std::string &s) override; void printI(long long int i) override; @@ -56,17 +43,28 @@ DRW_dbg *DRW_dbg::getInstance(){ } DRW_dbg::DRW_dbg() : - prClass(std::make_unique()) -{} + debugPrinter(std::make_unique()) +{ + currentPrinter = &silentDebug; +} + +void DRW_dbg::setCustomDebugPrinter(std::unique_ptr printer) +{ + debugPrinter = std::move( printer ); + if (level == Level::Debug){ + currentPrinter = debugPrinter.get(); + } +} void DRW_dbg::setLevel(Level lvl){ level = lvl; switch (level){ case Level::Debug: - prClass = std::make_unique(); + currentPrinter = debugPrinter.get(); break; default: - prClass = std::make_unique(); + currentPrinter = &silentDebug; + break; } } @@ -75,46 +73,46 @@ DRW_dbg::Level DRW_dbg::getLevel() const{ } void DRW_dbg::print(const std::string &s){ - prClass->printS(s); + currentPrinter->printS(s); } void DRW_dbg::print(int i){ - prClass->printI(i); + currentPrinter->printI(i); } void DRW_dbg::print(unsigned int i){ - prClass->printUI(i); + currentPrinter->printUI(i); } void DRW_dbg::print(long long int i){ - prClass->printI(i); + currentPrinter->printI(i); } void DRW_dbg::print(long unsigned int i){ - prClass->printUI(i); + currentPrinter->printUI(i); } void DRW_dbg::print(long long unsigned int i){ - prClass->printUI(i); + currentPrinter->printUI(i); } void DRW_dbg::print(double d){ - prClass->printD(d); + currentPrinter->printD(d); } void DRW_dbg::printH(long long int i){ - prClass->printH(i); + currentPrinter->printH(i); } void DRW_dbg::printB(int i){ - prClass->printB(i); + currentPrinter->printB(i); } void DRW_dbg::printHL(int c, int s, int h){ - prClass->printHL(c, s, h); + currentPrinter->printHL(c, s, h); } void DRW_dbg::printPT(double x, double y, double z){ - prClass->printPT(x, y, z); + currentPrinter->printPT(x, y, z); } void print_debug::printS(const std::string &s){ diff --git a/src/libs/vdxf/libdxfrw/intern/drw_dbg.h b/src/libs/vdxf/libdxfrw/intern/drw_dbg.h index ab752ac09..81a3d8f39 100644 --- a/src/libs/vdxf/libdxfrw/intern/drw_dbg.h +++ b/src/libs/vdxf/libdxfrw/intern/drw_dbg.h @@ -17,6 +17,7 @@ #include #include #include +#include "../drw_base.h" //#include #define DRW_DBGSL(a) DRW_dbg::getInstance()->setLevel(a) @@ -37,6 +38,11 @@ public: Debug }; void setLevel(Level lvl); + /** + * Sets a custom debug printer to use when non-silent output + * is required. + */ + void setCustomDebugPrinter(std::unique_ptr printer); Level getLevel() const; static DRW_dbg *getInstance(); void print(const std::string &s); @@ -57,8 +63,9 @@ private: ~DRW_dbg(); static DRW_dbg *instance; Level level{Level::None}; - std::ios_base::fmtflags flags{std::cerr.flags()}; - std::unique_ptr prClass; + DRW::DebugPrinter silentDebug{}; + std::unique_ptr< DRW::DebugPrinter > debugPrinter; + DRW::DebugPrinter* currentPrinter{nullptr}; }; diff --git a/src/libs/vdxf/libdxfrw/intern/drw_textcodec.cpp b/src/libs/vdxf/libdxfrw/intern/drw_textcodec.cpp index 6a0bb113e..72dbf92e0 100644 --- a/src/libs/vdxf/libdxfrw/intern/drw_textcodec.cpp +++ b/src/libs/vdxf/libdxfrw/intern/drw_textcodec.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -42,44 +43,78 @@ QMap QtCodecs() {"UTF-16", {"UTF-16", "UTF16", "UTF16-BIT"}}, }; } -} +} // namespace DRW_TextCodec::DRW_TextCodec() : version(DRW::AC1021) {} -void DRW_TextCodec::setVersion(int v, bool dxfFormat){ - if (v == DRW::AC1009 || v == DRW::AC1006) { - version = DRW::AC1009; - cp = "ANSI_1252"; - setCodePage(cp, dxfFormat); - } else if (v == DRW::AC1012 || v == DRW::AC1014 - || v == DRW::AC1015 || v == DRW::AC1018) { - version = DRW::AC1015; -// if (cp.empty()) { //codepage not set, initialize +void DRW_TextCodec::setVersion(DRW::Version v, bool dxfFormat){ + switch (v) + { + case DRW::UNKNOWNV: + case DRW::MC00: + case DRW::AC12: + case DRW::AC14: + case DRW::AC150: + case DRW::AC210: + case DRW::AC1002: + case DRW::AC1003: + case DRW::AC1004: + // unhandled? + break; + case DRW::AC1006: + case DRW::AC1009: + { + version = DRW::AC1009; cp = "ANSI_1252"; setCodePage(cp, dxfFormat); -// } - } else { - version = DRW::AC1021; - if (dxfFormat) - cp = "UTF-8";//RLZ: can be UCS2 or UTF-16 16bits per char - else - cp = "UTF-16";//RLZ: can be UCS2 or UTF-16 16bits per char - setCodePage(cp, dxfFormat); + break; + } + case DRW::AC1012: + case DRW::AC1014: + case DRW::AC1015: + case DRW::AC1018: + { + version = DRW::AC1015; +// if (cp.empty()) { //codepage not set, initialize + cp = "ANSI_1252"; + setCodePage(cp, dxfFormat); +// } + break; + } + case DRW::AC1021: + case DRW::AC1024: + case DRW::AC1027: + case DRW::AC1032: + { + version = DRW::AC1021; + if (dxfFormat) + { + cp = "UTF-8";//RLZ: can be UCS2 or UTF-16 16bits per char + } + else + { + cp = "UTF-16";//RLZ: can be UCS2 or UTF-16 16bits per char + } + setCodePage(cp, dxfFormat); + break; + } + default: + break; } } -void DRW_TextCodec::setVersion(const std::string &versionStr, bool dxfFormat){ - if (versionStr == "AC1009" || versionStr == "AC1006") { - setVersion(DRW::AC1009, dxfFormat); - } else if (versionStr == "AC1012" || versionStr == "AC1014" - || versionStr == "AC1015" || versionStr == "AC1018") { - setVersion(DRW::AC1015, dxfFormat); - } - else +void DRW_TextCodec::setVersion(const std::string &v, bool dxfFormat){ + version = DRW::UNKNOWNV; + for (auto dwgVersionString : DRW::dwgVersionStrings) { - setVersion(DRW::AC1021, dxfFormat); + if (std::strcmp( v.c_str(), dwgVersionString.first ) == 0) + { + version = dwgVersionString.second; + setVersion( dwgVersionString.second, dxfFormat); + break; + } } } diff --git a/src/libs/vdxf/libdxfrw/intern/drw_textcodec.h b/src/libs/vdxf/libdxfrw/intern/drw_textcodec.h index 634496c22..3f1fca855 100644 --- a/src/libs/vdxf/libdxfrw/intern/drw_textcodec.h +++ b/src/libs/vdxf/libdxfrw/intern/drw_textcodec.h @@ -3,6 +3,7 @@ #include #include +#include "../drw_base.h" class QTextCodec; class QStringList; @@ -15,8 +16,8 @@ public: std::string fromUtf8(const std::string &s); std::string toUtf8(const std::string &s); int getVersion() const {return version;} - void setVersion(const std::string &versionStr, bool dxfFormat); - void setVersion(int v, bool dxfFormat); + void setVersion(const std::string &v, bool dxfFormat); + void setVersion(DRW::Version v, bool dxfFormat); void setCodePage(const std::string &c, bool dxfFormat); std::string getCodePage() const {return cp;} @@ -28,7 +29,7 @@ private: private: Q_DISABLE_COPY(DRW_TextCodec) - int version; + DRW::Version version{DRW::UNKNOWNV}; std::string cp{}; QTextCodec *conv{nullptr}; }; diff --git a/src/libs/vdxf/vdxf.pri b/src/libs/vdxf/vdxf.pri index ce0441c08..f38e1199b 100644 --- a/src/libs/vdxf/vdxf.pri +++ b/src/libs/vdxf/vdxf.pri @@ -2,6 +2,7 @@ # This need for corect working file translations.pro SOURCES += \ + $$PWD/libdxfrw/drw_base.cpp \ $$PWD/vdxfengine.cpp \ $$PWD/vdxfpaintdevice.cpp \ $$PWD/libdxfrw/intern/drw_dbg.cpp \