| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #ifndef IMPORT_IMPORTOCAF2_H |
| #define IMPORT_IMPORTOCAF2_H |
|
|
| #include <map> |
| #include <set> |
| #include <string> |
| #include <unordered_map> |
| #include <vector> |
|
|
| #include <TDocStd_Document.hxx> |
| #include <TopoDS_Shape.hxx> |
| #include <XCAFDoc_ColorTool.hxx> |
| #include <XCAFDoc_ShapeTool.hxx> |
|
|
| #include <Base/Sequencer.h> |
| #include <Mod/Part/App/TopoShape.h> |
|
|
| #include "ExportOCAF.h" |
| #include "ImportOCAF.h" |
| #include "Tools.h" |
|
|
|
|
| class TDF_Label; |
| class TopLoc_Location; |
|
|
| namespace App |
| { |
| class Document; |
| class DocumentObject; |
| } |
| namespace Part |
| { |
| class Feature; |
| } |
|
|
| namespace Import |
| { |
|
|
| struct ImportExport ImportOCAFOptions |
| { |
| ImportOCAFOptions(); |
| Base::Color defaultFaceColor; |
| Base::Color defaultEdgeColor; |
| bool merge = false; |
| bool useLinkGroup = false; |
| bool useBaseName = true; |
| bool importHidden = true; |
| bool reduceObjects = false; |
| bool showProgress = false; |
| bool expandCompound = false; |
| int mode = 0; |
| }; |
|
|
| class ImportExport ImportOCAF2 |
| { |
| public: |
| ImportOCAF2(Handle(TDocStd_Document) h, App::Document* d, const std::string& name); |
| virtual ~ImportOCAF2(); |
| App::DocumentObject* loadShapes(); |
|
|
| static ImportOCAFOptions customImportOptions(); |
| void setImportOptions(ImportOCAFOptions opts); |
| void setMerge(bool enable) |
| { |
| options.merge = enable; |
| } |
| void setUseLinkGroup(bool enable); |
| void setBaseName(bool enable) |
| { |
| options.useBaseName = enable; |
| } |
| void setImportHiddenObject(bool enable) |
| { |
| options.importHidden = enable; |
| } |
| void setReduceObjects(bool enable) |
| { |
| options.reduceObjects = enable; |
| } |
| void setShowProgress(bool enable) |
| { |
| options.showProgress = enable; |
| } |
| void setExpandCompound(bool enable) |
| { |
| options.expandCompound = enable; |
| } |
|
|
| enum ImportMode |
| { |
| SingleDoc = 0, |
| GroupPerDoc = 1, |
| GroupPerDir = 2, |
| ObjectPerDoc = 3, |
| ObjectPerDir = 4, |
| ModeMax, |
| }; |
| void setMode(int m); |
| int getMode() const |
| { |
| return options.mode; |
| } |
|
|
| private: |
| struct Info |
| { |
| std::string baseName; |
| App::DocumentObject* obj = nullptr; |
| App::PropertyPlacement* propPlacement = nullptr; |
| Base::Color faceColor; |
| Base::Color edgeColor; |
| bool hasFaceColor = false; |
| bool hasEdgeColor = false; |
| int free = true; |
| }; |
|
|
| App::DocumentObject* loadShape( |
| App::Document* doc, |
| TDF_Label label, |
| const TopoDS_Shape& shape, |
| bool baseOnly = false, |
| bool newDoc = true |
| ); |
| App::Document* getDocument(App::Document* doc, TDF_Label label); |
| bool createAssembly( |
| App::Document* doc, |
| TDF_Label label, |
| const TopoDS_Shape& shape, |
| Info& info, |
| bool newDoc |
| ); |
| bool createObject( |
| App::Document* doc, |
| TDF_Label label, |
| const TopoDS_Shape& shape, |
| Info& info, |
| bool newDoc |
| ); |
| bool createGroup( |
| App::Document* doc, |
| Info& info, |
| const TopoDS_Shape& shape, |
| std::vector<App::DocumentObject*>& children, |
| const boost::dynamic_bitset<>& visibilities, |
| bool canReduce = false |
| ); |
| bool getColor(const TopoDS_Shape& shape, Info& info, bool check = false, bool noDefault = false); |
| void getSHUOColors(TDF_Label label, std::map<std::string, Base::Color>& colors, bool appendFirst); |
| void setObjectName(Info& info, TDF_Label label); |
| std::string getLabelName(TDF_Label label); |
| App::DocumentObject* expandShape(App::Document* doc, TDF_Label label, const TopoDS_Shape& shape); |
|
|
| virtual void applyEdgeColors(Part::Feature*, const std::vector<Base::Color>&) |
| {} |
| virtual void applyFaceColors(Part::Feature*, const std::vector<Base::Color>&) |
| {} |
| virtual void applyElementColors(App::DocumentObject*, const std::map<std::string, Base::Color>&) |
| {} |
| virtual void applyLinkColor(App::DocumentObject*, int , Base::Color) |
| {} |
|
|
| private: |
| class ImportLegacy: public ImportOCAF |
| { |
| public: |
| explicit ImportLegacy(ImportOCAF2& parent) |
| : ImportOCAF(parent.pDoc, parent.pDocument, parent.default_name) |
| , myParent(parent) |
| {} |
|
|
| private: |
| void applyColors(Part::Feature* part, const std::vector<Base::Color>& colors) override |
| { |
| myParent.applyFaceColors(part, colors); |
| } |
|
|
| ImportOCAF2& myParent; |
| }; |
| friend class ImportLegacy; |
|
|
| Handle(TDocStd_Document) pDoc; |
| App::Document* pDocument; |
| Handle(XCAFDoc_ShapeTool) aShapeTool; |
| Handle(XCAFDoc_ColorTool) aColorTool; |
| std::string default_name; |
|
|
| ImportOCAFOptions options; |
| std::string filePath; |
|
|
| std::unordered_map<TopoDS_Shape, Info, ShapeHasher> myShapes; |
| std::unordered_map<TDF_Label, std::string, LabelHasher> myNames; |
| std::unordered_map<App::DocumentObject*, App::PropertyPlacement*> myCollapsedObjects; |
|
|
| Base::SequencerLauncher* sequencer {nullptr}; |
| }; |
|
|
| class ImportExport ImportOCAFExt: public ImportOCAF2 |
| { |
| public: |
| ImportOCAFExt(Handle(TDocStd_Document) hStdDoc, App::Document* doc, const std::string& name); |
|
|
| std::map<Part::Feature*, std::vector<Base::Color>> partColors; |
|
|
| private: |
| void applyFaceColors(Part::Feature* part, const std::vector<Base::Color>& colors) override; |
| }; |
|
|
| struct ImportExport ExportOCAFOptions |
| { |
| ExportOCAFOptions(); |
| Base::Color defaultColor; |
| bool exportHidden = true; |
| bool keepPlacement = false; |
| }; |
|
|
| class ImportExport ExportOCAF2 |
| { |
| public: |
| using GetShapeColorsFunc |
| = std::function<std::map<std::string, Base::Color>(App::DocumentObject*, const char*)>; |
| explicit ExportOCAF2(Handle(TDocStd_Document) h, GetShapeColorsFunc func = GetShapeColorsFunc()); |
|
|
| static ExportOCAFOptions customExportOptions(); |
| void setExportOptions(ExportOCAFOptions opts) |
| { |
| options = opts; |
| } |
| void setExportHiddenObject(bool enable) |
| { |
| options.exportHidden = enable; |
| } |
| void setKeepPlacement(bool enable) |
| { |
| options.keepPlacement = enable; |
| } |
| void exportObjects(std::vector<App::DocumentObject*>& objs, const char* name = nullptr); |
| bool canFallback(std::vector<App::DocumentObject*> objs); |
|
|
| private: |
| TDF_Label exportObject( |
| App::DocumentObject* obj, |
| const char* sub, |
| TDF_Label parent, |
| const char* name = nullptr |
| ); |
| void setupObject( |
| TDF_Label label, |
| App::DocumentObject* obj, |
| const Part::TopoShape& shape, |
| const std::string& prefix, |
| const char* name = nullptr, |
| bool force = false |
| ); |
| void setName(TDF_Label label, App::DocumentObject* obj, const char* name = nullptr); |
| TDF_Label findComponent(const char* subname, TDF_Label label, TDF_LabelSequence& labels); |
|
|
| private: |
| Handle(TDocStd_Document) pDoc; |
| Handle(XCAFDoc_ShapeTool) aShapeTool; |
| Handle(XCAFDoc_ColorTool) aColorTool; |
|
|
| std::unordered_map<App::DocumentObject*, TDF_Label> myObjects; |
|
|
| std::unordered_map<TDF_Label, std::vector<std::string>, LabelHasher> myNames; |
|
|
| std::set<std::pair<App::DocumentObject*, std::string>> mySetups; |
|
|
| std::vector<App::DocumentObject*> groupLinks; |
|
|
| GetShapeColorsFunc getShapeColors; |
|
|
| ExportOCAFOptions options; |
| }; |
|
|
| } |
|
|
| #endif |
|
|