diff --git a/src/Mod/Part/Gui/DlgFilletEdges.cpp b/src/Mod/Part/Gui/DlgFilletEdges.cpp index f6c701ab8..46066a5f2 100644 --- a/src/Mod/Part/Gui/DlgFilletEdges.cpp +++ b/src/Mod/Part/Gui/DlgFilletEdges.cpp @@ -30,6 +30,7 @@ # include # include # include +# include # include # include # include @@ -133,14 +134,23 @@ bool FilletRadiusModel::setData (const QModelIndex & index, const QVariant & val // -------------------------------------------------------------- namespace PartGui { - class EdgeSelection : public Gui::SelectionFilterGate + class EdgeFaceSelection : public Gui::SelectionFilterGate { + bool allowEdge; App::DocumentObject*& object; public: - EdgeSelection(App::DocumentObject*& obj) - : Gui::SelectionFilterGate((Gui::SelectionFilter*)0), object(obj) + EdgeFaceSelection(App::DocumentObject*& obj) + : Gui::SelectionFilterGate((Gui::SelectionFilter*)0), allowEdge(true), object(obj) { } + void selectEdges() + { + allowEdge = true; + } + void selectFaces() + { + allowEdge = false; + } bool allow(App::Document*pDoc, App::DocumentObject*pObj, const char*sSubName) { if (pObj != this->object) @@ -148,16 +158,21 @@ namespace PartGui { if (!sSubName || sSubName[0] == '\0') return false; std::string element(sSubName); - return element.substr(0,4) == "Edge"; + if (allowEdge) + return element.substr(0,4) == "Edge"; + else + return element.substr(0,4) == "Face"; } }; class DlgFilletEdgesP { public: App::DocumentObject* object; - EdgeSelection* selection; + EdgeFaceSelection* selection; Part::FilletBase* fillet; std::vector edge_ids; + TopTools_IndexedMapOfShape all_edges; + TopTools_IndexedMapOfShape all_faces; typedef boost::signals::connection Connection; Connection connectApplicationDeletedObject; Connection connectApplicationDeletedDocument; @@ -172,7 +187,7 @@ DlgFilletEdges::DlgFilletEdges(Part::FilletBase* fillet, QWidget* parent, Qt::WF ui->setupUi(this); d->object = 0; - d->selection = new EdgeSelection(d->object); + d->selection = new EdgeFaceSelection(d->object); Gui::Selection().addSelectionGate(d->selection); d->fillet = fillet; @@ -225,27 +240,67 @@ void DlgFilletEdges::onSelectionChanged(const Gui::SelectionChanges& msg) std::string objname = d->object->getNameInDocument(); if (docname==msg.pDocName && objname==msg.pObjectName) { QString subelement = QString::fromAscii(msg.pSubName); - QAbstractItemModel* model = ui->treeView->model(); - for (int i=0; irowCount(); ++i) { - int id = model->data(model->index(i,0), Qt::UserRole).toInt(); + if (subelement.startsWith(QLatin1String("Edge"))) { + onSelectEdge(subelement, msg.Type); + } + else if (subelement.startsWith(QLatin1String("Face"))) { + d->selection->selectEdges(); + onSelectEdgesOfFace(subelement, msg.Type); + d->selection->selectFaces(); + } + } + } +} + +void DlgFilletEdges::onSelectEdge(const QString& subelement, int type) +{ + Gui::SelectionChanges::MsgType msgType = Gui::SelectionChanges::MsgType(type); + QAbstractItemModel* model = ui->treeView->model(); + for (int i=0; irowCount(); ++i) { + int id = model->data(model->index(i,0), Qt::UserRole).toInt(); + QString name = QString::fromAscii("Edge%1").arg(id); + if (name == subelement) { + // ok, check the selected sub-element + Qt::CheckState checkState = + (msgType == Gui::SelectionChanges::AddSelection + ? Qt::Checked : Qt::Unchecked); + QVariant value(static_cast(checkState)); + QModelIndex index = model->index(i,0); + model->setData(index, value, Qt::CheckStateRole); + // select the item + ui->treeView->selectionModel()->setCurrentIndex(index,QItemSelectionModel::NoUpdate); + QItemSelection selection(index, model->index(i,1)); + ui->treeView->selectionModel()->select(selection, QItemSelectionModel::ClearAndSelect); + ui->treeView->update(); + break; + } + } +} + +void DlgFilletEdges::onSelectEdgesOfFace(const QString& subelement, int type) +{ + bool ok; + int index = subelement.mid(4).toInt(&ok); + if (ok) { + try { + const TopoDS_Shape& face = d->all_faces.FindKey(index); + TopTools_IndexedMapOfShape mapOfEdges; + TopExp::MapShapes(face, TopAbs_EDGE, mapOfEdges); + + for(int j = 1; j <= mapOfEdges.Extent(); ++j) { + TopoDS_Edge edge = TopoDS::Edge(mapOfEdges.FindKey(j)); + int id = d->all_edges.FindIndex(edge); QString name = QString::fromAscii("Edge%1").arg(id); - if (name == subelement) { - // ok, check the selected sub-element - Qt::CheckState checkState = - (msg.Type == Gui::SelectionChanges::AddSelection - ? Qt::Checked : Qt::Unchecked); - QVariant value(static_cast(checkState)); - QModelIndex index = model->index(i,0); - model->setData(index, value, Qt::CheckStateRole); - // select the item - ui->treeView->selectionModel()->setCurrentIndex(index,QItemSelectionModel::NoUpdate); - QItemSelection selection(index, model->index(i,1)); - ui->treeView->selectionModel()->select(selection, QItemSelectionModel::ClearAndSelect); - ui->treeView->update(); - break; + onSelectEdge(name, type); + Gui::SelectionChanges::MsgType msgType = Gui::SelectionChanges::MsgType(type); + if (msgType == Gui::SelectionChanges::AddSelection) { + Gui::Selection().addSelection(d->object->getDocument()->getName(), + d->object->getNameInDocument(), (const char*)name.toAscii()); } } } + catch (Standard_Failure) { + } } } @@ -435,6 +490,13 @@ void DlgFilletEdges::on_shapeObject_activated(int index) if (part && part->getTypeId().isDerivedFrom(Part::Feature::getClassTypeId())) { d->object = part; TopoDS_Shape myShape = static_cast(part)->Shape.getValue(); + + d->all_edges.Clear(); + TopExp::MapShapes(myShape, TopAbs_EDGE, d->all_edges); + + d->all_faces.Clear(); + TopExp::MapShapes(myShape, TopAbs_FACE, d->all_faces); + // build up map edge->face TopTools_IndexedDataMapOfShapeListOfShape edge2Face; TopExp::MapShapesAndAncestors(myShape, TopAbs_EDGE, TopAbs_FACE, edge2Face); @@ -481,6 +543,16 @@ void DlgFilletEdges::on_shapeObject_activated(int index) } } +void DlgFilletEdges::on_selectEdges_toggled(bool on) +{ + if (on) d->selection->selectEdges(); +} + +void DlgFilletEdges::on_selectFaces_toggled(bool on) +{ + if (on) d->selection->selectFaces(); +} + void DlgFilletEdges::on_selectAllButton_clicked() { QAbstractItemModel* model = ui->treeView->model(); diff --git a/src/Mod/Part/Gui/DlgFilletEdges.h b/src/Mod/Part/Gui/DlgFilletEdges.h index 4c36cd9c6..46df51366 100644 --- a/src/Mod/Part/Gui/DlgFilletEdges.h +++ b/src/Mod/Part/Gui/DlgFilletEdges.h @@ -90,9 +90,13 @@ private: void onSelectionChanged(const Gui::SelectionChanges& msg); void onDeleteObject(const App::DocumentObject&); void onDeleteDocument(const App::Document&); + void onSelectEdge(const QString& subelement, int type); + void onSelectEdgesOfFace(const QString& subelement, int type); private Q_SLOTS: void on_shapeObject_activated(int); + void on_selectEdges_toggled(bool); + void on_selectFaces_toggled(bool); void on_selectAllButton_clicked(); void on_selectNoneButton_clicked(); void on_filletType_activated(int); diff --git a/src/Mod/Part/Gui/DlgFilletEdges.ui b/src/Mod/Part/Gui/DlgFilletEdges.ui index 5d08a55d9..9f2e4606a 100644 --- a/src/Mod/Part/Gui/DlgFilletEdges.ui +++ b/src/Mod/Part/Gui/DlgFilletEdges.ui @@ -51,27 +51,7 @@ Fillet Parameter - - - - Qt::Horizontal - - - - 221 - 20 - - - - - - - - All - - - - + None @@ -85,7 +65,7 @@ - + @@ -99,10 +79,10 @@ - + - + 6 @@ -155,6 +135,43 @@ + + + + All + + + + + + + Select faces + + + + + + + Qt::Horizontal + + + + 221 + 20 + + + + + + + + Select edges + + + true + + +