diff --git a/src/Mod/Measure/App/MeasureArea.cpp b/src/Mod/Measure/App/MeasureArea.cpp index 591857d36f..091467f963 100644 --- a/src/Mod/Measure/App/MeasureArea.cpp +++ b/src/Mod/Measure/App/MeasureArea.cpp @@ -95,12 +95,6 @@ void MeasureArea::parseSelection(const App::MeasureSelection& selection) App::DocumentObjectExecReturn* MeasureArea::execute() -{ - recalculateArea(); - return DocumentObject::StdReturn; -} - -void MeasureArea::recalculateArea() { const std::vector& objects = Elements.getValues(); const std::vector& subElements = Elements.getSubValues(); @@ -113,15 +107,17 @@ void MeasureArea::recalculateArea() auto info = getMeasureInfo(subject); if (!info || !info->valid) { - continue; + return new App::DocumentObjectExecReturn("Cannot calculate area"); } auto areaInfo = std::dynamic_pointer_cast(info); result += areaInfo->area; } Area.setValue(result); + return DocumentObject::StdReturn; } + void MeasureArea::onChanged(const App::Property* prop) { if (isRestoring() || isRemoving()) { @@ -129,7 +125,8 @@ void MeasureArea::onChanged(const App::Property* prop) } if (prop == &Elements) { - recalculateArea(); + auto ret = recompute(); + delete ret; } MeasureBase::onChanged(prop); diff --git a/src/Mod/Measure/App/MeasureArea.h b/src/Mod/Measure/App/MeasureArea.h index 0192c671f8..ecf7be5efa 100644 --- a/src/Mod/Measure/App/MeasureArea.h +++ b/src/Mod/Measure/App/MeasureArea.h @@ -53,7 +53,6 @@ public: App::PropertyArea Area; App::DocumentObjectExecReturn* execute() override; - void recalculateArea(); const char* getViewProviderName() const override { diff --git a/src/Mod/Measure/App/MeasureBase.h b/src/Mod/Measure/App/MeasureBase.h index 8cdde524dd..bcbdd122a7 100644 --- a/src/Mod/Measure/App/MeasureBase.h +++ b/src/Mod/Measure/App/MeasureBase.h @@ -116,6 +116,10 @@ public: // Resolve App::Link App::DocumentObject* sub = subObjT.getSubObject(); + if (!sub) { + return nullptr; + } + if (sub->isDerivedFrom()) { auto link = static_cast(sub); sub = link->getLinkedObject(true); diff --git a/src/Mod/Measure/App/MeasureLength.cpp b/src/Mod/Measure/App/MeasureLength.cpp index 087b2c1f4a..f2e5ccc49b 100644 --- a/src/Mod/Measure/App/MeasureLength.cpp +++ b/src/Mod/Measure/App/MeasureLength.cpp @@ -97,12 +97,6 @@ void MeasureLength::parseSelection(const App::MeasureSelection& selection) App::DocumentObjectExecReturn* MeasureLength::execute() -{ - recalculateLength(); - return DocumentObject::StdReturn; -} - -void MeasureLength::recalculateLength() { const std::vector& objects = Elements.getValues(); const std::vector& subElements = Elements.getSubValues(); @@ -115,7 +109,7 @@ void MeasureLength::recalculateLength() App::SubObjectT subject {objects.at(i), subElements.at(i).c_str()}; auto info = getMeasureInfo(subject); if (!info || !info->valid) { - continue; + return new App::DocumentObjectExecReturn("Cannot calculate length"); } auto lengthInfo = std::dynamic_pointer_cast(info); @@ -123,8 +117,10 @@ void MeasureLength::recalculateLength() } Length.setValue(result); + return DocumentObject::StdReturn; } + void MeasureLength::onChanged(const App::Property* prop) { if (isRestoring() || isRemoving()) { @@ -132,7 +128,8 @@ void MeasureLength::onChanged(const App::Property* prop) } if (prop == &Elements) { - recalculateLength(); + auto ret = recompute(); + delete ret; } MeasureBase::onChanged(prop); diff --git a/src/Mod/Measure/App/MeasureLength.h b/src/Mod/Measure/App/MeasureLength.h index 0fb66951c6..8290bc634f 100644 --- a/src/Mod/Measure/App/MeasureLength.h +++ b/src/Mod/Measure/App/MeasureLength.h @@ -50,7 +50,6 @@ public: App::PropertyDistance Length; App::DocumentObjectExecReturn* execute() override; - void recalculateLength(); const char* getViewProviderName() const override { diff --git a/src/Mod/Measure/App/MeasurePosition.cpp b/src/Mod/Measure/App/MeasurePosition.cpp index a8b8140cdb..19195dee00 100644 --- a/src/Mod/Measure/App/MeasurePosition.cpp +++ b/src/Mod/Measure/App/MeasurePosition.cpp @@ -92,12 +92,6 @@ void MeasurePosition::parseSelection(const App::MeasureSelection& selection) App::DocumentObjectExecReturn* MeasurePosition::execute() -{ - recalculatePosition(); - return DocumentObject::StdReturn; -} - -void MeasurePosition::recalculatePosition() { const App::DocumentObject* object = Element.getValue(); const std::vector& subElements = Element.getSubValues(); @@ -106,13 +100,15 @@ void MeasurePosition::recalculatePosition() auto info = getMeasureInfo(subject); if (!info || !info->valid) { - return; + return new App::DocumentObjectExecReturn("Cannot calculate position"); } auto positionInfo = std::dynamic_pointer_cast(info); Position.setValue(positionInfo->position); + return DocumentObject::StdReturn; } + void MeasurePosition::onChanged(const App::Property* prop) { if (isRestoring() || isRemoving()) { @@ -120,7 +116,8 @@ void MeasurePosition::onChanged(const App::Property* prop) } if (prop == &Element) { - recalculatePosition(); + auto ret = recompute(); + delete ret; } DocumentObject::onChanged(prop); } diff --git a/src/Mod/Measure/App/MeasurePosition.h b/src/Mod/Measure/App/MeasurePosition.h index d598b60501..0a559d3881 100644 --- a/src/Mod/Measure/App/MeasurePosition.h +++ b/src/Mod/Measure/App/MeasurePosition.h @@ -54,7 +54,6 @@ public: App::PropertyPosition Position; App::DocumentObjectExecReturn* execute() override; - void recalculatePosition(); const char* getViewProviderName() const override { diff --git a/src/Mod/Measure/App/MeasureRadius.cpp b/src/Mod/Measure/App/MeasureRadius.cpp index ec1e8371c8..5fb3c6206b 100644 --- a/src/Mod/Measure/App/MeasureRadius.cpp +++ b/src/Mod/Measure/App/MeasureRadius.cpp @@ -119,16 +119,16 @@ void MeasureRadius::parseSelection(const App::MeasureSelection& selection) App::DocumentObjectExecReturn* MeasureRadius::execute() { - recalculateRadius(); + auto info = getMeasureInfoFirst(); + if (!info || !info->valid) { + return new App::DocumentObjectExecReturn("Cannot calculate radius"); + } + + Radius.setValue(info->radius); return DocumentObject::StdReturn; } -void MeasureRadius::recalculateRadius() -{ - Radius.setValue(getMeasureInfoFirst()->radius); -} - void MeasureRadius::onChanged(const App::Property* prop) { if (isRestoring() || isRemoving()) { @@ -136,7 +136,8 @@ void MeasureRadius::onChanged(const App::Property* prop) } if (prop == &Element) { - recalculateRadius(); + auto ret = recompute(); + delete ret; } MeasureBase::onChanged(prop); diff --git a/src/Mod/Measure/App/MeasureRadius.h b/src/Mod/Measure/App/MeasureRadius.h index 6d74dcba6a..be28c071c0 100644 --- a/src/Mod/Measure/App/MeasureRadius.h +++ b/src/Mod/Measure/App/MeasureRadius.h @@ -58,8 +58,6 @@ public: return "MeasureGui::ViewProviderMeasureRadius"; } - void recalculateRadius(); - static bool isValidSelection(const App::MeasureSelection& selection); static bool isPrioritizedSelection(const App::MeasureSelection& selection); void parseSelection(const App::MeasureSelection& selection) override;