diff --git a/src/Mod/Part/Gui/TaskShapeBuilder.cpp b/src/Mod/Part/Gui/TaskShapeBuilder.cpp index d0917bbd5c..2191118f67 100644 --- a/src/Mod/Part/Gui/TaskShapeBuilder.cpp +++ b/src/Mod/Part/Gui/TaskShapeBuilder.cpp @@ -114,10 +114,11 @@ ShapeBuilderWidget::ShapeBuilderWidget(QWidget* parent) d->ui.setupUi(this); d->ui.label->setText(QString()); d->bg.addButton(d->ui.radioButtonEdgeFromVertex, 0); - d->bg.addButton(d->ui.radioButtonFaceFromVertex, 1); - d->bg.addButton(d->ui.radioButtonFaceFromEdge, 2); - d->bg.addButton(d->ui.radioButtonShellFromFace, 3); - d->bg.addButton(d->ui.radioButtonSolidFromShell, 4); + d->bg.addButton(d->ui.radioButtonWireFromEdge, 1); + d->bg.addButton(d->ui.radioButtonFaceFromVertex, 2); + d->bg.addButton(d->ui.radioButtonFaceFromEdge, 3); + d->bg.addButton(d->ui.radioButtonShellFromFace, 4); + d->bg.addButton(d->ui.radioButtonSolidFromShell, 5); d->bg.setExclusive(true); connect(&d->bg, SIGNAL(buttonClicked(int)), @@ -177,15 +178,18 @@ void ShapeBuilderWidget::on_createButton_clicked() createEdgeFromVertex(); } else if (mode == 1) { - createFaceFromVertex(); + createWireFromEdge(); } else if (mode == 2) { - createFaceFromEdge(); + createFaceFromVertex(); } else if (mode == 3) { - createShellFromFace(); + createFaceFromEdge(); } else if (mode == 4) { + createShellFromFace(); + } + else if (mode == 5) { createSolidFromShell(); } doc->getDocument()->recompute(); @@ -243,6 +247,47 @@ void ShapeBuilderWidget::createEdgeFromVertex() } } +void ShapeBuilderWidget::createWireFromEdge() +{ + Gui::SelectionFilter edgeFilter ("SELECT Part::Feature SUBELEMENT Edge COUNT 1.."); + bool matchEdge = edgeFilter.match(); + if (!matchEdge) { + QMessageBox::critical(this, tr("Wrong selection"), tr("Select one or more edges")); + return; + } + + std::vector sel = edgeFilter.Result[0]; + std::vector::iterator it; + std::vector::const_iterator jt; + + QString list; + QTextStream str(&list); + str << "["; + for (it=sel.begin();it!=sel.end();++it) { + for (jt=it->getSubNames().begin();jt!=it->getSubNames().end();++jt) { + str << "App.ActiveDocument." << it->getFeatName() << ".Shape." << jt->c_str() << ", "; + } + } + str << "]"; + + QString cmd; + cmd = QString::fromLatin1( + "_=Part.Wire(Part.__sortEdges__(%1))\n" + "if _.isNull(): raise RuntimeError('Failed to create face')\n" + "App.ActiveDocument.addObject('Part::Feature','Wire').Shape=_\n" + "del _\n" + ).arg(list); + try { + Gui::Application::Instance->activeDocument()->openCommand("Wire"); + Gui::Command::runCommand(Gui::Command::App, cmd.toLatin1()); + Gui::Application::Instance->activeDocument()->commitCommand(); + } + catch (const Base::Exception&) { + Gui::Application::Instance->activeDocument()->abortCommand(); + throw; + } +} + void ShapeBuilderWidget::createFaceFromVertex() { Gui::SelectionFilter vertexFilter ("SELECT Part::Feature SUBELEMENT Vertex COUNT 3.."); @@ -473,20 +518,27 @@ void ShapeBuilderWidget::switchMode(int mode) d->ui.checkRefine->setEnabled(false); } else if (mode == 1) { - d->gate->setMode(ShapeSelection::VERTEX); - d->ui.label->setText(tr("Select a list of vertices")); - d->ui.checkPlanar->setEnabled(true); - d->ui.checkFaces->setEnabled(false); - d->ui.checkRefine->setEnabled(false); - } - else if (mode == 2) { d->gate->setMode(ShapeSelection::EDGE); d->ui.label->setText(tr("Select a closed set of edges")); d->ui.checkPlanar->setEnabled(true); d->ui.checkFaces->setEnabled(false); d->ui.checkRefine->setEnabled(false); } + else if (mode == 2) { + d->gate->setMode(ShapeSelection::VERTEX); + d->ui.label->setText(tr("Select a list of vertices")); + d->ui.checkPlanar->setEnabled(true); + d->ui.checkFaces->setEnabled(false); + d->ui.checkRefine->setEnabled(false); + } else if (mode == 3) { + d->gate->setMode(ShapeSelection::EDGE); + d->ui.label->setText(tr("Select a closed set of edges")); + d->ui.checkPlanar->setEnabled(true); + d->ui.checkFaces->setEnabled(false); + d->ui.checkRefine->setEnabled(false); + } + else if (mode == 4) { d->gate->setMode(ShapeSelection::FACE); d->ui.label->setText(tr("Select adjacent faces")); d->ui.checkPlanar->setEnabled(false); diff --git a/src/Mod/Part/Gui/TaskShapeBuilder.h b/src/Mod/Part/Gui/TaskShapeBuilder.h index 6af6410e9a..b428d8cbe2 100644 --- a/src/Mod/Part/Gui/TaskShapeBuilder.h +++ b/src/Mod/Part/Gui/TaskShapeBuilder.h @@ -51,6 +51,7 @@ private: private: void createEdgeFromVertex(); + void createWireFromEdge(); void createFaceFromVertex(); void createFaceFromEdge(); void createShellFromFace(); diff --git a/src/Mod/Part/Gui/TaskShapeBuilder.ui b/src/Mod/Part/Gui/TaskShapeBuilder.ui index e38c1d5b09..b6507a0603 100644 --- a/src/Mod/Part/Gui/TaskShapeBuilder.ui +++ b/src/Mod/Part/Gui/TaskShapeBuilder.ui @@ -20,6 +20,20 @@ Create shape + + + + Face from vertices + + + + + + + Shell from faces + + + @@ -27,49 +41,35 @@ - - - - Face from vertices - - - - + Face from edges - - - - Shell from faces - - - - + Solid from shell - + Qt::Horizontal - + Planar - + Refine shape @@ -79,14 +79,14 @@ - + All faces - + @@ -110,6 +110,13 @@ + + + + Wire from edges + + +