Part: Added 'Wire from Edges' option to Part ShapeBuilder

This commit is contained in:
Yorik van Havre
2018-07-20 20:15:26 -03:00
parent a91f9e9812
commit 4aa91d62e2
3 changed files with 95 additions and 35 deletions

View File

@@ -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<Gui::SelectionObject> sel = edgeFilter.Result[0];
std::vector<Gui::SelectionObject>::iterator it;
std::vector<std::string>::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);

View File

@@ -51,6 +51,7 @@ private:
private:
void createEdgeFromVertex();
void createWireFromEdge();
void createFaceFromVertex();
void createFaceFromEdge();
void createShellFromFace();

View File

@@ -20,6 +20,20 @@
<string>Create shape</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="2" column="0">
<widget class="QRadioButton" name="radioButtonFaceFromVertex">
<property name="text">
<string>Face from vertices</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QRadioButton" name="radioButtonShellFromFace">
<property name="text">
<string>Shell from faces</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QRadioButton" name="radioButtonEdgeFromVertex">
<property name="text">
@@ -27,49 +41,35 @@
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QRadioButton" name="radioButtonFaceFromVertex">
<property name="text">
<string>Face from vertices</string>
</property>
</widget>
</item>
<item row="2" column="0">
<item row="3" column="0">
<widget class="QRadioButton" name="radioButtonFaceFromEdge">
<property name="text">
<string>Face from edges</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QRadioButton" name="radioButtonShellFromFace">
<property name="text">
<string>Shell from faces</string>
</property>
</widget>
</item>
<item row="4" column="0">
<item row="5" column="0">
<widget class="QRadioButton" name="radioButtonSolidFromShell">
<property name="text">
<string>Solid from shell</string>
</property>
</widget>
</item>
<item row="5" column="0">
<item row="6" column="0">
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="6" column="0">
<item row="7" column="0">
<widget class="QCheckBox" name="checkPlanar">
<property name="text">
<string>Planar</string>
</property>
</widget>
</item>
<item row="7" column="0">
<item row="8" column="0">
<widget class="QCheckBox" name="checkRefine">
<property name="text">
<string>Refine shape</string>
@@ -79,14 +79,14 @@
</property>
</widget>
</item>
<item row="8" column="0">
<item row="9" column="0">
<widget class="QCheckBox" name="checkFaces">
<property name="text">
<string>All faces</string>
</property>
</widget>
</item>
<item row="9" column="0">
<item row="10" column="0">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<spacer name="horizontalSpacer_2">
@@ -110,6 +110,13 @@
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QRadioButton" name="radioButtonWireFromEdge">
<property name="text">
<string>Wire from edges</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>