/*************************************************************************** * Copyright (c) 2007 Werner Mayer * * * * This file is part of the FreeCAD CAx development system. * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Library General Public * * License as published by the Free Software Foundation; either * * version 2 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU Library General Public License for more details. * * * * You should have received a copy of the GNU Library General Public * * License along with this library; see the file COPYING.LIB. If not, * * write to the Free Software Foundation, Inc., 59 Temple Place, * * Suite 330, Boston, MA 02111-1307, USA * * * ***************************************************************************/ #include "PreCompiled.h" #ifndef _PreComp_ #include #include #include #include #include #include #include #include #include #include #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "DlgPrimitives.h" #include "ui_DlgPrimitives.h" #include "ui_Location.h" using namespace PartGui; namespace PartGui { QString getAutoGroupCommandStr(QString objectName) // Helper function to get the python code to add the newly created object to the active Part object if present { App::Part* activePart = Gui::Application::Instance->activeView()->getActiveObject("part"); if (activePart) { QString activeObjectName = QString::fromLatin1(activePart->getNameInDocument()); return QString::fromLatin1("App.ActiveDocument.getObject('%1\')." "addObject(App.ActiveDocument.getObject('%2\'))\n") .arg(activeObjectName) .arg(objectName); } return QString::fromLatin1("# Object %1 created at document root").arg(objectName); } 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::runCommand(Gui::Command::Doc, cmd.toLatin1()); doc->commitCommand(); Gui::Command::runCommand(Gui::Command::Doc, "App.ActiveDocument.recompute()"); Gui::Command::runCommand(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::fromLatin1("Base.Placement(Base.Vector(%1,%2,%3),Base.Rotation(%4,%5,%6,%7))") .arg(loc.X(),0,'g',Base::UnitsApi::getDecimals()) .arg(loc.Y(),0,'g',Base::UnitsApi::getDecimals()) .arg(loc.Z(),0,'g',Base::UnitsApi::getDecimals()) .arg(rot[0],0,'g',Base::UnitsApi::getDecimals()) .arg(rot[1],0,'g',Base::UnitsApi::getDecimals()) .arg(rot[2],0,'g',Base::UnitsApi::getDecimals()) .arg(rot[3],0,'g',Base::UnitsApi::getDecimals()); } 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::CADKernelError(gce_ErrorStatusText(arc.Status())); Handle(Geom_TrimmedCurve) trim = arc.Value(); Handle(Geom_Circle) circle = Handle(Geom_Circle)::DownCast(trim->BasisCurve()); QString name = QString::fromLatin1(doc->getUniqueObjectName("Circle").c_str()); return QString::fromLatin1( "App.ActiveDocument.addObject(\"Part::Circle\",\"%1\")\n" "App.ActiveDocument.%1.Radius=%2\n" "App.ActiveDocument.%1.Angle1=%3\n" "App.ActiveDocument.%1.Angle2=%4\n" "App.ActiveDocument.%1.Placement=%5\n") .arg(name) .arg(circle->Radius(),0,'g',Base::UnitsApi::getDecimals()) .arg(Base::toDegrees(trim->FirstParameter()),0,'g',Base::UnitsApi::getDecimals()) .arg(Base::toDegrees(trim->LastParameter ()),0,'g',Base::UnitsApi::getDecimals()) .arg(toPlacement(circle->Position())); } private: std::vector points; }; } /* TRANSLATOR PartGui::DlgPrimitives */ DlgPrimitives::DlgPrimitives(QWidget* parent, Part::Primitive* feature) : QWidget(parent) , ui(new Ui_DlgPrimitives) , featurePtr(feature) { ui->setupUi(this); Gui::Command::doCommand(Gui::Command::Doc, "from FreeCAD import Base"); Gui::Command::doCommand(Gui::Command::Doc, "import Part,PartGui"); // set limits // // plane ui->planeLength->setRange(0, INT_MAX); ui->planeWidth->setRange(0, INT_MAX); // box ui->boxLength->setRange(0, INT_MAX); ui->boxWidth->setRange(0, INT_MAX); ui->boxHeight->setRange(0, INT_MAX); // cylinder ui->cylinderRadius->setRange(0, INT_MAX); ui->cylinderHeight->setRange(0, INT_MAX); ui->cylinderAngle->setRange(0, 360); // cone ui->coneRadius1->setRange(0, INT_MAX); ui->coneRadius2->setRange(0, INT_MAX); ui->coneHeight->setRange(0, INT_MAX); ui->coneAngle->setRange(0, 360); // sphere ui->sphereRadius->setRange(0, INT_MAX); ui->sphereAngle1->setRange(-90, 90); ui->sphereAngle2->setRange(-90, 90); ui->sphereAngle3->setRange(0, 360); // ellipsoid ui->ellipsoidRadius1->setRange(0, INT_MAX); ui->ellipsoidRadius2->setRange(0, INT_MAX); ui->ellipsoidRadius3->setRange(0, INT_MAX); ui->ellipsoidAngle1->setRange(-90, 90); ui->ellipsoidAngle2->setRange(-90, 90); ui->ellipsoidAngle3->setRange(0, 360); // torus ui->torusRadius1->setRange(0, INT_MAX); ui->torusRadius2->setRange(0, INT_MAX); ui->torusAngle1->setRange(-180, 180); ui->torusAngle2->setRange(-180, 180); ui->torusAngle3->setRange(0, 360); // prism ui->prismCircumradius->setRange(0, INT_MAX); ui->prismHeight->setRange(0, INT_MAX); // wedge ui->wedgeXmin->setMinimum(INT_MIN); ui->wedgeXmin->setMaximum(INT_MAX); ui->wedgeYmin->setMinimum(INT_MIN); ui->wedgeYmin->setMaximum(INT_MAX); ui->wedgeZmin->setMinimum(INT_MIN); ui->wedgeZmin->setMaximum(INT_MAX); ui->wedgeX2min->setMinimum(INT_MIN); ui->wedgeX2min->setMaximum(INT_MAX); ui->wedgeZ2min->setMinimum(INT_MIN); ui->wedgeZ2min->setMaximum(INT_MAX); ui->wedgeXmax->setMinimum(INT_MIN); ui->wedgeXmax->setMaximum(INT_MAX); ui->wedgeYmax->setMinimum(INT_MIN); ui->wedgeYmax->setMaximum(INT_MAX); ui->wedgeZmax->setMinimum(INT_MIN); ui->wedgeZmax->setMaximum(INT_MAX); ui->wedgeX2max->setMinimum(INT_MIN); ui->wedgeX2max->setMaximum(INT_MAX); ui->wedgeZ2max->setMinimum(INT_MIN); ui->wedgeZ2max->setMaximum(INT_MAX); // helix ui->helixPitch->setRange(0, INT_MAX); ui->helixHeight->setRange(0, INT_MAX); ui->helixRadius->setRange(0, INT_MAX); ui->helixAngle->setRange(-90, 90); // circle ui->circleRadius->setRange(0, INT_MAX); ui->circleAngle1->setRange(0, 360); ui->circleAngle2->setRange(0, 360); // ellipse ui->ellipseMajorRadius->setRange(0, INT_MAX); ui->ellipseMinorRadius->setRange(0, INT_MAX); ui->ellipseAngle1->setRange(0, 360); ui->ellipseAngle2->setRange(0, 360); // vertex ui->vertexX->setMaximum(INT_MAX); ui->vertexY->setMaximum(INT_MAX); ui->vertexZ->setMaximum(INT_MAX); ui->vertexX->setMinimum(INT_MIN); ui->vertexY->setMinimum(INT_MIN); ui->vertexZ->setMinimum(INT_MIN); // line ui->edgeX1->setMaximum(INT_MAX); ui->edgeX1->setMinimum(INT_MIN); ui->edgeY1->setMaximum(INT_MAX); ui->edgeY1->setMinimum(INT_MIN); ui->edgeZ1->setMaximum(INT_MAX); ui->edgeZ1->setMinimum(INT_MIN); ui->edgeX2->setMaximum(INT_MAX); ui->edgeX2->setMinimum(INT_MIN); ui->edgeY2->setMaximum(INT_MAX); ui->edgeY2->setMinimum(INT_MIN); ui->edgeZ2->setMaximum(INT_MAX); ui->edgeZ2->setMinimum(INT_MIN); // RegularPolygon ui->regularPolygonCircumradius->setRange(0, INT_MAX); // fill the dialog with data if the primitives already exists if (feature) { // must be the same order as of the stacked widget std::vector types; types.emplace_back(Part::Plane::getClassTypeId()); types.emplace_back(Part::Box::getClassTypeId()); types.emplace_back(Part::Cylinder::getClassTypeId()); types.emplace_back(Part::Cone::getClassTypeId()); types.emplace_back(Part::Sphere::getClassTypeId()); types.emplace_back(Part::Ellipsoid::getClassTypeId()); types.emplace_back(Part::Torus::getClassTypeId()); types.emplace_back(Part::Prism::getClassTypeId()); types.emplace_back(Part::Wedge::getClassTypeId()); types.emplace_back(Part::Helix::getClassTypeId()); types.emplace_back(Part::Spiral::getClassTypeId()); types.emplace_back(Part::Circle::getClassTypeId()); types.emplace_back(Part::Ellipse::getClassTypeId()); types.emplace_back(Part::Vertex::getClassTypeId()); types.emplace_back(Part::Line::getClassTypeId()); types.emplace_back(Part::RegularPolygon::getClassTypeId()); Base::Type type = feature->getTypeId(); int index = std::distance(types.begin(), std::find(types.begin(), types.end(), type)); ui->PrimitiveTypeCB->setCurrentIndex(index); ui->widgetStack2->setCurrentIndex(index); // if existing, the primitive type can not be changed by the user ui->PrimitiveTypeCB->setDisabled(feature != nullptr); // ToDo: connect signal if there is a preview of primitives available // read values from the properties if (type == Part::Plane::getClassTypeId()) { Part::Plane* plane = static_cast(feature); ui->planeLength->setValue(plane->Length.getQuantityValue()); ui->planeLength->bind(plane->Length); ui->planeWidth->setValue(plane->Width.getQuantityValue()); ui->planeWidth->bind(plane->Width); QSignalMapper* mapper = new QSignalMapper(this); connect(mapper, SIGNAL(mapped(QWidget*)), this, SLOT(onChangePlane(QWidget*))); connectSignalMapper(ui->planeLength, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->planeWidth, SIGNAL(valueChanged(double)), mapper); } else if (type == Part::Box::getClassTypeId()) { Part::Box* box = static_cast(feature); ui->boxLength->setValue(box->Length.getQuantityValue()); ui->boxLength->bind(box->Length); ui->boxWidth->setValue(box->Width.getQuantityValue()); ui->boxWidth->bind(box->Width); ui->boxHeight->setValue(box->Height.getQuantityValue()); ui->boxHeight->bind(box->Height); QSignalMapper* mapper = new QSignalMapper(this); connect(mapper, SIGNAL(mapped(QWidget*)), this, SLOT(onChangeBox(QWidget*))); connectSignalMapper(ui->boxLength, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->boxWidth, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->boxHeight, SIGNAL(valueChanged(double)), mapper); } else if (type == Part::Cylinder::getClassTypeId()) { Part::Cylinder* cyl = static_cast(feature); ui->cylinderRadius->setValue(cyl->Radius.getQuantityValue()); ui->cylinderRadius->bind(cyl->Radius); ui->cylinderHeight->setValue(cyl->Height.getQuantityValue()); ui->cylinderHeight->bind(cyl->Height); ui->cylinderXSkew->setValue(cyl->FirstAngle.getQuantityValue()); ui->cylinderXSkew->bind(cyl->FirstAngle); ui->cylinderYSkew->setValue(cyl->SecondAngle.getQuantityValue()); ui->cylinderYSkew->bind(cyl->SecondAngle); ui->cylinderAngle->setValue(cyl->Angle.getQuantityValue()); ui->cylinderAngle->bind(cyl->Angle); QSignalMapper* mapper = new QSignalMapper(this); connect(mapper, SIGNAL(mapped(QWidget*)), this, SLOT(onChangeCylinder(QWidget*))); connectSignalMapper(ui->cylinderRadius, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->cylinderHeight, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->cylinderXSkew, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->cylinderYSkew, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->cylinderAngle, SIGNAL(valueChanged(double)), mapper); } else if (type == Part::Cone::getClassTypeId()) { Part::Cone* cone = static_cast(feature); ui->coneRadius1->setValue(cone->Radius1.getQuantityValue()); ui->coneRadius1->bind(cone->Radius1); ui->coneRadius2->setValue(cone->Radius2.getQuantityValue()); ui->coneRadius2->bind(cone->Radius2); ui->coneHeight->setValue(cone->Height.getQuantityValue()); ui->coneHeight->bind(cone->Height); ui->coneAngle->setValue(cone->Angle.getQuantityValue()); ui->coneAngle->bind(cone->Angle); QSignalMapper* mapper = new QSignalMapper(this); connect(mapper, SIGNAL(mapped(QWidget*)), this, SLOT(onChangeCone(QWidget*))); connectSignalMapper(ui->coneRadius1, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->coneRadius2, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->coneHeight, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->coneAngle, SIGNAL(valueChanged(double)), mapper); } else if (type == Part::Sphere::getClassTypeId()) { Part::Sphere* sphere = static_cast(feature); ui->sphereRadius->setValue(sphere->Radius.getQuantityValue()); ui->sphereRadius->bind(sphere->Radius); ui->sphereAngle1->setValue(sphere->Angle1.getQuantityValue()); ui->sphereAngle1->bind(sphere->Angle1); ui->sphereAngle2->setValue(sphere->Angle2.getQuantityValue()); ui->sphereAngle2->bind(sphere->Angle2); ui->sphereAngle3->setValue(sphere->Angle3.getQuantityValue()); ui->sphereAngle3->bind(sphere->Angle3); QSignalMapper* mapper = new QSignalMapper(this); connect(mapper, SIGNAL(mapped(QWidget*)), this, SLOT(onChangeSphere(QWidget*))); connectSignalMapper(ui->sphereRadius, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->sphereAngle1, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->sphereAngle2, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->sphereAngle3, SIGNAL(valueChanged(double)), mapper); } else if (type == Part::Ellipsoid::getClassTypeId()) { Part::Ellipsoid* ell = static_cast(feature); ui->ellipsoidRadius1->setValue(ell->Radius1.getQuantityValue()); ui->ellipsoidRadius1->bind(ell->Radius1); ui->ellipsoidRadius2->setValue(ell->Radius2.getQuantityValue()); ui->ellipsoidRadius2->bind(ell->Radius2); ui->ellipsoidRadius3->setValue(ell->Radius3.getQuantityValue()); ui->ellipsoidRadius3->bind(ell->Radius3); ui->ellipsoidAngle1->setValue(ell->Angle1.getQuantityValue()); ui->ellipsoidAngle1->bind(ell->Angle1); ui->ellipsoidAngle2->setValue(ell->Angle2.getQuantityValue()); ui->ellipsoidAngle2->bind(ell->Angle2); ui->ellipsoidAngle3->setValue(ell->Angle3.getQuantityValue()); ui->ellipsoidAngle3->bind(ell->Angle3); QSignalMapper* mapper = new QSignalMapper(this); connect(mapper, SIGNAL(mapped(QWidget*)), this, SLOT(onChangeEllipsoid(QWidget*))); connectSignalMapper(ui->ellipsoidRadius1, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->ellipsoidRadius2, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->ellipsoidRadius3, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->ellipsoidAngle1, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->ellipsoidAngle2, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->ellipsoidAngle3, SIGNAL(valueChanged(double)), mapper); } else if (type == Part::Torus::getClassTypeId()) { Part::Torus* torus = static_cast(feature); ui->torusRadius1->setValue(torus->Radius1.getQuantityValue()); ui->torusRadius1->bind(torus->Radius1); ui->torusRadius2->setValue(torus->Radius2.getQuantityValue()); ui->torusRadius2->bind(torus->Radius2); ui->torusAngle1->setValue(torus->Angle1.getQuantityValue()); ui->torusAngle1->bind(torus->Angle1); ui->torusAngle2->setValue(torus->Angle2.getQuantityValue()); ui->torusAngle2->bind(torus->Angle2); ui->torusAngle3->setValue(torus->Angle3.getQuantityValue()); ui->torusAngle3->bind(torus->Angle3); QSignalMapper* mapper = new QSignalMapper(this); connect(mapper, SIGNAL(mapped(QWidget*)), this, SLOT(onChangeTorus(QWidget*))); connectSignalMapper(ui->torusRadius1, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->torusRadius2, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->torusAngle1, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->torusAngle2, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->torusAngle3, SIGNAL(valueChanged(double)), mapper); } else if (type == Part::Prism::getClassTypeId()) { Part::Prism* prism = static_cast(feature); ui->prismPolygon->setValue(prism->Polygon.getValue()); ui->prismCircumradius->setValue(prism->Circumradius.getQuantityValue()); ui->prismCircumradius->bind(prism->Circumradius); ui->prismHeight->setValue(prism->Height.getQuantityValue()); ui->prismHeight->bind(prism->Height); ui->prismXSkew->setValue(prism->FirstAngle.getQuantityValue()); ui->prismXSkew->bind(prism->FirstAngle); ui->prismYSkew->setValue(prism->SecondAngle.getQuantityValue()); ui->prismYSkew->bind(prism->SecondAngle); QSignalMapper* mapper = new QSignalMapper(this); connect(mapper, SIGNAL(mapped(QWidget*)), this, SLOT(onChangePrism(QWidget*))); connectSignalMapper(ui->prismPolygon, SIGNAL(valueChanged(int)), mapper); connectSignalMapper(ui->prismCircumradius, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->prismHeight, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->prismXSkew, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->prismYSkew, SIGNAL(valueChanged(double)), mapper); } else if (type == Part::Wedge::getClassTypeId()) { Part::Wedge* wedge = static_cast(feature); ui->wedgeXmin->setValue(wedge->Xmin.getQuantityValue()); ui->wedgeXmin->bind(wedge->Xmin); ui->wedgeYmin->setValue(wedge->Ymin.getQuantityValue()); ui->wedgeYmin->bind(wedge->Ymin); ui->wedgeZmin->setValue(wedge->Zmin.getQuantityValue()); ui->wedgeZmin->bind(wedge->Zmin); ui->wedgeX2min->setValue(wedge->X2min.getQuantityValue()); ui->wedgeX2min->bind(wedge->X2min); ui->wedgeZ2min->setValue(wedge->Z2min.getQuantityValue()); ui->wedgeZ2min->bind(wedge->Z2min); ui->wedgeXmax->setValue(wedge->Xmax.getQuantityValue()); ui->wedgeXmax->bind(wedge->Xmax); ui->wedgeYmax->setValue(wedge->Ymax.getQuantityValue()); ui->wedgeYmax->bind(wedge->Ymax); ui->wedgeZmax->setValue(wedge->Zmax.getQuantityValue()); ui->wedgeZmax->bind(wedge->Zmax); ui->wedgeX2max->setValue(wedge->X2max.getQuantityValue()); ui->wedgeX2max->bind(wedge->X2max); ui->wedgeZ2max->setValue(wedge->Z2max.getQuantityValue()); ui->wedgeZ2max->bind(wedge->Z2max); QSignalMapper* mapper = new QSignalMapper(this); connect(mapper, SIGNAL(mapped(QWidget*)), this, SLOT(onChangeWedge(QWidget*))); connectSignalMapper(ui->wedgeXmin, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->wedgeYmin, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->wedgeZmin, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->wedgeX2min, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->wedgeZ2min, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->wedgeXmax, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->wedgeYmax, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->wedgeZmax, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->wedgeX2max, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->wedgeZ2max, SIGNAL(valueChanged(double)), mapper); } else if (type == Part::Helix::getClassTypeId()) { Part::Helix* helix = static_cast(feature); ui->helixPitch->setValue(helix->Pitch.getQuantityValue()); ui->helixPitch->bind(helix->Pitch); ui->helixHeight->setValue(helix->Height.getQuantityValue()); ui->helixHeight->bind(helix->Height); ui->helixRadius->setValue(helix->Radius.getQuantityValue()); ui->helixRadius->bind(helix->Radius); ui->helixAngle->setValue(helix->Angle.getQuantityValue()); ui->helixAngle->bind(helix->Angle); ui->helixLocalCS->setCurrentIndex(helix->LocalCoord.getValue()); QSignalMapper* mapper = new QSignalMapper(this); connect(mapper, SIGNAL(mapped(QWidget*)), this, SLOT(onChangeHelix(QWidget*))); connectSignalMapper(ui->helixPitch, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->helixHeight, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->helixRadius, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->helixAngle, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->helixLocalCS, SIGNAL(currentIndexChanged(int)), mapper); } else if (type == Part::Spiral::getClassTypeId()) { Part::Spiral* spiral = static_cast(feature); ui->spiralGrowth->setValue(spiral->Growth.getQuantityValue()); ui->spiralGrowth->bind(spiral->Growth); ui->spiralRotation->setValue(spiral->Rotations.getQuantityValue().getValue()); ui->spiralRadius->setValue(spiral->Radius.getQuantityValue()); ui->spiralRadius->bind(spiral->Radius); QSignalMapper* mapper = new QSignalMapper(this); connect(mapper, SIGNAL(mapped(QWidget*)), this, SLOT(onChangeSpiral(QWidget*))); connectSignalMapper(ui->spiralGrowth, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->spiralRotation, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->spiralRadius, SIGNAL(valueChanged(double)), mapper); } else if (type == Part::Circle::getClassTypeId()) { Part::Circle* circle = static_cast(feature); ui->circleRadius->setValue(circle->Radius.getQuantityValue()); ui->circleRadius->bind(circle->Radius); ui->circleAngle1->setValue(circle->Angle1.getQuantityValue()); ui->circleAngle1->bind(circle->Angle1); ui->circleAngle2->setValue(circle->Angle2.getQuantityValue()); ui->circleAngle2->bind(circle->Angle2); QSignalMapper* mapper = new QSignalMapper(this); connect(mapper, SIGNAL(mapped(QWidget*)), this, SLOT(onChangeCircle(QWidget*))); connectSignalMapper(ui->circleRadius, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->circleAngle1, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->circleAngle2, SIGNAL(valueChanged(double)), mapper); } else if (type == Part::Ellipse::getClassTypeId()) { Part::Ellipse* ell = static_cast(feature); ui->ellipseMajorRadius->setValue(ell->MajorRadius.getQuantityValue()); ui->ellipseMajorRadius->bind(ell->MajorRadius); ui->ellipseMinorRadius->setValue(ell->MinorRadius.getQuantityValue()); ui->ellipseMinorRadius->bind(ell->MinorRadius); ui->ellipseAngle1->setValue(ell->Angle1.getQuantityValue()); ui->ellipseAngle1->bind(ell->Angle1); ui->ellipseAngle2->setValue(ell->Angle2.getQuantityValue()); ui->ellipseAngle2->bind(ell->Angle2); QSignalMapper* mapper = new QSignalMapper(this); connect(mapper, SIGNAL(mapped(QWidget*)), this, SLOT(onChangeEllipse(QWidget*))); connectSignalMapper(ui->ellipseMajorRadius, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->ellipseMinorRadius, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->ellipseAngle1, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->ellipseAngle2, SIGNAL(valueChanged(double)), mapper); } else if (type == Part::Vertex::getClassTypeId()) { Part::Vertex* v = static_cast(feature); ui->vertexX->setValue(v->X.getQuantityValue()); ui->vertexX->bind(v->X); ui->vertexY->setValue(v->Y.getQuantityValue()); ui->vertexY->bind(v->Y); ui->vertexZ->setValue(v->Z.getQuantityValue()); ui->vertexZ->bind(v->Z); QSignalMapper* mapper = new QSignalMapper(this); connect(mapper, SIGNAL(mapped(QWidget*)), this, SLOT(onChangeVertex(QWidget*))); connectSignalMapper(ui->vertexX, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->vertexY, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->vertexZ, SIGNAL(valueChanged(double)), mapper); } else if (type == Part::Line::getClassTypeId()) { Part::Line* line = static_cast(feature); ui->edgeX1->setValue(line->X1.getQuantityValue()); ui->edgeX1->bind(line->X1); ui->edgeY1->setValue(line->Y1.getQuantityValue()); ui->edgeY1->bind(line->Y1); ui->edgeZ1->setValue(line->Z1.getQuantityValue()); ui->edgeZ1->bind(line->Z1); ui->edgeX2->setValue(line->X2.getQuantityValue()); ui->edgeX2->bind(line->X2); ui->edgeY2->setValue(line->Y2.getQuantityValue()); ui->edgeY2->bind(line->Y2); ui->edgeZ2->setValue(line->Z2.getQuantityValue()); ui->edgeZ2->bind(line->Z2); QSignalMapper* mapper = new QSignalMapper(this); connect(mapper, SIGNAL(mapped(QWidget*)), this, SLOT(onChangeLine(QWidget*))); connectSignalMapper(ui->edgeX1, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->edgeY1, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->edgeZ1, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->edgeX2, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->edgeY2, SIGNAL(valueChanged(double)), mapper); connectSignalMapper(ui->edgeZ2, SIGNAL(valueChanged(double)), mapper); } else if (type == Part::RegularPolygon::getClassTypeId()) { Part::RegularPolygon* poly = static_cast(feature); ui->regularPolygonPolygon->setValue(poly->Polygon.getValue()); ui->regularPolygonCircumradius->setValue(poly->Circumradius.getQuantityValue()); ui->regularPolygonCircumradius->bind(poly->Circumradius); QSignalMapper* mapper = new QSignalMapper(this); connect(mapper, SIGNAL(mapped(QWidget*)), this, SLOT(onChangeRegularPolygon(QWidget*))); connectSignalMapper(ui->regularPolygonPolygon, SIGNAL(valueChanged(int)), mapper); connectSignalMapper(ui->regularPolygonCircumradius, SIGNAL(valueChanged(double)), mapper); } } } /* * Destroys the object and frees any allocated resources */ DlgPrimitives::~DlgPrimitives() { } void DlgPrimitives::connectSignalMapper(QWidget *sender, const char *signal, QSignalMapper* mapper) { connect(sender, signal, mapper, SLOT(map())); mapper->setMapping(sender, sender); } void DlgPrimitives::pickCallback(void * ud, SoEventCallback * n) { const SoMouseButtonEvent * mbe = static_cast(n->getEvent()); Picker* pick = reinterpret_cast(ud); if (pick->exitCode >= 0) pick->loop.exit(pick->exitCode); // 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) { if (pick->pickedPoint(point)) { pick->exitCode = 0; } } } } else if (mbe->getButton() == SoMouseButtonEvent::BUTTON2) { if (mbe->getState() == SoButtonEvent::UP) { 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); SoNode* root = viewer->getSceneGraph(); int mode = 0; if (root && root->getTypeId().isDerivedFrom(Gui::SoFCUnifiedSelection::getClassTypeId())) { mode = static_cast(root)->selectionMode.getValue(); static_cast(root)->selectionMode.setValue(Gui::SoFCUnifiedSelection::OFF); } viewer->addEventCallback(SoMouseButtonEvent::getClassTypeId(), pickCallback, p); this->setDisabled(true); int ret = p->loop.exec(); if (root && root->getTypeId().isDerivedFrom(Gui::SoFCUnifiedSelection::getClassTypeId())) static_cast(root)->selectionMode.setValue(mode); this->setEnabled(true); viewer->setEditing(false); viewer->setRedirectToSceneGraph(false); viewer->removeEventCallback(SoMouseButtonEvent::getClassTypeId(), pickCallback, p); if (ret == 0) { p->createPrimitive(this, ui->PrimitiveTypeCB->currentText(), doc); } } } } void DlgPrimitives::on_buttonCircleFromThreePoints_clicked() { CircleFromThreePoints pp; executeCallback(&pp); } QString DlgPrimitives::createPlane(const QString& objectName, const QString& placement) const { return QString::fromLatin1( "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" "App.ActiveDocument.%1.Label='%5'\n") .arg(objectName) .arg(Base::UnitsApi::toNumber(ui->planeLength->value())) .arg(Base::UnitsApi::toNumber(ui->planeWidth->value())) .arg(placement) .arg(tr("Plane")); } QString DlgPrimitives::createBox(const QString& objectName, const QString& placement) const { return QString::fromLatin1( "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" "App.ActiveDocument.%1.Label='%6'\n") .arg(objectName) .arg(Base::UnitsApi::toNumber(ui->boxLength->value())) .arg(Base::UnitsApi::toNumber(ui->boxWidth->value())) .arg(Base::UnitsApi::toNumber(ui->boxHeight->value())) .arg(placement) .arg(tr("Box")); } QString DlgPrimitives::createCylinder(const QString& objectName, const QString& placement) const { return QString::fromLatin1( "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.FirstAngle=%5\n" "App.ActiveDocument.%1.SecondAngle=%6\n" "App.ActiveDocument.%1.Placement=%7\n" "App.ActiveDocument.%1.Label='%8'\n") .arg(objectName) .arg(Base::UnitsApi::toNumber(ui->cylinderRadius->value())) .arg(Base::UnitsApi::toNumber(ui->cylinderHeight->value())) .arg(Base::UnitsApi::toNumber(ui->cylinderAngle->value())) .arg(Base::UnitsApi::toNumber(ui->cylinderXSkew->value())) .arg(Base::UnitsApi::toNumber(ui->cylinderYSkew->value())) .arg(placement) .arg(tr("Cylinder")); } QString DlgPrimitives::createCone(const QString& objectName, const QString& placement) const { return QString::fromLatin1( "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" "App.ActiveDocument.%1.Label='%7'\n") .arg(objectName) .arg(Base::UnitsApi::toNumber(ui->coneRadius1->value())) .arg(Base::UnitsApi::toNumber(ui->coneRadius2->value())) .arg(Base::UnitsApi::toNumber(ui->coneHeight->value())) .arg(Base::UnitsApi::toNumber(ui->coneAngle->value())) .arg(placement) .arg(tr("Cone")); } QString DlgPrimitives::createSphere(const QString& objectName, const QString& placement) const { return QString::fromLatin1( "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" "App.ActiveDocument.%1.Label='%7'\n") .arg(objectName) .arg(Base::UnitsApi::toNumber(ui->sphereRadius->value())) .arg(Base::UnitsApi::toNumber(ui->sphereAngle1->value())) .arg(Base::UnitsApi::toNumber(ui->sphereAngle2->value())) .arg(Base::UnitsApi::toNumber(ui->sphereAngle3->value())) .arg(placement) .arg(tr("Sphere")); } QString DlgPrimitives::createEllipsoid(const QString& objectName, const QString& placement) const { return QString::fromLatin1( "App.ActiveDocument.addObject(\"Part::Ellipsoid\",\"%1\")\n" "App.ActiveDocument.%1.Radius1=%2\n" "App.ActiveDocument.%1.Radius2=%3\n" "App.ActiveDocument.%1.Radius3=%4\n" "App.ActiveDocument.%1.Angle1=%5\n" "App.ActiveDocument.%1.Angle2=%6\n" "App.ActiveDocument.%1.Angle3=%7\n" "App.ActiveDocument.%1.Placement=%8\n" "App.ActiveDocument.%1.Label='%9'\n") .arg(objectName) .arg(Base::UnitsApi::toNumber(ui->ellipsoidRadius1->value())) .arg(Base::UnitsApi::toNumber(ui->ellipsoidRadius2->value())) .arg(Base::UnitsApi::toNumber(ui->ellipsoidRadius3->value())) .arg(Base::UnitsApi::toNumber(ui->ellipsoidAngle1->value())) .arg(Base::UnitsApi::toNumber(ui->ellipsoidAngle2->value())) .arg(Base::UnitsApi::toNumber(ui->ellipsoidAngle3->value())) .arg(placement) .arg(tr("Ellipsoid")); } QString DlgPrimitives::createTorus(const QString& objectName, const QString& placement) const { return QString::fromLatin1( "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" "App.ActiveDocument.%1.Label='%8'\n") .arg(objectName) .arg(Base::UnitsApi::toNumber(ui->torusRadius1->value())) .arg(Base::UnitsApi::toNumber(ui->torusRadius2->value())) .arg(Base::UnitsApi::toNumber(ui->torusAngle1->value())) .arg(Base::UnitsApi::toNumber(ui->torusAngle2->value())) .arg(Base::UnitsApi::toNumber(ui->torusAngle3->value())) .arg(placement) .arg(tr("Torus")); } QString DlgPrimitives::createPrism(const QString& objectName, const QString& placement) const { return QString::fromLatin1( "App.ActiveDocument.addObject(\"Part::Prism\",\"%1\")\n" "App.ActiveDocument.%1.Polygon=%2\n" "App.ActiveDocument.%1.Circumradius=%3\n" "App.ActiveDocument.%1.Height=%4\n" "App.ActiveDocument.%1.FirstAngle=%5\n" "App.ActiveDocument.%1.SecondAngle=%6\n" "App.ActiveDocument.%1.Placement=%7\n" "App.ActiveDocument.%1.Label='%8'\n") .arg(objectName) .arg(ui->prismPolygon->value()) .arg(Base::UnitsApi::toNumber(ui->prismCircumradius->value())) .arg(Base::UnitsApi::toNumber(ui->prismHeight->value())) .arg(Base::UnitsApi::toNumber(ui->prismXSkew->value())) .arg(Base::UnitsApi::toNumber(ui->prismYSkew->value())) .arg(placement) .arg(tr("Prism")); } QString DlgPrimitives::createWedge(const QString& objectName, const QString& placement) const { return QString::fromLatin1( "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" "App.ActiveDocument.%1.Label='%13'\n") .arg(objectName) .arg(Base::UnitsApi::toNumber(ui->wedgeXmin->value())) .arg(Base::UnitsApi::toNumber(ui->wedgeYmin->value())) .arg(Base::UnitsApi::toNumber(ui->wedgeZmin->value())) .arg(Base::UnitsApi::toNumber(ui->wedgeX2min->value())) .arg(Base::UnitsApi::toNumber(ui->wedgeZ2min->value())) .arg(Base::UnitsApi::toNumber(ui->wedgeXmax->value())) .arg(Base::UnitsApi::toNumber(ui->wedgeYmax->value())) .arg(Base::UnitsApi::toNumber(ui->wedgeZmax->value())) .arg(Base::UnitsApi::toNumber(ui->wedgeX2max->value())) .arg(Base::UnitsApi::toNumber(ui->wedgeZ2max->value())) .arg(placement) .arg(tr("Wedge")); } QString DlgPrimitives::createHelix(const QString& objectName, const QString& placement) const { return QString::fromLatin1( "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.LocalCoord=%6\n" "App.ActiveDocument.%1.Style=1\n" "App.ActiveDocument.%1.Placement=%7\n" "App.ActiveDocument.%1.Label='%8'\n") .arg(objectName) .arg(Base::UnitsApi::toNumber(ui->helixPitch->value())) .arg(Base::UnitsApi::toNumber(ui->helixHeight->value())) .arg(Base::UnitsApi::toNumber(ui->helixRadius->value())) .arg(Base::UnitsApi::toNumber(ui->helixAngle->value())) .arg(ui->helixLocalCS->currentIndex()) .arg(placement) .arg(tr("Helix")); } QString DlgPrimitives::createSpiral(const QString& objectName, const QString& placement) const { return QString::fromLatin1( "App.ActiveDocument.addObject(\"Part::Spiral\",\"%1\")\n" "App.ActiveDocument.%1.Growth=%2\n" "App.ActiveDocument.%1.Rotations=%3\n" "App.ActiveDocument.%1.Radius=%4\n" "App.ActiveDocument.%1.Placement=%5\n" "App.ActiveDocument.%1.Label='%6'\n") .arg(objectName) .arg(Base::UnitsApi::toNumber(ui->spiralGrowth->value())) .arg(Base::UnitsApi::toNumber(ui->spiralRotation->value())) .arg(Base::UnitsApi::toNumber(ui->spiralRadius->value())) .arg(placement) .arg(tr("Spiral")); } QString DlgPrimitives::createCircle(const QString& objectName, const QString& placement) const { return QString::fromLatin1( "App.ActiveDocument.addObject(\"Part::Circle\",\"%1\")\n" "App.ActiveDocument.%1.Radius=%2\n" "App.ActiveDocument.%1.Angle1=%3\n" "App.ActiveDocument.%1.Angle2=%4\n" "App.ActiveDocument.%1.Placement=%5\n" "App.ActiveDocument.%1.Label='%6'\n") .arg(objectName) .arg(Base::UnitsApi::toNumber(ui->circleRadius->value())) .arg(Base::UnitsApi::toNumber(ui->circleAngle1->value())) .arg(Base::UnitsApi::toNumber(ui->circleAngle2->value())) .arg(placement) .arg(tr("Circle")); } QString DlgPrimitives::createEllipse(const QString& objectName, const QString& placement) const { return QString::fromLatin1( "App.ActiveDocument.addObject(\"Part::Ellipse\",\"%1\")\n" "App.ActiveDocument.%1.MajorRadius=%2\n" "App.ActiveDocument.%1.MinorRadius=%3\n" "App.ActiveDocument.%1.Angle1=%4\n" "App.ActiveDocument.%1.Angle2=%5\n" "App.ActiveDocument.%1.Placement=%6\n" "App.ActiveDocument.%1.Label='%7'\n") .arg(objectName) .arg(Base::UnitsApi::toNumber(ui->ellipseMajorRadius->value())) .arg(Base::UnitsApi::toNumber(ui->ellipseMinorRadius->value())) .arg(Base::UnitsApi::toNumber(ui->ellipseAngle1->value())) .arg(Base::UnitsApi::toNumber(ui->ellipseAngle2->value())) .arg(placement) .arg(tr("Ellipse")); } QString DlgPrimitives::createVertex(const QString& objectName, const QString& placement) const { return QString::fromLatin1( "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" "App.ActiveDocument.%1.Label='%6'\n") .arg(objectName) .arg(Base::UnitsApi::toNumber(ui->vertexX->value())) .arg(Base::UnitsApi::toNumber(ui->vertexY->value())) .arg(Base::UnitsApi::toNumber(ui->vertexZ->value())) .arg(placement) .arg(tr("Vertex")); } QString DlgPrimitives::createLine(const QString& objectName, const QString& placement) const { return QString::fromLatin1( "App.ActiveDocument.addObject(\"Part::Line\",\"%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" "App.ActiveDocument.%1.Label='%9'\n") .arg(objectName) .arg(Base::UnitsApi::toNumber(ui->edgeX1->value())) .arg(Base::UnitsApi::toNumber(ui->edgeY1->value())) .arg(Base::UnitsApi::toNumber(ui->edgeZ1->value())) .arg(Base::UnitsApi::toNumber(ui->edgeX2->value())) .arg(Base::UnitsApi::toNumber(ui->edgeY2->value())) .arg(Base::UnitsApi::toNumber(ui->edgeZ2->value())) .arg(placement) .arg(tr("Line")); } QString DlgPrimitives::createRegularPolygon(const QString& objectName, const QString& placement) const { return QString::fromLatin1( "App.ActiveDocument.addObject(\"Part::RegularPolygon\",\"%1\")\n" "App.ActiveDocument.%1.Polygon=%2\n" "App.ActiveDocument.%1.Circumradius=%3\n" "App.ActiveDocument.%1.Placement=%4\n" "App.ActiveDocument.%1.Label='%5'\n") .arg(objectName) .arg(ui->regularPolygonPolygon->value()) .arg(Base::UnitsApi::toNumber(ui->regularPolygonCircumradius->value())) .arg(placement) .arg(tr("Regular polygon")); } 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->PrimitiveTypeCB->currentText()), tr("No active document")); return; } if (ui->PrimitiveTypeCB->currentIndex() == 0) { // plane name = QString::fromLatin1(doc->getUniqueObjectName("Plane").c_str()); cmd = createPlane(name, placement); } else if (ui->PrimitiveTypeCB->currentIndex() == 1) { // box name = QString::fromLatin1(doc->getUniqueObjectName("Box").c_str()); cmd = createBox(name, placement); } else if (ui->PrimitiveTypeCB->currentIndex() == 2) { // cylinder name = QString::fromLatin1(doc->getUniqueObjectName("Cylinder").c_str()); cmd = createCylinder(name, placement); } else if (ui->PrimitiveTypeCB->currentIndex() == 3) { // cone name = QString::fromLatin1(doc->getUniqueObjectName("Cone").c_str()); cmd = createCone(name, placement); } else if (ui->PrimitiveTypeCB->currentIndex() == 4) { // sphere name = QString::fromLatin1(doc->getUniqueObjectName("Sphere").c_str()); cmd = createSphere(name, placement); } else if (ui->PrimitiveTypeCB->currentIndex() == 5) { // ellipsoid name = QString::fromLatin1(doc->getUniqueObjectName("Ellipsoid").c_str()); cmd = createEllipsoid(name, placement); } else if (ui->PrimitiveTypeCB->currentIndex() == 6) { // torus name = QString::fromLatin1(doc->getUniqueObjectName("Torus").c_str()); cmd = createTorus(name, placement); } else if (ui->PrimitiveTypeCB->currentIndex() == 7) { // prism name = QString::fromLatin1(doc->getUniqueObjectName("Prism").c_str()); cmd = createPrism(name, placement); } else if (ui->PrimitiveTypeCB->currentIndex() == 8) { // wedge name = QString::fromLatin1(doc->getUniqueObjectName("Wedge").c_str()); cmd = createWedge(name, placement); } else if (ui->PrimitiveTypeCB->currentIndex() == 9) { // helix name = QString::fromLatin1(doc->getUniqueObjectName("Helix").c_str()); cmd = createHelix(name, placement); } else if (ui->PrimitiveTypeCB->currentIndex() == 10) { // spiral name = QString::fromLatin1(doc->getUniqueObjectName("Spiral").c_str()); cmd = createSpiral(name, placement); } else if (ui->PrimitiveTypeCB->currentIndex() == 11) { // circle name = QString::fromLatin1(doc->getUniqueObjectName("Circle").c_str()); cmd = createCircle(name, placement); } else if (ui->PrimitiveTypeCB->currentIndex() == 12) { // ellipse name = QString::fromLatin1(doc->getUniqueObjectName("Ellipse").c_str()); cmd = createEllipse(name, placement); } else if (ui->PrimitiveTypeCB->currentIndex() == 13) { // vertex name = QString::fromLatin1(doc->getUniqueObjectName("Vertex").c_str()); cmd = createVertex(name, placement); } else if (ui->PrimitiveTypeCB->currentIndex() == 14) { // line name = QString::fromLatin1(doc->getUniqueObjectName("Line").c_str()); cmd = createLine(name, placement); } else if (ui->PrimitiveTypeCB->currentIndex() == 15) { // RegularPolygon name = QString::fromLatin1(doc->getUniqueObjectName("RegularPolygon").c_str()); cmd = createRegularPolygon(name, placement); } // Execute the Python block QString prim = tr("Create %1").arg(ui->PrimitiveTypeCB->currentText()); Gui::Application::Instance->activeDocument()->openCommand(prim.toUtf8()); Gui::Command::runCommand(Gui::Command::Doc, cmd.toUtf8()); Gui::Command::runCommand(Gui::Command::Doc, getAutoGroupCommandStr(name).toUtf8()); Gui::Application::Instance->activeDocument()->commitCommand(); Gui::Command::runCommand(Gui::Command::Doc, "App.ActiveDocument.recompute()"); Gui::Command::runCommand(Gui::Command::Gui, "Gui.SendMsgToActiveView(\"ViewFit\")"); } catch (const Base::PyException& e) { QMessageBox::warning(this, tr("Create %1") .arg(ui->PrimitiveTypeCB->currentText()), QString::fromLatin1(e.what())); } } QString DlgPrimitives::changePlane(const QString& objectName, const QString& placement) const { return QString::fromLatin1( "%1.Length=%2\n" "%1.Width=%3\n" "%1.Placement=%4\n") .arg(objectName) .arg(Base::UnitsApi::toNumber(ui->planeLength->value())) .arg(Base::UnitsApi::toNumber(ui->planeWidth->value())) .arg(placement); } QString DlgPrimitives::changeBox(const QString& objectName, const QString& placement) const { return QString::fromLatin1( "%1.Length=%2\n" "%1.Width=%3\n" "%1.Height=%4\n" "%1.Placement=%5\n") .arg(objectName) .arg(Base::UnitsApi::toNumber(ui->boxLength->value())) .arg(Base::UnitsApi::toNumber(ui->boxWidth->value())) .arg(Base::UnitsApi::toNumber(ui->boxHeight->value())) .arg(placement); } QString DlgPrimitives::changeCylinder(const QString& objectName, const QString& placement) const { return QString::fromLatin1( "%1.Radius=%2\n" "%1.Height=%3\n" "%1.Angle=%4\n" "%1.Placement=%5\n") .arg(objectName) .arg(Base::UnitsApi::toNumber(ui->cylinderRadius->value())) .arg(Base::UnitsApi::toNumber(ui->cylinderHeight->value())) .arg(Base::UnitsApi::toNumber(ui->cylinderAngle->value())) .arg(placement); } QString DlgPrimitives::changeCone(const QString& objectName, const QString& placement) const { return QString::fromLatin1( "%1.Radius1=%2\n" "%1.Radius2=%3\n" "%1.Height=%4\n" "%1.Angle=%5\n" "%1.Placement=%6\n") .arg(objectName) .arg(Base::UnitsApi::toNumber(ui->coneRadius1->value())) .arg(Base::UnitsApi::toNumber(ui->coneRadius2->value())) .arg(Base::UnitsApi::toNumber(ui->coneHeight->value())) .arg(Base::UnitsApi::toNumber(ui->coneAngle->value())) .arg(placement); } QString DlgPrimitives::changeSphere(const QString& objectName, const QString& placement) const { return QString::fromLatin1( "%1.Radius=%2\n" "%1.Angle1=%3\n" "%1.Angle2=%4\n" "%1.Angle3=%5\n" "%1.Placement=%6\n") .arg(objectName) .arg(Base::UnitsApi::toNumber(ui->sphereRadius->value())) .arg(Base::UnitsApi::toNumber(ui->sphereAngle1->value())) .arg(Base::UnitsApi::toNumber(ui->sphereAngle2->value())) .arg(Base::UnitsApi::toNumber(ui->sphereAngle3->value())) .arg(placement); } QString DlgPrimitives::changeEllipsoid(const QString& objectName, const QString& placement) const { return QString::fromLatin1( "%1.Radius1=%2\n" "%1.Radius2=%3\n" "%1.Radius3=%4\n" "%1.Angle1=%5\n" "%1.Angle2=%6\n" "%1.Angle3=%7\n" "%1.Placement=%8\n") .arg(objectName) .arg(Base::UnitsApi::toNumber(ui->ellipsoidRadius1->value())) .arg(Base::UnitsApi::toNumber(ui->ellipsoidRadius2->value())) .arg(Base::UnitsApi::toNumber(ui->ellipsoidRadius3->value())) .arg(Base::UnitsApi::toNumber(ui->ellipsoidAngle1->value())) .arg(Base::UnitsApi::toNumber(ui->ellipsoidAngle2->value())) .arg(Base::UnitsApi::toNumber(ui->ellipsoidAngle3->value())) .arg(placement); } QString DlgPrimitives::changeTorus(const QString& objectName, const QString& placement) const { return QString::fromLatin1( "%1.Radius1=%2\n" "%1.Radius2=%3\n" "%1.Angle1=%4\n" "%1.Angle2=%5\n" "%1.Angle3=%6\n" "%1.Placement=%7\n") .arg(objectName) .arg(Base::UnitsApi::toNumber(ui->torusRadius1->value())) .arg(Base::UnitsApi::toNumber(ui->torusRadius2->value())) .arg(Base::UnitsApi::toNumber(ui->torusAngle1->value())) .arg(Base::UnitsApi::toNumber(ui->torusAngle2->value())) .arg(Base::UnitsApi::toNumber(ui->torusAngle3->value())) .arg(placement); } QString DlgPrimitives::changePrism(const QString& objectName, const QString& placement) const { return QString::fromLatin1( "%1.Polygon=%2\n" "%1.Circumradius=%3\n" "%1.Height=%4\n" "%1.FirstAngle=%5\n" "%1.SecondAngle=%6\n" "%1.Placement=%7\n") .arg(objectName) .arg(ui->prismPolygon->value()) .arg(Base::UnitsApi::toNumber(ui->prismCircumradius->value())) .arg(Base::UnitsApi::toNumber(ui->prismHeight->value())) .arg(Base::UnitsApi::toNumber(ui->prismXSkew->value())) .arg(Base::UnitsApi::toNumber(ui->prismYSkew->value())) .arg(placement); } QString DlgPrimitives::changeWedge(const QString& objectName, const QString& placement) const { return QString::fromLatin1( "%1.Xmin=%2\n" "%1.Ymin=%3\n" "%1.Zmin=%4\n" "%1.X2min=%5\n" "%1.Z2min=%6\n" "%1.Xmax=%7\n" "%1.Ymax=%8\n" "%1.Zmax=%9\n" "%1.X2max=%10\n" "%1.Z2max=%11\n" "%1.Placement=%12\n") .arg(objectName) .arg(Base::UnitsApi::toNumber(ui->wedgeXmin->value())) .arg(Base::UnitsApi::toNumber(ui->wedgeYmin->value())) .arg(Base::UnitsApi::toNumber(ui->wedgeZmin->value())) .arg(Base::UnitsApi::toNumber(ui->wedgeX2min->value())) .arg(Base::UnitsApi::toNumber(ui->wedgeZ2min->value())) .arg(Base::UnitsApi::toNumber(ui->wedgeXmax->value())) .arg(Base::UnitsApi::toNumber(ui->wedgeYmax->value())) .arg(Base::UnitsApi::toNumber(ui->wedgeZmax->value())) .arg(Base::UnitsApi::toNumber(ui->wedgeX2max->value())) .arg(Base::UnitsApi::toNumber(ui->wedgeZ2max->value())) .arg(placement); } QString DlgPrimitives::changeHelix(const QString& objectName, const QString& placement) const { return QString::fromLatin1( "%1.Pitch=%2\n" "%1.Height=%3\n" "%1.Radius=%4\n" "%1.Angle=%5\n" "%1.LocalCoord=%6\n" "%1.Placement=%7\n") .arg(objectName) .arg(Base::UnitsApi::toNumber(ui->helixPitch->value())) .arg(Base::UnitsApi::toNumber(ui->helixHeight->value())) .arg(Base::UnitsApi::toNumber(ui->helixRadius->value())) .arg(Base::UnitsApi::toNumber(ui->helixAngle->value())) .arg(ui->helixLocalCS->currentIndex()) .arg(placement); } QString DlgPrimitives::changeSpiral(const QString& objectName, const QString& placement) const { return QString::fromLatin1( "%1.Growth=%2\n" "%1.Rotations=%3\n" "%1.Radius=%4\n" "%1.Placement=%5\n") .arg(objectName) .arg(Base::UnitsApi::toNumber(ui->spiralGrowth->value())) .arg(Base::UnitsApi::toNumber(ui->spiralRotation->value())) .arg(Base::UnitsApi::toNumber(ui->spiralRadius->value())) .arg(placement); } QString DlgPrimitives::changeCircle(const QString& objectName, const QString& placement) const { return QString::fromLatin1( "%1.Radius=%2\n" "%1.Angle1=%3\n" "%1.Angle2=%4\n" "%1.Placement=%5\n") .arg(objectName) .arg(Base::UnitsApi::toNumber(ui->circleRadius->value())) .arg(Base::UnitsApi::toNumber(ui->circleAngle1->value())) .arg(Base::UnitsApi::toNumber(ui->circleAngle2->value())) .arg(placement); } QString DlgPrimitives::changeEllipse(const QString& objectName, const QString& placement) const { return QString::fromLatin1( "%1.MajorRadius=%2\n" "%1.MinorRadius=%3\n" "%1.Angle1=%4\n" "%1.Angle2=%5\n" "%1.Placement=%6\n") .arg(objectName) .arg(Base::UnitsApi::toNumber(ui->ellipseMajorRadius->value())) .arg(Base::UnitsApi::toNumber(ui->ellipseMinorRadius->value())) .arg(Base::UnitsApi::toNumber(ui->ellipseAngle1->value())) .arg(Base::UnitsApi::toNumber(ui->ellipseAngle2->value())) .arg(placement); } QString DlgPrimitives::changeVertex(const QString& objectName, const QString& placement) const { return QString::fromLatin1( "%1.X=%2\n" "%1.Y=%3\n" "%1.Z=%4\n" "%1.Placement=%5\n") .arg(objectName) .arg(Base::UnitsApi::toNumber(ui->vertexX->value())) .arg(Base::UnitsApi::toNumber(ui->vertexY->value())) .arg(Base::UnitsApi::toNumber(ui->vertexZ->value())) .arg(placement); } QString DlgPrimitives::changeLine(const QString& objectName, const QString& placement) const { return QString::fromLatin1( "%1.X1=%2\n" "%1.Y1=%3\n" "%1.Z1=%4\n" "%1.X2=%5\n" "%1.Y2=%6\n" "%1.Z2=%7\n" "%1.Placement=%8\n") .arg(objectName) .arg(Base::UnitsApi::toNumber(ui->edgeX1->value())) .arg(Base::UnitsApi::toNumber(ui->edgeY1->value())) .arg(Base::UnitsApi::toNumber(ui->edgeZ1->value())) .arg(Base::UnitsApi::toNumber(ui->edgeX2->value())) .arg(Base::UnitsApi::toNumber(ui->edgeY2->value())) .arg(Base::UnitsApi::toNumber(ui->edgeZ2->value())) .arg(placement); } QString DlgPrimitives::changeRegularPolygon(const QString& objectName, const QString& placement) const { return QString::fromLatin1( "%1.Polygon=%2\n" "%1.Circumradius=%3\n" "%1.Placement=%4\n") .arg(objectName) .arg(ui->regularPolygonPolygon->value()) .arg(Base::UnitsApi::toNumber(ui->regularPolygonCircumradius->value())) .arg(placement); } void DlgPrimitives::accept(const QString& placement) { if (featurePtr.expired()) return; QString command; App::Document* doc = featurePtr->getDocument(); Base::Type type = featurePtr->getTypeId(); QString objectName = QString::fromLatin1("App.getDocument(\"%1\").%2") .arg(QString::fromLatin1(doc->getName())) .arg(QString::fromLatin1(featurePtr->getNameInDocument())); // read values from the properties if (type == Part::Plane::getClassTypeId()) { command = changePlane(objectName, placement); } else if (type == Part::Box::getClassTypeId()) { command = changeBox(objectName, placement); } else if (type == Part::Cylinder::getClassTypeId()) { command = changeCylinder(objectName, placement); } else if (type == Part::Cone::getClassTypeId()) { command = changeCone(objectName, placement); } else if (type == Part::Sphere::getClassTypeId()) { command = changeSphere(objectName, placement); } else if (type == Part::Ellipsoid::getClassTypeId()) { command = changeEllipsoid(objectName, placement); } else if (type == Part::Torus::getClassTypeId()) { command = changeTorus(objectName, placement); } else if (type == Part::Prism::getClassTypeId()) { command = changePrism(objectName, placement); } else if (type == Part::Wedge::getClassTypeId()) { command = changeWedge(objectName, placement); } else if (type == Part::Helix::getClassTypeId()) { command = changeHelix(objectName, placement); } else if (type == Part::Spiral::getClassTypeId()) { command = changeSpiral(objectName, placement); } else if (type == Part::Circle::getClassTypeId()) { command = changeCircle(objectName, placement); } else if (type == Part::Ellipse::getClassTypeId()) { command = changeEllipse(objectName, placement); } else if (type == Part::Vertex::getClassTypeId()) { command = changeVertex(objectName, placement); } else if (type == Part::Line::getClassTypeId()) { command = changeLine(objectName, placement); } else if (type == Part::RegularPolygon::getClassTypeId()) { command = changeRegularPolygon(objectName, placement); } // execute command, a transaction is already opened Gui::Command::runCommand(Gui::Command::App, command.toLatin1()); doc->recompute(); // commit undo command doc->commitTransaction(); } void DlgPrimitives::reject() { if (featurePtr.expired()) return; App::Document* doc = featurePtr->getDocument(); doc->abortTransaction(); } void DlgPrimitives::onChangePlane(QWidget* widget) { if (featurePtr.expired()) return; Part::Plane* plane = featurePtr.get(); if (widget == ui->planeLength) { plane->Length.setValue(ui->planeLength->value().getValue()); } else if (widget == ui->planeWidth) { plane->Width.setValue(ui->planeWidth->value().getValue()); } plane->recomputeFeature(); } void DlgPrimitives::onChangeBox(QWidget* widget) { if (featurePtr.expired()) return; Part::Box* box = featurePtr.get(); if (widget == ui->boxLength) { box->Length.setValue(ui->boxLength->value().getValue()); } else if (widget == ui->boxWidth) { box->Width.setValue(ui->boxWidth->value().getValue()); } else if (widget == ui->boxHeight) { box->Height.setValue(ui->boxHeight->value().getValue()); } box->recomputeFeature(); } void DlgPrimitives::onChangeCylinder(QWidget* widget) { if (featurePtr.expired()) return; Part::Cylinder* cyl = featurePtr.get(); if (widget == ui->cylinderRadius) { cyl->Radius.setValue(ui->cylinderRadius->value().getValue()); } else if (widget == ui->cylinderHeight) { cyl->Height.setValue(ui->cylinderHeight->value().getValue()); } else if (widget == ui->cylinderAngle) { cyl->Angle.setValue(ui->cylinderAngle->value().getValue()); } else if (widget == ui->cylinderXSkew) { cyl->FirstAngle.setValue(ui->cylinderXSkew->value().getValue()); } else if (widget == ui->cylinderYSkew) { cyl->SecondAngle.setValue(ui->cylinderYSkew->value().getValue()); } cyl->recomputeFeature(); } void DlgPrimitives::onChangeCone(QWidget* widget) { if (featurePtr.expired()) return; Part::Cone* cone = featurePtr.get(); if (widget == ui->coneRadius1) { cone->Radius1.setValue(ui->coneRadius1->value().getValue()); } else if (widget == ui->coneRadius2) { cone->Radius2.setValue(ui->coneRadius2->value().getValue()); } else if (widget == ui->coneHeight) { cone->Height.setValue(ui->coneHeight->value().getValue()); } else if (widget == ui->coneAngle) { cone->Angle.setValue(ui->coneAngle->value().getValue()); } cone->recomputeFeature(); } void DlgPrimitives::onChangeSphere(QWidget* widget) { if (featurePtr.expired()) return; Part::Sphere* sphere = featurePtr.get(); if (widget == ui->sphereRadius) { sphere->Radius.setValue(ui->sphereRadius->value().getValue()); } else if (widget == ui->sphereAngle1) { sphere->Angle1.setValue(ui->sphereAngle1->value().getValue()); } else if (widget == ui->sphereAngle2) { sphere->Angle2.setValue(ui->sphereAngle2->value().getValue()); } else if (widget == ui->sphereAngle3) { sphere->Angle3.setValue(ui->sphereAngle3->value().getValue()); } sphere->recomputeFeature(); } void DlgPrimitives::onChangeEllipsoid(QWidget* widget) { if (featurePtr.expired()) return; Part::Ellipsoid* ell = featurePtr.get(); if (widget == ui->ellipsoidRadius1) { ell->Radius1.setValue(ui->ellipsoidRadius1->value().getValue()); } else if (widget == ui->ellipsoidRadius2) { ell->Radius2.setValue(ui->ellipsoidRadius2->value().getValue()); } else if (widget == ui->ellipsoidRadius3) { ell->Radius3.setValue(ui->ellipsoidRadius3->value().getValue()); } else if (widget == ui->ellipsoidAngle1) { ell->Angle1.setValue(ui->ellipsoidAngle1->value().getValue()); } else if (widget == ui->ellipsoidAngle2) { ell->Angle2.setValue(ui->ellipsoidAngle2->value().getValue()); } else if (widget == ui->ellipsoidAngle3) { ell->Angle3.setValue(ui->ellipsoidAngle3->value().getValue()); } ell->recomputeFeature(); } void DlgPrimitives::onChangeTorus(QWidget* widget) { if (featurePtr.expired()) return; Part::Torus* torus = featurePtr.get(); if (widget == ui->torusRadius1) { torus->Radius1.setValue(ui->torusRadius1->value().getValue()); } else if (widget == ui->torusRadius2) { torus->Radius2.setValue(ui->torusRadius2->value().getValue()); } else if (widget == ui->torusAngle1) { torus->Angle1.setValue(ui->torusAngle1->value().getValue()); } else if (widget == ui->torusAngle2) { torus->Angle2.setValue(ui->torusAngle2->value().getValue()); } else if (widget == ui->torusAngle3) { torus->Angle3.setValue(ui->torusAngle3->value().getValue()); } torus->recomputeFeature(); } void DlgPrimitives::onChangePrism(QWidget* widget) { if (featurePtr.expired()) return; Part::Prism* prism = featurePtr.get(); if (widget == ui->prismPolygon) { prism->Polygon.setValue(ui->prismPolygon->value()); } else if (widget == ui->prismCircumradius) { prism->Circumradius.setValue(ui->prismCircumradius->value().getValue()); } else if (widget == ui->prismHeight) { prism->Height.setValue(ui->prismHeight->value().getValue()); } else if (widget == ui->prismXSkew) { prism->FirstAngle.setValue(ui->prismXSkew->value().getValue()); } else if (widget == ui->prismYSkew) { prism->SecondAngle.setValue(ui->prismYSkew->value().getValue()); } prism->recomputeFeature(); } void DlgPrimitives::onChangeWedge(QWidget* widget) { if (featurePtr.expired()) return; Part::Wedge* wedge = featurePtr.get(); if (widget == ui->wedgeXmin) { wedge->Xmin.setValue(ui->wedgeXmin->value().getValue()); } else if (widget == ui->wedgeYmin) { wedge->Ymin.setValue(ui->wedgeYmin->value().getValue()); } else if (widget == ui->wedgeZmin) { wedge->Zmin.setValue(ui->wedgeZmin->value().getValue()); } else if (widget == ui->wedgeX2min) { wedge->X2min.setValue(ui->wedgeX2min->value().getValue()); } else if (widget == ui->wedgeZ2min) { wedge->Z2min.setValue(ui->wedgeZ2min->value().getValue()); } else if (widget == ui->wedgeXmax) { wedge->Xmax.setValue(ui->wedgeXmax->value().getValue()); } else if (widget == ui->wedgeYmax) { wedge->Ymax.setValue(ui->wedgeYmax->value().getValue()); } else if (widget == ui->wedgeZmax) { wedge->Zmax.setValue(ui->wedgeZmax->value().getValue()); } else if (widget == ui->wedgeX2max) { wedge->X2max.setValue(ui->wedgeX2max->value().getValue()); } else if (widget == ui->wedgeZ2max) { wedge->Z2max.setValue(ui->wedgeZ2max->value().getValue()); } wedge->recomputeFeature(); } void DlgPrimitives::onChangeHelix(QWidget* widget) { if (featurePtr.expired()) return; Part::Helix* helix = featurePtr.get(); if (widget == ui->helixPitch) { helix->Pitch.setValue(ui->helixPitch->value().getValue()); } else if (widget == ui->helixHeight) { helix->Height.setValue(ui->helixHeight->value().getValue()); } else if (widget == ui->helixRadius) { helix->Radius.setValue(ui->helixRadius->value().getValue()); } else if (widget == ui->helixAngle) { helix->Angle.setValue(ui->helixAngle->value().getValue()); } else if (widget == ui->helixLocalCS) { helix->LocalCoord.setValue(ui->helixLocalCS->currentIndex()); } helix->recomputeFeature(); } void DlgPrimitives::onChangeSpiral(QWidget* widget) { if (featurePtr.expired()) return; Part::Spiral* spiral = featurePtr.get(); if (widget == ui->spiralGrowth) { spiral->Growth.setValue(ui->spiralGrowth->value().getValue()); } else if (widget == ui->spiralRotation) { spiral->Rotations.setValue(ui->spiralRotation->value()); } else if (widget == ui->spiralRadius) { spiral->Radius.setValue(ui->spiralRadius->value().getValue()); } spiral->recomputeFeature(); } void DlgPrimitives::onChangeCircle(QWidget* widget) { if (featurePtr.expired()) return; Part::Circle* circle = featurePtr.get(); if (widget == ui->circleRadius) { circle->Radius.setValue(ui->circleRadius->value().getValue()); } else if (widget == ui->circleAngle1) { circle->Angle1.setValue(ui->circleAngle1->value().getValue()); } else if (widget == ui->circleAngle2) { circle->Angle2.setValue(ui->circleAngle2->value().getValue()); } circle->recomputeFeature(); } void DlgPrimitives::onChangeEllipse(QWidget* widget) { if (featurePtr.expired()) return; Part::Ellipse* ell = featurePtr.get(); if (widget == ui->ellipseMajorRadius) { ell->MajorRadius.setValue(ui->ellipseMajorRadius->value().getValue()); } else if (widget == ui->ellipseMinorRadius) { ell->MinorRadius.setValue(ui->ellipseMinorRadius->value().getValue()); } else if (widget == ui->ellipseAngle1) { ell->Angle1.setValue(ui->ellipseAngle1->value().getValue()); } else if (widget == ui->ellipseAngle2) { ell->Angle2.setValue(ui->ellipseAngle2->value().getValue()); } ell->recomputeFeature(); } void DlgPrimitives::onChangeVertex(QWidget* widget) { if (featurePtr.expired()) return; Part::Vertex* v = featurePtr.get(); if (widget == ui->vertexX) { v->X.setValue(ui->vertexX->value().getValue()); } else if (widget == ui->vertexY) { v->Y.setValue(ui->vertexY->value().getValue()); } else if (widget == ui->vertexZ) { v->Z.setValue(ui->vertexZ->value().getValue()); } v->recomputeFeature(); } void DlgPrimitives::onChangeLine(QWidget* widget) { if (featurePtr.expired()) return; Part::Line* line = featurePtr.get(); if (widget == ui->edgeX1) { line->X1.setValue(ui->edgeX1->value().getValue()); } else if (widget == ui->edgeY1) { line->Y1.setValue(ui->edgeY1->value().getValue()); } else if (widget == ui->edgeZ1) { line->Z1.setValue(ui->edgeZ1->value().getValue()); } else if (widget == ui->edgeX2) { line->X2.setValue(ui->edgeX2->value().getValue()); } else if (widget == ui->edgeY2) { line->Y2.setValue(ui->edgeY2->value().getValue()); } else if (widget == ui->edgeZ2) { line->Z2.setValue(ui->edgeZ2->value().getValue()); } line->recomputeFeature(); } void DlgPrimitives::onChangeRegularPolygon(QWidget* widget) { if (featurePtr.expired()) return; Part::RegularPolygon* poly = featurePtr.get(); if (widget == ui->regularPolygonPolygon) { poly->Polygon.setValue(ui->regularPolygonPolygon->value()); } else if (widget == ui->regularPolygonCircumradius) { poly->Circumradius.setValue(ui->regularPolygonCircumradius->value().getValue()); } poly->recomputeFeature(); } // ---------------------------------------------- /* TRANSLATOR PartGui::Location */ Location::Location(QWidget* parent, Part::Feature* feature) : QWidget(parent) , ui(new Ui_Location) , featurePtr(feature) { mode = 0; ui->setupUi(this); ui->XPositionQSB->setUnit(Base::Unit::Length); ui->YPositionQSB->setUnit(Base::Unit::Length); ui->ZPositionQSB->setUnit(Base::Unit::Length); ui->AngleQSB->setUnit(Base::Unit::Angle); // fill location widget if object already exists if (feature) { // get the placement values auto placement = feature->Placement.getValue(); auto position = placement.getPosition(); ui->XPositionQSB->setValue(position.x); ui->YPositionQSB->setValue(position.y); ui->ZPositionQSB->setValue(position.z); double rotationAngle; Base::Vector3d rotationAxes; auto rotation = placement.getRotation(); rotation.getRawValue(rotationAxes, rotationAngle); ui->XDirectionEdit->setValue(rotationAxes.x); ui->YDirectionEdit->setValue(rotationAxes.y); ui->ZDirectionEdit->setValue(rotationAxes.z); // the angle is rad, transform it for display to degrees ui->AngleQSB->setValue(Base::toDegrees(rotationAngle)); ui->XPositionQSB->bind(App::ObjectIdentifier::parse(feature, std::string("Placement.Base.x"))); ui->YPositionQSB->bind(App::ObjectIdentifier::parse(feature, std::string("Placement.Base.y"))); ui->ZPositionQSB->bind(App::ObjectIdentifier::parse(feature, std::string("Placement.Base.z"))); ui->XDirectionEdit->bind(App::ObjectIdentifier::parse(feature, std::string("Placement.Rotation.Axis.x"))); ui->YDirectionEdit->bind(App::ObjectIdentifier::parse(feature, std::string("Placement.Rotation.Axis.y"))); ui->ZDirectionEdit->bind(App::ObjectIdentifier::parse(feature, std::string("Placement.Rotation.Axis.z"))); ui->AngleQSB->bind(App::ObjectIdentifier::parse(feature, std::string("Placement.Rotation.Angle"))); //connect signals connect(ui->XPositionQSB, SIGNAL(valueChanged(double)), this, SLOT(onChangePosRot())); connect(ui->YPositionQSB, SIGNAL(valueChanged(double)), this, SLOT(onChangePosRot())); connect(ui->ZPositionQSB, SIGNAL(valueChanged(double)), this, SLOT(onChangePosRot())); connect(ui->AngleQSB, SIGNAL(valueChanged(double)), this, SLOT(onChangePosRot())); connect(ui->XDirectionEdit, SIGNAL(valueChanged(double)), this, SLOT(onChangePosRot())); connect(ui->YDirectionEdit, SIGNAL(valueChanged(double)), this, SLOT(onChangePosRot())); connect(ui->ZDirectionEdit, SIGNAL(valueChanged(double)), this, SLOT(onChangePosRot())); } } Location::~Location() { // no need to delete child widgets, Qt does it all for us if (!this->activeView.isNull()) { Gui::View3DInventorViewer* viewer = static_cast (this->activeView.data())->getViewer(); viewer->setEditing(false); viewer->setRedirectToSceneGraph(false); viewer->removeEventCallback(SoMouseButtonEvent::getClassTypeId(), pickCallback,this); SoNode* root = viewer->getSceneGraph(); if (root && root->getTypeId().isDerivedFrom(Gui::SoFCUnifiedSelection::getClassTypeId())) static_cast(root)->selectionMode.setValue(this->mode); } } void Location::onChangePosRot() { App::GeoFeature* geom = featurePtr.get(); if (!geom) return; // read dialog values Base::Vector3d loc; loc.x = ui->XPositionQSB->rawValue(); loc.y = ui->YPositionQSB->rawValue(); loc.z = ui->ZPositionQSB->rawValue(); double angle = ui->AngleQSB->rawValue(); // the angle is displayed in degrees, transform it to rad angle = Base::toRadians(angle); Base::Vector3d rot; rot.x = ui->XDirectionEdit->value(); rot.y = ui->YDirectionEdit->value(); rot.z = ui->ZDirectionEdit->value(); // set placement and rotation Base::Placement placement; Base::Rotation rotation(rot, angle); placement.setPosition(loc); placement.setRotation(rotation); // apply new placement to the feature geom->Placement.setValue(placement); geom->recomputeFeature(); } 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); SoNode* root = viewer->getSceneGraph(); if (root && root->getTypeId().isDerivedFrom(Gui::SoFCUnifiedSelection::getClassTypeId())) { this->mode = static_cast(root)->selectionMode.getValue(); static_cast(root)->selectionMode.setValue(Gui::SoFCUnifiedSelection::OFF); } } } } void Location::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->getAction()->setHandled(); if (mbe->getButton() == SoMouseButtonEvent::BUTTON1) { 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->XPositionQSB->setValue(pnt[0]); dlg->ui->YPositionQSB->setValue(pnt[1]); dlg->ui->ZPositionQSB->setValue(pnt[2]); dlg->ui->XDirectionEdit->setValue(nor[0]); dlg->ui->YDirectionEdit->setValue(nor[1]); dlg->ui->ZDirectionEdit->setValue(nor[2]); n->setHandled(); } } } else if (mbe->getButton() == SoMouseButtonEvent::BUTTON2) { 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); SoNode* root = view->getSceneGraph(); if (root && root->getTypeId().isDerivedFrom(Gui::SoFCUnifiedSelection::getClassTypeId())) static_cast(root)->selectionMode.setValue(static_cast(ud)->mode); } } } QString Location::toPlacement() const { // create a command to set the position and angle of the primitive object Base::Vector3d rot; rot.x = ui->XDirectionEdit->value(); rot.y = ui->YDirectionEdit->value(); rot.z = ui->ZDirectionEdit->value(); double angle = ui->AngleQSB->rawValue(); Base::Vector3d loc; loc.x = ui->XPositionQSB->rawValue(); loc.y = ui->YPositionQSB->rawValue(); loc.z = ui->ZPositionQSB->rawValue(); return QString::fromLatin1("App.Placement(App.Vector(%1,%2,%3),App.Rotation(App.Vector(%4,%5,%6),%7))") .arg(loc.x, 0, 'f', Base::UnitsApi::getDecimals()) .arg(loc.y, 0, 'f', Base::UnitsApi::getDecimals()) .arg(loc.z, 0, 'f', Base::UnitsApi::getDecimals()) .arg(rot.x, 0, 'f', Base::UnitsApi::getDecimals()) .arg(rot.y, 0, 'f', Base::UnitsApi::getDecimals()) .arg(rot.z, 0, 'f', Base::UnitsApi::getDecimals()) .arg(angle, 0, 'f', Base::UnitsApi::getDecimals()); } // ---------------------------------------------- /* 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 TaskPrimitives::modifyStandardButtons(QDialogButtonBox* box) { 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; } // ---------------------------------------------- /* TRANSLATOR PartGui::TaskPrimitivesEdit */ TaskPrimitivesEdit::TaskPrimitivesEdit(Part::Primitive* feature) { // create and show dialog for the primitives Gui::TaskView::TaskBox* taskbox; widget = new DlgPrimitives(nullptr, feature); taskbox = new Gui::TaskView::TaskBox(QPixmap(), widget->windowTitle(), true, 0); taskbox->groupLayout()->addWidget(widget); Content.push_back(taskbox); // create and show dialog for the location location = new Location(nullptr, feature); taskbox = new Gui::TaskView::TaskBox(QPixmap(), location->windowTitle(), true, 0); taskbox->groupLayout()->addWidget(location); Content.push_back(taskbox); } TaskPrimitivesEdit::~TaskPrimitivesEdit() { // automatically deleted in the sub-class } QDialogButtonBox::StandardButtons TaskPrimitivesEdit::getStandardButtons() const { return QDialogButtonBox::Cancel | QDialogButtonBox::Ok; } bool TaskPrimitivesEdit::accept() { widget->accept(location->toPlacement()); std::string document = getDocumentName(); // needed because resetEdit() deletes this instance Gui::Command::doCommand(Gui::Command::Gui, "Gui.getDocument('%s').resetEdit()", document.c_str()); return true; } bool TaskPrimitivesEdit::reject() { widget->reject(); std::string document = getDocumentName(); // needed because resetEdit() deletes this instance Gui::Command::doCommand(Gui::Command::Gui, "Gui.getDocument('%s').resetEdit()", document.c_str()); return true; } #include "moc_DlgPrimitives.cpp"