| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #ifndef DWGREADER_H |
| #define DWGREADER_H |
|
|
| #include <unordered_map> |
| #include <list> |
| #include <memory> |
| #include "drw_textcodec.h" |
| #include "dwgutil.h" |
| #include "dwgbuffer.h" |
| #include "../libdwgr.h" |
|
|
| class objHandle{ |
| public: |
| objHandle()=default; |
| objHandle(duint32 t, duint32 h, duint32 l) |
| :type{t} |
| ,handle{h} |
| ,loc{l} |
| {} |
| duint32 type{0}; |
| duint32 handle{0}; |
| duint32 loc{0}; |
| }; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| class dwgPageInfo { |
| public: |
| dwgPageInfo()=default; |
| dwgPageInfo(duint64 i, duint64 ad, duint64 sz){ |
| Id=i; address=ad; size=sz; |
| } |
| duint64 Id; |
| duint64 address; |
| duint64 size; |
| duint64 dataSize; |
| duint64 startOffset; |
| duint64 cSize; |
| duint64 uSize; |
| }; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| class dwgSectionInfo { |
| public: |
| dwgSectionInfo()=default; |
| dint32 Id{-1}; |
| std::string name; |
| duint32 compressed{1}; |
| duint32 encrypted{0}; |
| std::unordered_map<duint32, dwgPageInfo >pages; |
| duint64 size; |
| duint64 pageCount{0}; |
| duint64 maxSize; |
| duint64 address; |
| }; |
|
|
|
|
| |
| |
| |
| |
| |
| class DRW_ObjControl : public DRW_TableEntry { |
| public: |
| DRW_ObjControl() { reset();} |
| ~DRW_ObjControl() override = default; |
|
|
| |
| void reset(){ |
| } |
| bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0) override; |
| std::list<duint32>handlesList; |
| }; |
|
|
|
|
| class dwgReader { |
| friend class dwgR; |
| public: |
| dwgReader(std::ifstream *stream, dwgR *p) |
| :fileBuf{ new dwgBuffer(stream) } |
| ,parent{p} |
| { |
| decoder.setVersion(DRW::AC1021, false); |
| decoder.setCodePage("UTF-16", false); |
| |
| |
| |
| } |
| virtual ~dwgReader(); |
|
|
| protected: |
| virtual bool readMetaData() = 0; |
| virtual bool readPreview(){return false;} |
| virtual bool readFileHeader() = 0; |
| virtual bool readDwgHeader(DRW_Header& hdr)=0; |
| virtual bool readDwgClasses() = 0; |
| virtual bool readDwgHandles() = 0; |
| virtual bool readDwgTables(DRW_Header& hdr)=0; |
| virtual bool readDwgBlocks(DRW_Interface& intfa) = 0; |
| virtual bool readDwgEntities(DRW_Interface& intfa) = 0; |
| virtual bool readDwgObjects(DRW_Interface& intfa) = 0; |
|
|
| virtual bool readDwgEntity(dwgBuffer *dbuf, objHandle& obj, DRW_Interface& intfa); |
| bool readDwgObject(dwgBuffer *dbuf, objHandle& obj, DRW_Interface& intfa); |
| void parseAttribs(DRW_Entity* e); |
| std::string findTableName(DRW::TTYPE table, dint32 handle); |
|
|
| void setCodePage(const std::string &c){decoder.setCodePage(c, false);} |
| std::string getCodePage(){ return decoder.getCodePage();} |
| bool readDwgHeader(DRW_Header& hdr, dwgBuffer *buf, dwgBuffer *hBuf); |
| bool readDwgHandles(dwgBuffer *dbuf, duint64 offset, duint64 size); |
| bool readDwgTables(DRW_Header& hdr, dwgBuffer *dbuf); |
| bool checkSentinel(dwgBuffer *buf, enum secEnum::DWGSection, bool start); |
|
|
| bool readDwgBlocks(DRW_Interface& intfa, dwgBuffer *dbuf); |
| bool readDwgEntities(DRW_Interface& intfa, dwgBuffer *dbuf); |
| bool readDwgObjects(DRW_Interface& intfa, dwgBuffer *dbuf); |
| bool readPlineVertex(DRW_Polyline& pline, dwgBuffer *dbuf); |
|
|
| public: |
| std::unordered_map<duint32, objHandle>ObjectMap; |
| std::unordered_map<duint32, objHandle>objObjectMap; |
| std::unordered_map<duint32, objHandle>remainingMap; |
| std::unordered_map<duint32, DRW_LType*> ltypemap; |
| std::unordered_map<duint32, DRW_Layer*> layermap; |
| std::unordered_map<duint32, DRW_Block*> blockmap; |
| std::unordered_map<duint32, DRW_Textstyle*> stylemap; |
| std::unordered_map<duint32, DRW_Dimstyle*> dimstylemap; |
| std::unordered_map<duint32, DRW_Vport*> vportmap; |
| |
| std::unordered_map<duint32, DRW_AppId*> appIdmap; |
| |
| duint8 maintenanceVersion{0}; |
|
|
| DRW_ParsingContext parsingContext; |
|
|
| protected: |
| std::unique_ptr<dwgBuffer> fileBuf; |
| dwgR *parent{nullptr}; |
| DRW::Version version{DRW::UNKNOWNV}; |
|
|
| |
| duint32 previewImagePos; |
|
|
| |
| std::unordered_map<int, dwgSectionInfo >sections; |
| std::unordered_map<duint32, DRW_Class*> classesmap; |
|
|
| protected: |
| DRW_TextCodec decoder; |
|
|
| protected: |
| |
| duint32 nextEntLink{0}; |
| duint32 prevEntLink{0}; |
|
|
| private: |
| template <class T> |
| bool entryParse(T &e, dwgBuffer &buff, duint32 bs, bool &ret) { |
| ret = e.parseDwg( version, &buff, bs); |
| if (ret) { |
| parseAttribs(&e); |
| nextEntLink = e.nextEntLink; |
| prevEntLink = e.prevEntLink; |
| } |
|
|
| return ret; |
| } |
|
|
| }; |
|
|
|
|
|
|
| #endif |
|
|