From 0e1d0ef634b20cb22d070e4eba32444ebed46b4c Mon Sep 17 00:00:00 2001 From: wmayer Date: Sun, 23 Apr 2017 00:38:34 +0200 Subject: [PATCH] Extend task panel for filling function --- src/Mod/Surface/Gui/TaskFilling.cpp | 102 ++++++++++++++++--- src/Mod/Surface/Gui/TaskFilling.h | 6 ++ src/Mod/Surface/Gui/TaskFilling.ui | 146 ++++++++++++++++++++-------- 3 files changed, 203 insertions(+), 51 deletions(-) diff --git a/src/Mod/Surface/Gui/TaskFilling.cpp b/src/Mod/Surface/Gui/TaskFilling.cpp index 2436461335..c26bc80eac 100644 --- a/src/Mod/Surface/Gui/TaskFilling.cpp +++ b/src/Mod/Surface/Gui/TaskFilling.cpp @@ -28,6 +28,8 @@ #include #include #include +#include +#include #include #include @@ -171,7 +173,7 @@ public: } private: - bool allowFace(App::DocumentObject* pObj, const char* sSubName) + bool allowFace(App::DocumentObject*, const char* sSubName) { std::string element(sSubName); if (element.substr(0,4) != "Face") @@ -216,9 +218,9 @@ FillingPanel::FillingPanel(ViewProviderFilling* vp, Surface::Filling* obj) // Create context menu QAction* action = new QAction(tr("Remove"), this); action->setShortcut(QString::fromLatin1("Del")); - ui->listWidget->addAction(action); + ui->listBoundary->addAction(action); connect(action, SIGNAL(triggered()), this, SLOT(onDeleteEdge())); - ui->listWidget->setContextMenuPolicy(Qt::ActionsContextMenu); + ui->listBoundary->setContextMenuPolicy(Qt::ActionsContextMenu); } /* @@ -251,8 +253,8 @@ void FillingPanel::setEditedObject(Surface::Filling* obj) App::Document* doc = editedObject->getDocument(); for (; it != objects.end() && jt != element.end(); ++it, ++jt) { - QListWidgetItem* item = new QListWidgetItem(ui->listWidget); - ui->listWidget->addItem(item); + QListWidgetItem* item = new QListWidgetItem(ui->listBoundary); + ui->listBoundary->addItem(item); QString text = QString::fromLatin1("%1.%2") .arg(QString::fromUtf8((*it)->Label.getValue())) @@ -370,6 +372,56 @@ void FillingPanel::on_buttonEdgeRemove_clicked() Gui::Selection().addSelectionGate(new ShapeSelection(selectionMode, editedObject)); } +void FillingPanel::on_listBoundary_itemDoubleClicked(QListWidgetItem* item) +{ + Gui::Selection().clearSelection(); + Gui::Selection().rmvSelectionGate(); + selectionMode = None; + ui->comboBoxFaces->clear(); + ui->comboBoxCont->clear(); + + if (item) { + modifyBorder(true); + + QList data; + data = item->data(Qt::UserRole).toList(); + + try { + App::Document* doc = App::GetApplication().getDocument(data[0].toByteArray()); + App::DocumentObject* obj = doc ? doc->getObject(data[1].toByteArray()) : nullptr; + if (obj && obj->getTypeId().isDerivedFrom(Part::Feature::getClassTypeId())) { + const Part::TopoShape& shape = static_cast(obj)->Shape.getShape(); + TopoDS_Shape edge = shape.getSubShape(data[2].toByteArray()); + + // build up map edge->face + TopTools_IndexedMapOfShape faces; + TopExp::MapShapes(shape.getShape(), TopAbs_FACE, faces); + TopTools_IndexedDataMapOfShapeListOfShape edge2Face; + TopExp::MapShapesAndAncestors(shape.getShape(), TopAbs_EDGE, TopAbs_FACE, edge2Face); + const TopTools_ListOfShape& adj_faces = edge2Face.FindFromKey(edge); + if (adj_faces.Extent() > 0) { + ui->comboBoxFaces->addItem(tr("None")); + ui->comboBoxCont->addItem(QString::fromLatin1("C0")); + ui->comboBoxCont->addItem(QString::fromLatin1("G1")); + ui->comboBoxCont->addItem(QString::fromLatin1("G2")); + TopTools_ListIteratorOfListOfShape it(adj_faces); + for (; it.More(); it.Next()) { + const TopoDS_Shape& F = it.Value(); + int index = faces.FindIndex(F); + ui->comboBoxFaces->addItem(QString::fromLatin1("Face%1").arg(index)); + } + } + } + + Gui::Selection().addSelection(data[0].toByteArray(), + data[1].toByteArray(), + data[2].toByteArray()); + } + catch (...) { + } + } +} + void FillingPanel::onSelectionChanged(const Gui::SelectionChanges& msg) { if (selectionMode == None) @@ -393,8 +445,8 @@ void FillingPanel::onSelectionChanged(const Gui::SelectionChanges& msg) selectionMode = None; } else if (selectionMode == AppendEdge) { - QListWidgetItem* item = new QListWidgetItem(ui->listWidget); - ui->listWidget->addItem(item); + QListWidgetItem* item = new QListWidgetItem(ui->listBoundary); + ui->listBoundary->addItem(item); Gui::SelectionObject sel(msg); QString text = QString::fromLatin1("%1.%2") @@ -421,10 +473,10 @@ void FillingPanel::onSelectionChanged(const Gui::SelectionChanges& msg) data << QByteArray(msg.pDocName); data << QByteArray(msg.pObjectName); data << QByteArray(msg.pSubName); - for (int i=0; ilistWidget->count(); i++) { - QListWidgetItem* item = ui->listWidget->item(i); + for (int i=0; ilistBoundary->count(); i++) { + QListWidgetItem* item = ui->listBoundary->item(i); if (item && item->data(Qt::UserRole) == data) { - ui->listWidget->takeItem(i); + ui->listBoundary->takeItem(i); delete item; } } @@ -454,13 +506,13 @@ void FillingPanel::onSelectionChanged(const Gui::SelectionChanges& msg) void FillingPanel::onDeleteEdge() { - int row = ui->listWidget->currentRow(); - QListWidgetItem* item = ui->listWidget->item(row); + int row = ui->listBoundary->currentRow(); + QListWidgetItem* item = ui->listBoundary->item(row); if (item) { checkOpenCommand(); QList data; data = item->data(Qt::UserRole).toList(); - ui->listWidget->takeItem(row); + ui->listBoundary->takeItem(row); delete item; App::Document* doc = App::GetApplication().getDocument(data[0].toByteArray()); @@ -483,6 +535,30 @@ void FillingPanel::onDeleteEdge() } } +void FillingPanel::on_buttonAccept_clicked() +{ + modifyBorder(false); +} + +void FillingPanel::on_buttonIgnore_clicked() +{ + modifyBorder(false); +} + +void FillingPanel::modifyBorder(bool on) +{ + ui->buttonInitFace->setDisabled(on); + ui->lineInitFaceName->setDisabled(on); + ui->buttonEdgeAdd->setDisabled(on); + ui->buttonEdgeRemove->setDisabled(on); + ui->listBoundary->setDisabled(on); + + ui->comboBoxFaces->setEnabled(on); + ui->comboBoxCont->setEnabled(on); + ui->buttonAccept->setEnabled(on); + ui->buttonIgnore->setEnabled(on); +} + // ---------------------------------------------------------------------------- TaskFilling::TaskFilling(ViewProviderFilling* vp, Surface::Filling* obj) diff --git a/src/Mod/Surface/Gui/TaskFilling.h b/src/Mod/Surface/Gui/TaskFilling.h index ce56c7b3b8..752904f60a 100644 --- a/src/Mod/Surface/Gui/TaskFilling.h +++ b/src/Mod/Surface/Gui/TaskFilling.h @@ -31,6 +31,8 @@ #include #include +class QListWidgetItem; + namespace SurfaceGui { @@ -81,12 +83,16 @@ protected: virtual void slotUndoDocument(const Gui::Document& Doc); /** Notifies on redo */ virtual void slotRedoDocument(const Gui::Document& Doc); + void modifyBorder(bool); private Q_SLOTS: void on_buttonInitFace_clicked(); void on_buttonEdgeAdd_clicked(); void on_buttonEdgeRemove_clicked(); void on_lineInitFaceName_textChanged(const QString&); + void on_listBoundary_itemDoubleClicked(QListWidgetItem*); + void on_buttonAccept_clicked(); + void on_buttonIgnore_clicked(); void onDeleteEdge(void); void clearSelection(); }; diff --git a/src/Mod/Surface/Gui/TaskFilling.ui b/src/Mod/Surface/Gui/TaskFilling.ui index 733779d10f..bb25d5850b 100644 --- a/src/Mod/Surface/Gui/TaskFilling.ui +++ b/src/Mod/Surface/Gui/TaskFilling.ui @@ -19,7 +19,7 @@ Filling - + @@ -39,43 +39,113 @@ - - - - - true - - - - 0 - 0 - - - - Add Edge - - - false - - - - - - - - 0 - 0 - - - - Remove Edge - - - - - - - + + + Boundary + + + + + + + + + Faces: + + + + + + + false + + + + + + + Continuity: + + + + + + + false + + + + + + + Qt::Horizontal + + + + 74 + 20 + + + + + + + + false + + + Accept + + + + + + + false + + + Ignore + + + + + + + + + true + + + + 0 + 0 + + + + Add Edge + + + false + + + + + + + + 0 + 0 + + + + Remove Edge + + + + + + +