From 94d101d1f564abc43650bb97915aaa4846052e05 Mon Sep 17 00:00:00 2001 From: hlorus <64740362+hlorus@users.noreply.github.com> Date: Tue, 2 Jul 2024 16:42:34 +0200 Subject: [PATCH] MeasureGui: Avoid adding measurement to document during command interaction format --- src/Gui/TaskMeasure.cpp | 78 +++++++++++++++++++++++++++++++++++++---- src/Gui/TaskMeasure.h | 5 +++ 2 files changed, 76 insertions(+), 7 deletions(-) diff --git a/src/Gui/TaskMeasure.cpp b/src/Gui/TaskMeasure.cpp index 4ec7fbd5ba78..23bede503340 100644 --- a/src/Gui/TaskMeasure.cpp +++ b/src/Gui/TaskMeasure.cpp @@ -36,6 +36,8 @@ #include "App/Document.h" #include "App/DocumentObjectGroup.h" #include +#include +#include #include #include @@ -149,6 +151,59 @@ void TaskMeasure::setMeasureObject(Measure::MeasureBase* obj) { } +App::DocumentObject* TaskMeasure::createObject(const std::string& measureClass) { + auto type = Base::Type::getTypeIfDerivedFrom(measureClass.c_str(), + App::DocumentObject::getClassTypeId(), + true); + + if (type.isBad()) { + return nullptr; + } + + auto measureObj = static_cast(type.createInstance()); + return measureObj; +} + + +Gui::ViewProviderDocumentObject* TaskMeasure::createViewObject(App::DocumentObject* measureObj) { + // Add view object + auto guiDoc = Gui::Application::Instance->activeDocument(); + auto vpName = measureObj->getViewProviderName(); + if ((vpName == nullptr) || (vpName[0] == '\0')) { + return nullptr; + } + + auto vpType = + Base::Type::getTypeIfDerivedFrom(vpName, + Gui::ViewProviderDocumentObject::getClassTypeId(), + true); + if (vpType.isBad()) { + return nullptr; + } + + auto vp = static_cast(vpType.createInstance()); + + guiDoc->setAnnotationViewProvider(vp->getTypeId().getName(), vp); + vp->attach(measureObj); + vp->updateView(); + vp->setActiveMode(); + + return vp; +} + + +void TaskMeasure::saveObject() { + if (_mViewObject) { + auto guiDoc = Gui::Application::Instance->activeDocument(); + guiDoc->removeAnnotationViewProvider(_mViewObject->getTypeId().getName()); + _mViewObject = nullptr; + } + + App::Document* appDoc = App::GetApplication().getActiveDocument(); + appDoc->addObject(_mMeasureObject, _mMeasureType->label.c_str()); +} + + void TaskMeasure::update() { App::Document *doc = App::GetApplication().getActiveDocument(); @@ -183,14 +238,13 @@ void TaskMeasure::update() { if (measureTypes.size() > 0) { _mMeasureType = measureTypes.front(); } - if (!_mMeasureType) { // Note: If there's no valid measure type we might just restart the selection, // however this requires enough coverage of measuretypes that we can access all of them - + // std::tuple sel = selection.back(); // clearSelection(); // addElement(measureModule.c_str(), get<0>(sel).c_str(), get<1>(sel).c_str()); @@ -227,7 +281,7 @@ void TaskMeasure::update() { else { // Create measure object setMeasureObject( - (Measure::MeasureBase*)doc->addObject(_mMeasureType->measureObject.c_str(), _mMeasureType->label.c_str()) + (Measure::MeasureBase*)createObject(_mMeasureType->measureObject) ); } } @@ -240,6 +294,8 @@ void TaskMeasure::update() { // Get result valueResult->setText(_mMeasureObject->getResultString()); + + _mViewObject = createViewObject(_mMeasureObject); } void TaskMeasure::close(){ @@ -272,6 +328,7 @@ void TaskMeasure::invoke() { } bool TaskMeasure::apply(){ + saveObject(); ensureGroup(_mMeasureObject); _mMeasureType = nullptr; _mMeasureObject = nullptr; @@ -297,7 +354,7 @@ void TaskMeasure::reset() { _mMeasureType = nullptr; this->clearSelection(); - // Should the explicit mode also be reset? + // Should the explicit mode also be reset? // setModeSilent(nullptr); // explicitMode = false; @@ -312,7 +369,14 @@ void TaskMeasure::removeObject() { if (_mMeasureObject->isRemoving() ) { return; } - _mMeasureObject->getDocument()->removeObject (_mMeasureObject->getNameInDocument()); + + if (_mViewObject) { + auto guiDoc = Gui::Application::Instance->activeDocument(); + guiDoc->removeAnnotationViewProvider(_mViewObject->getTypeId().getName()); + _mViewObject = nullptr; + } + + delete _mMeasureObject; setMeasureObject(nullptr); } @@ -331,7 +395,7 @@ void TaskMeasure::onSelectionChanged(const Gui::SelectionChanges& msg) && msg.Type != SelectionChanges::SetSelection && msg.Type != SelectionChanges::ClrSelection) { return; - } + } update(); } @@ -368,7 +432,7 @@ void TaskMeasure::onModeChanged(int index) { void TaskMeasure::setModeSilent(App::MeasureType* mode) { modeSwitch->blockSignals(true); - + if (mode == nullptr) { modeSwitch->setCurrentIndex(0); } diff --git a/src/Gui/TaskMeasure.h b/src/Gui/TaskMeasure.h index 373712ca5b5b..d3bcc0f4e893 100644 --- a/src/Gui/TaskMeasure.h +++ b/src/Gui/TaskMeasure.h @@ -64,6 +64,7 @@ class TaskMeasure : public TaskView::TaskDialog, public Gui::SelectionObserver { App::MeasureType* _mMeasureType = nullptr; Measure::MeasureBase *_mMeasureObject = nullptr; + Gui::ViewProviderDocumentObject* _mViewObject = nullptr; QLineEdit* valueResult{nullptr}; QComboBox* modeSwitch{nullptr}; @@ -73,6 +74,10 @@ class TaskMeasure : public TaskView::TaskDialog, public Gui::SelectionObserver { void setModeSilent(App::MeasureType* mode); App::MeasureType* getMeasureType(); void enableAnnotateButton(bool state); + App::DocumentObject* createObject(const std::string& measureClass); + Gui::ViewProviderDocumentObject* createViewObject(App::DocumentObject* measureObj); + void saveObject(); + // List of measure types std::vector measureObjects;