From 2540a19a5d249e020d4c00eb3c539be173e449c6 Mon Sep 17 00:00:00 2001 From: logari81 Date: Sat, 15 Sep 2012 08:14:36 +0200 Subject: [PATCH] PartDesign: use selection filter gate for picking references for pattern/transform features --- .../Gui/TaskLinearPatternParameters.cpp | 9 +--- .../Gui/TaskLinearPatternParameters.h | 3 -- .../PartDesign/Gui/TaskMirroredParameters.cpp | 9 +--- .../PartDesign/Gui/TaskMirroredParameters.h | 3 -- .../Gui/TaskPolarPatternParameters.cpp | 9 +--- .../Gui/TaskPolarPatternParameters.h | 3 -- .../Gui/TaskTransformedParameters.cpp | 51 +++++++++++++++++++ .../Gui/TaskTransformedParameters.h | 4 ++ 8 files changed, 58 insertions(+), 33 deletions(-) diff --git a/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp b/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp index ef73505fc..bea2229bb 100644 --- a/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp @@ -284,6 +284,7 @@ void TaskLinearPatternParameters::onButtonReference(bool checked) showOriginals(); referenceSelectionMode = true; Gui::Selection().clearSelection(); + addReferenceSelectionGate(true, true); } else { exitSelectionMode(); } @@ -349,14 +350,6 @@ const unsigned TaskLinearPatternParameters::getOccurrences(void) const return ui->spinOccurrences->value(); } -void TaskLinearPatternParameters::exitSelectionMode() -{ - originalSelectionMode = false; - referenceSelectionMode = false; - showObject(); - hideOriginals(); -} - TaskLinearPatternParameters::~TaskLinearPatternParameters() { diff --git a/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.h b/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.h index 28a82b5f8..b351f59b0 100644 --- a/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.h +++ b/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.h @@ -77,12 +77,9 @@ protected: virtual void changeEvent(QEvent *e); virtual void onSelectionChanged(const Gui::SelectionChanges& msg); - bool referenceSelectionMode; - private: void setupUI(); void updateUI(); - void exitSelectionMode(); private: Ui_TaskLinearPatternParameters* ui; diff --git a/src/Mod/PartDesign/Gui/TaskMirroredParameters.cpp b/src/Mod/PartDesign/Gui/TaskMirroredParameters.cpp index ec1cf6720..ec4dd414e 100644 --- a/src/Mod/PartDesign/Gui/TaskMirroredParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskMirroredParameters.cpp @@ -230,6 +230,7 @@ void TaskMirroredParameters::onButtonReference(bool checked) showOriginals(); referenceSelectionMode = true; Gui::Selection().clearSelection(); + addReferenceSelectionGate(false, true); } else { exitSelectionMode(); } @@ -276,15 +277,7 @@ const std::string TaskMirroredParameters::getMirrorPlane(void) const return ui->lineReference->text().toStdString(); } -void TaskMirroredParameters::exitSelectionMode() -{ - originalSelectionMode = false; - referenceSelectionMode = false; - showObject(); - hideOriginals(); -} - TaskMirroredParameters::~TaskMirroredParameters() { delete ui; diff --git a/src/Mod/PartDesign/Gui/TaskMirroredParameters.h b/src/Mod/PartDesign/Gui/TaskMirroredParameters.h index caa410924..ec9fd210f 100644 --- a/src/Mod/PartDesign/Gui/TaskMirroredParameters.h +++ b/src/Mod/PartDesign/Gui/TaskMirroredParameters.h @@ -71,13 +71,10 @@ protected: virtual void changeEvent(QEvent *e); virtual void onSelectionChanged(const Gui::SelectionChanges& msg); - bool referenceSelectionMode; - private: void onStdMirrorPlane(const std::string& plane); void setupUI(); void updateUI(); - void exitSelectionMode(); private: Ui_TaskMirroredParameters* ui; diff --git a/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.cpp b/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.cpp index f218522a2..0c5e0750a 100644 --- a/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.cpp @@ -281,6 +281,7 @@ void TaskPolarPatternParameters::onButtonReference(bool checked) showOriginals(); referenceSelectionMode = true; Gui::Selection().clearSelection(); + addReferenceSelectionGate(true, false); } else { exitSelectionMode(); } @@ -346,14 +347,6 @@ const unsigned TaskPolarPatternParameters::getOccurrences(void) const return ui->spinOccurrences->value(); } -void TaskPolarPatternParameters::exitSelectionMode() -{ - originalSelectionMode = false; - referenceSelectionMode = false; - showObject(); - hideOriginals(); -} - TaskPolarPatternParameters::~TaskPolarPatternParameters() { diff --git a/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.h b/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.h index 2c8dd8f9a..6b06f10a6 100644 --- a/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.h +++ b/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.h @@ -77,12 +77,9 @@ protected: virtual void changeEvent(QEvent *e); virtual void onSelectionChanged(const Gui::SelectionChanges& msg); - bool referenceSelectionMode; - private: void setupUI(); void updateUI(); - void exitSelectionMode(); private: Ui_TaskPolarPatternParameters* ui; diff --git a/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp b/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp index 8d6123530..83952dcfc 100644 --- a/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp @@ -24,6 +24,10 @@ #ifndef _PreComp_ # include +# include +# include +# include +# include #endif #include "TaskTransformedParameters.h" @@ -179,6 +183,53 @@ void TaskTransformedParameters::showOriginals() } } +void TaskTransformedParameters::exitSelectionMode() +{ + originalSelectionMode = false; + referenceSelectionMode = false; + Gui::Selection().rmvSelectionGate(); + showObject(); + hideOriginals(); +} + +class ReferenceSelection : public Gui::SelectionFilterGate +{ + const App::DocumentObject* support; + bool edge, plane; +public: + ReferenceSelection(const App::DocumentObject* support_, bool edge_, bool plane_) + : Gui::SelectionFilterGate((Gui::SelectionFilter*)0), + support(support_), edge(edge_), plane(plane_) + { + } + bool allow(App::Document* pDoc, App::DocumentObject* pObj, const char* sSubName) + { + if (!sSubName || sSubName[0] == '\0') + return false; + if (pObj != support) + return false; + std::string subName(sSubName); + if (edge && subName.size() > 4 && subName.substr(0,4) == "Edge") + return true; + if (plane && subName.size() > 4 && subName.substr(0,4) == "Face") { + const Part::TopoShape &shape = static_cast(support)->Shape.getValue(); + TopoDS_Shape sh = shape.getSubShape(subName.c_str()); + const TopoDS_Face& face = TopoDS::Face(sh); + if (!face.IsNull()) { + BRepAdaptor_Surface adapt(face); + if (adapt.GetType() == GeomAbs_Plane) + return true; + } + } + return false; + } +}; + +void TaskTransformedParameters::addReferenceSelectionGate(bool edge, bool face) +{ + Gui::Selection().addSelectionGate(new ReferenceSelection(getSupportObject(), edge, face)); +} + //************************************************************************** //************************************************************************** diff --git a/src/Mod/PartDesign/Gui/TaskTransformedParameters.h b/src/Mod/PartDesign/Gui/TaskTransformedParameters.h index a531de4f8..53b7206ad 100644 --- a/src/Mod/PartDesign/Gui/TaskTransformedParameters.h +++ b/src/Mod/PartDesign/Gui/TaskTransformedParameters.h @@ -81,7 +81,9 @@ protected: void showObject(); void hideOriginals(); void showOriginals(); + void exitSelectionMode(); + void addReferenceSelectionGate(bool edge, bool face); protected: virtual void changeEvent(QEvent *e) = 0; virtual void onSelectionChanged(const Gui::SelectionChanges& msg) = 0; @@ -89,7 +91,9 @@ protected: protected: QWidget* proxy; ViewProviderTransformed *TransformedView; + bool originalSelectionMode; + bool referenceSelectionMode; /// The MultiTransform parent task of this task TaskMultiTransformParameters* parentTask;