diff --git a/src/Mod/PartDesign/App/FeatureChamfer.cpp b/src/Mod/PartDesign/App/FeatureChamfer.cpp index 333668dd7f..10bc38d6b6 100644 --- a/src/Mod/PartDesign/App/FeatureChamfer.cpp +++ b/src/Mod/PartDesign/App/FeatureChamfer.cpp @@ -76,11 +76,29 @@ Chamfer::Chamfer() Angle.setConstraints(&floatAngle); ADD_PROPERTY(FlipDirection, (false)); + + updateProperties(); } short Chamfer::mustExecute() const { - if (Placement.isTouched() || Size.isTouched()) + bool touched = false; + + auto chamferType = ChamferType.getValue(); + + switch (chamferType) { + case 0: // "Equal distance" + touched = Size.isTouched() || ChamferType.isTouched(); + break; + case 1: // "Two distances" + touched = Size.isTouched() || ChamferType.isTouched() || Size2.isTouched(); + break; + case 2: // "Distance and Angle" + touched = Size.isTouched() || ChamferType.isTouched() || Angle.isTouched(); + break; + } + + if (Placement.isTouched() || touched) return 1; return DressUp::mustExecute(); } @@ -212,6 +230,39 @@ void Chamfer::Restore(Base::XMLReader &reader) reader.readEndElement("Properties"); } +void Chamfer::onChanged(const App::Property* prop) +{ + if (prop == &ChamferType) { + updateProperties(); + } + + DressUp::onChanged(prop); +} + +void Chamfer::updateProperties() +{ + auto chamferType = ChamferType.getValue(); + + auto disableproperty = [](App::Property * prop, bool on) { + prop->setStatus(App::Property::ReadOnly, on); + }; + + switch (chamferType) { + case 0: // "Equal distance" + disableproperty(&this->Angle, true); + disableproperty(&this->Size2, true); + break; + case 1: // "Two distances" + disableproperty(&this->Angle, true); + disableproperty(&this->Size2, false); + break; + case 2: // "Distance and Angle" + disableproperty(&this->Angle, false); + disableproperty(&this->Size2, true); + break; + } +} + static App::DocumentObjectExecReturn *validateParameters(int chamferType, double size, double size2, double angle) { // Size is common to all chamfer types. @@ -237,3 +288,5 @@ static App::DocumentObjectExecReturn *validateParameters(int chamferType, double return App::DocumentObject::StdReturn; } + + diff --git a/src/Mod/PartDesign/App/FeatureChamfer.h b/src/Mod/PartDesign/App/FeatureChamfer.h index 7882bb148e..6a5ec442d9 100644 --- a/src/Mod/PartDesign/App/FeatureChamfer.h +++ b/src/Mod/PartDesign/App/FeatureChamfer.h @@ -34,7 +34,7 @@ namespace PartDesign class PartDesignExport Chamfer : public DressUp { - PROPERTY_HEADER(PartDesign::Chamfer); + PROPERTY_HEADER_WITH_OVERRIDE(PartDesign::Chamfer); public: Chamfer(); @@ -48,17 +48,20 @@ public: /** @name methods override feature */ //@{ /// recalculate the feature - App::DocumentObjectExecReturn *execute(void); - short mustExecute() const; + App::DocumentObjectExecReturn *execute(void) override; + short mustExecute() const override; /// returns the type name of the view provider - const char* getViewProviderName(void) const { + const char* getViewProviderName(void) const override { return "PartDesignGui::ViewProviderChamfer"; } //@} -protected: - void Restore(Base::XMLReader &reader); + virtual void onChanged(const App::Property* /*prop*/) override; + void updateProperties(); + +protected: + void Restore(Base::XMLReader &reader) override; }; } //namespace Part diff --git a/src/Mod/PartDesign/Gui/TaskChamferParameters.cpp b/src/Mod/PartDesign/Gui/TaskChamferParameters.cpp index ca118fc0ad..da99fb4e92 100644 --- a/src/Mod/PartDesign/Gui/TaskChamferParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskChamferParameters.cpp @@ -320,9 +320,25 @@ void TaskChamferParameters::apply() std::string name = DressUpView->getObject()->getNameInDocument(); //Gui::Command::openCommand("Chamfer changed"); - ui->chamferSize->apply(); - ui->chamferSize2->apply(); - ui->chamferAngle->apply(); + + PartDesign::Chamfer* pcChamfer = static_cast(DressUpView->getObject()); + + const int chamfertype = pcChamfer->ChamferType.getValue(); + + switch(chamfertype) { + + case 0: // "Equal distance" + ui->chamferSize->apply(); + break; + case 1: // "Two distances" + ui->chamferSize->apply(); + ui->chamferSize2->apply(); + break; + case 2: // "Distance and Angle" + ui->chamferSize->apply(); + ui->chamferAngle->apply(); + break; + } } //**************************************************************************