[Measure] Add MeasureDistanceDetached

This commit is contained in:
hlorus
2024-05-03 10:16:34 +02:00
parent 039242b964
commit 96fba15cb1
3 changed files with 111 additions and 0 deletions

View File

@@ -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",

View File

@@ -229,3 +229,65 @@ std::vector<App::DocumentObject*> 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<App::DocumentObject*> MeasureDistanceDetached::getSubject() const
{
return {};
}

View File

@@ -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<std::string> getInputProps() override {return {"Position1", "Position2"};}
App::Property* getResultProp() override {return &this->Distance;}
// Return the object we are measuring
std::vector<App::DocumentObject*> getSubject() const override;
private:
void onChanged(const App::Property* prop) override;
};
} //namespace Measure