diff --git a/src/Mod/Import/App/AppImportPy.cpp b/src/Mod/Import/App/AppImportPy.cpp index 2fbeef16c0..7655329ff4 100644 --- a/src/Mod/Import/App/AppImportPy.cpp +++ b/src/Mod/Import/App/AppImportPy.cpp @@ -74,22 +74,6 @@ namespace Import { -class ImportOCAFExt: public Import::ImportOCAF2 -{ -public: - ImportOCAFExt(Handle(TDocStd_Document) hStdDoc, App::Document* doc, const std::string& name) - : ImportOCAF2(hStdDoc, doc, name) - {} - - std::map> partColors; - -private: - void applyFaceColors(Part::Feature* part, const std::vector& colors) override - { - partColors[part] = colors; - } -}; - class Module: public Py::ExtensionModule { public: @@ -126,7 +110,7 @@ public: private: Py::Object importer(const Py::Tuple& args, const Py::Dict& kwds) { - char* Name; + char* Name = nullptr; char* DocName = nullptr; PyObject* importHidden = Py_None; PyObject* merge = Py_None; @@ -153,7 +137,6 @@ private: std::string Utf8Name = std::string(Name); PyMem_Free(Name); - std::string name8bit = Part::encodeFilename(Utf8Name); try { Base::FileInfo file(Utf8Name.c_str()); @@ -235,7 +218,7 @@ private: list.append(tuple); } - return list; + return list; // NOLINT } } catch (Standard_Failure& e) { @@ -250,11 +233,11 @@ private: } Py::Object exporter(const Py::Tuple& args, const Py::Dict& kwds) { - PyObject* object; - char* Name; - PyObject* exportHidden = Py_None; - PyObject* legacy = Py_None; - PyObject* keepPlacement = Py_None; + PyObject* object = nullptr; + char* Name = nullptr; + PyObject* pyexportHidden = Py_None; + PyObject* pylegacy = Py_None; + PyObject* pykeepPlacement = Py_None; static const std::array kwd_list {"obj", "name", "exportHidden", @@ -269,68 +252,56 @@ private: "utf-8", &Name, &PyBool_Type, - &exportHidden, + &pyexportHidden, &PyBool_Type, - &legacy, + &pylegacy, &PyBool_Type, - &keepPlacement)) { + &pykeepPlacement)) { throw Py::Exception(); } std::string Utf8Name = std::string(Name); PyMem_Free(Name); + // clang-format off + // determine export options + Part::OCAF::ImportExportSettings settings; + + bool legacyExport = (pylegacy == Py_None ? settings.getExportLegacy() + : Base::asBoolean(pylegacy)); + bool exportHidden = (pyexportHidden == Py_None ? settings.getExportHiddenObject() + : Base::asBoolean(pyexportHidden)); + bool keepPlacement = (pykeepPlacement == Py_None ? settings.getExportKeepPlacement() + : Base::asBoolean(pykeepPlacement)); + // clang-format on + try { Py::Sequence list(object); - Handle(XCAFApp_Application) hApp = XCAFApp_Application::GetApplication(); - Handle(TDocStd_Document) hDoc; - hApp->NewDocument(TCollection_ExtendedString("MDTV-CAF"), hDoc); - std::vector objs; for (Py::Sequence::iterator it = list.begin(); it != list.end(); ++it) { PyObject* item = (*it).ptr(); if (PyObject_TypeCheck(item, &(App::DocumentObjectPy::Type))) { - objs.push_back( - static_cast(item)->getDocumentObjectPtr()); + auto pydoc = static_cast(item); + objs.push_back(pydoc->getDocumentObjectPtr()); } } - if (legacy == Py_None) { - Part::OCAF::ImportExportSettings settings; - legacy = settings.getExportLegacy() ? Py_True : Py_False; - } + Handle(XCAFApp_Application) hApp = XCAFApp_Application::GetApplication(); + Handle(TDocStd_Document) hDoc; + hApp->NewDocument(TCollection_ExtendedString("MDTV-CAF"), hDoc); Import::ExportOCAF2 ocaf(hDoc); - if (!Base::asBoolean(legacy) || !ocaf.canFallback(objs)) { + if (!legacyExport || !ocaf.canFallback(objs)) { ocaf.setExportOptions(ExportOCAF2::customExportOptions()); - - if (exportHidden != Py_None) { - ocaf.setExportHiddenObject(Base::asBoolean(exportHidden)); - } - if (keepPlacement != Py_None) { - ocaf.setKeepPlacement(Base::asBoolean(keepPlacement)); - } + ocaf.setExportHiddenObject(exportHidden); + ocaf.setKeepPlacement(keepPlacement); ocaf.exportObjects(objs); } else { - bool keepExplicitPlacement = Standard_True; - ExportOCAF ocaf(hDoc, keepExplicitPlacement); - // That stuff is exporting a list of selected objects into FreeCAD Tree - std::vector hierarchical_label; - std::vector hierarchical_loc; - std::vector hierarchical_part; - for (auto obj : objs) { - ocaf.exportObject(obj, hierarchical_label, hierarchical_loc, hierarchical_part); - } - - // Free Shapes must have absolute placement and not explicit - std::vector FreeLabels; - std::vector part_id; - ocaf.getFreeLabels(hierarchical_label, FreeLabels, part_id); - // Update is not performed automatically anymore: - // https://tracker.dev.opencascade.org/view.php?id=28055 - XCAFDoc_DocumentTool::ShapeTool(hDoc->Main())->UpdateAssemblies(); + bool keepExplicitPlacement = true; + ExportOCAFCmd ocaf(hDoc, keepExplicitPlacement); + ocaf.exportObjects(objs); } Base::FileInfo file(Utf8Name.c_str()); @@ -362,7 +333,7 @@ private: Py::Object readDXF(const Py::Tuple& args) { - char* Name; + char* Name = nullptr; const char* DocName = nullptr; const char* optionSource = nullptr; std::string defaultOptions = "User parameter:BaseApp/Preferences/Mod/Draft"; @@ -389,7 +360,7 @@ private: defaultOptions = optionSource; } - App::Document* pcDoc; + App::Document* pcDoc = nullptr; if (DocName) { pcDoc = App::GetApplication().getDocument(DocName); } @@ -419,8 +390,8 @@ private: Py::Object writeDXFShape(const Py::Tuple& args) { - PyObject* shapeObj; - char* fname; + PyObject* shapeObj = nullptr; + char* fname = nullptr; std::string filePath; std::string layerName; const char* optionSource = nullptr; @@ -531,8 +502,8 @@ private: Py::Object writeDXFObject(const Py::Tuple& args) { - PyObject* docObj; - char* fname; + PyObject* docObj = nullptr; + char* fname = nullptr; std::string filePath; std::string layerName; const char* optionSource = nullptr; diff --git a/src/Mod/Import/App/ExportOCAF.cpp b/src/Mod/Import/App/ExportOCAF.cpp index 1da458d8dd..adf65a1176 100644 --- a/src/Mod/Import/App/ExportOCAF.cpp +++ b/src/Mod/Import/App/ExportOCAF.cpp @@ -67,8 +67,8 @@ static inline Quantity_ColorRGBA convertColor(const App::Color& c) using namespace Import; -ExportOCAF::ExportOCAF(Handle(TDocStd_Document) h, bool explicitPlacement) - : pDoc(h) +ExportOCAF::ExportOCAF(Handle(TDocStd_Document) hDoc, bool explicitPlacement) + : pDoc(hDoc) , keepExplicitPlacement(explicitPlacement) { aShapeTool = XCAFDoc_DocumentTool::ShapeTool(pDoc->Main()); @@ -129,6 +129,30 @@ std::vector ExportOCAF::filterPart(App::Part* part) const return entries; } +void ExportOCAF::exportObjects(std::vector& objs) +{ + // That stuff is exporting a list of selected objects into FreeCAD Tree + std::vector hierarchical_label; + std::vector hierarchical_loc; + std::vector hierarchical_part; + for (auto obj : objs) { + exportObject(obj, hierarchical_label, hierarchical_loc, hierarchical_part); + } + + // Free Shapes must have absolute placement and not explicit + std::vector FreeLabels; + std::vector part_id; + getFreeLabels(hierarchical_label, FreeLabels, part_id); + + std::vector> Colors; + getPartColors(hierarchical_part, FreeLabels, part_id, Colors); + reallocateFreeShape(hierarchical_part, FreeLabels, part_id, Colors); + + // Update is not performed automatically anymore: + // https://tracker.dev.opencascade.org/view.php?id=28055 + XCAFDoc_DocumentTool::ShapeTool(pDoc->Main())->UpdateAssemblies(); +} + int ExportOCAF::exportObject(App::DocumentObject* obj, std::vector& hierarchical_label, std::vector& hierarchical_loc, diff --git a/src/Mod/Import/App/ExportOCAF.h b/src/Mod/Import/App/ExportOCAF.h index 53872ad608..3542f5169f 100644 --- a/src/Mod/Import/App/ExportOCAF.h +++ b/src/Mod/Import/App/ExportOCAF.h @@ -57,8 +57,9 @@ namespace Import class ImportExport ExportOCAF { public: - ExportOCAF(Handle(TDocStd_Document) h, bool explicitPlacement); + ExportOCAF(Handle(TDocStd_Document) hDoc, bool explicitPlacement); virtual ~ExportOCAF(); + void exportObjects(std::vector& objs); int exportObject(App::DocumentObject* obj, std::vector& hierarchical_label, std::vector& hierarchical_loc, diff --git a/src/Mod/Import/App/ImportOCAF2.cpp b/src/Mod/Import/App/ImportOCAF2.cpp index 7946aedd2c..b8d2fde888 100644 --- a/src/Mod/Import/App/ImportOCAF2.cpp +++ b/src/Mod/Import/App/ImportOCAF2.cpp @@ -1004,6 +1004,19 @@ bool ImportOCAF2::createAssembly(App::Document* _doc, // ---------------------------------------------------------------------------- +ImportOCAFExt::ImportOCAFExt(Handle(TDocStd_Document) hStdDoc, + App::Document* doc, + const std::string& name) + : ImportOCAF2(hStdDoc, doc, name) +{} + +void ImportOCAFExt::applyFaceColors(Part::Feature* part, const std::vector& colors) +{ + partColors[part] = colors; +} + +// ---------------------------------------------------------------------------- + ExportOCAFOptions::ExportOCAFOptions() { defaultColor.setPackedValue(0xCCCCCC00); diff --git a/src/Mod/Import/App/ImportOCAF2.h b/src/Mod/Import/App/ImportOCAF2.h index 45f434ea4c..08070068e1 100644 --- a/src/Mod/Import/App/ImportOCAF2.h +++ b/src/Mod/Import/App/ImportOCAF2.h @@ -228,6 +228,17 @@ private: Base::SequencerLauncher* sequencer {nullptr}; }; +class ImportExport ImportOCAFExt: public ImportOCAF2 +{ +public: + ImportOCAFExt(Handle(TDocStd_Document) hStdDoc, App::Document* doc, const std::string& name); + + std::map> partColors; + +private: + void applyFaceColors(Part::Feature* part, const std::vector& colors) override; +}; + struct ImportExport ExportOCAFOptions { ExportOCAFOptions(); diff --git a/src/Mod/Import/Gui/AppImportGuiPy.cpp b/src/Mod/Import/Gui/AppImportGuiPy.cpp index 515a8425b5..3bd32997af 100644 --- a/src/Mod/Import/Gui/AppImportGuiPy.cpp +++ b/src/Mod/Import/Gui/AppImportGuiPy.cpp @@ -589,16 +589,18 @@ private: std::string Utf8Name = std::string(Name); PyMem_Free(Name); + // clang-format off // determine export options Part::OCAF::ImportExportSettings settings; // still support old way - bool legacyExport = - (pylegacy == Py_None ? settings.getExportLegacy() : Base::asBoolean(pylegacy)); - bool exportHidden = (pyexportHidden == Py_None ? settings.getExportHiddenObject() - : Base::asBoolean(pyexportHidden)); + bool legacyExport = (pylegacy == Py_None ? settings.getExportLegacy() + : Base::asBoolean(pylegacy)); + bool exportHidden = (pyexportHidden == Py_None ? settings.getExportHiddenObject() + : Base::asBoolean(pyexportHidden)); bool keepPlacement = (pykeepPlacement == Py_None ? settings.getExportKeepPlacement() : Base::asBoolean(pykeepPlacement)); + // clang-format on // new way if (pyoptions) { @@ -616,19 +618,19 @@ private: try { Py::Sequence list(object); - Handle(XCAFApp_Application) hApp = XCAFApp_Application::GetApplication(); - Handle(TDocStd_Document) hDoc; - hApp->NewDocument(TCollection_ExtendedString("MDTV-CAF"), hDoc); - std::vector objs; for (Py::Sequence::iterator it = list.begin(); it != list.end(); ++it) { PyObject* item = (*it).ptr(); if (PyObject_TypeCheck(item, &(App::DocumentObjectPy::Type))) { - objs.push_back( - static_cast(item)->getDocumentObjectPtr()); + auto pydoc = static_cast(item); + objs.push_back(pydoc->getDocumentObjectPtr()); } } + Handle(XCAFApp_Application) hApp = XCAFApp_Application::GetApplication(); + Handle(TDocStd_Document) hDoc; + hApp->NewDocument(TCollection_ExtendedString("MDTV-CAF"), hDoc); + Import::ExportOCAF2 ocaf(hDoc, &getShapeColors); if (!legacyExport || !ocaf.canFallback(objs)) { ocaf.setExportOptions(Import::ExportOCAF2::customExportOptions()); @@ -638,27 +640,9 @@ private: ocaf.exportObjects(objs); } else { - bool keepExplicitPlacement = Standard_True; + bool keepExplicitPlacement = true; ExportOCAFGui ocaf(hDoc, keepExplicitPlacement); - // That stuff is exporting a list of selected objects into FreeCAD Tree - std::vector hierarchical_label; - std::vector hierarchical_loc; - std::vector hierarchical_part; - for (auto obj : objs) { - ocaf.exportObject(obj, hierarchical_label, hierarchical_loc, hierarchical_part); - } - - // Free Shapes must have absolute placement and not explicit - std::vector FreeLabels; - std::vector part_id; - ocaf.getFreeLabels(hierarchical_label, FreeLabels, part_id); - // Got issue with the colors as they are coming from the View Provider they can't be - // determined into the App Code. - std::vector> Colors; - ocaf.getPartColors(hierarchical_part, FreeLabels, part_id, Colors); - ocaf.reallocateFreeShape(hierarchical_part, FreeLabels, part_id, Colors); - - XCAFDoc_DocumentTool::ShapeTool(hDoc->Main())->UpdateAssemblies(); + ocaf.exportObjects(objs); } Base::FileInfo file(Utf8Name.c_str());