From 2cfa09041bd206cd8d9fef167e5cb3ac33ce9fa6 Mon Sep 17 00:00:00 2001 From: hlorus <64740362+hlorus@users.noreply.github.com> Date: Fri, 3 May 2024 10:16:34 +0200 Subject: [PATCH] [Measure] Add MeasureDistanceDetached --- src/Mod/Measure/App/AppMeasure.cpp | 8 ++++ src/Mod/Measure/App/MeasureDistance.cpp | 62 +++++++++++++++++++++++++ src/Mod/Measure/App/MeasureDistance.h | 41 ++++++++++++++++ 3 files changed, 111 insertions(+) diff --git a/src/Mod/Measure/App/AppMeasure.cpp b/src/Mod/Measure/App/AppMeasure.cpp index 856c44c875..7cf7059aa9 100644 --- a/src/Mod/Measure/App/AppMeasure.cpp +++ b/src/Mod/Measure/App/AppMeasure.cpp @@ -97,6 +97,7 @@ PyMOD_INIT_FUNC(Measure) Measure::MeasurePython ::init(); Measure::MeasureAngle ::init(); Measure::MeasureDistance ::init(); + Measure::MeasureDistanceDetached::init(); Measure::MeasurePosition ::init(); Measure::MeasureLength ::init(); Measure::MeasureArea ::init(); @@ -111,6 +112,13 @@ PyMOD_INIT_FUNC(Measure) MeasureDistance::isPrioritizedSelection ); + App::MeasureManager::addMeasureType("DISTANCEFREE", + "Distance Free", + "Measure::MeasureDistanceDetached", + MeasureDistanceDetached::isValidSelection, + nullptr + ); + App::MeasureManager::addMeasureType( "ANGLE", "Angle", diff --git a/src/Mod/Measure/App/MeasureDistance.cpp b/src/Mod/Measure/App/MeasureDistance.cpp index 9a04b77bcd..692989a984 100644 --- a/src/Mod/Measure/App/MeasureDistance.cpp +++ b/src/Mod/Measure/App/MeasureDistance.cpp @@ -229,3 +229,65 @@ std::vector MeasureDistance::getSubject() const return {Element1.getValue()}; } + + +PROPERTY_SOURCE(Measure::MeasureDistanceDetached, Measure::MeasureBase) + +MeasureDistanceDetached::MeasureDistanceDetached() +{ + ADD_PROPERTY_TYPE(Distance,(0.0),"Measurement",App::PropertyType(App::Prop_ReadOnly|App::Prop_Output), + "Distance between the two elements"); + Distance.setUnit(Base::Unit::Length); + + ADD_PROPERTY_TYPE(Position1,(Base::Vector3d(0.0,0.0,0.0)),"Measurement", App::Prop_None, "Position1"); + ADD_PROPERTY_TYPE(Position2,(Base::Vector3d(0.0,1.0,0.0)),"Measurement", App::Prop_None, "Position2"); +} + +MeasureDistanceDetached::~MeasureDistanceDetached() = default; + + +bool MeasureDistanceDetached::isValidSelection(const App::MeasureSelection& selection){ + return selection.size() == 2; +} + +void MeasureDistanceDetached::parseSelection(const App::MeasureSelection& selection) { + auto sel1 = selection.at(0); + auto sel2 = selection.at(1); + + Position1.setValue(sel1.pickedPoint); + Position2.setValue(sel2.pickedPoint); +} + + +App::DocumentObjectExecReturn *MeasureDistanceDetached::execute() +{ + recalculateDistance(); + return DocumentObject::StdReturn; +} + +void MeasureDistanceDetached::recalculateDistance() +{ + auto delta = Position1.getValue() - Position2.getValue(); + Distance.setValue(delta.Length()); +} + +void MeasureDistanceDetached::onChanged(const App::Property* prop) +{ + if (isRestoring() || isRemoving()) { + return; + } + + if (prop == &Position1 || prop == &Position2) { + recalculateDistance(); + } + + MeasureBase::onChanged(prop); +} + + +std::vector MeasureDistanceDetached::getSubject() const +{ + return {}; +} + + diff --git a/src/Mod/Measure/App/MeasureDistance.h b/src/Mod/Measure/App/MeasureDistance.h index ad6f8984ff..906a0c9e5e 100644 --- a/src/Mod/Measure/App/MeasureDistance.h +++ b/src/Mod/Measure/App/MeasureDistance.h @@ -81,6 +81,47 @@ private: void onChanged(const App::Property* prop) override; }; + + + + +class MeasureExport MeasureDistanceDetached : public Measure::MeasureBase +{ + PROPERTY_HEADER_WITH_OVERRIDE(Measure::MeasureDistanceDetached); + +public: + /// Constructor + MeasureDistanceDetached(); + ~MeasureDistanceDetached() override; + + App::PropertyDistance Distance; + + App::PropertyVector Position1; + App::PropertyVector Position2; + + App::DocumentObjectExecReturn *execute() override; + void recalculateDistance(); + + const char* getViewProviderName() const override { + return "MeasureGui::ViewProviderMeasureDistance"; + } + + static bool isValidSelection(const App::MeasureSelection& selection); + void parseSelection(const App::MeasureSelection& selection) override; + + std::vector getInputProps() override {return {"Position1", "Position2"};} + App::Property* getResultProp() override {return &this->Distance;} + + // Return the object we are measuring + std::vector getSubject() const override; + + +private: + void onChanged(const App::Property* prop) override; + +}; + + } //namespace Measure