From 891421d805f0b09b6fc9805696d63cab72b4ae92 Mon Sep 17 00:00:00 2001 From: wmayer Date: Fri, 30 Dec 2011 17:27:21 +0000 Subject: [PATCH] + implement primitive dialog as task panel git-svn-id: https://free-cad.svn.sourceforge.net/svnroot/free-cad/trunk@5365 e8eeb9e2-ec13-0410-a4a9-efa5cf37419d --- src/Gui/InputVector.cpp | 11 +- src/Gui/InputVector.h | 3 +- src/Mod/Part/Gui/CMakeLists.txt | 2 + src/Mod/Part/Gui/Command.cpp | 9 +- src/Mod/Part/Gui/DlgPrimitives.cpp | 628 +++++++++++---------- src/Mod/Part/Gui/DlgPrimitives.h | 42 +- src/Mod/Part/Gui/DlgPrimitives.ui | 382 +++---------- src/Mod/Part/Gui/Location.ui | 81 +++ src/Mod/Part/Gui/Makefile.am | 2 + src/Tools/plugins/widget/customwidgets.cpp | 2 +- 10 files changed, 562 insertions(+), 600 deletions(-) create mode 100644 src/Mod/Part/Gui/Location.ui diff --git a/src/Gui/InputVector.cpp b/src/Gui/InputVector.cpp index 25757fdaa..0afec49a8 100644 --- a/src/Gui/InputVector.cpp +++ b/src/Gui/InputVector.cpp @@ -63,6 +63,8 @@ LocationWidget::LocationWidget (QWidget * parent) QGridLayout* gridLayout = new QGridLayout(this); gridLayout->addLayout(box, 0, 0, 1, 2); + connect(dValue, SIGNAL(activated(int)), + this, SLOT(on_direction_activated(int))); retranslateUi(); } @@ -72,7 +74,7 @@ LocationWidget::~LocationWidget() QSize LocationWidget::sizeHint() const { - return QSize(150,190); + return QSize(150,100); } void LocationWidget::changeEvent(QEvent* e) @@ -121,6 +123,13 @@ Base::Vector3f LocationWidget::getPosition() const (float)this->zValue->value()); } +void LocationWidget::setPosition(const Base::Vector3f& v) +{ + this->xValue->setValue(v.x); + this->yValue->setValue(v.y); + this->zValue->setValue(v.z); +} + void LocationWidget::setDirection(const Base::Vector3f& dir) { if (dir.Length() < FLT_EPSILON) { diff --git a/src/Gui/InputVector.h b/src/Gui/InputVector.h index 852ad2394..b5c101251 100644 --- a/src/Gui/InputVector.h +++ b/src/Gui/InputVector.h @@ -37,7 +37,7 @@ class QComboBox; namespace Gui { -class LocationWidget : public QWidget +class GuiExport LocationWidget : public QWidget { Q_OBJECT @@ -47,6 +47,7 @@ public: QSize sizeHint() const; Base::Vector3f getPosition() const; + void setPosition(const Base::Vector3f&); void setDirection(const Base::Vector3f& dir); Base::Vector3f getDirection() const; Base::Vector3f getUserDirection(bool* ok=0) const; diff --git a/src/Mod/Part/Gui/CMakeLists.txt b/src/Mod/Part/Gui/CMakeLists.txt index 0626ca749..38a984c5e 100644 --- a/src/Mod/Part/Gui/CMakeLists.txt +++ b/src/Mod/Part/Gui/CMakeLists.txt @@ -58,6 +58,7 @@ set(PartGui_UIC_SRCS DlgPartImportIges.ui DlgPartImportStep.ui DlgPrimitives.ui + Location.ui DlgRevolution.ui DlgSettings3DViewPart.ui DlgSettingsGeneral.ui @@ -104,6 +105,7 @@ SET(PartGui_SRCS DlgPrimitives.cpp DlgPrimitives.h DlgPrimitives.ui + Location.ui DlgRevolution.cpp DlgRevolution.h DlgRevolution.ui diff --git a/src/Mod/Part/Gui/Command.cpp b/src/Mod/Part/Gui/Command.cpp index e5ccaaac5..f4288f997 100644 --- a/src/Mod/Part/Gui/Command.cpp +++ b/src/Mod/Part/Gui/Command.cpp @@ -208,16 +208,13 @@ CmdPartPrimitives::CmdPartPrimitives() void CmdPartPrimitives::activated(int iMsg) { - static QPointer dlg = 0; - if (!dlg) - dlg = new PartGui::DlgPrimitives(Gui::getMainWindow()); - dlg->setAttribute(Qt::WA_DeleteOnClose); - dlg->show(); + PartGui::TaskPrimitives* dlg = new PartGui::TaskPrimitives(); + Gui::Control().showDialog(dlg); } bool CmdPartPrimitives::isActive(void) { - return hasActiveDocument(); + return (hasActiveDocument() && !Gui::Control().activeDialog()); } //=========================================================================== diff --git a/src/Mod/Part/Gui/DlgPrimitives.cpp b/src/Mod/Part/Gui/DlgPrimitives.cpp index 4ea927906..8b5339832 100644 --- a/src/Mod/Part/Gui/DlgPrimitives.cpp +++ b/src/Mod/Part/Gui/DlgPrimitives.cpp @@ -40,6 +40,7 @@ #include #include #include +#include #include #include "DlgPrimitives.h" @@ -48,15 +49,13 @@ using namespace PartGui; /* TRANSLATOR PartGui::DlgPrimitives */ -DlgPrimitives::DlgPrimitives(QWidget* parent, Qt::WFlags fl) - : Gui::LocationDialogComp(parent, fl) +DlgPrimitives::DlgPrimitives(QWidget* parent) + : QWidget(parent) { + ui.setupUi(this); Gui::Command::doCommand(Gui::Command::Doc, "from FreeCAD import Base"); Gui::Command::doCommand(Gui::Command::Doc, "import Part,PartGui"); - connect(ui.viewPositionButton, SIGNAL(clicked()), - this, SLOT(on_viewPositionButton_clicked())); - // set limits // // plane @@ -135,6 +134,247 @@ DlgPrimitives::DlgPrimitives(QWidget* parent, Qt::WFlags fl) */ DlgPrimitives::~DlgPrimitives() { +} + +void DlgPrimitives::createPrimitive(const QString& placement) +{ + try { + QString cmd; QString name; + App::Document* doc = App::GetApplication().getActiveDocument(); + if (!doc) { + QMessageBox::warning(this, tr("Create %1") + .arg(ui.comboBox1->currentText()), tr("No active document")); + return; + } + if (ui.comboBox1->currentIndex() == 0) { // plane + name = QString::fromAscii(doc->getUniqueObjectName("Plane").c_str()); + cmd = QString::fromAscii( + "App.ActiveDocument.addObject(\"Part::Plane\",\"%1\")\n" + "App.ActiveDocument.%1.Length=%2\n" + "App.ActiveDocument.%1.Width=%3\n" + "App.ActiveDocument.%1.Placement=%4\n") + .arg(name) + .arg(ui.planeLength->value(),0,'f',2) + .arg(ui.planeWidth->value(),0,'f',2) + .arg(placement); + } + else if (ui.comboBox1->currentIndex() == 1) { // box + name = QString::fromAscii(doc->getUniqueObjectName("Box").c_str()); + cmd = QString::fromAscii( + "App.ActiveDocument.addObject(\"Part::Box\",\"%1\")\n" + "App.ActiveDocument.%1.Length=%2\n" + "App.ActiveDocument.%1.Width=%3\n" + "App.ActiveDocument.%1.Height=%4\n" + "App.ActiveDocument.%1.Placement=%5\n") + .arg(name) + .arg(ui.boxLength->value(),0,'f',2) + .arg(ui.boxWidth->value(),0,'f',2) + .arg(ui.boxHeight->value(),0,'f',2) + .arg(placement); + } + else if (ui.comboBox1->currentIndex() == 2) { // cylinder + name = QString::fromAscii(doc->getUniqueObjectName("Cylinder").c_str()); + cmd = QString::fromAscii( + "App.ActiveDocument.addObject(\"Part::Cylinder\",\"%1\")\n" + "App.ActiveDocument.%1.Radius=%2\n" + "App.ActiveDocument.%1.Height=%3\n" + "App.ActiveDocument.%1.Angle=%4\n" + "App.ActiveDocument.%1.Placement=%5\n") + .arg(name) + .arg(ui.cylinderRadius->value(),0,'f',2) + .arg(ui.cylinderHeight->value(),0,'f',2) + .arg(ui.cylinderAngle->value(),0,'f',2) + .arg(placement); + } + else if (ui.comboBox1->currentIndex() == 3) { // cone + name = QString::fromAscii(doc->getUniqueObjectName("Cone").c_str()); + cmd = QString::fromAscii( + "App.ActiveDocument.addObject(\"Part::Cone\",\"%1\")\n" + "App.ActiveDocument.%1.Radius1=%2\n" + "App.ActiveDocument.%1.Radius2=%3\n" + "App.ActiveDocument.%1.Height=%4\n" + "App.ActiveDocument.%1.Angle=%5\n" + "App.ActiveDocument.%1.Placement=%6\n") + .arg(name) + .arg(ui.coneRadius1->value(),0,'f',2) + .arg(ui.coneRadius2->value(),0,'f',2) + .arg(ui.coneHeight->value(),0,'f',2) + .arg(ui.coneAngle->value(),0,'f',2) + .arg(placement); + } + else if (ui.comboBox1->currentIndex() == 4) { // sphere + name = QString::fromAscii(doc->getUniqueObjectName("Sphere").c_str()); + cmd = QString::fromAscii( + "App.ActiveDocument.addObject(\"Part::Sphere\",\"%1\")\n" + "App.ActiveDocument.%1.Radius=%2\n" + "App.ActiveDocument.%1.Angle1=%3\n" + "App.ActiveDocument.%1.Angle2=%4\n" + "App.ActiveDocument.%1.Angle3=%5\n" + "App.ActiveDocument.%1.Placement=%6\n") + .arg(name) + .arg(ui.sphereRadius->value(),0,'f',2) + .arg(ui.sphereAngle1->value(),0,'f',2) + .arg(ui.sphereAngle2->value(),0,'f',2) + .arg(ui.sphereAngle3->value(),0,'f',2) + .arg(placement); + } + else if (ui.comboBox1->currentIndex() == 5) { // ellipsoid + name = QString::fromAscii(doc->getUniqueObjectName("Ellipsoid").c_str()); + cmd = QString::fromAscii( + "App.ActiveDocument.addObject(\"Part::Ellipsoid\",\"%1\")\n" + "App.ActiveDocument.%1.Radius1=%2\n" + "App.ActiveDocument.%1.Radius2=%3\n" + "App.ActiveDocument.%1.Angle1=%4\n" + "App.ActiveDocument.%1.Angle2=%5\n" + "App.ActiveDocument.%1.Angle3=%6\n" + "App.ActiveDocument.%1.Placement=%7\n") + .arg(name) + .arg(ui.ellipsoidRadius1->value(),0,'f',2) + .arg(ui.ellipsoidRadius2->value(),0,'f',2) + .arg(ui.ellipsoidAngle1->value(),0,'f',2) + .arg(ui.ellipsoidAngle2->value(),0,'f',2) + .arg(ui.ellipsoidAngle3->value(),0,'f',2) + .arg(placement); + } + else if (ui.comboBox1->currentIndex() == 6) { // torus + name = QString::fromAscii(doc->getUniqueObjectName("Torus").c_str()); + cmd = QString::fromAscii( + "App.ActiveDocument.addObject(\"Part::Torus\",\"%1\")\n" + "App.ActiveDocument.%1.Radius1=%2\n" + "App.ActiveDocument.%1.Radius2=%3\n" + "App.ActiveDocument.%1.Angle1=%4\n" + "App.ActiveDocument.%1.Angle2=%5\n" + "App.ActiveDocument.%1.Angle3=%6\n" + "App.ActiveDocument.%1.Placement=%7\n") + .arg(name) + .arg(ui.torusRadius1->value(),0,'f',2) + .arg(ui.torusRadius2->value(),0,'f',2) + .arg(ui.torusAngle1->value(),0,'f',2) + .arg(ui.torusAngle2->value(),0,'f',2) + .arg(ui.torusAngle3->value(),0,'f',2) + .arg(placement); + } + else if (ui.comboBox1->currentIndex() == 7) { // wedge + name = QString::fromAscii(doc->getUniqueObjectName("Wedge").c_str()); + cmd = QString::fromAscii( + "App.ActiveDocument.addObject(\"Part::Wedge\",\"%1\")\n" + "App.ActiveDocument.%1.Xmin=%2\n" + "App.ActiveDocument.%1.Ymin=%3\n" + "App.ActiveDocument.%1.Zmin=%4\n" + "App.ActiveDocument.%1.X2min=%5\n" + "App.ActiveDocument.%1.Z2min=%6\n" + "App.ActiveDocument.%1.Xmax=%7\n" + "App.ActiveDocument.%1.Ymax=%8\n" + "App.ActiveDocument.%1.Zmax=%9\n" + "App.ActiveDocument.%1.X2max=%10\n" + "App.ActiveDocument.%1.Z2max=%11\n" + "App.ActiveDocument.%1.Placement=%12\n") + .arg(name) + .arg(ui.wedgeXmin->value(),0,'f',2) + .arg(ui.wedgeYmin->value(),0,'f',2) + .arg(ui.wedgeZmin->value(),0,'f',2) + .arg(ui.wedgeX2min->value(),0,'f',2) + .arg(ui.wedgeZ2min->value(),0,'f',2) + .arg(ui.wedgeXmax->value(),0,'f',2) + .arg(ui.wedgeYmax->value(),0,'f',2) + .arg(ui.wedgeZmax->value(),0,'f',2) + .arg(ui.wedgeX2max->value(),0,'f',2) + .arg(ui.wedgeZ2max->value(),0,'f',2) + .arg(placement); + } + else if (ui.comboBox1->currentIndex() == 8) { // helix + name = QString::fromAscii(doc->getUniqueObjectName("Helix").c_str()); + cmd = QString::fromAscii( + "App.ActiveDocument.addObject(\"Part::Helix\",\"%1\")\n" + "App.ActiveDocument.%1.Pitch=%2\n" + "App.ActiveDocument.%1.Height=%3\n" + "App.ActiveDocument.%1.Radius=%4\n" + "App.ActiveDocument.%1.Angle=%5\n" + "App.ActiveDocument.%1.Placement=%6\n") + .arg(name) + .arg(ui.helixPitch->value(),0,'f',2) + .arg(ui.helixHeight->value(),0,'f',2) + .arg(ui.helixRadius->value(),0,'f',2) + .arg(ui.helixAngle->value(),0,'f',2) + .arg(placement); + } + else if (ui.comboBox1->currentIndex() == 9) { // circle + name = QString::fromAscii(doc->getUniqueObjectName("Circle").c_str()); + cmd = QString::fromAscii( + "App.ActiveDocument.addObject(\"Part::Circle\",\"%1\")\n" + "App.ActiveDocument.%1.Radius=%2\n" + "App.ActiveDocument.%1.Angle0=%3\n" + "App.ActiveDocument.%1.Angle1=%4\n" + "App.ActiveDocument.%1.Placement=%5\n") + .arg(name) + .arg(ui.circleRadius->value(),0,'f',2) + .arg(ui.circleAngle0->value(),0,'f',2) + .arg(ui.circleAngle1->value(),0,'f',2) + .arg(placement); + } + else if (ui.comboBox1->currentIndex() == 10) { // vertex + name = QString::fromAscii(doc->getUniqueObjectName("Vertex").c_str()); + cmd = QString::fromAscii( + "App.ActiveDocument.addObject(\"Part::Vertex\",\"%1\")\n" + "App.ActiveDocument.%1.X=%2\n" + "App.ActiveDocument.%1.Y=%3\n" + "App.ActiveDocument.%1.Z=%4\n" + "App.ActiveDocument.%1.Placement=%5\n") + .arg(name) + .arg(ui.vertexX->value(),0,'f',2) + .arg(ui.vertexY->value(),0,'f',2) + .arg(ui.vertexZ->value(),0,'f',2) + .arg(placement); + } + else if (ui.comboBox1->currentIndex() == 11) { // edge + name = QString::fromAscii(doc->getUniqueObjectName("Edge").c_str()); + cmd = QString::fromAscii( + "App.ActiveDocument.addObject(\"Part::Edge\",\"%1\")\n" + "App.ActiveDocument.%1.X1=%2\n" + "App.ActiveDocument.%1.Y1=%3\n" + "App.ActiveDocument.%1.Z1=%4\n" + "App.ActiveDocument.%1.X2=%5\n" + "App.ActiveDocument.%1.Y2=%6\n" + "App.ActiveDocument.%1.Z2=%7\n" + "App.ActiveDocument.%1.Placement=%8\n") + .arg(name) + .arg(ui.edgeX1->value(),0,'f',2) + .arg(ui.edgeY1->value(),0,'f',2) + .arg(ui.edgeZ1->value(),0,'f',2) + .arg(ui.edgeX2->value(),0,'f',2) + .arg(ui.edgeY2->value(),0,'f',2) + .arg(ui.edgeZ2->value(),0,'f',2) + .arg(placement); + } + + // Execute the Python block + QString prim = tr("Create %1").arg(ui.comboBox1->currentText()); + Gui::Application::Instance->activeDocument()->openCommand(prim.toUtf8()); + Gui::Command::doCommand(Gui::Command::Doc, (const char*)cmd.toAscii()); + Gui::Application::Instance->activeDocument()->commitCommand(); + Gui::Command::doCommand(Gui::Command::Doc, "App.ActiveDocument.recompute()"); + Gui::Command::doCommand(Gui::Command::Gui, "Gui.SendMsgToActiveView(\"ViewFit\")"); + } + catch (const Base::PyException& e) { + QMessageBox::warning(this, tr("Create %1") + .arg(ui.comboBox1->currentText()), QString::fromLatin1(e.what())); + } +} + +// ---------------------------------------------- + +/* TRANSLATOR PartGui::Location */ + +Location::Location(QWidget* parent) +{ + ui.setupUi(this); + + connect(ui.viewPositionButton, SIGNAL(clicked()), + this, SLOT(on_viewPositionButton_clicked())); +} + +Location::~Location() +{ // no need to delete child widgets, Qt does it all for us if (!this->activeView.isNull()) { Gui::View3DInventorViewer* viewer = static_cast @@ -143,11 +383,60 @@ DlgPrimitives::~DlgPrimitives() viewer->setRedirectToSceneGraph(false); viewer->removeEventCallback(SoMouseButtonEvent::getClassTypeId(), pickCallback,this); } +} + +void Location::on_viewPositionButton_clicked() +{ + Gui::Document* doc = Gui::Application::Instance->activeDocument(); + if (!doc) { + return; + } + + Gui::View3DInventor* view = static_cast(doc->getActiveView()); + if (view && !this->activeView) { + Gui::View3DInventorViewer* viewer = view->getViewer(); + if (!viewer->isEditing()) { + this->activeView = view; + viewer->setEditing(true); + viewer->setRedirectToSceneGraph(true); + viewer->addEventCallback(SoMouseButtonEvent::getClassTypeId(), pickCallback, this); + } + } } -QString DlgPrimitives::toPlacement() const +void Location::pickCallback(void * ud, SoEventCallback * n) { - Base::Vector3f d = ui.getDirection(); + const SoMouseButtonEvent * mbe = static_cast(n->getEvent()); + Gui::View3DInventorViewer* view = reinterpret_cast(n->getUserData()); + + // Mark all incoming mouse button events as handled, especially, to deactivate the selection node + n->getAction()->setHandled(); + if (mbe->getButton() == SoMouseButtonEvent::BUTTON1) { + if (mbe->getState() == SoButtonEvent::UP) { + n->setHandled(); + view->setEditing(false); + view->setRedirectToSceneGraph(false); + Location* dlg = reinterpret_cast(ud); + dlg->activeView = 0; + view->removeEventCallback(SoMouseButtonEvent::getClassTypeId(), pickCallback,ud); + } + else if (mbe->getState() == SoButtonEvent::DOWN) { + const SoPickedPoint * point = n->getPickedPoint(); + if (point) { + SbVec3f pnt = point->getPoint(); + SbVec3f nor = point->getNormal(); + Location* dlg = reinterpret_cast(ud); + dlg->ui.loc->setPosition(Base::Vector3f(pnt[0],pnt[1],pnt[2])); + dlg->ui.loc->setDirection(Base::Vector3f(nor[0],nor[1],nor[2])); + n->setHandled(); + } + } + } +} + +QString Location::toPlacement() const +{ + Base::Vector3f d = ui.loc->getDirection(); gp_Dir dir = gp_Dir(d.x,d.y,d.z); gp_Pnt pnt = gp_Pnt(0.0,0.0,0.0); gp_Ax3 ax3; @@ -190,293 +479,62 @@ QString DlgPrimitives::toPlacement() const Trf.GetRotation(theAxis,theAngle); Base::Rotation rot(Base::convertTo(theAxis), theAngle); + Base::Vector3f loc = ui.loc->getPosition(); return QString::fromAscii("Base.Placement(Base.Vector(%1,%2,%3),Base.Rotation(%4,%5,%6,%7))") - .arg(ui.xPos->value(),0,'f',2) - .arg(ui.yPos->value(),0,'f',2) - .arg(ui.zPos->value(),0,'f',2) + .arg(loc.x,0,'f',2) + .arg(loc.y,0,'f',2) + .arg(loc.z,0,'f',2) .arg(rot[0],0,'f',2) .arg(rot[1],0,'f',2) .arg(rot[2],0,'f',2) .arg(rot[3],0,'f',2); } + +// ---------------------------------------------- + +/* TRANSLATOR PartGui::TaskPrimitives */ + +TaskPrimitives::TaskPrimitives() +{ + Gui::TaskView::TaskBox* taskbox; + widget = new DlgPrimitives(); + taskbox = new Gui::TaskView::TaskBox(QPixmap(), widget->windowTitle(),true, 0); + taskbox->groupLayout()->addWidget(widget); + Content.push_back(taskbox); + + location = new Location(); + taskbox = new Gui::TaskView::TaskBox(QPixmap(), location->windowTitle(),true, 0); + taskbox->groupLayout()->addWidget(location); + Content.push_back(taskbox); +} + +TaskPrimitives::~TaskPrimitives() +{ + // automatically deleted in the sub-class +} + +QDialogButtonBox::StandardButtons TaskPrimitives::getStandardButtons() const +{ + return QDialogButtonBox::Close| + QDialogButtonBox::Ok; +} -void DlgPrimitives::pickCallback(void * ud, SoEventCallback * n) +void TaskPrimitives::modifyStandardButtons(QDialogButtonBox* box) { - const SoMouseButtonEvent * mbe = static_cast(n->getEvent()); - Gui::View3DInventorViewer* view = reinterpret_cast(n->getUserData()); - - // Mark all incoming mouse button events as handled, especially, to deactivate the selection node - n->getAction()->setHandled(); - if (mbe->getButton() == SoMouseButtonEvent::BUTTON1) { - if (mbe->getState() == SoButtonEvent::UP) { - n->setHandled(); - view->setEditing(false); - view->setRedirectToSceneGraph(false); - DlgPrimitives* dlg = reinterpret_cast(ud); - dlg->activeView = 0; - view->removeEventCallback(SoMouseButtonEvent::getClassTypeId(), pickCallback,ud); - } - else if (mbe->getState() == SoButtonEvent::DOWN) { - const SoPickedPoint * point = n->getPickedPoint(); - if (point) { - SbVec3f pnt = point->getPoint(); - SbVec3f nor = point->getNormal(); - DlgPrimitives* dlg = reinterpret_cast(ud); - dlg->ui.xPos->setValue(pnt[0]); - dlg->ui.yPos->setValue(pnt[1]); - dlg->ui.zPos->setValue(pnt[2]); - dlg->ui.setDirection(Base::Vector3f(nor[0],nor[1],nor[2])); - n->setHandled(); - } - } - } -} - -void DlgPrimitives::on_viewPositionButton_clicked() -{ - Gui::Document* doc = Gui::Application::Instance->activeDocument(); - if (!doc) { - QMessageBox::warning(this, tr("Create %1") - .arg(ui.comboBox1->currentText()), tr("No active document")); - return; - } - - Gui::View3DInventor* view = static_cast(doc->getActiveView()); - if (view && !this->activeView) { - Gui::View3DInventorViewer* viewer = view->getViewer(); - if (!viewer->isEditing()) { - this->activeView = view; - viewer->setEditing(true); - viewer->setRedirectToSceneGraph(true); - viewer->addEventCallback(SoMouseButtonEvent::getClassTypeId(), pickCallback, this); - } - } -} - -void DlgPrimitives::accept() -{ - try { - QString cmd; QString name; - App::Document* doc = App::GetApplication().getActiveDocument(); - if (!doc) { - QMessageBox::warning(this, tr("Create %1") - .arg(ui.comboBox1->currentText()), tr("No active document")); - return; - } - if (ui.comboBox1->currentIndex() == 0) { // plane - name = QString::fromAscii(doc->getUniqueObjectName("Plane").c_str()); - cmd = QString::fromAscii( - "App.ActiveDocument.addObject(\"Part::Plane\",\"%1\")\n" - "App.ActiveDocument.%1.Length=%2\n" - "App.ActiveDocument.%1.Width=%3\n" - "App.ActiveDocument.%1.Placement=%4\n") - .arg(name) - .arg(ui.planeLength->value(),0,'f',2) - .arg(ui.planeWidth->value(),0,'f',2) - .arg(this->toPlacement()); - } - else if (ui.comboBox1->currentIndex() == 1) { // box - name = QString::fromAscii(doc->getUniqueObjectName("Box").c_str()); - cmd = QString::fromAscii( - "App.ActiveDocument.addObject(\"Part::Box\",\"%1\")\n" - "App.ActiveDocument.%1.Length=%2\n" - "App.ActiveDocument.%1.Width=%3\n" - "App.ActiveDocument.%1.Height=%4\n" - "App.ActiveDocument.%1.Placement=%5\n") - .arg(name) - .arg(ui.boxLength->value(),0,'f',2) - .arg(ui.boxWidth->value(),0,'f',2) - .arg(ui.boxHeight->value(),0,'f',2) - .arg(this->toPlacement()); - } - else if (ui.comboBox1->currentIndex() == 2) { // cylinder - name = QString::fromAscii(doc->getUniqueObjectName("Cylinder").c_str()); - cmd = QString::fromAscii( - "App.ActiveDocument.addObject(\"Part::Cylinder\",\"%1\")\n" - "App.ActiveDocument.%1.Radius=%2\n" - "App.ActiveDocument.%1.Height=%3\n" - "App.ActiveDocument.%1.Angle=%4\n" - "App.ActiveDocument.%1.Placement=%5\n") - .arg(name) - .arg(ui.cylinderRadius->value(),0,'f',2) - .arg(ui.cylinderHeight->value(),0,'f',2) - .arg(ui.cylinderAngle->value(),0,'f',2) - .arg(this->toPlacement()); - } - else if (ui.comboBox1->currentIndex() == 3) { // cone - name = QString::fromAscii(doc->getUniqueObjectName("Cone").c_str()); - cmd = QString::fromAscii( - "App.ActiveDocument.addObject(\"Part::Cone\",\"%1\")\n" - "App.ActiveDocument.%1.Radius1=%2\n" - "App.ActiveDocument.%1.Radius2=%3\n" - "App.ActiveDocument.%1.Height=%4\n" - "App.ActiveDocument.%1.Angle=%5\n" - "App.ActiveDocument.%1.Placement=%6\n") - .arg(name) - .arg(ui.coneRadius1->value(),0,'f',2) - .arg(ui.coneRadius2->value(),0,'f',2) - .arg(ui.coneHeight->value(),0,'f',2) - .arg(ui.coneAngle->value(),0,'f',2) - .arg(this->toPlacement()); - } - else if (ui.comboBox1->currentIndex() == 4) { // sphere - name = QString::fromAscii(doc->getUniqueObjectName("Sphere").c_str()); - cmd = QString::fromAscii( - "App.ActiveDocument.addObject(\"Part::Sphere\",\"%1\")\n" - "App.ActiveDocument.%1.Radius=%2\n" - "App.ActiveDocument.%1.Angle1=%3\n" - "App.ActiveDocument.%1.Angle2=%4\n" - "App.ActiveDocument.%1.Angle3=%5\n" - "App.ActiveDocument.%1.Placement=%6\n") - .arg(name) - .arg(ui.sphereRadius->value(),0,'f',2) - .arg(ui.sphereAngle1->value(),0,'f',2) - .arg(ui.sphereAngle2->value(),0,'f',2) - .arg(ui.sphereAngle3->value(),0,'f',2) - .arg(this->toPlacement()); - } - else if (ui.comboBox1->currentIndex() == 5) { // ellipsoid - name = QString::fromAscii(doc->getUniqueObjectName("Ellipsoid").c_str()); - cmd = QString::fromAscii( - "App.ActiveDocument.addObject(\"Part::Ellipsoid\",\"%1\")\n" - "App.ActiveDocument.%1.Radius1=%2\n" - "App.ActiveDocument.%1.Radius2=%3\n" - "App.ActiveDocument.%1.Angle1=%4\n" - "App.ActiveDocument.%1.Angle2=%5\n" - "App.ActiveDocument.%1.Angle3=%6\n" - "App.ActiveDocument.%1.Placement=%7\n") - .arg(name) - .arg(ui.ellipsoidRadius1->value(),0,'f',2) - .arg(ui.ellipsoidRadius2->value(),0,'f',2) - .arg(ui.ellipsoidAngle1->value(),0,'f',2) - .arg(ui.ellipsoidAngle2->value(),0,'f',2) - .arg(ui.ellipsoidAngle3->value(),0,'f',2) - .arg(this->toPlacement()); - } - else if (ui.comboBox1->currentIndex() == 6) { // torus - name = QString::fromAscii(doc->getUniqueObjectName("Torus").c_str()); - cmd = QString::fromAscii( - "App.ActiveDocument.addObject(\"Part::Torus\",\"%1\")\n" - "App.ActiveDocument.%1.Radius1=%2\n" - "App.ActiveDocument.%1.Radius2=%3\n" - "App.ActiveDocument.%1.Angle1=%4\n" - "App.ActiveDocument.%1.Angle2=%5\n" - "App.ActiveDocument.%1.Angle3=%6\n" - "App.ActiveDocument.%1.Placement=%7\n") - .arg(name) - .arg(ui.torusRadius1->value(),0,'f',2) - .arg(ui.torusRadius2->value(),0,'f',2) - .arg(ui.torusAngle1->value(),0,'f',2) - .arg(ui.torusAngle2->value(),0,'f',2) - .arg(ui.torusAngle3->value(),0,'f',2) - .arg(this->toPlacement()); - } - else if (ui.comboBox1->currentIndex() == 7) { // wedge - name = QString::fromAscii(doc->getUniqueObjectName("Wedge").c_str()); - cmd = QString::fromAscii( - "App.ActiveDocument.addObject(\"Part::Wedge\",\"%1\")\n" - "App.ActiveDocument.%1.Xmin=%2\n" - "App.ActiveDocument.%1.Ymin=%3\n" - "App.ActiveDocument.%1.Zmin=%4\n" - "App.ActiveDocument.%1.X2min=%5\n" - "App.ActiveDocument.%1.Z2min=%6\n" - "App.ActiveDocument.%1.Xmax=%7\n" - "App.ActiveDocument.%1.Ymax=%8\n" - "App.ActiveDocument.%1.Zmax=%9\n" - "App.ActiveDocument.%1.X2max=%10\n" - "App.ActiveDocument.%1.Z2max=%11\n" - "App.ActiveDocument.%1.Placement=%12\n") - .arg(name) - .arg(ui.wedgeXmin->value(),0,'f',2) - .arg(ui.wedgeYmin->value(),0,'f',2) - .arg(ui.wedgeZmin->value(),0,'f',2) - .arg(ui.wedgeX2min->value(),0,'f',2) - .arg(ui.wedgeZ2min->value(),0,'f',2) - .arg(ui.wedgeXmax->value(),0,'f',2) - .arg(ui.wedgeYmax->value(),0,'f',2) - .arg(ui.wedgeZmax->value(),0,'f',2) - .arg(ui.wedgeX2max->value(),0,'f',2) - .arg(ui.wedgeZ2max->value(),0,'f',2) - .arg(this->toPlacement()); - } - else if (ui.comboBox1->currentIndex() == 8) { // helix - name = QString::fromAscii(doc->getUniqueObjectName("Helix").c_str()); - cmd = QString::fromAscii( - "App.ActiveDocument.addObject(\"Part::Helix\",\"%1\")\n" - "App.ActiveDocument.%1.Pitch=%2\n" - "App.ActiveDocument.%1.Height=%3\n" - "App.ActiveDocument.%1.Radius=%4\n" - "App.ActiveDocument.%1.Angle=%5\n" - "App.ActiveDocument.%1.Placement=%6\n") - .arg(name) - .arg(ui.helixPitch->value(),0,'f',2) - .arg(ui.helixHeight->value(),0,'f',2) - .arg(ui.helixRadius->value(),0,'f',2) - .arg(ui.helixAngle->value(),0,'f',2) - .arg(this->toPlacement()); - } - else if (ui.comboBox1->currentIndex() == 9) { // circle - name = QString::fromAscii(doc->getUniqueObjectName("Circle").c_str()); - cmd = QString::fromAscii( - "App.ActiveDocument.addObject(\"Part::Circle\",\"%1\")\n" - "App.ActiveDocument.%1.Radius=%2\n" - "App.ActiveDocument.%1.Angle0=%3\n" - "App.ActiveDocument.%1.Angle1=%4\n" - "App.ActiveDocument.%1.Placement=%5\n") - .arg(name) - .arg(ui.circleRadius->value(),0,'f',2) - .arg(ui.circleAngle0->value(),0,'f',2) - .arg(ui.circleAngle1->value(),0,'f',2) - .arg(this->toPlacement()); - } - else if (ui.comboBox1->currentIndex() == 10) { // vertex - name = QString::fromAscii(doc->getUniqueObjectName("Vertex").c_str()); - cmd = QString::fromAscii( - "App.ActiveDocument.addObject(\"Part::Vertex\",\"%1\")\n" - "App.ActiveDocument.%1.X=%2\n" - "App.ActiveDocument.%1.Y=%3\n" - "App.ActiveDocument.%1.Z=%4\n" - "App.ActiveDocument.%1.Placement=%5\n") - .arg(name) - .arg(ui.vertexX->value(),0,'f',2) - .arg(ui.vertexY->value(),0,'f',2) - .arg(ui.vertexZ->value(),0,'f',2) - .arg(this->toPlacement()); - } - else if (ui.comboBox1->currentIndex() == 11) { // edge - name = QString::fromAscii(doc->getUniqueObjectName("Edge").c_str()); - cmd = QString::fromAscii( - "App.ActiveDocument.addObject(\"Part::Edge\",\"%1\")\n" - "App.ActiveDocument.%1.X1=%2\n" - "App.ActiveDocument.%1.Y1=%3\n" - "App.ActiveDocument.%1.Z1=%4\n" - "App.ActiveDocument.%1.X2=%5\n" - "App.ActiveDocument.%1.Y2=%6\n" - "App.ActiveDocument.%1.Z2=%7\n" - "App.ActiveDocument.%1.Placement=%8\n") - .arg(name) - .arg(ui.edgeX1->value(),0,'f',2) - .arg(ui.edgeY1->value(),0,'f',2) - .arg(ui.edgeZ1->value(),0,'f',2) - .arg(ui.edgeX2->value(),0,'f',2) - .arg(ui.edgeY2->value(),0,'f',2) - .arg(ui.edgeZ2->value(),0,'f',2) - .arg(this->toPlacement()); - } - - // Execute the Python block - QString prim = tr("Create %1").arg(ui.comboBox1->currentText()); - Gui::Application::Instance->activeDocument()->openCommand(prim.toUtf8()); - Gui::Command::doCommand(Gui::Command::Doc, (const char*)cmd.toAscii()); - Gui::Application::Instance->activeDocument()->commitCommand(); - Gui::Command::doCommand(Gui::Command::Doc, "App.ActiveDocument.recompute()"); - Gui::Command::doCommand(Gui::Command::Gui, "Gui.SendMsgToActiveView(\"ViewFit\")"); - } - catch (const Base::PyException& e) { - QMessageBox::warning(this, tr("Create %1") - .arg(ui.comboBox1->currentText()), QString::fromLatin1(e.what())); - } + QPushButton* btn = box->button(QDialogButtonBox::Ok); + btn->setText(QApplication::translate("PartGui::DlgPrimitives", "&Create")); } + +bool TaskPrimitives::accept() +{ + widget->createPrimitive(location->toPlacement()); + return false; +} + +bool TaskPrimitives::reject() +{ + return true; +} #include "moc_DlgPrimitives.cpp" diff --git a/src/Mod/Part/Gui/DlgPrimitives.h b/src/Mod/Part/Gui/DlgPrimitives.h index 0e50ab4f6..d485047df 100644 --- a/src/Mod/Part/Gui/DlgPrimitives.h +++ b/src/Mod/Part/Gui/DlgPrimitives.h @@ -24,21 +24,34 @@ #define PARTGUI_DLGPRIMITIVES_H #include -#include +#include #include "ui_DlgPrimitives.h" +#include "ui_Location.h" class SoEventCallback; namespace PartGui { -class DlgPrimitives : public Gui::LocationDialogComp +class DlgPrimitives : public QWidget { Q_OBJECT public: - DlgPrimitives(QWidget* parent = 0, Qt::WFlags fl = 0); + DlgPrimitives(QWidget* parent = 0); ~DlgPrimitives(); - void accept(); + void createPrimitive(const QString&); + +private: + Ui_DlgPrimitives ui; +}; + +class Location : public QWidget +{ + Q_OBJECT + +public: + Location(QWidget* parent = 0); + ~Location(); QString toPlacement() const; private Q_SLOTS: @@ -47,6 +60,27 @@ private Q_SLOTS: private: static void pickCallback(void * ud, SoEventCallback * n); QPointer activeView; + Ui_Location ui; +}; + +class TaskPrimitives : public Gui::TaskView::TaskDialog +{ + Q_OBJECT + +public: + TaskPrimitives(); + ~TaskPrimitives(); + +public: + bool accept(); + bool reject(); + + QDialogButtonBox::StandardButtons getStandardButtons() const; + void modifyStandardButtons(QDialogButtonBox*); + +private: + DlgPrimitives* widget; + Location* location; }; } // namespace PartGui diff --git a/src/Mod/Part/Gui/DlgPrimitives.ui b/src/Mod/Part/Gui/DlgPrimitives.ui index afbcc9441..648ea6406 100644 --- a/src/Mod/Part/Gui/DlgPrimitives.ui +++ b/src/Mod/Part/Gui/DlgPrimitives.ui @@ -1,96 +1,102 @@ PartGui::DlgPrimitives - + 0 0 - 480 - 341 + 258 + 331 Geometric Primitives - + true - - - 9 - - - 6 - - - - - 6 - - - 0 - - - - - Qt::Horizontal - - - QSizePolicy::Expanding - - - - 20 - 20 - - - - - - - - &Create - - - Alt+C - - - true - - - true - - - - - - - Cl&ose - - - Alt+O - - - true - - - - - + Primitive - - - 9 - - - 6 - - + + + + + + 0 + 0 + + + + 14 + + + + Plane + + + + + Box + + + + + Cylinder + + + + + Cone + + + + + Sphere + + + + + Ellipsoid + + + + + Torus + + + + + Wedge + + + + + Helix + + + + + Circle + + + + + Vertex + + + + + Edge + + + + + Parameter @@ -1464,196 +1470,6 @@ - - - - Qt::Horizontal - - - - 221 - 20 - - - - - - - - - 0 - 0 - - - - 14 - - - - Plane - - - - - Box - - - - - Cylinder - - - - - Cone - - - - - Sphere - - - - - Ellipsoid - - - - - Torus - - - - - Wedge - - - - - Helix - - - - - Circle - - - - - Vertex - - - - - Edge - - - - - - - - Position - - - - - - 0 - - - 6 - - - - - -2147480000.000000000000000 - - - 2147480000.000000000000000 - - - - - - - Z: - - - - - - - X: - - - - - - - Direction: - - - - - - - -2147480000.000000000000000 - - - 2147480000.000000000000000 - - - - - - - Y: - - - - - - - -1 - - - - - - - -2147480000.000000000000000 - - - 2147480000.000000000000000 - - - - - - - - - 3D View - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - @@ -1662,10 +1478,6 @@ comboBox1 - xPos - yPos - zPos - direction planeLength planeWidth boxLength @@ -1692,8 +1504,6 @@ torusAngle1 torusAngle2 torusAngle3 - createSolidButton - buttonClose @@ -1713,37 +1523,5 @@ - - buttonClose - clicked() - PartGui::DlgPrimitives - reject() - - - 254 - 282 - - - 44 - 268 - - - - - createSolidButton - clicked() - PartGui::DlgPrimitives - accept() - - - 160 - 276 - - - 8 - 277 - - - diff --git a/src/Mod/Part/Gui/Location.ui b/src/Mod/Part/Gui/Location.ui new file mode 100644 index 000000000..69f22d4dd --- /dev/null +++ b/src/Mod/Part/Gui/Location.ui @@ -0,0 +1,81 @@ + + + PartGui::Location + + + + 0 + 0 + 209 + 205 + + + + Location + + + true + + + + + + Position + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + 3D View + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + Gui::LocationWidget + QWidget +
Gui/InputVector.h
+
+
+ + +
diff --git a/src/Mod/Part/Gui/Makefile.am b/src/Mod/Part/Gui/Makefile.am index 4f9c63311..fe7d7a8dd 100644 --- a/src/Mod/Part/Gui/Makefile.am +++ b/src/Mod/Part/Gui/Makefile.am @@ -12,6 +12,7 @@ BUILT_SOURCES=\ ui_DlgPartImportIges.h \ ui_DlgPartImportStep.h \ ui_DlgPrimitives.h \ + ui_Location.h \ ui_DlgSettings3DViewPart.h \ ui_DlgSettingsGeneral.h \ ui_Mirroring.h \ @@ -220,6 +221,7 @@ EXTRA_DIST = \ DlgPartImportIges.ui \ DlgPartImportStep.ui \ DlgPrimitives.ui \ + Location.ui \ DlgSettings3DViewPart.ui \ DlgSettingsGeneral.ui \ Mirroring.ui \ diff --git a/src/Tools/plugins/widget/customwidgets.cpp b/src/Tools/plugins/widget/customwidgets.cpp index d46bd0541..6a2280377 100644 --- a/src/Tools/plugins/widget/customwidgets.cpp +++ b/src/Tools/plugins/widget/customwidgets.cpp @@ -115,7 +115,7 @@ LocationWidget::~LocationWidget() QSize LocationWidget::sizeHint() const { - return QSize(150,190); + return QSize(150,100); } void LocationWidget::changeEvent(QEvent* e)