From 9f8bb2dc98349f37477e283f1febbcec7198f98b Mon Sep 17 00:00:00 2001 From: wmayer Date: Wed, 4 Jan 2012 16:17:57 +0000 Subject: [PATCH] 0000548: 3D Circle from three points in Part wb git-svn-id: https://free-cad.svn.sourceforge.net/svnroot/free-cad/trunk@5387 e8eeb9e2-ec13-0410-a4a9-efa5cf37419d --- src/Gui/Workbench.cpp | 2 +- src/Gui/Workbench.h | 2 +- src/Mod/Part/Gui/DlgPrimitives.cpp | 155 +- src/Mod/Part/Gui/DlgPrimitives.h | 29 + src/Mod/Part/Gui/DlgPrimitives.ui | 3233 ++++++++++++++-------------- 5 files changed, 1807 insertions(+), 1614 deletions(-) diff --git a/src/Gui/Workbench.cpp b/src/Gui/Workbench.cpp index 91874b9f3c..e173b22e2a 100644 --- a/src/Gui/Workbench.cpp +++ b/src/Gui/Workbench.cpp @@ -341,7 +341,7 @@ PyObject* Workbench::getPyObject() return new WorkbenchPy(this); } -void Workbench::addTaskWatcher(std::vector &Watcher) +void Workbench::addTaskWatcher(const std::vector &Watcher) { Gui::TaskView::TaskView* taskView = Control().taskPanel(); if (taskView) diff --git a/src/Gui/Workbench.h b/src/Gui/Workbench.h index d781792df0..223766b58b 100644 --- a/src/Gui/Workbench.h +++ b/src/Gui/Workbench.h @@ -90,7 +90,7 @@ public: virtual void deactivated(); /// helper to add TaskWatcher to the TaskView - void addTaskWatcher(std::vector &Watcher); + void addTaskWatcher(const std::vector &Watcher); /// remove the added TaskWatcher void removeTaskWatcher(void); diff --git a/src/Mod/Part/Gui/DlgPrimitives.cpp b/src/Mod/Part/Gui/DlgPrimitives.cpp index 04b5462f9c..1aae98b0ba 100644 --- a/src/Mod/Part/Gui/DlgPrimitives.cpp +++ b/src/Mod/Part/Gui/DlgPrimitives.cpp @@ -24,15 +24,22 @@ #include "PreCompiled.h" #ifndef _PreComp_ #include +#include #include #include #include +#include +#include +#include +#include +#include #include #include #endif #include #include +#include #include #include #include @@ -47,6 +54,91 @@ using namespace PartGui; +namespace PartGui { + +void Picker::createPrimitive(QWidget* widget, const QString& descr, Gui::Document* doc) +{ + try { + App::Document* app = doc->getDocument(); + QString cmd = this->command(app); + + // Execute the Python block + doc->openCommand(descr.toUtf8()); + Gui::Command::doCommand(Gui::Command::Doc, (const char*)cmd.toAscii()); + doc->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(widget, descr, QString::fromLatin1(e.what())); + } +} + +QString Picker::toPlacement(const gp_Ax2& axis) const +{ + gp_Dir dir = axis.Direction(); + gp_Pnt pnt = gp_Pnt(0.0,0.0,0.0); + gp_Ax3 ax3(pnt, dir, axis.XDirection()); + + gp_Trsf Trf; + Trf.SetTransformation(ax3); + Trf.Invert(); + + gp_XYZ theAxis(0,0,1); + Standard_Real theAngle = 0.0; + Trf.GetRotation(theAxis,theAngle); + + Base::Rotation rot(Base::convertTo(theAxis), theAngle); + gp_Pnt loc = axis.Location(); + + return QString::fromAscii("Base.Placement(Base.Vector(%1,%2,%3),Base.Rotation(%4,%5,%6,%7))") + .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); +} + +class CircleFromThreePoints : public Picker +{ +public: + CircleFromThreePoints() : Picker() + { + } + bool pickedPoint(const SoPickedPoint * point) + { + SbVec3f pnt = point->getPoint(); + points.push_back(gp_Pnt(pnt[0],pnt[1],pnt[2])); + return points.size() == 3; + } + QString command(App::Document* doc) const + { + GC_MakeArcOfCircle arc(points[0], points[1], points[2]); + Handle_Geom_TrimmedCurve trim = arc.Value(); + Handle_Geom_Circle circle = Handle_Geom_Circle::DownCast(trim->BasisCurve()); + + QString name = QString::fromAscii(doc->getUniqueObjectName("Circle").c_str()); + return 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(circle->Radius(),0,'f',2) + .arg(Base::toDegrees(trim->FirstParameter()),0,'f',2) + .arg(Base::toDegrees(trim->LastParameter ()),0,'f',2) + .arg(toPlacement(circle->Position())); + } + +private: + std::vector points; +}; + +} + /* TRANSLATOR PartGui::DlgPrimitives */ DlgPrimitives::DlgPrimitives(QWidget* parent) @@ -136,6 +228,66 @@ DlgPrimitives::~DlgPrimitives() { } +void DlgPrimitives::pickCallback(void * ud, SoEventCallback * n) +{ + 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->setHandled(); + if (mbe->getButton() == SoMouseButtonEvent::BUTTON1) { + if (mbe->getState() == SoButtonEvent::DOWN) { + const SoPickedPoint * point = n->getPickedPoint(); + if (point) { + Picker* pick = reinterpret_cast(ud); + if (pick->pickedPoint(point)) { + pick->loop.exit(0); + } + } + } + } + else if (mbe->getButton() == SoMouseButtonEvent::BUTTON2) { + if (mbe->getState() == SoButtonEvent::UP) { + Picker* pick = reinterpret_cast(ud); + pick->loop.exit(1); + } + } +} + +void DlgPrimitives::executeCallback(Picker* p) +{ + Gui::Document* doc = Gui::Application::Instance->activeDocument(); + if (!doc) { + return; + } + + Gui::View3DInventor* view = static_cast(doc->getActiveView()); + if (view) { + Gui::View3DInventorViewer* viewer = view->getViewer(); + if (!viewer->isEditing()) { + viewer->setEditing(true); + viewer->setRedirectToSceneGraph(true); + viewer->addEventCallback(SoMouseButtonEvent::getClassTypeId(), pickCallback, p); + this->setDisabled(true); + int ret = p->loop.exec(); + this->setEnabled(true); + viewer->setEditing(false); + viewer->setRedirectToSceneGraph(false); + viewer->removeEventCallback(SoMouseButtonEvent::getClassTypeId(), pickCallback, p); + + if (ret == 0) { + p->createPrimitive(this, ui.comboBox1->currentText(), doc); + } + } + } +} + +void DlgPrimitives::on_buttonCircleFromThreePoints_clicked() +{ + CircleFromThreePoints pp; + executeCallback(&pp); +} + void DlgPrimitives::createPrimitive(const QString& placement) { try { @@ -384,9 +536,6 @@ void DlgPrimitives::createPrimitive(const QString& placement) Location::Location(QWidget* parent) { ui.setupUi(this); - - connect(ui.viewPositionButton, SIGNAL(clicked()), - this, SLOT(on_viewPositionButton_clicked())); } Location::~Location() diff --git a/src/Mod/Part/Gui/DlgPrimitives.h b/src/Mod/Part/Gui/DlgPrimitives.h index d485047df4..178dff08aa 100644 --- a/src/Mod/Part/Gui/DlgPrimitives.h +++ b/src/Mod/Part/Gui/DlgPrimitives.h @@ -23,14 +23,36 @@ #ifndef PARTGUI_DLGPRIMITIVES_H #define PARTGUI_DLGPRIMITIVES_H +#include #include #include #include "ui_DlgPrimitives.h" #include "ui_Location.h" +class gp_Ax2; class SoEventCallback; +namespace App { class Document; } +namespace Gui { class Document; } namespace PartGui { + +class Picker +{ +public: + Picker() + { + } + virtual ~Picker() + { + } + + virtual bool pickedPoint(const SoPickedPoint * point) = 0; + virtual QString command(App::Document*) const = 0; + void createPrimitive(QWidget* widget, const QString&, Gui::Document*); + QString toPlacement(const gp_Ax2&) const; + + QEventLoop loop; +}; class DlgPrimitives : public QWidget { @@ -41,6 +63,13 @@ public: ~DlgPrimitives(); void createPrimitive(const QString&); +private Q_SLOTS: + void on_buttonCircleFromThreePoints_clicked(); + +private: + static void pickCallback(void * ud, SoEventCallback * n); + void executeCallback(Picker*); + private: Ui_DlgPrimitives ui; }; diff --git a/src/Mod/Part/Gui/DlgPrimitives.ui b/src/Mod/Part/Gui/DlgPrimitives.ui index 8f227b6fbd..6138066ea9 100644 --- a/src/Mod/Part/Gui/DlgPrimitives.ui +++ b/src/Mod/Part/Gui/DlgPrimitives.ui @@ -6,7 +6,7 @@ 0 0 - 285 + 260 370 @@ -16,1623 +16,1638 @@ true - + - - - Primitive + + + + 0 + 0 + - - - - - - 0 - 0 - - - - 14 - - - - Plane - - - - - Box - - - - - Cylinder - - - - - Cone - - - - - Sphere - - - - - Ellipsoid - - - - - Torus - - - - - Wedge - - - - - Helix - - - - - Circle - - - - - Ellipse - - - - - Point - - - - - Line - - - - + + 14 + + + + Plane + + + + + Box + + + + + Cylinder + + + + + Cone + + + + + Sphere + + + + + Ellipsoid + + + + + Torus + + + + + Wedge + + + + + Helix + + + + + Circle + + + + + Ellipse + + + + + Point + + + + + Line + + + + + + + + Parameter + + + + 9 + + + 6 + - - - Parameter + + + 0 - - - 9 - - - 6 - - - - - 0 - - - - - 9 - - - 6 - - - - - 0 - - - 6 - - - - - 0.000000000000000 - - - 1000.000000000000000 - - - 10.000000000000000 - - - - - - - Width: - - - - - - - Length: - - - - - - - 1000.000000000000000 - - - 10.000000000000000 - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - + + + + 9 + + + 6 + + + + + 0 + + + 6 + + + + + 0.000000000000000 + + + 1000.000000000000000 + + + 10.000000000000000 + + + + + + + Width: + + + + + + + Length: + + + + + + + 1000.000000000000000 + + + 10.000000000000000 + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + 9 + + + 6 + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 51 + + + + + + + + 0 + + + 6 + + + + + Height: + + + + + + + 1000.000000000000000 + + + 10.000000000000000 + + + + + + + 0.000000000000000 + + + 1000.000000000000000 + + + 10.000000000000000 + + + + + + + Length: + + + + + + + 1000.000000000000000 + + + 10.000000000000000 + + + + + + + Width: + + + + + + + + + + + 9 + + + 6 + + + + + 6 + + + 0 + + + + + Angle: + + + + + + + 360.000000000000000 + + + 360.000000000000000 + + + + + + + + + QFrame::HLine + + + QFrame::Sunken + - - - - 9 - - - 6 - - - - - Qt::Vertical - - - QSizePolicy::Expanding - - - - 20 - 51 - - - - - - - - 0 - - - 6 - - - - - Height: - - - - - - - 1000.000000000000000 - - - 10.000000000000000 - - - - - - - 0.000000000000000 - - - 1000.000000000000000 - - - 10.000000000000000 - - - - - - - Length: - - - - - - - 1000.000000000000000 - - - 10.000000000000000 - - - - - - - Width: - - - - - - + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 31 + 81 + + + + + + + + 0 + + + 6 + + + + + Radius: + + + + + + + 1000.000000000000000 + + + 2.000000000000000 + + + + + + + 1000.000000000000000 + + + 10.000000000000000 + + + + + + + Height: + + + + + + + + + + + 9 + + + 6 + + + + + 6 + + + 0 + + + + + Angle: + + + + + + + 360.000000000000000 + + + 360.000000000000000 + + + + + + + + + QFrame::HLine + + + QFrame::Sunken + - - - - 9 - - - 6 - - - - - 6 - - - 0 - - - - - Angle: - - - - - - - 360.000000000000000 - - - 360.000000000000000 - - - - - - - - - QFrame::HLine - - - QFrame::Sunken - - - - - - - Qt::Vertical - - - QSizePolicy::Expanding - - - - 31 - 81 - - - - - - - - 0 - - - 6 - - - - - Radius: - - - - - - - 1000.000000000000000 - - - 2.000000000000000 - - - - - - - 1000.000000000000000 - - - 10.000000000000000 - - - - - - - Height: - - - - - - + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 31 + 91 + + + + + + + + 0 + + + 6 + + + + + Height: + + + + + + + 1000.000000000000000 + + + 4.000000000000000 + + + + + + + 1000.000000000000000 + + + 10.000000000000000 + + + + + + + 1000.000000000000000 + + + 2.000000000000000 + + + + + + + Radius 1: + + + + + + + Radius 2: + + + + + + + + + + + 9 + + + 6 + + + + + QFrame::HLine + + + QFrame::Sunken + - - - - 9 - - - 6 - - - - - 6 - - - 0 - - - - - Angle: - - - - - - - 360.000000000000000 - - - 360.000000000000000 - - - - - - - - - QFrame::HLine - - - QFrame::Sunken - - - - - - - Qt::Vertical - - - QSizePolicy::Expanding - - - - 31 - 91 - - - - - - - - 0 - - - 6 - - - - - Height: - - - - - - - 1000.000000000000000 - - - 4.000000000000000 - - - - - - - 1000.000000000000000 - - - 10.000000000000000 - - - - - - - 1000.000000000000000 - - - 2.000000000000000 - - - - - - - Radius 1: - - - - - - - Radius 2: - - - - - - + + + + + 0 + + + 6 + + + + + U parametric: + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 81 + 20 + + + + + + + + -90.000000000000000 + + + 90.000000000000000 + + + -90.000000000000000 + + + + + + + V parametric: + + + + + + + -90.000000000000000 + + + 90.000000000000000 + + + 90.000000000000000 + + + + + + + 360.000000000000000 + + + 360.000000000000000 + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 21 + 151 + + + + + + + + 6 + + + 0 + + + + + Radius: + + + + + + + 1000.000000000000000 + + + 5.000000000000000 + + + + + + + + + + + 9 + + + 6 + + + + + Qt::Vertical + + + + 20 + 20 + + + + + + + + QFrame::HLine + + + QFrame::Sunken + - - - - 9 - - - 6 - - - - - QFrame::HLine - - - QFrame::Sunken - - - - - - - 0 - - - 6 - - - - - U parametric: - - - - - - - Qt::Horizontal - - - QSizePolicy::Preferred - - - - 81 - 20 - - - - - - - - -90.000000000000000 - - - 90.000000000000000 - - - -90.000000000000000 - - - - - - - V parametric: - - - - - - - -90.000000000000000 - - - 90.000000000000000 - - - 90.000000000000000 - - - - - - - 360.000000000000000 - - - 360.000000000000000 - - - - - - - - - Qt::Vertical - - - QSizePolicy::Expanding - - - - 21 - 151 - - - - - - - - 6 - - - 0 - - - - - Radius: - - - - - - - 1000.000000000000000 - - - 5.000000000000000 - - - - - - + + + + + 0 + + + 6 + + + + + 1000.000000000000000 + + + 4.000000000000000 + + + + + + + 1000.000000000000000 + + + 2.000000000000000 + + + + + + + Radius 1: + + + + + + + Radius 2: + + + + + + + + + 0 + + + 6 + + + + + U parametric: + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 81 + 20 + + + + + + + + -90.000000000000000 + + + 90.000000000000000 + + + -90.000000000000000 + + + + + + + V parametric: + + + + + + + -90.000000000000000 + + + 90.000000000000000 + + + 90.000000000000000 + + + + + + + 360.000000000000000 + + + 360.000000000000000 + + + + + + + + + + + 9 + + + 6 + + + + + QFrame::HLine + + + QFrame::Sunken + - - - - 9 - - - 6 - - - - - Qt::Vertical - - - - 20 - 20 - - - - - - - - QFrame::HLine - - - QFrame::Sunken - - - - - - - 0 - - - 6 - - - - - 1000.000000000000000 - - - 4.000000000000000 - - - - - - - 1000.000000000000000 - - - 2.000000000000000 - - - - - - - Radius 1: - - - - - - - Radius 2: - - - - - - - - - 0 - - - 6 - - - - - U parametric: - - - - - - - Qt::Horizontal - - - QSizePolicy::Preferred - - - - 81 - 20 - - - - - - - - -90.000000000000000 - - - 90.000000000000000 - - - -90.000000000000000 - - - - - - - V parametric: - - - - - - - -90.000000000000000 - - - 90.000000000000000 - - - 90.000000000000000 - - - - - - - 360.000000000000000 - - - 360.000000000000000 - - - - - - - - - - - 9 - - - 6 - - - - - QFrame::HLine - - - QFrame::Sunken - - - - - - - 0 - - - 6 - - - - - U parametric: - - - - - - - Qt::Horizontal - - - QSizePolicy::Preferred - - - - 81 - 20 - - - - - - - - -180.000000000000000 - - - 180.000000000000000 - - - -180.000000000000000 - - - - - - - V parametric: - - - - - - - -180.000000000000000 - - - 180.000000000000000 - - - 180.000000000000000 - - - - - - - 360.000000000000000 - - - 360.000000000000000 - - - - - - - - - Qt::Vertical - - - QSizePolicy::Expanding - - - - 20 - 91 - - - - - - - - 0 - - - 6 - - - - - Radius 2: - - - - - - - Radius 1: - - - - - - - 1000.000000000000000 - - - 2.000000000000000 - - - - - - - 1000.000000000000000 - - - 10.000000000000000 - - - - - - - - - - - - - - - X min/max: - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - 10.000000000000000 - - - - - - - Y min/max: - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - 10.000000000000000 - - - - - - - Z min/max: - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - 10.000000000000000 - - - - - - - X2 min/max: - - - - - - - - 0 - 0 - - - - 2.000000000000000 - - - - - - - - 0 - 0 - - - - 8.000000000000000 - - - - - - - Z2 min/max: - - - - - - - - 0 - 0 - - - - 2.000000000000000 - - - - - - - - 0 - 0 - - - - 8.000000000000000 - - - - - - - - - Qt::Vertical - - - - 20 - 81 - - - - - - - - - - 9 - - - 6 - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - 0 - - - 6 - - - - - Radius: - - - - - - - Pitch: - - - - - - - 1000.000000000000000 - - - 1.000000000000000 - - - - - - - 1000.000000000000000 - - - 1.000000000000000 - - - - - - - 1000.000000000000000 - - - 2.000000000000000 - - - - - - - Height: - - - - - - - Angle: - - - - - - - 0.000000000000000 - - - 89.989999999999995 - - - 1.000000000000000 - - - 0.000000000000000 - - - - - - - - - - - - - 0 - - - 6 - - - - - Radius: - - - - - - - 1000000000.000000000000000 - - - 2.000000000000000 - - - - - - - Angle 1: - - - - - - - 360.000000000000000 - - - 0.000000000000000 - - - - - - - Angle 2: - - - - - - - 0.000000000000000 - - - 360.000000000000000 - - - 1.000000000000000 - - - 360.000000000000000 - - - - - - - - - Qt::Vertical - - - - 20 - 95 - - - - - - - - - - - - - - Major radius: - - - - - - - 1000000000.000000000000000 - - - 4.000000000000000 - - - - - - - Minor radius: - - - - - - - 1000000000.000000000000000 - - - 2.000000000000000 - - - - - - - Angle 1: - - - - - - - 360.000000000000000 - - - 0.000000000000000 - - - - - - - Angle 2: - - - - - - - 0.000000000000000 - - - 360.000000000000000 - - - 1.000000000000000 - - - 360.000000000000000 - - - - - - - - - Qt::Vertical - - - - 20 - 131 - - - - - - - - - - - - - - - - - - - - - - - X: - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - Y: - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - Z: - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - - - Qt::Vertical - - - - 20 - 139 - - - - - - - - - - - - - - X: - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - Y: - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - Z: - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - Qt::Horizontal - - - - - - - End point - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - Start point - - - - - - - X: - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - Y: - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - Z: - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - 0.000000000000000 - - - - - - - 0.000000000000000 - - - - - - - - - - 0.000000000000000 - - - - - - - 1.000000000000000 - - - - - - - 1.000000000000000 - - - - - - - 1.000000000000000 - - - - - - - - - Qt::Vertical - - - - 20 - 0 - - - - - - - - - + + + + + 0 + + + 6 + + + + + U parametric: + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 81 + 20 + + + + + + + + -180.000000000000000 + + + 180.000000000000000 + + + -180.000000000000000 + + + + + + + V parametric: + + + + + + + -180.000000000000000 + + + 180.000000000000000 + + + 180.000000000000000 + + + + + + + 360.000000000000000 + + + 360.000000000000000 + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 91 + + + + + + + + 0 + + + 6 + + + + + Radius 2: + + + + + + + Radius 1: + + + + + + + 1000.000000000000000 + + + 2.000000000000000 + + + + + + + 1000.000000000000000 + + + 10.000000000000000 + + + + + + + + + + + + + + + X min/max: + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + 10.000000000000000 + + + + + + + Y min/max: + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + 10.000000000000000 + + + + + + + Z min/max: + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + 10.000000000000000 + + + + + + + X2 min/max: + + + + + + + + 0 + 0 + + + + 2.000000000000000 + + + + + + + + 0 + 0 + + + + 8.000000000000000 + + + + + + + Z2 min/max: + + + + + + + + 0 + 0 + + + + 2.000000000000000 + + + + + + + + 0 + 0 + + + + 8.000000000000000 + + + + + + + + + Qt::Vertical + + + + 20 + 81 + + + + + + + + + + 9 + + + 6 + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + 0 + + + 6 + + + + + Radius: + + + + + + + Pitch: + + + + + + + 1000.000000000000000 + + + 1.000000000000000 + + + + + + + 1000.000000000000000 + + + 1.000000000000000 + + + + + + + 1000.000000000000000 + + + 2.000000000000000 + + + + + + + Height: + + + + + + + Angle: + + + + + + + 0.000000000000000 + + + 89.989999999999995 + + + 1.000000000000000 + + + 0.000000000000000 + + + + + + + + + + + + + 0 + + + 6 + + + + + Radius: + + + + + + + 1000000000.000000000000000 + + + 2.000000000000000 + + + + + + + Angle 1: + + + + + + + 360.000000000000000 + + + 0.000000000000000 + + + + + + + Angle 2: + + + + + + + 0.000000000000000 + + + 360.000000000000000 + + + 1.000000000000000 + + + 360.000000000000000 + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + From three points + + + + + + + + + Qt::Vertical + + + + 20 + 95 + + + + + + + + + + + + + + Major radius: + + + + + + + 1000000000.000000000000000 + + + 4.000000000000000 + + + + + + + Minor radius: + + + + + + + 1000000000.000000000000000 + + + 2.000000000000000 + + + + + + + Angle 1: + + + + + + + 360.000000000000000 + + + 0.000000000000000 + + + + + + + Angle 2: + + + + + + + 0.000000000000000 + + + 360.000000000000000 + + + 1.000000000000000 + + + 360.000000000000000 + + + + + + + + + Qt::Vertical + + + + 20 + 131 + + + + + + + + + + + + + + + + + + + + + + + X: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + Y: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + Z: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + + + Qt::Vertical + + + + 20 + 139 + + + + + + + + + + + + + + X: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + Y: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + Z: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + Qt::Horizontal + + + + + + + End point + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + Start point + + + + + + + X: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + Y: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + Z: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + 0.000000000000000 + + + + + + + 0.000000000000000 + + + + + + + + + + 0.000000000000000 + + + + + + + 1.000000000000000 + + + + + + + 1.000000000000000 + + + + + + + 1.000000000000000 + + + + + + + + + Qt::Vertical + + + + 20 + 0 + + + + + +