PartDesign: use selection filter gate for picking references for pattern/transform features

This commit is contained in:
logari81 2012-09-15 08:14:36 +02:00
parent 68995739d6
commit 2540a19a5d
8 changed files with 58 additions and 33 deletions

View File

@ -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()
{

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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()
{

View File

@ -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;

View File

@ -24,6 +24,10 @@
#ifndef _PreComp_
# include <QMessageBox>
# include <TopoDS_Shape.hxx>
# include <TopoDS_Face.hxx>
# include <TopoDS.hxx>
# include <BRepAdaptor_Surface.hxx>
#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<const Part::Feature*>(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));
}
//**************************************************************************
//**************************************************************************

View File

@ -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;