From 985579bced062cb955ba289844211b757692ace7 Mon Sep 17 00:00:00 2001 From: wmayer Date: Tue, 18 Jun 2024 13:50:05 +0200 Subject: [PATCH] Import: Move options handling to ImportGui.importOptions Currently a modal dialog is used directly in ImportGui.open()/ImportGui.insert() that makes it impossible to use the functions in a script because they will be blocked --- src/Mod/Fem/Gui/TaskCreateElementSet.cpp | 1 - src/Mod/Import/Gui/AppImportGuiPy.cpp | 104 ++++++++++++++++-- .../Part/App/OCAF/ImportExportSettings.cpp | 12 -- src/Mod/Part/App/OCAF/ImportExportSettings.h | 3 - .../Part/App/STEP/ImportExportSettings.cpp | 9 ++ src/Mod/Part/App/STEP/ImportExportSettings.h | 3 + src/Mod/Part/Gui/DlgImportStep.cpp | 80 +++++++++++++- src/Mod/Part/Gui/DlgImportStep.h | 36 ++++++ src/Mod/Part/Gui/DlgImportStep.ui | 16 --- 9 files changed, 215 insertions(+), 49 deletions(-) diff --git a/src/Mod/Fem/Gui/TaskCreateElementSet.cpp b/src/Mod/Fem/Gui/TaskCreateElementSet.cpp index d41d40c029..db0500fb6b 100644 --- a/src/Mod/Fem/Gui/TaskCreateElementSet.cpp +++ b/src/Mod/Fem/Gui/TaskCreateElementSet.cpp @@ -33,7 +33,6 @@ #include #include #include -#include #include #endif diff --git a/src/Mod/Import/Gui/AppImportGuiPy.cpp b/src/Mod/Import/Gui/AppImportGuiPy.cpp index 5c45be8c50..347b9a9fef 100644 --- a/src/Mod/Import/Gui/AppImportGuiPy.cpp +++ b/src/Mod/Import/Gui/AppImportGuiPy.cpp @@ -74,6 +74,7 @@ #include #include #include +#include #include @@ -98,6 +99,9 @@ public: &Module::readDXF, "readDXF(filename,[document,ignore_errors,option_source]): Imports a " "DXF file into the given document. ignore_errors is True by default."); + add_varargs_method("importOptions", + &Module::importOptions, + "importOptions(string) -- Return the import options of a file type."); add_varargs_method("exportOptions", &Module::exportOptions, "exportOptions(string) -- Return the export options of a file type."); @@ -109,23 +113,63 @@ public: } private: + Py::Object importOptions(const Py::Tuple& args) + { + char* Name {}; + 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()); + if (file.hasExtension({"stp", "step"})) { + PartGui::TaskImportStep dlg(Gui::getMainWindow()); + if (!dlg.showDialog() || dlg.exec()) { + auto stepSettings = dlg.getSettings(); + options.setItem("merge", Py::Boolean(stepSettings.merge)); + options.setItem("useLinkGroup", Py::Boolean(stepSettings.useLinkGroup)); + options.setItem("useBaseName", Py::Boolean(stepSettings.useBaseName)); + options.setItem("importHidden", Py::Boolean(stepSettings.importHidden)); + options.setItem("reduceObjects", Py::Boolean(stepSettings.reduceObjects)); + options.setItem("showProgress", Py::Boolean(stepSettings.showProgress)); + options.setItem("expandCompound", Py::Boolean(stepSettings.expandCompound)); + options.setItem("mode", Py::Long(stepSettings.mode)); + options.setItem("codePage", Py::Long(stepSettings.codePage)); + } + } + return options; + } + Py::Object insert(const Py::Tuple& args, const Py::Dict& kwds) { char* Name; char* DocName = nullptr; + PyObject* pyoptions = nullptr; PyObject* importHidden = Py_None; PyObject* merge = Py_None; PyObject* useLinkGroup = Py_None; int mode = -1; - static const std::array - kwd_list {"name", "docName", "importHidden", "merge", "useLinkGroup", "mode", nullptr}; + static const std::array kwd_list {"name", + "docName", + "options", + "importHidden", + "merge", + "useLinkGroup", + "mode", + nullptr}; if (!Base::Wrapped_ParseTupleAndKeywords(args.ptr(), kwds.ptr(), - "et|sO!O!O!i", + "et|sO!O!O!O!i", kwd_list, "utf-8", &Name, &DocName, + &PyDict_Type, + &pyoptions, &PyBool_Type, &importHidden, &PyBool_Type, @@ -138,7 +182,6 @@ private: std::string Utf8Name = std::string(Name); PyMem_Free(Name); - std::string name8bit = Part::encodeFilename(Utf8Name); try { Base::FileInfo file(Utf8Name.c_str()); @@ -165,15 +208,52 @@ private: mode = ocaf.getMode(); } #if OCC_VERSION_HEX >= 0x070800 - auto handle = App::GetApplication().GetParameterGroupByPath( - "User parameter:BaseApp/Preferences/Mod/Import/hSTEP"); - if (handle->GetBool("ReadShowDialogImport", false)) { - Gui::Command::doCommand(Gui::Command::Gui, - "Gui.showPreferences('Import-Export', 8)"); - } - Part::OCAF::ImportExportSettings settings; - Resource_FormatType cp = settings.getImportCodePage(); + Resource_FormatType cp = Resource_FormatType_UTF8; #endif + + // new way + if (pyoptions) { + Py::Dict options(pyoptions); + if (options.hasKey("merge")) { + ocaf.setMerge(static_cast(Py::Boolean(options.getItem("merge")))); + } + if (options.hasKey("useLinkGroup")) { + ocaf.setUseLinkGroup( + static_cast(Py::Boolean(options.getItem("useLinkGroup")))); + } + if (options.hasKey("useBaseName")) { + ocaf.setBaseName( + static_cast(Py::Boolean(options.getItem("useBaseName")))); + } + if (options.hasKey("importHidden")) { + ocaf.setImportHiddenObject( + static_cast(Py::Boolean(options.getItem("importHidden")))); + } + if (options.hasKey("reduceObjects")) { + ocaf.setReduceObjects( + static_cast(Py::Boolean(options.getItem("reduceObjects")))); + } + if (options.hasKey("showProgress")) { + ocaf.setShowProgress( + static_cast(Py::Boolean(options.getItem("showProgress")))); + } + if (options.hasKey("expandCompound")) { + ocaf.setExpandCompound( + static_cast(Py::Boolean(options.getItem("expandCompound")))); + } + if (options.hasKey("mode")) { + ocaf.setMode(static_cast(Py::Long(options.getItem("mode")))); + } + if (options.hasKey("codePage")) { +#if OCC_VERSION_HEX >= 0x070800 + int codePage = static_cast(Py::Long(options.getItem("codePage"))); + if (codePage >= 0) { + cp = static_cast(codePage); + } +#endif + } + } + if (mode && !pcDoc->isSaved()) { auto gdoc = Gui::Application::Instance->getDocument(pcDoc); if (!gdoc->save()) { diff --git a/src/Mod/Part/App/OCAF/ImportExportSettings.cpp b/src/Mod/Part/App/OCAF/ImportExportSettings.cpp index 36dc9a7f71..37d76ff8ac 100644 --- a/src/Mod/Part/App/OCAF/ImportExportSettings.cpp +++ b/src/Mod/Part/App/OCAF/ImportExportSettings.cpp @@ -127,18 +127,6 @@ std::list ImportExportSettings::getCodePageList( return codePageList; } -void ImportExportSettings::setReadShowDialogImport(bool on) -{ - auto grp = pGroup->GetGroup("hSTEP"); - grp->SetBool("ReadShowDialogImport", on); -} - -bool ImportExportSettings::getReadShowDialogImport() const -{ - auto grp = pGroup->GetGroup("hSTEP"); - return grp->GetBool("ReadShowDialogImport", false); -} - #endif void ImportExportSettings::initSTEP(Base::Reference hGrp) diff --git a/src/Mod/Part/App/OCAF/ImportExportSettings.h b/src/Mod/Part/App/OCAF/ImportExportSettings.h index f9da619481..4bc2d30069 100644 --- a/src/Mod/Part/App/OCAF/ImportExportSettings.h +++ b/src/Mod/Part/App/OCAF/ImportExportSettings.h @@ -103,9 +103,6 @@ public: ImportMode getImportMode() const; #if OCC_VERSION_HEX >= 0x070800 - void setReadShowDialogImport(bool); - bool getReadShowDialogImport() const; - void setImportCodePage(int); Resource_FormatType getImportCodePage() const; std::list getCodePageList() const; diff --git a/src/Mod/Part/App/STEP/ImportExportSettings.cpp b/src/Mod/Part/App/STEP/ImportExportSettings.cpp index 3569d5cdf5..4b97f7b04d 100644 --- a/src/Mod/Part/App/STEP/ImportExportSettings.cpp +++ b/src/Mod/Part/App/STEP/ImportExportSettings.cpp @@ -47,6 +47,15 @@ bool ImportExportSettings::isVisibleExportDialog() const return pGroup->GetBool("VisibleExportDialog", true); } +void ImportExportSettings::setVisibleImportDialog(bool on) +{ + pGroup->SetBool("VisibleImportDialog", on); +} + +bool ImportExportSettings::isVisibleImportDialog() const +{ + return pGroup->GetBool("VisibleImportDialog", true); +} void ImportExportSettings::setWriteSurfaceCurveMode(bool on) { diff --git a/src/Mod/Part/App/STEP/ImportExportSettings.h b/src/Mod/Part/App/STEP/ImportExportSettings.h index 325f7821b8..4218cf1cff 100644 --- a/src/Mod/Part/App/STEP/ImportExportSettings.h +++ b/src/Mod/Part/App/STEP/ImportExportSettings.h @@ -40,6 +40,9 @@ public: void setVisibleExportDialog(bool); bool isVisibleExportDialog() const; + void setVisibleImportDialog(bool); + bool isVisibleImportDialog() const; + void setWriteSurfaceCurveMode(bool); bool getWriteSurfaceCurveMode() const; diff --git a/src/Mod/Part/Gui/DlgImportStep.cpp b/src/Mod/Part/Gui/DlgImportStep.cpp index 6a0b9bd71a..4942179beb 100644 --- a/src/Mod/Part/Gui/DlgImportStep.cpp +++ b/src/Mod/Part/Gui/DlgImportStep.cpp @@ -22,6 +22,10 @@ #include "PreCompiled.h" +#ifndef _PreComp_ +# include +#endif + #include #include @@ -45,7 +49,6 @@ DlgImportStep::DlgImportStep(QWidget* parent) ui->checkBoxExpandCompound->setChecked(settings.getExpandCompound()); ui->checkBoxShowProgress->setChecked(settings.getShowProgress()); #if OCC_VERSION_HEX >= 0x070800 - ui->checkBoxShowOnImport->setChecked(settings.getReadShowDialogImport()); std::list codepagelist; codepagelist = settings.getCodePageList(); for (const auto& codePage : codepagelist) { @@ -54,10 +57,8 @@ DlgImportStep::DlgImportStep(QWidget* parent) #else // hide options that not supported in this OCCT version (7.8.0) ui->label_6->hide(); - ui->checkBoxShowOnImport->hide(); ui->comboBoxImportCodePage->hide(); #endif - } /** @@ -69,7 +70,6 @@ void DlgImportStep::saveSettings() { // (h)STEP of Import module #if OCC_VERSION_HEX >= 0x070800 - ui->checkBoxShowOnImport->onSave(); ui->comboBoxImportCodePage->onSave(); #endif ui->checkBoxMergeCompound->onSave(); @@ -86,7 +86,6 @@ void DlgImportStep::loadSettings() { // (h)STEP of Import module #if OCC_VERSION_HEX >= 0x070800 - ui->checkBoxShowOnImport->onRestore(); ui->comboBoxImportCodePage->onRestore(); #endif ui->checkBoxMergeCompound->onRestore(); @@ -99,6 +98,25 @@ void DlgImportStep::loadSettings() ui->comboBoxImportMode->onRestore(); } +StepImportSettings DlgImportStep::getSettings() const +{ + StepImportSettings set; + Part::OCAF::ImportExportSettings settings; + set.merge = settings.getReadShapeCompoundMode(); + set.useLinkGroup = settings.getUseLinkGroup(); + set.useBaseName = settings.getUseBaseName(); + set.importHidden = settings.getImportHiddenObject(); + set.reduceObjects = settings.getReduceObjects(); + set.showProgress = settings.getShowProgress(); + set.expandCompound = settings.getExpandCompound(); + set.mode = static_cast(settings.getImportMode()); +#if OCC_VERSION_HEX >= 0x070800 + Resource_FormatType cp = settings.getImportCodePage(); + set.codePage = static_cast(cp); +#endif + return set; +} + /** * Sets the strings of the subwidgets using the current language. */ @@ -112,5 +130,57 @@ void DlgImportStep::changeEvent(QEvent *e) } } +// ---------------------------------------------------------------------------- + +TaskImportStep::TaskImportStep(QWidget* parent) + : QDialog(parent) + , ui(new DlgImportStep(this)) +{ + QApplication::setOverrideCursor(Qt::ArrowCursor); + + ui->loadSettings(); + setWindowTitle(ui->windowTitle()); + + QVBoxLayout* layout = new QVBoxLayout(this); + layout->addWidget(ui.get()); + setLayout(layout); + + showThis = new QCheckBox(this); + showThis->setText(tr("Don't show this dialog again")); + layout->addWidget(showThis); + + QDialogButtonBox* buttonBox = new QDialogButtonBox(this); + buttonBox->setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + layout->addWidget(buttonBox); + + connect(buttonBox, &QDialogButtonBox::accepted, this, &TaskImportStep::accept); + connect(buttonBox, &QDialogButtonBox::rejected, this, &TaskImportStep::reject); +} + +TaskImportStep::~TaskImportStep() +{ + QApplication::restoreOverrideCursor(); +} + +void TaskImportStep::accept() +{ + QDialog::accept(); + ui->saveSettings(); + + Part::STEP::ImportExportSettings settings; + settings.setVisibleImportDialog(!showThis->isChecked()); +} + +bool TaskImportStep::showDialog() const +{ + Part::STEP::ImportExportSettings settings; + return settings.isVisibleImportDialog(); +} + +StepImportSettings TaskImportStep::getSettings() const +{ + return ui->getSettings(); +} + #include "moc_DlgImportStep.cpp" diff --git a/src/Mod/Part/Gui/DlgImportStep.h b/src/Mod/Part/Gui/DlgImportStep.h index c623780b12..8c88aba8f0 100644 --- a/src/Mod/Part/Gui/DlgImportStep.h +++ b/src/Mod/Part/Gui/DlgImportStep.h @@ -24,13 +24,28 @@ #ifndef PARTGUI_DLGIMPORTSTEP_H #define PARTGUI_DLGIMPORTSTEP_H +#include #include +#include class QButtonGroup; class QCheckBox; namespace PartGui { +struct StepImportSettings +{ + bool merge = false; + bool useLinkGroup = false; + bool useBaseName = true; + bool importHidden = true; + bool reduceObjects = false; + bool showProgress = false; + bool expandCompound = false; + int mode = 0; + int codePage = -1; +}; + class Ui_DlgImportStep; class DlgImportStep : public Gui::Dialog::PreferencePage { @@ -43,6 +58,8 @@ public: void saveSettings() override; void loadSettings() override; + StepImportSettings getSettings() const; + protected: void changeEvent(QEvent *e) override; @@ -50,6 +67,25 @@ private: std::unique_ptr ui; }; +// ---------------------------------------------------------------------------- + +class PartGuiExport TaskImportStep : public QDialog +{ + Q_OBJECT + +public: + explicit TaskImportStep(QWidget* parent = nullptr); + ~TaskImportStep() override; + + bool showDialog() const; + void accept() override; + StepImportSettings getSettings() const; + +private: + QCheckBox* showThis; + std::unique_ptr ui; +}; + } // namespace PartGui #endif // PARTGUI_DLGIMPORTSTEP_H diff --git a/src/Mod/Part/Gui/DlgImportStep.ui b/src/Mod/Part/Gui/DlgImportStep.ui index 00661ca8b7..eb343e533e 100644 --- a/src/Mod/Part/Gui/DlgImportStep.ui +++ b/src/Mod/Part/Gui/DlgImportStep.ui @@ -20,22 +20,6 @@ Import - - - - If checked, this Dialog will be shown during Import - - - Show this Dialog when importing - - - ReadShowDialogImport - - - Mod/Import/hSTEP - - -