Import: implement exportOptions()

This commit is contained in:
wmayer
2022-10-04 17:20:04 +02:00
parent 4d719d516e
commit 5af6521377

View File

@@ -381,6 +381,9 @@ public:
add_keyword_method("insert",&Module::insert,
"insert(string,string) -- Insert the file into the given document."
);
add_varargs_method("exportOptions",&Module::exportOptions,
"exportOptions(string) -- Return the export options of a file type."
);
add_keyword_method("export",&Module::exporter,
"export(list,string) -- Export a list of objects into a single file."
);
@@ -556,22 +559,76 @@ private:
return std::map<std::string,App::Color>();
}
Py::Object exporter(const Py::Tuple& args, const Py::Dict &kwds)
Py::Object exportOptions(const Py::Tuple& args)
{
PyObject* object;
char* Name;
PyObject *exportHidden = Py_None;
PyObject *legacy = Py_None;
PyObject *keepPlacement = Py_None;
static char* kwd_list[] = {"obj", "name", "exportHidden", "legacy", "keepPlacement",nullptr};
if (!PyArg_ParseTupleAndKeywords(args.ptr(), kwds.ptr(), "Oet|O!O!O!",
kwd_list,&object,"utf-8",&Name,&PyBool_Type,&exportHidden,&PyBool_Type,&legacy,&PyBool_Type,&keepPlacement))
if (!PyArg_ParseTuple(args.ptr(), "et", "utf-8", &Name))
throw Py::Exception();
std::string Utf8Name = std::string(Name);
PyMem_Free(Name);
std::string name8bit = Part::encodeFilename(Utf8Name);
Py::Dict options;
Base::FileInfo file(name8bit.c_str());
// Here we can open a model dialog...
if (file.hasExtension("stp") || file.hasExtension("step")) {
auto ocafSettings = Import::ExportOCAF2::customExportOptions();
options.setItem("exportHidden", Py::Boolean(ocafSettings.exportHidden));
options.setItem("keepPlacement", Py::Boolean(ocafSettings.keepPlacement));
Part::OCAF::ImportExportSettings stepSettings;
options.setItem("legacy", Py::Boolean(stepSettings.getExportLegacy()));
}
return options;
}
Py::Object exporter(const Py::Tuple& args, const Py::Dict &kwds)
{
PyObject* object;
char* Name;
PyObject *pyoptions = nullptr;
PyObject *pyexportHidden = Py_None;
PyObject *pylegacy = Py_None;
PyObject *pykeepPlacement = Py_None;
static char* kwd_list[] = {"obj", "name", "options", "exportHidden", "legacy", "keepPlacement", nullptr};
if (!PyArg_ParseTupleAndKeywords(args.ptr(), kwds.ptr(), "Oet|O!O!O!O!",
kwd_list, &object,
"utf-8", &Name,
&PyDict_Type, &pyoptions,
&PyBool_Type, &pyexportHidden,
&PyBool_Type, &pylegacy,
&PyBool_Type, &pykeepPlacement))
throw Py::Exception();
std::string Utf8Name = std::string(Name);
PyMem_Free(Name);
std::string name8bit = Part::encodeFilename(Utf8Name);
// 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 keepPlacement = (pykeepPlacement == Py_None ? settings.getExportKeepPlacement() : Base::asBoolean(pykeepPlacement));
// new way
if (pyoptions) {
Py::Dict options(pyoptions);
if (options.hasKey("legacy")) {
legacyExport = static_cast<bool>(Py::Boolean(options.getItem("legacy")));
}
if (options.hasKey("exportHidden")) {
exportHidden = static_cast<bool>(Py::Boolean(options.getItem("exportHidden")));
}
if (options.hasKey("keepPlacement")) {
keepPlacement = static_cast<bool>(Py::Boolean(options.getItem("keepPlacement")));
}
}
try {
Py::Sequence list(object);
Handle(XCAFApp_Application) hApp = XCAFApp_Application::GetApplication();
@@ -585,24 +642,15 @@ private:
objs.push_back(static_cast<App::DocumentObjectPy*>(item)->getDocumentObjectPtr());
}
if (legacy == Py_None) {
Part::OCAF::ImportExportSettings settings;
legacy = settings.getExportLegacy() ? Py_True : Py_False;
}
Import::ExportOCAF2 ocaf(hDoc, &getShapeColors);
if (!Base::asBoolean(legacy) || !ocaf.canFallback(objs)) {
if (!legacyExport || !ocaf.canFallback(objs)) {
ocaf.setExportOptions(Import::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 = objs.size() > 1;
bool keepExplicitPlacement = Standard_True;
ExportOCAFGui ocaf(hDoc, keepExplicitPlacement);
// That stuff is exporting a list of selected objects into FreeCAD Tree
@@ -623,7 +671,7 @@ private:
ocaf.reallocateFreeShape(hierarchical_part,FreeLabels,part_id,Colors);
#if OCC_VERSION_HEX >= 0x070200
// Update is not performed automatically anymore: https://tracker.dev.opencascade.org/view.php?id=28055
// Update is not performed automatically anymore: https://tracker.dev.opencascade.org/view.php?id=28055
XCAFDoc_DocumentTool::ShapeTool(hDoc->Main())->UpdateAssemblies();
#endif
}