diff --git a/src/Gui/Command.cpp b/src/Gui/Command.cpp index 330720b3b..db0bf9890 100644 --- a/src/Gui/Command.cpp +++ b/src/Gui/Command.cpp @@ -424,6 +424,16 @@ void Command::doCommand(DoCmd_Type eType,const char* sCmd,...) free (format); } +/// Run a App level Action +void Command::runCommand(DoCmd_Type eType,const char* sCmd) +{ + if (eType == Gui) + Gui::Application::Instance->macroManager()->addLine(MacroManager::Gui,sCmd); + else + Gui::Application::Instance->macroManager()->addLine(MacroManager::Base,sCmd); + Base::Interpreter().runString(sCmd); +} + void Command::copyVisual(const char* to, const char* attr, const char* from) { doCommand(Gui,"Gui.ActiveDocument.%s.%s=Gui.ActiveDocument.%s.%s", to, attr, from, attr); diff --git a/src/Gui/Command.h b/src/Gui/Command.h index 789c6e7c9..5cd3c3c54 100644 --- a/src/Gui/Command.h +++ b/src/Gui/Command.h @@ -234,6 +234,7 @@ public: static void blockCommand(bool); /// Run a App level Action static void doCommand(DoCmd_Type eType,const char* sCmd,...); + static void runCommand(DoCmd_Type eType,const char* sCmd); static void copyVisual(const char* to, const char* attr, const char* from); static void copyVisual(const char* to, const char* attr_to, const char* from, const char* attr_from); /// import an external module only once diff --git a/src/Gui/MainWindow.cpp b/src/Gui/MainWindow.cpp index 09f13d19b..6b34086d5 100644 --- a/src/Gui/MainWindow.cpp +++ b/src/Gui/MainWindow.cpp @@ -282,6 +282,7 @@ MainWindow::MainWindow(QWidget * parent, Qt::WFlags f) d->mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); d->mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); d->mdiArea->setOption(QMdiArea::DontMaximizeSubWindowOnActivation, false); + d->mdiArea->setActivationOrder(QMdiArea::ActivationHistoryOrder); QPixmap backgnd((const char**) background); d->mdiArea->setBackground(backgnd); setCentralWidget(d->mdiArea); diff --git a/src/Gui/Workbench.cpp b/src/Gui/Workbench.cpp index 91874b9f3..e173b22e2 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 d781792df..223766b58 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/Draft/importSVG.py b/src/Mod/Draft/importSVG.py index a45c3b5bf..138ed488a 100644 --- a/src/Mod/Draft/importSVG.py +++ b/src/Mod/Draft/importSVG.py @@ -592,35 +592,22 @@ class svgHandler(xml.sax.ContentHandler): path = [] point = [] command = None - #elif (len(point)==6) and (command=="cubic"): - elif (command=="cubic") and (((smooth==False) and (len(point)==6)) or (smooth==True and (len(point)==4))) : - if smooth: - if relative: - currentvec = lastvec.add(Vector(point[2],-point[3],0)) - pole2 = lastvec.add(Vector(point[0],-point[1],0)) - else: - currentvec = Vector(point[2],-point[3],0) - pole2 = Vector(point[0],-point[1],0) - if lastpole is not None and lastpole[0]=='cubic': - pole1 = lastvec.sub(lastpole[1]).add(lastvec) - else: - pole1 = lastvec - else: #not smooth - if relative: - currentvec = lastvec.add(Vector(point[4],-point[5],0)) - pole1 = lastvec.add(Vector(point[0],-point[1],0)) - pole2 = lastvec.add(Vector(point[2],-point[3],0)) - else: - currentvec = Vector(point[4],-point[5],0) - pole1 = Vector(point[0],-point[1],0) - pole2 = Vector(point[2],-point[3],0) - + elif (len(point)==6) and (command=="curve"): + if relative: + currentvec = lastvec.add(Vector(point[4],-point[5],0)) + pole1 = lastvec.add(Vector(point[0],-point[1],0)) + pole2 = lastvec.add(Vector(point[2],-point[3],0)) + else: + currentvec = Vector(point[4],-point[5],0) + pole1 = Vector(point[0],-point[1],0) + pole2 = Vector(point[2],-point[3],0) if not fcvec.equals(currentvec,lastvec): mainv = currentvec.sub(lastvec) pole1v = lastvec.add(pole1) pole2v = currentvec.add(pole2) - print "cubic curve data:",mainv.normalize(),pole1v.normalize(),pole2v.normalize() - if pole1.distanceToLine(lastvec,currentvec) < 10**(-1*Draft.precision()) and pole2.distanceToLine(lastvec,currentvec) < 10**(-1*Draft.precision()): + print "curve data:",mainv.normalize(),pole1v.normalize(),pole2v.normalize() + if (round(mainv.getAngle(pole1v),Draft.precision()) in [0,round(math.pi,Draft.precision())]) \ + and (round(mainv.getAngle(pole2v),Draft.precision()) in [0,round(math.pi,Draft.precision())]): print "straight segment" seg = Part.Line(lastvec,currentvec).toShape() else: diff --git a/src/Mod/Drawing/Gui/Command.cpp b/src/Mod/Drawing/Gui/Command.cpp index c8a9bf206..b4aa2640f 100644 --- a/src/Mod/Drawing/Gui/Command.cpp +++ b/src/Mod/Drawing/Gui/Command.cpp @@ -249,7 +249,7 @@ CmdDrawingNewView::CmdDrawingNewView() void CmdDrawingNewView::activated(int iMsg) { std::vector shapes = getSelection().getObjectsOfType(Part::Feature::getClassTypeId()); - if (shapes.size() != 1) { + if (shapes.empty()) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), QObject::tr("Select a Part object.")); return; @@ -262,19 +262,19 @@ void CmdDrawingNewView::activated(int iMsg) return; } - std::string FeatName = getUniqueObjectName("View"); std::string PageName = pages.front()->getNameInDocument(); - std::vector Sel = getSelection().getSelection(); - openCommand("Create view"); - doCommand(Doc,"App.activeDocument().addObject('Drawing::FeatureViewPart','%s')",FeatName.c_str()); - doCommand(Doc,"App.activeDocument().%s.Source = App.activeDocument().%s",FeatName.c_str(),shapes.front()->getNameInDocument()); - doCommand(Doc,"App.activeDocument().%s.Direction = (0.0,0.0,1.0)",FeatName.c_str()); - doCommand(Doc,"App.activeDocument().%s.X = 10.0",FeatName.c_str()); - doCommand(Doc,"App.activeDocument().%s.Y = 10.0",FeatName.c_str()); - doCommand(Doc,"App.activeDocument().%s.Scale = 1.0",FeatName.c_str()); - doCommand(Doc,"App.activeDocument().%s.addObject(App.activeDocument().%s)",PageName.c_str(),FeatName.c_str()); + for (std::vector::iterator it = shapes.begin(); it != shapes.end(); ++it) { + std::string FeatName = getUniqueObjectName("View"); + doCommand(Doc,"App.activeDocument().addObject('Drawing::FeatureViewPart','%s')",FeatName.c_str()); + doCommand(Doc,"App.activeDocument().%s.Source = App.activeDocument().%s",FeatName.c_str(),(*it)->getNameInDocument()); + doCommand(Doc,"App.activeDocument().%s.Direction = (0.0,0.0,1.0)",FeatName.c_str()); + doCommand(Doc,"App.activeDocument().%s.X = 10.0",FeatName.c_str()); + doCommand(Doc,"App.activeDocument().%s.Y = 10.0",FeatName.c_str()); + doCommand(Doc,"App.activeDocument().%s.Scale = 1.0",FeatName.c_str()); + doCommand(Doc,"App.activeDocument().%s.addObject(App.activeDocument().%s)",PageName.c_str(),FeatName.c_str()); + } updateActive(); commitCommand(); } diff --git a/src/Mod/Part/Gui/Command.cpp b/src/Mod/Part/Gui/Command.cpp index f4288f997..fdcfefc89 100644 --- a/src/Mod/Part/Gui/Command.cpp +++ b/src/Mod/Part/Gui/Command.cpp @@ -23,6 +23,7 @@ #include "PreCompiled.h" #ifndef _PreComp_ +# include # include # include # include @@ -295,17 +296,18 @@ void CmdPartCommon::activated(int iMsg) std::string FeatName = getUniqueObjectName("Common"); std::vector Sel = getSelection().getSelection(); - std::string ObjectBuf; + std::stringstream str; std::vector tempSelNames; + str << "App.activeDocument()." << FeatName << ".Shapes = ["; for (std::vector::iterator it = Sel.begin(); it != Sel.end(); ++it){ - ObjectBuf += std::string("App.activeDocument().") + it->FeatName + ","; + str << "App.activeDocument()." << it->FeatName << ","; tempSelNames.push_back(it->FeatName); } - ObjectBuf.erase(--ObjectBuf.end()); + str << "]"; openCommand("Common"); doCommand(Doc,"App.activeDocument().addObject(\"Part::MultiCommon\",\"%s\")",FeatName.c_str()); - doCommand(Doc,"App.activeDocument().%s.Shapes = [%s]",FeatName.c_str(),ObjectBuf.c_str()); + runCommand(Doc,str.str().c_str()); for (std::vector::iterator it = tempSelNames.begin(); it != tempSelNames.end(); ++it) doCommand(Gui,"Gui.activeDocument().%s.Visibility=False",it->c_str()); copyVisual(FeatName.c_str(), "ShapeColor", tempSelNames.front().c_str()); @@ -348,17 +350,18 @@ void CmdPartFuse::activated(int iMsg) std::string FeatName = getUniqueObjectName("Fusion"); std::vector Sel = getSelection().getSelection(); - std::string ObjectBuf; + std::stringstream str; std::vector tempSelNames; + str << "App.activeDocument()." << FeatName << ".Shapes = ["; for (std::vector::iterator it = Sel.begin(); it != Sel.end(); ++it){ - ObjectBuf += std::string("App.activeDocument().") + it->FeatName + ","; + str << "App.activeDocument()." << it->FeatName << ","; tempSelNames.push_back(it->FeatName); } - ObjectBuf.erase(--ObjectBuf.end()); + str << "]"; openCommand("Fusion"); doCommand(Doc,"App.activeDocument().addObject(\"Part::MultiFuse\",\"%s\")",FeatName.c_str()); - doCommand(Doc,"App.activeDocument().%s.Shapes = [%s]",FeatName.c_str(),ObjectBuf.c_str()); + runCommand(Doc,str.str().c_str()); for (std::vector::iterator it = tempSelNames.begin(); it != tempSelNames.end(); ++it) doCommand(Gui,"Gui.activeDocument().%s.Visibility=False",it->c_str()); copyVisual(FeatName.c_str(), "ShapeColor", tempSelNames.front().c_str()); diff --git a/src/Mod/Part/Gui/DlgPrimitives.cpp b/src/Mod/Part/Gui/DlgPrimitives.cpp index 04b5462f9..83b6b53cc 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,130 @@ using namespace PartGui; +namespace PartGui { + +const char* gce_ErrorStatusText(gce_ErrorType et) +{ + switch (et) + { + case gce_Done: + return "Construction was successful"; + case gce_ConfusedPoints: + return "Two points are coincident"; + case gce_NegativeRadius: + return "Radius value is negative"; + case gce_ColinearPoints: + return "Three points are collinear"; + case gce_IntersectionError: + return "Intersection cannot be computed"; + case gce_NullAxis: + return "Axis is undefined"; + case gce_NullAngle: + return "Angle value is invalid (usually null)"; + case gce_NullRadius: + return "Radius is null"; + case gce_InvertAxis: + return "Axis value is invalid"; + case gce_BadAngle: + return "Angle value is invalid"; + case gce_InvertRadius: + return "Radius value is incorrect (usually with respect to another radius)"; + case gce_NullFocusLength: + return "Focal distance is null"; + case gce_NullVector: + return "Vector is null"; + case gce_BadEquation: + return "Coefficients are incorrect (applies to the equation of a geometric object)"; + default: + return "Creation of geometry failed"; + } +} + +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::Exception& 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]); + if (!arc.IsDone()) + throw Base::Exception(gce_ErrorStatusText(arc.Status())); + 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 +267,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 +575,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 d485047df..178dff08a 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 8f227b6fb..6138066ea 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 + + + + + +