From bc133e4de2c65c151eb73337ae15232af99af3fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Tr=C3=B6ger?= Date: Thu, 1 Dec 2016 16:11:51 +0100 Subject: [PATCH] PartDesign: Primitives are attachable directly With the recently introduced AttachExtension the PartDesign primitives can be attachable by themself and don't need anymore the helping coordinate system datum. This simplyfies the code and the TreeView largely --- src/Mod/PartDesign/App/FeaturePrimitive.cpp | 10 ++-- src/Mod/PartDesign/App/FeaturePrimitive.h | 8 ++- src/Mod/PartDesign/Gui/CommandPrimitive.cpp | 16 ------ .../Gui/TaskPrimitiveParameters.cpp | 50 +------------------ .../PartDesign/Gui/TaskPrimitiveParameters.h | 5 -- src/Mod/PartDesign/Gui/Utils.cpp | 14 ------ .../PartDesign/Gui/ViewProviderPrimitive.cpp | 7 --- .../PartDesign/Gui/ViewProviderPrimitive.h | 1 - 8 files changed, 8 insertions(+), 103 deletions(-) diff --git a/src/Mod/PartDesign/App/FeaturePrimitive.cpp b/src/Mod/PartDesign/App/FeaturePrimitive.cpp index d583b54873..c35530f662 100644 --- a/src/Mod/PartDesign/App/FeaturePrimitive.cpp +++ b/src/Mod/PartDesign/App/FeaturePrimitive.cpp @@ -59,12 +59,12 @@ const App::PropertyQuantityConstraint::Constraints angleRangeU = {0.0,360.0,1.0} const App::PropertyQuantityConstraint::Constraints angleRangeV = {-90.0,90.0,1.0}; const App::PropertyQuantityConstraint::Constraints quantityRange = {0.0,FLT_MAX,0.1}; -PROPERTY_SOURCE(PartDesign::FeaturePrimitive, PartDesign::FeatureAddSub) +PROPERTY_SOURCE_WITH_EXTENSIONS(PartDesign::FeaturePrimitive, PartDesign::FeatureAddSub) FeaturePrimitive::FeaturePrimitive() : primitiveType(Box) { - ADD_PROPERTY_TYPE(CoordinateSystem, (0), "Primitive", App::Prop_None, "References to build the location of the primitive"); + Part::AttachExtension::initExtension(this); } TopoDS_Shape FeaturePrimitive::refineShapeIfActive(const TopoDS_Shape& oldShape) const @@ -84,11 +84,7 @@ App::DocumentObjectExecReturn* FeaturePrimitive::execute(const TopoDS_Shape& pri { try { //transform the primitive in the correct coordinance - App::DocumentObject* cs = CoordinateSystem.getValue(); - if(cs && cs->getTypeId() == PartDesign::CoordinateSystem::getClassTypeId()) - Placement.setValue(static_cast(cs)->Placement.getValue()); - else - Placement.setValue(Base::Placement()); + FeatureAddSub::execute(); //if we have no base we just add the standard primitive shape TopoDS_Shape base; diff --git a/src/Mod/PartDesign/App/FeaturePrimitive.h b/src/Mod/PartDesign/App/FeaturePrimitive.h index 29ed233a99..2f5a9c98c3 100644 --- a/src/Mod/PartDesign/App/FeaturePrimitive.h +++ b/src/Mod/PartDesign/App/FeaturePrimitive.h @@ -28,13 +28,14 @@ #include #include "FeatureAddSub.h" +#include namespace PartDesign { -class PartDesignExport FeaturePrimitive : public PartDesign::FeatureAddSub +class PartDesignExport FeaturePrimitive : public PartDesign::FeatureAddSub, public Part::AttachExtension { - PROPERTY_HEADER(PartDesign::FeaturePrimitive); + PROPERTY_HEADER_WITH_EXTENSIONS(PartDesign::FeaturePrimitive); public: enum Type { @@ -57,9 +58,6 @@ public: TopoDS_Shape refineShapeIfActive(const TopoDS_Shape& oldShape) const; virtual void onChanged(const App::Property* prop); - /// The references datum defining the primtive location - App::PropertyLink CoordinateSystem; - /// Do nothing, just to suppress warning, must be redefined in derived classes virtual App::DocumentObjectExecReturn* execute() { return PartDesign::FeatureAddSub::execute(); diff --git a/src/Mod/PartDesign/Gui/CommandPrimitive.cpp b/src/Mod/PartDesign/Gui/CommandPrimitive.cpp index fbb60bd5ad..9c21237f20 100644 --- a/src/Mod/PartDesign/Gui/CommandPrimitive.cpp +++ b/src/Mod/PartDesign/Gui/CommandPrimitive.cpp @@ -67,7 +67,6 @@ void CmdPrimtiveCompAdditive::activated(int iMsg) pcAction->setIcon(pcAction->actions().at(iMsg)->icon()); std::string FeatName; - std::string CSName = getUniqueObjectName("CoordinateSystem");; if(iMsg == 0) { FeatName = getUniqueObjectName("Box"); @@ -136,19 +135,12 @@ void CmdPrimtiveCompAdditive::activated(int iMsg) Gui::Command::doCommand(Doc,"App.ActiveDocument.%s.addFeature(App.activeDocument().%s)" ,pcActiveBody->getNameInDocument(), FeatName.c_str()); - Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.addObject(\'PartDesign::CoordinateSystem\',\'%s\')", - CSName.c_str()); - Gui::Command::doCommand(Doc,"App.ActiveDocument.%s.addFeature(App.activeDocument().%s)" - ,pcActiveBody->getNameInDocument(), CSName.c_str()); - Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.CoordinateSystem=(App.ActiveDocument.%s)", - FeatName.c_str(), CSName.c_str()); Gui::Command::updateActive(); auto* prm = static_cast(getDocument()->getObject(FeatName.c_str())); if (prm->BaseFeature.getValue()) doCommand(Gui,"Gui.activeDocument().hide(\"%s\")", prm->BaseFeature.getValue()->getNameInDocument()); - Gui::Command::doCommand(Gui, "Gui.activeDocument().hide(\'%s\')", CSName.c_str()); Gui::Command::doCommand(Gui, "Gui.activeDocument().setEdit(\'%s\')", FeatName.c_str()); } @@ -265,7 +257,6 @@ void CmdPrimtiveCompSubtractive::activated(int iMsg) } std::string FeatName; - std::string CSName = getUniqueObjectName("CoordinateSystem"); if(iMsg == 0) { FeatName = getUniqueObjectName("Box"); @@ -333,12 +324,6 @@ void CmdPrimtiveCompSubtractive::activated(int iMsg) Gui::Command::doCommand(Doc,"App.ActiveDocument.%s.addFeature(App.activeDocument().%s)" ,pcActiveBody->getNameInDocument(), FeatName.c_str()); - Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.addObject(\'PartDesign::CoordinateSystem\',\'%s\')", - CSName.c_str()); - Gui::Command::doCommand(Doc,"App.ActiveDocument.%s.addFeature(App.activeDocument().%s)" - ,pcActiveBody->getNameInDocument(), CSName.c_str()); - Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.CoordinateSystem=(App.ActiveDocument.%s)", - FeatName.c_str(), CSName.c_str()); Gui::Command::updateActive(); if (isActiveObjectValid() && (pcActiveBody != NULL)) { @@ -348,7 +333,6 @@ void CmdPrimtiveCompSubtractive::activated(int iMsg) } } - Gui::Command::doCommand(Gui, "Gui.activeDocument().hide(\'%s\')", CSName.c_str()); Gui::Command::doCommand(Gui, "Gui.activeDocument().setEdit(\'%s\')", FeatName.c_str()); } diff --git a/src/Mod/PartDesign/Gui/TaskPrimitiveParameters.cpp b/src/Mod/PartDesign/Gui/TaskPrimitiveParameters.cpp index 93fbe28e0e..25087c5d00 100644 --- a/src/Mod/PartDesign/Gui/TaskPrimitiveParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskPrimitiveParameters.cpp @@ -601,36 +601,12 @@ TaskPrimitiveParameters::TaskPrimitiveParameters(ViewProviderPrimitive* Primitiv { assert(PrimitiveView); - - PartDesign::FeaturePrimitive* prm = static_cast(PrimitiveView->getObject()); - cs = static_cast(prm->CoordinateSystem.getValue()); - - //if no coordinate system exist we need to add one, it is highly important that it exists! - if(!cs) { - std::string CSName = App::GetApplication().getActiveDocument()->getUniqueObjectName("CoordinateSystem"); - cs = static_cast( - App::GetApplication().getActiveDocument()->addObject("PartDesign::CoordinateSystem", CSName.c_str())); - prm->CoordinateSystem.setValue(cs); - } - - ViewProviderDatumCoordinateSystem* vp = static_cast( - Gui::Application::Instance->activeDocument()->getViewProvider(cs)); - - assert(vp); - - //make sure the relevant things are visible - cs_visibility = vp->isVisible(); - vp->Visibility.setValue(true); - parameter = new TaskDatumParameters(vp); - Content.push_back(parameter); + //parameter = new TaskDatumParameters(vp); + //Content.push_back(parameter); primitive = new TaskBoxPrimitives(PrimitiveView); Content.push_back(primitive); - - //make sure we track changes from the coordinate system to the primitive position - auto bnd = boost::bind(&TaskPrimitiveParameters::objectChanged, this, _1, _2); - connection = vp_prm->getObject()->getDocument()->signalChangedObject.connect(bnd); } TaskPrimitiveParameters::~TaskPrimitiveParameters() @@ -638,25 +614,12 @@ TaskPrimitiveParameters::~TaskPrimitiveParameters() } -void TaskPrimitiveParameters::objectChanged(const App::DocumentObject& obj, const App::Property& p) -{ - if (&obj == cs && strcmp(p.getName(), "Placement")==0) { - vp_prm->getObject()->recomputeFeature(); - } -} - bool TaskPrimitiveParameters::accept() { primitive->setPrimitive(QString::fromUtf8(vp_prm->getObject()->getNameInDocument())); Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.recompute()"); Gui::Command::doCommand(Gui::Command::Gui,"Gui.activeDocument().resetEdit()"); - ViewProviderDatumCoordinateSystem* vp = static_cast( - Gui::Application::Instance->activeDocument()->getViewProvider(cs)); - vp->setVisible(cs_visibility); - - connection.disconnect(); - return true; } @@ -666,15 +629,6 @@ bool TaskPrimitiveParameters::reject() Gui::Command::abortCommand(); Gui::Command::doCommand(Gui::Command::Gui,"Gui.activeDocument().resetEdit()"); - //if we did not delete the document object we need to set the visibilities right - ViewProviderDatumCoordinateSystem* vp = static_cast( - Gui::Application::Instance->activeDocument()->getViewProvider(cs)); - - if (vp) - vp->setVisible(cs_visibility); - - connection.disconnect(); - return true; } diff --git a/src/Mod/PartDesign/Gui/TaskPrimitiveParameters.h b/src/Mod/PartDesign/Gui/TaskPrimitiveParameters.h index 92c08aae3f..370cb8e08f 100644 --- a/src/Mod/PartDesign/Gui/TaskPrimitiveParameters.h +++ b/src/Mod/PartDesign/Gui/TaskPrimitiveParameters.h @@ -113,8 +113,6 @@ public: TaskPrimitiveParameters(ViewProviderPrimitive *PrimitiveView); ~TaskPrimitiveParameters(); - void objectChanged(const App::DocumentObject&, const App::Property&); - protected: virtual QDialogButtonBox::StandardButtons getStandardButtons(void) const; @@ -122,12 +120,9 @@ protected: virtual bool reject(); private: - s::connection connection; TaskBoxPrimitives* primitive; TaskDatumParameters* parameter; - PartDesign::CoordinateSystem* cs; ViewProviderPrimitive* vp_prm; - bool cs_visibility; }; } //namespace PartDesignGui diff --git a/src/Mod/PartDesign/Gui/Utils.cpp b/src/Mod/PartDesign/Gui/Utils.cpp index c65861c4c6..18f3ed8a50 100644 --- a/src/Mod/PartDesign/Gui/Utils.cpp +++ b/src/Mod/PartDesign/Gui/Utils.cpp @@ -355,13 +355,6 @@ bool isFeatureMovable(App::DocumentObject* const feat) return false; } - if (feat->getTypeId().isDerivedFrom(PartDesign::FeaturePrimitive::getClassTypeId())) { - auto prim = static_cast(feat); - - if (!isFeatureMovable(prim->CoordinateSystem.getValue())) - return false; - } - if (feat->getTypeId().isDerivedFrom(PartDesign::ProfileBased::getClassTypeId())) { auto prim = static_cast(feat); auto sk = prim->getVerifiedSketch(true); @@ -410,13 +403,6 @@ std::vector collectMovableDependencies(std::vectorgetTypeId().isDerivedFrom(PartDesign::FeaturePrimitive::getClassTypeId())) { - auto prim = static_cast(feat); - App::DocumentObject* cs = prim->CoordinateSystem.getValue(); - if (cs && cs->getTypeId() == PartDesign::CoordinateSystem::getClassTypeId()) - unique_objs.insert(cs); - } // Get sketches and datums from profile based features if (feat->getTypeId().isDerivedFrom(PartDesign::ProfileBased::getClassTypeId())) { diff --git a/src/Mod/PartDesign/Gui/ViewProviderPrimitive.cpp b/src/Mod/PartDesign/Gui/ViewProviderPrimitive.cpp index a3685b5528..594ea49eca 100644 --- a/src/Mod/PartDesign/Gui/ViewProviderPrimitive.cpp +++ b/src/Mod/PartDesign/Gui/ViewProviderPrimitive.cpp @@ -121,13 +121,6 @@ void ViewProviderPrimitive::updateData(const App::Property* p) { PartDesignGui::ViewProviderAddSub::updateData(p); } -std::vector< App::DocumentObject* > ViewProviderPrimitive::claimChildren(void) const { - std::vector< App::DocumentObject* > vec; - vec.push_back(static_cast(getObject())->CoordinateSystem.getValue()); - - return vec; -} - QIcon ViewProviderPrimitive::getIcon(void) const { QString str = QString::fromLatin1("PartDesign_"); diff --git a/src/Mod/PartDesign/Gui/ViewProviderPrimitive.h b/src/Mod/PartDesign/Gui/ViewProviderPrimitive.h index fd7bc83b54..be7ec7a6fa 100644 --- a/src/Mod/PartDesign/Gui/ViewProviderPrimitive.h +++ b/src/Mod/PartDesign/Gui/ViewProviderPrimitive.h @@ -40,7 +40,6 @@ public: /// destructor virtual ~ViewProviderPrimitive(); - virtual std::vector< App::DocumentObject* > claimChildren(void) const; virtual void attach(App::DocumentObject*); virtual void updateData(const App::Property*);