From 7f66f3f4dc0282d8312d12dc58749e74aeb4f6aa Mon Sep 17 00:00:00 2001 From: wmayer Date: Tue, 20 Apr 2021 17:10:33 +0200 Subject: [PATCH 1/6] Gui: properly handle small quantities in property editor --- src/Gui/propertyeditor/PropertyItem.cpp | 27 ++++++++++++++----------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/Gui/propertyeditor/PropertyItem.cpp b/src/Gui/propertyeditor/PropertyItem.cpp index 75d67ce4cb..512e7589cb 100644 --- a/src/Gui/propertyeditor/PropertyItem.cpp +++ b/src/Gui/propertyeditor/PropertyItem.cpp @@ -1051,8 +1051,8 @@ void PropertyUnitItem::setValue(const QVariant& value) return; const Base::Quantity& val = value.value(); - QString unit = QString::fromLatin1("'%1 %2'").arg(val.getValue(),0,'f',decimals()) - .arg(val.getUnit().getString()); + Base::QuantityFormat format(Base::QuantityFormat::Default, decimals()); + QString unit = Base::UnitsApi::toString(val, format); setPropertyValue(unit); } } @@ -1643,10 +1643,12 @@ void PropertyVectorDistanceItem::setValue(const QVariant& variant) Base::Quantity x = Base::Quantity(value.x, Base::Unit::Length); Base::Quantity y = Base::Quantity(value.y, Base::Unit::Length); Base::Quantity z = Base::Quantity(value.z, Base::Unit::Length); + + Base::QuantityFormat format(Base::QuantityFormat::Default, decimals()); QString data = QString::fromLatin1("(%1, %2, %3)") - .arg(x.getValue(),0,'f',decimals()) - .arg(y.getValue(),0,'f',decimals()) - .arg(z.getValue(),0,'f',decimals()); + .arg(Base::UnitsApi::toNumber(x, format)) + .arg(Base::UnitsApi::toNumber(y, format)) + .arg(Base::UnitsApi::toNumber(z, format)); setPropertyValue(data); } @@ -2368,16 +2370,17 @@ void PropertyPlacementItem::setValue(const QVariant& value) const Base::Placement& val = value.value(); Base::Vector3d pos = val.getPosition(); + Base::QuantityFormat format(Base::QuantityFormat::Default, decimals()); QString data = QString::fromLatin1("App.Placement(" "App.Vector(%1,%2,%3)," "App.Rotation(App.Vector(%4,%5,%6),%7))") - .arg(pos.x, 0, 'f', decimals()) - .arg(pos.y, 0, 'f', decimals()) - .arg(pos.z, 0, 'f', decimals()) - .arg(rot_axis.x, 0, 'f', decimals()) - .arg(rot_axis.y, 0, 'f', decimals()) - .arg(rot_axis.z, 0, 'f', decimals()) - .arg(rot_angle, 0, 'f', decimals()); + .arg(Base::UnitsApi::toNumber(pos.x, format)) + .arg(Base::UnitsApi::toNumber(pos.y, format)) + .arg(Base::UnitsApi::toNumber(pos.z, format)) + .arg(Base::UnitsApi::toNumber(rot_axis.x, format)) + .arg(Base::UnitsApi::toNumber(rot_axis.y, format)) + .arg(Base::UnitsApi::toNumber(rot_axis.z, format)) + .arg(Base::UnitsApi::toNumber(rot_angle, format)); setPropertyValue(data); } From 791508eb0d53dd1dc5b4211a426bdab7b3ee9a58 Mon Sep 17 00:00:00 2001 From: wmayer Date: Tue, 20 Apr 2021 17:11:17 +0200 Subject: [PATCH 2/6] Mesh: properly handle small quantities in mesh primitive dialog --- src/Mod/Mesh/Gui/DlgRegularSolidImp.cpp | 30 ++++++++++++------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/Mod/Mesh/Gui/DlgRegularSolidImp.cpp b/src/Mod/Mesh/Gui/DlgRegularSolidImp.cpp index da41a8068b..d521324db4 100644 --- a/src/Mod/Mesh/Gui/DlgRegularSolidImp.cpp +++ b/src/Mod/Mesh/Gui/DlgRegularSolidImp.cpp @@ -135,9 +135,9 @@ void DlgRegularSolidImp::on_createSolidButton_clicked() "App.ActiveDocument.%1.Width=%3\n" "App.ActiveDocument.%1.Height=%4\n")) .arg(QLatin1String(name.c_str())) - .arg(ui->boxLength->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->boxWidth->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->boxHeight->value().getValue(),0,'f',Base::UnitsApi::getDecimals()); + .arg(Base::UnitsApi::toNumber(ui->boxLength->value())) + .arg(Base::UnitsApi::toNumber(ui->boxWidth->value())) + .arg(Base::UnitsApi::toNumber(ui->boxHeight->value())); } else if (ui->comboBox1->currentIndex() == 1) { // cylinder name = doc->getUniqueObjectName("Cylinder"); @@ -149,9 +149,9 @@ void DlgRegularSolidImp::on_createSolidButton_clicked() "App.ActiveDocument.%1.Closed=%5\n" "App.ActiveDocument.%1.Sampling=%6\n")) .arg(QLatin1String(name.c_str())) - .arg(ui->cylinderRadius->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->cylinderLength->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->cylinderEdgeLength->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .arg(Base::UnitsApi::toNumber(ui->cylinderRadius->value())) + .arg(Base::UnitsApi::toNumber(ui->cylinderLength->value())) + .arg(Base::UnitsApi::toNumber(ui->cylinderEdgeLength->value())) .arg(QLatin1String((ui->cylinderClosed->isChecked()?"True":"False"))) .arg(ui->cylinderCount->value()); } @@ -166,10 +166,10 @@ void DlgRegularSolidImp::on_createSolidButton_clicked() "App.ActiveDocument.%1.Closed=%6\n" "App.ActiveDocument.%1.Sampling=%7\n")) .arg(QLatin1String(name.c_str())) - .arg(ui->coneRadius1->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->coneRadius2->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->coneLength->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->coneEdgeLength->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .arg(Base::UnitsApi::toNumber(ui->coneRadius1->value())) + .arg(Base::UnitsApi::toNumber(ui->coneRadius2->value())) + .arg(Base::UnitsApi::toNumber(ui->coneLength->value())) + .arg(Base::UnitsApi::toNumber(ui->coneEdgeLength->value())) .arg(QLatin1String((ui->coneClosed->isChecked()?"True":"False"))) .arg(ui->coneCount->value()); } @@ -180,7 +180,7 @@ void DlgRegularSolidImp::on_createSolidButton_clicked() "App.ActiveDocument.%1.Radius=%2\n" "App.ActiveDocument.%1.Sampling=%3\n")) .arg(QLatin1String(name.c_str())) - .arg(ui->sphereRadius->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .arg(Base::UnitsApi::toNumber(ui->sphereRadius->value())) .arg(ui->sphereCount->value()); } else if (ui->comboBox1->currentIndex() == 4) { // ellipsoid @@ -191,8 +191,8 @@ void DlgRegularSolidImp::on_createSolidButton_clicked() "App.ActiveDocument.%1.Radius2=%3\n" "App.ActiveDocument.%1.Sampling=%4\n")) .arg(QLatin1String(name.c_str())) - .arg(ui->ellipsoidRadius1->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->ellipsoidRadius2->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .arg(Base::UnitsApi::toNumber(ui->ellipsoidRadius1->value())) + .arg(Base::UnitsApi::toNumber(ui->ellipsoidRadius2->value())) .arg(ui->ellipsoidCount->value()); } else if (ui->comboBox1->currentIndex() == 5) { // toroid @@ -203,8 +203,8 @@ void DlgRegularSolidImp::on_createSolidButton_clicked() "App.ActiveDocument.%1.Radius2=%3\n" "App.ActiveDocument.%1.Sampling=%4\n")) .arg(QLatin1String(name.c_str())) - .arg(ui->toroidRadius1->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->toroidRadius2->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .arg(Base::UnitsApi::toNumber(ui->toroidRadius1->value())) + .arg(Base::UnitsApi::toNumber(ui->toroidRadius2->value())) .arg(ui->toroidCount->value()); } From 2fe44f80b90978c0d0242f0b9aae7c99ac779536 Mon Sep 17 00:00:00 2001 From: wmayer Date: Tue, 20 Apr 2021 17:11:38 +0200 Subject: [PATCH 3/6] Part: properly handle small quantities in part primitive dialog --- src/Mod/Part/Gui/DlgPrimitives.cpp | 284 ++++++++++++++--------------- 1 file changed, 142 insertions(+), 142 deletions(-) diff --git a/src/Mod/Part/Gui/DlgPrimitives.cpp b/src/Mod/Part/Gui/DlgPrimitives.cpp index ce19072f44..3e428146ad 100644 --- a/src/Mod/Part/Gui/DlgPrimitives.cpp +++ b/src/Mod/Part/Gui/DlgPrimitives.cpp @@ -137,13 +137,13 @@ QString Picker::toPlacement(const gp_Ax2& axis) const 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,'f',Base::UnitsApi::getDecimals()) - .arg(loc.Y(),0,'f',Base::UnitsApi::getDecimals()) - .arg(loc.Z(),0,'f',Base::UnitsApi::getDecimals()) - .arg(rot[0],0,'f',Base::UnitsApi::getDecimals()) - .arg(rot[1],0,'f',Base::UnitsApi::getDecimals()) - .arg(rot[2],0,'f',Base::UnitsApi::getDecimals()) - .arg(rot[3],0,'f',Base::UnitsApi::getDecimals()); + .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 @@ -174,9 +174,9 @@ public: "App.ActiveDocument.%1.Angle1=%4\n" "App.ActiveDocument.%1.Placement=%5\n") .arg(name) - .arg(circle->Radius(),0,'f',Base::UnitsApi::getDecimals()) - .arg(Base::toDegrees(trim->FirstParameter()),0,'f',Base::UnitsApi::getDecimals()) - .arg(Base::toDegrees(trim->LastParameter ()),0,'f',Base::UnitsApi::getDecimals()) + .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())); } @@ -720,8 +720,8 @@ QString DlgPrimitives::createPlane(const QString& objectName, const QString& pla "App.ActiveDocument.%1.Placement=%4\n" "App.ActiveDocument.%1.Label='%5'\n") .arg(objectName) - .arg(ui->planeLength->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->planeWidth->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .arg(Base::UnitsApi::toNumber(ui->planeLength->value())) + .arg(Base::UnitsApi::toNumber(ui->planeWidth->value())) .arg(placement) .arg(tr("Plane")); } @@ -736,9 +736,9 @@ QString DlgPrimitives::createBox(const QString& objectName, const QString& place "App.ActiveDocument.%1.Placement=%5\n" "App.ActiveDocument.%1.Label='%6'\n") .arg(objectName) - .arg(ui->boxLength->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->boxWidth->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->boxHeight->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .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")); } @@ -755,11 +755,11 @@ QString DlgPrimitives::createCylinder(const QString& objectName, const QString& "App.ActiveDocument.%1.Placement=%7\n" "App.ActiveDocument.%1.Label='%8'\n") .arg(objectName) - .arg(ui->cylinderRadius->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->cylinderHeight->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->cylinderAngle->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->cylinderXSkew->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->cylinderYSkew->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .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")); } @@ -775,10 +775,10 @@ QString DlgPrimitives::createCone(const QString& objectName, const QString& plac "App.ActiveDocument.%1.Placement=%6\n" "App.ActiveDocument.%1.Label='%7'\n") .arg(objectName) - .arg(ui->coneRadius1->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->coneRadius2->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->coneHeight->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->coneAngle->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .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")); } @@ -794,10 +794,10 @@ QString DlgPrimitives::createSphere(const QString& objectName, const QString& pl "App.ActiveDocument.%1.Placement=%6\n" "App.ActiveDocument.%1.Label='%7'\n") .arg(objectName) - .arg(ui->sphereRadius->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->sphereAngle1->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->sphereAngle2->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->sphereAngle3->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .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")); } @@ -815,12 +815,12 @@ QString DlgPrimitives::createEllipsoid(const QString& objectName, const QString& "App.ActiveDocument.%1.Placement=%8\n" "App.ActiveDocument.%1.Label='%9'\n") .arg(objectName) - .arg(ui->ellipsoidRadius1->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->ellipsoidRadius2->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->ellipsoidRadius3->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->ellipsoidAngle1->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->ellipsoidAngle2->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->ellipsoidAngle3->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .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")); } @@ -837,11 +837,11 @@ QString DlgPrimitives::createTorus(const QString& objectName, const QString& pla "App.ActiveDocument.%1.Placement=%7\n" "App.ActiveDocument.%1.Label='%8'\n") .arg(objectName) - .arg(ui->torusRadius1->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->torusRadius2->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->torusAngle1->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->torusAngle2->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->torusAngle3->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .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")); } @@ -859,10 +859,10 @@ QString DlgPrimitives::createPrism(const QString& objectName, const QString& pla "App.ActiveDocument.%1.Label='%8'\n") .arg(objectName) .arg(ui->prismPolygon->value()) - .arg(ui->prismCircumradius->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->prismHeight->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->prismXSkew->value().getValue(), 0, 'f', Base::UnitsApi::getDecimals()) - .arg(ui->prismYSkew->value().getValue(), 0, 'f', Base::UnitsApi::getDecimals()) + .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")); } @@ -884,16 +884,16 @@ QString DlgPrimitives::createWedge(const QString& objectName, const QString& pla "App.ActiveDocument.%1.Placement=%12\n" "App.ActiveDocument.%1.Label='%13'\n") .arg(objectName) - .arg(ui->wedgeXmin->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->wedgeYmin->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->wedgeZmin->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->wedgeX2min->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->wedgeZ2min->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->wedgeXmax->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->wedgeYmax->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->wedgeZmax->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->wedgeX2max->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->wedgeZ2max->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .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")); } @@ -911,10 +911,10 @@ QString DlgPrimitives::createHelix(const QString& objectName, const QString& pla "App.ActiveDocument.%1.Placement=%7\n" "App.ActiveDocument.%1.Label='%8'\n") .arg(objectName) - .arg(ui->helixPitch->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->helixHeight->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->helixRadius->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->helixAngle->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .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")); @@ -930,9 +930,9 @@ QString DlgPrimitives::createSpiral(const QString& objectName, const QString& pl "App.ActiveDocument.%1.Placement=%5\n" "App.ActiveDocument.%1.Label='%6'\n") .arg(objectName) - .arg(ui->spiralGrowth->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->spiralRotation->value(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->spiralRadius->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .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")); } @@ -947,9 +947,9 @@ QString DlgPrimitives::createCircle(const QString& objectName, const QString& pl "App.ActiveDocument.%1.Placement=%5\n" "App.ActiveDocument.%1.Label='%6'\n") .arg(objectName) - .arg(ui->circleRadius->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->circleAngle0->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->circleAngle1->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .arg(Base::UnitsApi::toNumber(ui->circleRadius->value())) + .arg(Base::UnitsApi::toNumber(ui->circleAngle0->value())) + .arg(Base::UnitsApi::toNumber(ui->circleAngle1->value())) .arg(placement) .arg(tr("Circle")); } @@ -965,10 +965,10 @@ QString DlgPrimitives::createEllipse(const QString& objectName, const QString& p "App.ActiveDocument.%1.Placement=%6\n" "App.ActiveDocument.%1.Label='%7'\n") .arg(objectName) - .arg(ui->ellipseMajorRadius->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->ellipseMinorRadius->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->ellipseAngle0->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->ellipseAngle1->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .arg(Base::UnitsApi::toNumber(ui->ellipseMajorRadius->value())) + .arg(Base::UnitsApi::toNumber(ui->ellipseMinorRadius->value())) + .arg(Base::UnitsApi::toNumber(ui->ellipseAngle0->value())) + .arg(Base::UnitsApi::toNumber(ui->ellipseAngle1->value())) .arg(placement) .arg(tr("Ellipse")); } @@ -983,9 +983,9 @@ QString DlgPrimitives::createVertex(const QString& objectName, const QString& pl "App.ActiveDocument.%1.Placement=%5\n" "App.ActiveDocument.%1.Label='%6'\n") .arg(objectName) - .arg(ui->vertexX->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->vertexY->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->vertexZ->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .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")); } @@ -1003,12 +1003,12 @@ QString DlgPrimitives::createLine(const QString& objectName, const QString& plac "App.ActiveDocument.%1.Placement=%8\n" "App.ActiveDocument.%1.Label='%9'\n") .arg(objectName) - .arg(ui->edgeX1->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->edgeY1->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->edgeZ1->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->edgeX2->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->edgeY2->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->edgeZ2->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .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")); } @@ -1023,7 +1023,7 @@ QString DlgPrimitives::createRegularPolygon(const QString& objectName, const QSt "App.ActiveDocument.%1.Label='%5'\n") .arg(objectName) .arg(ui->regularPolygonPolygon->value()) - .arg(ui->regularPolygonCircumradius->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .arg(Base::UnitsApi::toNumber(ui->regularPolygonCircumradius->value())) .arg(placement) .arg(tr("Regular polygon")); } @@ -1124,8 +1124,8 @@ QString DlgPrimitives::changePlane(const QString& objectName, const QString& pla "%1.Width=%3\n" "%1.Placement=%4\n") .arg(objectName) - .arg(ui->planeLength->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->planeWidth->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .arg(Base::UnitsApi::toNumber(ui->planeLength->value())) + .arg(Base::UnitsApi::toNumber(ui->planeWidth->value())) .arg(placement); } @@ -1137,9 +1137,9 @@ QString DlgPrimitives::changeBox(const QString& objectName, const QString& place "%1.Height=%4\n" "%1.Placement=%5\n") .arg(objectName) - .arg(ui->boxLength->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->boxWidth->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->boxHeight->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .arg(Base::UnitsApi::toNumber(ui->boxLength->value())) + .arg(Base::UnitsApi::toNumber(ui->boxWidth->value())) + .arg(Base::UnitsApi::toNumber(ui->boxHeight->value())) .arg(placement); } @@ -1151,9 +1151,9 @@ QString DlgPrimitives::changeCylinder(const QString& objectName, const QString& "%1.Angle=%4\n" "%1.Placement=%5\n") .arg(objectName) - .arg(ui->cylinderRadius->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->cylinderHeight->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->cylinderAngle->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .arg(Base::UnitsApi::toNumber(ui->cylinderRadius->value())) + .arg(Base::UnitsApi::toNumber(ui->cylinderHeight->value())) + .arg(Base::UnitsApi::toNumber(ui->cylinderAngle->value())) .arg(placement); } @@ -1166,10 +1166,10 @@ QString DlgPrimitives::changeCone(const QString& objectName, const QString& plac "%1.Angle=%5\n" "%1.Placement=%6\n") .arg(objectName) - .arg(ui->coneRadius1->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->coneRadius2->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->coneHeight->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->coneAngle->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .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); } @@ -1182,10 +1182,10 @@ QString DlgPrimitives::changeSphere(const QString& objectName, const QString& pl "%1.Angle3=%5\n" "%1.Placement=%6\n") .arg(objectName) - .arg(ui->sphereRadius->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->sphereAngle1->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->sphereAngle2->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->sphereAngle3->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .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); } @@ -1200,12 +1200,12 @@ QString DlgPrimitives::changeEllipsoid(const QString& objectName, const QString& "%1.Angle3=%7\n" "%1.Placement=%8\n") .arg(objectName) - .arg(ui->ellipsoidRadius1->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->ellipsoidRadius2->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->ellipsoidRadius3->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->ellipsoidAngle1->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->ellipsoidAngle2->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->ellipsoidAngle3->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .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); } @@ -1219,11 +1219,11 @@ QString DlgPrimitives::changeTorus(const QString& objectName, const QString& pla "%1.Angle3=%6\n" "%1.Placement=%7\n") .arg(objectName) - .arg(ui->torusRadius1->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->torusRadius2->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->torusAngle1->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->torusAngle2->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->torusAngle3->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .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); } @@ -1238,10 +1238,10 @@ QString DlgPrimitives::changePrism(const QString& objectName, const QString& pla "%1.Placement=%7\n") .arg(objectName) .arg(ui->prismPolygon->value()) - .arg(ui->prismCircumradius->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->prismHeight->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->prismXSkew->value().getValue(), 0, 'f', Base::UnitsApi::getDecimals()) - .arg(ui->prismYSkew->value().getValue(), 0, 'f', Base::UnitsApi::getDecimals()) + .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); } @@ -1260,16 +1260,16 @@ QString DlgPrimitives::changeWedge(const QString& objectName, const QString& pla "%1.Z2max=%11\n" "%1.Placement=%12\n") .arg(objectName) - .arg(ui->wedgeXmin->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->wedgeYmin->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->wedgeZmin->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->wedgeX2min->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->wedgeZ2min->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->wedgeXmax->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->wedgeYmax->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->wedgeZmax->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->wedgeX2max->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->wedgeZ2max->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .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); } @@ -1283,10 +1283,10 @@ QString DlgPrimitives::changeHelix(const QString& objectName, const QString& pla "%1.LocalCoord=%6\n" "%1.Placement=%7\n") .arg(objectName) - .arg(ui->helixPitch->value().getValue(), 0, 'f', Base::UnitsApi::getDecimals()) - .arg(ui->helixHeight->value().getValue(), 0, 'f', Base::UnitsApi::getDecimals()) - .arg(ui->helixRadius->value().getValue(), 0, 'f', Base::UnitsApi::getDecimals()) - .arg(ui->helixAngle->value().getValue(), 0, 'f', Base::UnitsApi::getDecimals()) + .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); } @@ -1299,9 +1299,9 @@ QString DlgPrimitives::changeSpiral(const QString& objectName, const QString& pl "%1.Radius=%4\n" "%1.Placement=%5\n") .arg(objectName) - .arg(ui->spiralGrowth->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->spiralRotation->value(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->spiralRadius->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .arg(Base::UnitsApi::toNumber(ui->spiralGrowth->value())) + .arg(Base::UnitsApi::toNumber(ui->spiralRotation->value())) + .arg(Base::UnitsApi::toNumber(ui->spiralRadius->value())) .arg(placement); } @@ -1313,9 +1313,9 @@ QString DlgPrimitives::changeCircle(const QString& objectName, const QString& pl "%1.Angle1=%4\n" "%1.Placement=%5\n") .arg(objectName) - .arg(ui->circleRadius->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->circleAngle0->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->circleAngle1->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .arg(Base::UnitsApi::toNumber(ui->circleRadius->value())) + .arg(Base::UnitsApi::toNumber(ui->circleAngle0->value())) + .arg(Base::UnitsApi::toNumber(ui->circleAngle1->value())) .arg(placement); } @@ -1328,10 +1328,10 @@ QString DlgPrimitives::changeEllipse(const QString& objectName, const QString& p "%1.Angle1=%5\n" "%1.Placement=%6\n") .arg(objectName) - .arg(ui->ellipseMajorRadius->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->ellipseMinorRadius->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->ellipseAngle0->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->ellipseAngle1->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .arg(Base::UnitsApi::toNumber(ui->ellipseMajorRadius->value())) + .arg(Base::UnitsApi::toNumber(ui->ellipseMinorRadius->value())) + .arg(Base::UnitsApi::toNumber(ui->ellipseAngle0->value())) + .arg(Base::UnitsApi::toNumber(ui->ellipseAngle1->value())) .arg(placement); } @@ -1343,9 +1343,9 @@ QString DlgPrimitives::changeVertex(const QString& objectName, const QString& pl "%1.Z=%4\n" "%1.Placement=%5\n") .arg(objectName) - .arg(ui->vertexX->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->vertexY->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->vertexZ->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .arg(Base::UnitsApi::toNumber(ui->vertexX->value())) + .arg(Base::UnitsApi::toNumber(ui->vertexY->value())) + .arg(Base::UnitsApi::toNumber(ui->vertexZ->value())) .arg(placement); } @@ -1360,12 +1360,12 @@ QString DlgPrimitives::changeLine(const QString& objectName, const QString& plac "%1.Z2=%7\n" "%1.Placement=%8\n") .arg(objectName) - .arg(ui->edgeX1->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->edgeY1->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->edgeZ1->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->edgeX2->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->edgeY2->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->edgeZ2->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .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); } @@ -1377,7 +1377,7 @@ QString DlgPrimitives::changeRegularPolygon(const QString& objectName, const QSt "%1.Placement=%4\n") .arg(objectName) .arg(ui->regularPolygonPolygon->value()) - .arg(ui->regularPolygonCircumradius->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) + .arg(Base::UnitsApi::toNumber(ui->regularPolygonCircumradius->value())) .arg(placement); } From f0655f7c3f4e44272f931426c9b348b88b48e447 Mon Sep 17 00:00:00 2001 From: donovaly Date: Sun, 11 Apr 2021 21:39:28 +0200 Subject: [PATCH 4/6] [PD] fix primitives issues - to avoid invalid results: - don't allow to set equal radii for cones - don't allow to set equal wedge parameters - don't allow zero quantities like e.g. the box width - use full internal precision because it must be possible to create an e.g. 23.5 um wide box and using the default 2 displayed digits - take spinbox limits from App - add missing tooltips - remove disturbing commented out line from Workbench.cpp - some coding style issues fixed automatically by the MSVC IDE --- src/Mod/PartDesign/App/FeaturePrimitive.cpp | 76 ++++--- .../Gui/TaskPrimitiveParameters.cpp | 201 ++++++++++-------- .../PartDesign/Gui/TaskPrimitiveParameters.h | 2 +- .../PartDesign/Gui/TaskPrimitiveParameters.ui | 28 ++- src/Mod/PartDesign/Gui/Workbench.cpp | 1 - 5 files changed, 174 insertions(+), 134 deletions(-) diff --git a/src/Mod/PartDesign/App/FeaturePrimitive.cpp b/src/Mod/PartDesign/App/FeaturePrimitive.cpp index b97eb878dd..93ae307c80 100644 --- a/src/Mod/PartDesign/App/FeaturePrimitive.cpp +++ b/src/Mod/PartDesign/App/FeaturePrimitive.cpp @@ -56,10 +56,13 @@ using namespace PartDesign; namespace PartDesign { -const App::PropertyQuantityConstraint::Constraints torusRangeV = {-180.0,180.0,1.0}; -const App::PropertyQuantityConstraint::Constraints angleRangeU = {0.0,360.0,1.0}; -const App::PropertyQuantityConstraint::Constraints angleRangeV = {-90.0,90.0,1.0}; -const App::PropertyQuantityConstraint::Constraints quantityRange = {0.0,FLT_MAX,0.1}; +const App::PropertyQuantityConstraint::Constraints torusRangeV = { -180.0, 180.0, 1.0 }; +const App::PropertyQuantityConstraint::Constraints angleRangeU = { 0.0, 360.0, 1.0 }; +const App::PropertyQuantityConstraint::Constraints angleRangeV = { -90.0, 90.0, 1.0 }; +// it turned out that OCC cannot e.g. create a box with a width of Precision::Confusion() +// with two times Precision::Confusion() all geometric primitives can be created +const App::PropertyQuantityConstraint::Constraints quantityRange = { 2 * Precision::Confusion(), FLT_MAX, 0.1 }; +const App::PropertyQuantityConstraint::Constraints quantityRangeZero = { 0.0, FLT_MAX, 0.1 }; PROPERTY_SOURCE_WITH_EXTENSIONS(PartDesign::FeaturePrimitive, PartDesign::FeatureAddSub) @@ -77,12 +80,12 @@ App::DocumentObjectExecReturn* FeaturePrimitive::execute(const TopoDS_Shape& pri //if we have no base we just add the standard primitive shape TopoDS_Shape base; - try{ + try { //if we have a base shape we need to make sure that it does not get our transformation to BRepBuilderAPI_Transform trsf(getBaseShape(), getLocation().Transformation().Inverted(), true); base = trsf.Shape(); } - catch(const Base::Exception&) { + catch (const Base::Exception&) { //as we use this for preview we can add it even if useless for subtractive AddSubShape.setValue(primitiveShape); @@ -95,7 +98,7 @@ App::DocumentObjectExecReturn* FeaturePrimitive::execute(const TopoDS_Shape& pri return App::DocumentObject::StdReturn; } - if(getAddSubType() == FeatureAddSub::Additive) { + if (getAddSubType() == FeatureAddSub::Additive) { BRepAlgoAPI_Fuse mkFuse(base, primitiveShape); if (!mkFuse.IsDone()) @@ -115,7 +118,7 @@ App::DocumentObjectExecReturn* FeaturePrimitive::execute(const TopoDS_Shape& pri Shape.setValue(getSolid(boolOp)); AddSubShape.setValue(primitiveShape); } - else if(getAddSubType() == FeatureAddSub::Subtractive) { + else if (getAddSubType() == FeatureAddSub::Subtractive) { BRepAlgoAPI_Cut mkCut(base, primitiveShape); if (!mkCut.IsDone()) @@ -200,10 +203,8 @@ App::DocumentObjectExecReturn* Box::execute(void) if (L < Precision::Confusion()) return new App::DocumentObjectExecReturn("Length of box too small"); - if (W < Precision::Confusion()) return new App::DocumentObjectExecReturn("Width of box too small"); - if (H < Precision::Confusion()) return new App::DocumentObjectExecReturn("Height of box too small"); @@ -213,7 +214,6 @@ App::DocumentObjectExecReturn* Box::execute(void) return FeaturePrimitive::execute(mkBox.Shape()); } catch (Standard_Failure& e) { - return new App::DocumentObjectExecReturn(e.GetMessageString()); } } @@ -269,7 +269,6 @@ App::DocumentObjectExecReturn* Cylinder::execute(void) return FeaturePrimitive::execute(result); } catch (Standard_Failure& e) { - return new App::DocumentObjectExecReturn(e.GetMessageString()); } @@ -313,13 +312,12 @@ App::DocumentObjectExecReturn* Sphere::execute(void) return new App::DocumentObjectExecReturn("Radius of sphere too small"); try { BRepPrimAPI_MakeSphere mkSphere(Radius.getValue(), - Angle1.getValue()/180.0f*M_PI, - Angle2.getValue()/180.0f*M_PI, - Angle3.getValue()/180.0f*M_PI); + Base::toRadians(Angle1.getValue()), + Base::toRadians(Angle2.getValue()), + Base::toRadians(Angle3.getValue())); return FeaturePrimitive::execute(mkSphere.Shape()); } catch (Standard_Failure& e) { - return new App::DocumentObjectExecReturn(e.GetMessageString()); } @@ -350,8 +348,8 @@ Cone::Cone() ADD_PROPERTY_TYPE(Height,(10.0),"Cone",App::Prop_None,"The height of the cone"); ADD_PROPERTY_TYPE(Angle,(360.0),"Cone",App::Prop_None,"The angle of the cone"); Angle.setConstraints(&angleRangeU); - Radius1.setConstraints(&quantityRange); - Radius2.setConstraints(&quantityRange); + Radius1.setConstraints(&quantityRangeZero); + Radius2.setConstraints(&quantityRangeZero); Height.setConstraints(&quantityRange); primitiveType = FeaturePrimitive::Cone; @@ -359,10 +357,12 @@ Cone::Cone() App::DocumentObjectExecReturn* Cone::execute(void) { - if (Radius1.getValue() < 0) - return new App::DocumentObjectExecReturn("Radius of cone too small"); - if (Radius2.getValue() < 0) - return new App::DocumentObjectExecReturn("Radius of cone too small"); + if (Radius1.getValue() < 0.0) + return new App::DocumentObjectExecReturn("Radius of cone cannot be negative"); + if (Radius2.getValue() < 0.0) + return new App::DocumentObjectExecReturn("Radius of cone cannot be negative"); + if (Radius1.getValue() == Radius2.getValue()) + return new App::DocumentObjectExecReturn("The radii for cones must not be equal"); if (Height.getValue() < Precision::Confusion()) return new App::DocumentObjectExecReturn("Height of cone too small"); try { @@ -370,12 +370,11 @@ App::DocumentObjectExecReturn* Cone::execute(void) BRepPrimAPI_MakeCone mkCone(Radius1.getValue(), Radius2.getValue(), Height.getValue(), - Angle.getValue()/180.0f*M_PI); + Base::toRadians(Angle.getValue())); return FeaturePrimitive::execute(mkCone.Shape()); } catch (Standard_Failure& e) { - return new App::DocumentObjectExecReturn(e.GetMessageString()); } @@ -402,12 +401,12 @@ PROPERTY_SOURCE(PartDesign::Ellipsoid, PartDesign::FeaturePrimitive) Ellipsoid::Ellipsoid() { - ADD_PROPERTY_TYPE(Radius1,(2.0),"Ellipsoid",App::Prop_None,"The radius of the ellipsoid"); + ADD_PROPERTY_TYPE(Radius1,(2.0),"Ellipsoid",App::Prop_None,"Radius in local z-direction"); Radius1.setConstraints(&quantityRange); - ADD_PROPERTY_TYPE(Radius2,(4.0),"Ellipsoid",App::Prop_None,"The radius of the ellipsoid"); + ADD_PROPERTY_TYPE(Radius2,(4.0),"Ellipsoid",App::Prop_None,"Radius in local x-direction"); Radius2.setConstraints(&quantityRange); - ADD_PROPERTY_TYPE(Radius3,(0.0),"Ellipsoid",App::Prop_None,"The radius of the ellipsoid"); - Radius3.setConstraints(&quantityRange); + ADD_PROPERTY_TYPE(Radius3,(0.0),"Ellipsoid",App::Prop_None,"Radius in local y-direction\nIf zero, it is equal to Radius2"); + Radius3.setConstraints(&quantityRangeZero); ADD_PROPERTY_TYPE(Angle1,(-90.0f),"Ellipsoid",App::Prop_None,"The angle of the ellipsoid"); Angle1.setConstraints(&angleRangeV); ADD_PROPERTY_TYPE(Angle2,(90.0f),"Ellipsoid",App::Prop_None,"The angle of the ellipsoid"); @@ -432,9 +431,9 @@ App::DocumentObjectExecReturn* Ellipsoid::execute(void) gp_Ax2 ax2(pnt,dir); BRepPrimAPI_MakeSphere mkSphere(ax2, Radius2.getValue(), - Angle1.getValue()/180.0f*M_PI, - Angle2.getValue()/180.0f*M_PI, - Angle3.getValue()/180.0f*M_PI); + Base::toRadians(Angle1.getValue()), + Base::toRadians(Angle2.getValue()), + Base::toRadians(Angle3.getValue())); Standard_Real scaleX = 1.0; Standard_Real scaleZ = Radius1.getValue()/Radius2.getValue(); // issue #1798: A third radius has been introduced. To be backward @@ -457,7 +456,6 @@ App::DocumentObjectExecReturn* Ellipsoid::execute(void) return FeaturePrimitive::execute(mkTrsf.Shape()); } catch (Standard_Failure& e) { - return new App::DocumentObjectExecReturn(e.GetMessageString()); } @@ -490,9 +488,9 @@ PROPERTY_SOURCE(PartDesign::Torus, PartDesign::FeaturePrimitive) Torus::Torus() { - ADD_PROPERTY_TYPE(Radius1,(10.0),"Torus",App::Prop_None,"The radius of the torus"); + ADD_PROPERTY_TYPE(Radius1,(10.0),"Torus",App::Prop_None,"Radius in local xy-plane"); Radius1.setConstraints(&quantityRange); - ADD_PROPERTY_TYPE(Radius2,(2.0),"Torus",App::Prop_None,"The radius of the torus"); + ADD_PROPERTY_TYPE(Radius2,(2.0),"Torus",App::Prop_None,"Radius in local xz-plane"); Radius2.setConstraints(&quantityRange); ADD_PROPERTY_TYPE(Angle1,(-180.0),"Torus",App::Prop_None,"The angle of the torus"); Angle1.setConstraints(&torusRangeV); @@ -515,9 +513,9 @@ App::DocumentObjectExecReturn* Torus::execute(void) #if 0 BRepPrimAPI_MakeTorus mkTorus(Radius1.getValue(), Radius2.getValue(), - Angle1.getValue()/180.0f*M_PI, - Angle2.getValue()/180.0f*M_PI, - Angle3.getValue()/180.0f*M_PI); + Base::toRadians(Angle1.getValue()), + Base::toRadians(Angle2.getValue()), + Base::toRadians(Angle3.getValue())); return FeaturePrimitive::execute(mkTorus.Solid()); #else Part::TopoShape shape; @@ -639,7 +637,7 @@ Wedge::Wedge() App::DocumentObjectExecReturn* Wedge::execute(void) { - double xmin = Xmin.getValue(); + double xmin = Xmin.getValue(); double ymin = Ymin.getValue(); double zmin = Zmin.getValue(); double z2min = Z2min.getValue(); @@ -650,7 +648,6 @@ App::DocumentObjectExecReturn* Wedge::execute(void) double z2max = Z2max.getValue(); double x2max = X2max.getValue(); - double dx = xmax-xmin; double dy = ymax-ymin; double dz = zmax-zmin; @@ -683,7 +680,6 @@ App::DocumentObjectExecReturn* Wedge::execute(void) return FeaturePrimitive::execute(mkSolid.Solid()); } catch (Standard_Failure& e) { - return new App::DocumentObjectExecReturn(e.GetMessageString()); } diff --git a/src/Mod/PartDesign/Gui/TaskPrimitiveParameters.cpp b/src/Mod/PartDesign/Gui/TaskPrimitiveParameters.cpp index c8f9e40f89..9563e773cf 100644 --- a/src/Mod/PartDesign/Gui/TaskPrimitiveParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskPrimitiveParameters.cpp @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #include @@ -72,12 +73,12 @@ TaskBoxPrimitives::TaskBoxPrimitives(ViewProviderPrimitive* vp, QWidget* parent) ui->boxHeight->bind(static_cast(vp->getObject())->Height); ui->boxWidth->setValue(static_cast(vp->getObject())->Width.getValue()); ui->boxWidth->bind(static_cast(vp->getObject())->Width); - ui->boxLength->setMinimum(0.0); - ui->boxLength->setMaximum(INT_MAX); - ui->boxWidth->setMinimum(0.0); - ui->boxWidth->setMaximum(INT_MAX); - ui->boxHeight->setMinimum(0.0); - ui->boxHeight->setMaximum(INT_MAX); + ui->boxLength->setMinimum(static_cast(vp->getObject())->Length.getMinimum()); + ui->boxLength->setMaximum(static_cast(vp->getObject())->Length.getMaximum()); + ui->boxWidth->setMinimum(static_cast(vp->getObject())->Width.getMinimum()); + ui->boxWidth->setMaximum(static_cast(vp->getObject())->Width.getMaximum()); + ui->boxHeight->setMinimum(static_cast(vp->getObject())->Height.getMinimum()); + ui->boxHeight->setMaximum(static_cast(vp->getObject())->Height.getMaximum()); break; case PartDesign::FeaturePrimitive::Cylinder: index = 2; @@ -93,10 +94,10 @@ TaskBoxPrimitives::TaskBoxPrimitives(ViewProviderPrimitive* vp, QWidget* parent) ui->cylinderYSkew->bind(static_cast(vp->getObject())->SecondAngle); ui->cylinderAngle->setMaximum(static_cast(vp->getObject())->Angle.getMaximum()); ui->cylinderAngle->setMinimum(static_cast(vp->getObject())->Angle.getMinimum()); - ui->cylinderHeight->setMaximum(INT_MAX); - ui->cylinderHeight->setMinimum(0.0); - ui->cylinderRadius->setMaximum(INT_MAX); - ui->cylinderRadius->setMinimum(0.0); + ui->cylinderHeight->setMaximum(static_cast(vp->getObject())->Height.getMaximum()); + ui->cylinderHeight->setMinimum(static_cast(vp->getObject())->Height.getMinimum()); + ui->cylinderRadius->setMaximum(static_cast(vp->getObject())->Radius.getMaximum()); + ui->cylinderRadius->setMinimum(static_cast(vp->getObject())->Radius.getMinimum()); break; case PartDesign::FeaturePrimitive::Sphere: index = 4; @@ -114,8 +115,8 @@ TaskBoxPrimitives::TaskBoxPrimitives(ViewProviderPrimitive* vp, QWidget* parent) ui->sphereAngle2->setMinimum(ui->sphereAngle1->rawValue()); ui->sphereAngle3->setMaximum(static_cast(vp->getObject())->Angle3.getMaximum()); ui->sphereAngle3->setMinimum(static_cast(vp->getObject())->Angle3.getMinimum()); - ui->sphereRadius->setMaximum(INT_MAX); - ui->sphereRadius->setMinimum(0.0); + ui->sphereRadius->setMaximum(static_cast(vp->getObject())->Radius.getMaximum()); + ui->sphereRadius->setMinimum(static_cast(vp->getObject())->Radius.getMinimum()); break; case PartDesign::FeaturePrimitive::Cone: index = 3; @@ -129,12 +130,12 @@ TaskBoxPrimitives::TaskBoxPrimitives(ViewProviderPrimitive* vp, QWidget* parent) ui->coneRadius2->bind(static_cast(vp->getObject())->Radius2); ui->coneAngle->setMaximum(static_cast(vp->getObject())->Angle.getMaximum()); ui->coneAngle->setMinimum(static_cast(vp->getObject())->Angle.getMinimum()); - ui->coneHeight->setMaximum(INT_MAX); - ui->coneHeight->setMinimum(0.0); - ui->coneRadius1->setMaximum(INT_MAX); - ui->coneRadius1->setMinimum(0.0); - ui->coneRadius2->setMaximum(INT_MAX); - ui->coneRadius2->setMinimum(0.0); + ui->coneHeight->setMaximum(static_cast(vp->getObject())->Height.getMaximum()); + ui->coneHeight->setMinimum(static_cast(vp->getObject())->Height.getMinimum()); + ui->coneRadius1->setMaximum(static_cast(vp->getObject())->Radius1.getMaximum()); + ui->coneRadius1->setMinimum(static_cast(vp->getObject())->Radius1.getMinimum()); + ui->coneRadius2->setMaximum(static_cast(vp->getObject())->Radius2.getMaximum()); + ui->coneRadius2->setMinimum(static_cast(vp->getObject())->Radius2.getMinimum()); break; case PartDesign::FeaturePrimitive::Ellipsoid: index = 5; @@ -156,12 +157,12 @@ TaskBoxPrimitives::TaskBoxPrimitives(ViewProviderPrimitive* vp, QWidget* parent) ui->ellipsoidAngle2->setMinimum(ui->ellipsoidAngle1->rawValue()); ui->ellipsoidAngle3->setMaximum(static_cast(vp->getObject())->Angle3.getMaximum()); ui->ellipsoidAngle3->setMinimum(static_cast(vp->getObject())->Angle3.getMinimum()); - ui->ellipsoidRadius1->setMinimum(0.0); - ui->ellipsoidRadius1->setMaximum(INT_MAX); - ui->ellipsoidRadius2->setMinimum(0.0); - ui->ellipsoidRadius2->setMaximum(INT_MAX); - ui->ellipsoidRadius3->setMinimum(0.0); - ui->ellipsoidRadius3->setMaximum(INT_MAX); + ui->ellipsoidRadius1->setMinimum(static_cast(vp->getObject())->Radius1.getMinimum()); + ui->ellipsoidRadius1->setMaximum(static_cast(vp->getObject())->Radius1.getMaximum()); + ui->ellipsoidRadius2->setMinimum(static_cast(vp->getObject())->Radius2.getMinimum()); + ui->ellipsoidRadius2->setMaximum(static_cast(vp->getObject())->Radius2.getMaximum()); + ui->ellipsoidRadius3->setMinimum(static_cast(vp->getObject())->Radius3.getMinimum()); + ui->ellipsoidRadius3->setMaximum(static_cast(vp->getObject())->Radius3.getMaximum()); break; case PartDesign::FeaturePrimitive::Torus: index = 6; @@ -184,10 +185,10 @@ TaskBoxPrimitives::TaskBoxPrimitives(ViewProviderPrimitive* vp, QWidget* parent) // this is the outer radius that must not be smaller than the inner one // otherwise the geometry is impossible and we can even get a crash: // https://forum.freecadweb.org/viewtopic.php?f=3&t=44467 - ui->torusRadius1->setMaximum(INT_MAX); + ui->torusRadius1->setMaximum(static_cast(vp->getObject())->Radius1.getMaximum()); ui->torusRadius1->setMinimum(ui->torusRadius2->rawValue()); ui->torusRadius2->setMaximum(ui->torusRadius1->rawValue()); - ui->torusRadius2->setMinimum(0.0); + ui->torusRadius2->setMinimum(static_cast(vp->getObject())->Radius2.getMinimum()); break; case PartDesign::FeaturePrimitive::Prism: index = 7; @@ -200,10 +201,10 @@ TaskBoxPrimitives::TaskBoxPrimitives(ViewProviderPrimitive* vp, QWidget* parent) ui->prismXSkew->bind(static_cast(vp->getObject())->FirstAngle); ui->prismYSkew->setValue(static_cast(vp->getObject())->SecondAngle.getValue()); ui->prismYSkew->bind(static_cast(vp->getObject())->SecondAngle); - ui->prismCircumradius->setMaximum(INT_MAX); - ui->prismCircumradius->setMinimum(0.0); - ui->prismHeight->setMaximum(INT_MAX); - ui->prismHeight->setMinimum(0.0); + ui->prismCircumradius->setMaximum(static_cast(vp->getObject())->Circumradius.getMaximum()); + ui->prismCircumradius->setMinimum(static_cast(vp->getObject())->Circumradius.getMinimum()); + ui->prismHeight->setMaximum(static_cast(vp->getObject())->Height.getMaximum()); + ui->prismHeight->setMinimum(static_cast(vp->getObject())->Height.getMinimum()); break; case PartDesign::FeaturePrimitive::Wedge: index = 8; @@ -228,11 +229,11 @@ TaskBoxPrimitives::TaskBoxPrimitives(ViewProviderPrimitive* vp, QWidget* parent) ui->wedgeZ2min->setValue(static_cast(vp->getObject())->Z2min.getValue()); ui->wedgeZ2min->bind(static_cast(vp->getObject())->Z2min); ui->wedgeXmin->setMinimum(INT_MIN); - ui->wedgeXmin->setMaximum(ui->wedgeXmax->rawValue()); // must be <= than wedgeXmax + ui->wedgeXmin->setMaximum(ui->wedgeXmax->rawValue()); // must be < than wedgeXmax ui->wedgeYmin->setMinimum(INT_MIN); - ui->wedgeYmin->setMaximum(ui->wedgeYmax->rawValue()); // must be <= than wedgeYmax + ui->wedgeYmin->setMaximum(ui->wedgeYmax->rawValue()); // must be < than wedgeYmax ui->wedgeZmin->setMinimum(INT_MIN); - ui->wedgeZmin->setMaximum(ui->wedgeZmax->rawValue()); // must be <= than wedgeZmax + ui->wedgeZmin->setMaximum(ui->wedgeZmax->rawValue()); // must be < than wedgeZmax ui->wedgeX2min->setMinimum(INT_MIN); ui->wedgeX2min->setMaximum(ui->wedgeX2max->rawValue()); // must be <= than wedgeXmax ui->wedgeZ2min->setMinimum(INT_MIN); @@ -468,12 +469,14 @@ void TaskBoxPrimitives::onConeHeightChanged(double v) { } void TaskBoxPrimitives::onConeRadius1Changed(double v) { + PartDesign::Cone* sph = static_cast(vp->getObject()); sph->Radius1.setValue(v); vp->getObject()->getDocument()->recomputeFeature(vp->getObject()); } void TaskBoxPrimitives::onConeRadius2Changed(double v) { + PartDesign::Cone* sph = static_cast(vp->getObject()); sph->Radius2.setValue(v); vp->getObject()->getDocument()->recomputeFeature(vp->getObject()); @@ -630,65 +633,65 @@ void TaskBoxPrimitives::onWedgeXminChanged(double v) { void TaskBoxPrimitives::onWedgeXmaxChanged(double v) { PartDesign::Wedge* sph = static_cast(vp->getObject()); - ui->wedgeXmin->setMaximum(v); // must be <= than wedgeXmax + ui->wedgeXmin->setMaximum(v); // must be < than wedgeXmax sph->Xmax.setValue(v); vp->getObject()->getDocument()->recomputeFeature(vp->getObject()); } void TaskBoxPrimitives::onWedgeYminChanged(double v) { PartDesign::Wedge* sph = static_cast(vp->getObject()); - ui->wedgeYmax->setMinimum(v); + ui->wedgeYmax->setMinimum(v); // must be > than wedgeYmin sph->Ymin.setValue(v); vp->getObject()->getDocument()->recomputeFeature(vp->getObject()); } void TaskBoxPrimitives::onWedgeYmaxChanged(double v) { PartDesign::Wedge* sph = static_cast(vp->getObject()); - ui->wedgeYmin->setMaximum(v); + ui->wedgeYmin->setMaximum(v); // must be < than wedgeYmax sph->Ymax.setValue(v); vp->getObject()->getDocument()->recomputeFeature(vp->getObject()); } void TaskBoxPrimitives::onWedgeZ2minChanged(double v) { PartDesign::Wedge* sph = static_cast(vp->getObject()); - ui->wedgeZ2max->setMinimum(v); + ui->wedgeZ2max->setMinimum(v); // must be >= than wedgeZ2min sph->Z2min.setValue(v); vp->getObject()->getDocument()->recomputeFeature(vp->getObject()); } void TaskBoxPrimitives::onWedgeZ2maxChanged(double v) { PartDesign::Wedge* sph = static_cast(vp->getObject()); - ui->wedgeZ2min->setMaximum(v); // must be <= than wedgeXmax + ui->wedgeZ2min->setMaximum(v); // must be <= than wedgeZ2max sph->Z2max.setValue(v); vp->getObject()->getDocument()->recomputeFeature(vp->getObject()); } void TaskBoxPrimitives::onWedgeZminChanged(double v) { PartDesign::Wedge* sph = static_cast(vp->getObject()); - ui->wedgeZmax->setMinimum(v); + ui->wedgeZmax->setMinimum(v); // must be > than wedgeZmin sph->Zmin.setValue(v); vp->getObject()->getDocument()->recomputeFeature(vp->getObject()); } void TaskBoxPrimitives::onWedgeZmaxChanged(double v) { PartDesign::Wedge* sph = static_cast(vp->getObject()); - ui->wedgeZmin->setMaximum(v); + ui->wedgeZmin->setMaximum(v); // must be < than wedgeZmax sph->Zmax.setValue(v); vp->getObject()->getDocument()->recomputeFeature(vp->getObject()); } - - -void TaskBoxPrimitives::setPrimitive(App::DocumentObject *obj) +bool TaskBoxPrimitives::setPrimitive(App::DocumentObject *obj) { try { QString name(QString::fromLatin1(Gui::Command::getObjectCmd(obj).c_str())); QString cmd; App::Document* doc = App::GetApplication().getActiveDocument(); if (!doc) { - return; + return false; } + + Base::QuantityFormat format(Base::QuantityFormat::Default, Base::UnitsApi::getDecimals()); switch(ui->widgetStack->currentIndex()) { case 1: // box cmd = QString::fromLatin1( @@ -696,9 +699,9 @@ void TaskBoxPrimitives::setPrimitive(App::DocumentObject *obj) "%1.Width=%3\n" "%1.Height=%4\n") .arg(name) - .arg(ui->boxLength->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->boxWidth->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->boxHeight->value().getValue(),0,'f',Base::UnitsApi::getDecimals()); + .arg(Base::UnitsApi::toNumber(ui->boxLength->value(), format)) + .arg(Base::UnitsApi::toNumber(ui->boxWidth->value(), format)) + .arg(Base::UnitsApi::toNumber(ui->boxHeight->value(), format)); break; case 2: // cylinder @@ -709,24 +712,30 @@ void TaskBoxPrimitives::setPrimitive(App::DocumentObject *obj) "%1.FirstAngle=%5\n" "%1.SecondAngle=%6\n") .arg(name) - .arg(ui->cylinderRadius->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->cylinderHeight->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->cylinderAngle->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->cylinderXSkew->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->cylinderYSkew->value().getValue(),0,'f',Base::UnitsApi::getDecimals()); + .arg(Base::UnitsApi::toNumber(ui->cylinderRadius->value(), format)) + .arg(Base::UnitsApi::toNumber(ui->cylinderHeight->value(), format)) + .arg(Base::UnitsApi::toNumber(ui->cylinderAngle->value(), format)) + .arg(Base::UnitsApi::toNumber(ui->cylinderXSkew->value(), format)) + .arg(Base::UnitsApi::toNumber(ui->cylinderYSkew->value(), format)); break; case 3: // cone + // the cone radii must not be equal + if (ui->coneRadius1->value().getValue() == ui->coneRadius2->value().getValue()) { + QMessageBox::warning(Gui::getMainWindow(), tr("Cone radii are equal"), + tr("The radii for cones must not be equal!")); + return false; + } cmd = QString::fromLatin1( "%1.Radius1=%2\n" "%1.Radius2=%3\n" "%1.Height=%4\n" "%1.Angle=%5\n") .arg(name) - .arg(ui->coneRadius1->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->coneRadius2->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->coneHeight->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->coneAngle->value().getValue(),0,'f',Base::UnitsApi::getDecimals()); + .arg(Base::UnitsApi::toNumber(ui->coneRadius1->value(), format)) + .arg(Base::UnitsApi::toNumber(ui->coneRadius2->value(), format)) + .arg(Base::UnitsApi::toNumber(ui->coneHeight->value(), format)) + .arg(Base::UnitsApi::toNumber(ui->coneAngle->value(), format)); break; case 4: // sphere @@ -736,10 +745,10 @@ void TaskBoxPrimitives::setPrimitive(App::DocumentObject *obj) "%1.Angle2=%4\n" "%1.Angle3=%5\n") .arg(name) - .arg(ui->sphereRadius->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->sphereAngle1->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->sphereAngle2->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->sphereAngle3->value().getValue(),0,'f',Base::UnitsApi::getDecimals()); + .arg(Base::UnitsApi::toNumber(ui->sphereRadius->value(), format)) + .arg(Base::UnitsApi::toNumber(ui->sphereAngle1->value(), format)) + .arg(Base::UnitsApi::toNumber(ui->sphereAngle2->value(), format)) + .arg(Base::UnitsApi::toNumber(ui->sphereAngle3->value(), format)); break; case 5: // ellipsoid cmd = QString::fromLatin1( @@ -750,12 +759,12 @@ void TaskBoxPrimitives::setPrimitive(App::DocumentObject *obj) "%1.Angle2=%6\n" "%1.Angle3=%7\n") .arg(name) - .arg(ui->ellipsoidRadius1->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->ellipsoidRadius2->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->ellipsoidRadius3->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->ellipsoidAngle1->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->ellipsoidAngle2->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->ellipsoidAngle3->value().getValue(),0,'f',Base::UnitsApi::getDecimals()); + .arg(Base::UnitsApi::toNumber(ui->ellipsoidRadius1->value(), format)) + .arg(Base::UnitsApi::toNumber(ui->ellipsoidRadius2->value(), format)) + .arg(Base::UnitsApi::toNumber(ui->ellipsoidRadius3->value(), format)) + .arg(Base::UnitsApi::toNumber(ui->ellipsoidAngle1->value(), format)) + .arg(Base::UnitsApi::toNumber(ui->ellipsoidAngle2->value(), format)) + .arg(Base::UnitsApi::toNumber(ui->ellipsoidAngle3->value(), format)); break; case 6: // torus @@ -766,11 +775,11 @@ void TaskBoxPrimitives::setPrimitive(App::DocumentObject *obj) "%1.Angle2=%5\n" "%1.Angle3=%6\n") .arg(name) - .arg(ui->torusRadius1->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->torusRadius2->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->torusAngle1->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->torusAngle2->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->torusAngle3->value().getValue(),0,'f',Base::UnitsApi::getDecimals()); + .arg(Base::UnitsApi::toNumber(ui->torusRadius1->value(), format)) + .arg(Base::UnitsApi::toNumber(ui->torusRadius2->value(), format)) + .arg(Base::UnitsApi::toNumber(ui->torusAngle1->value(), format)) + .arg(Base::UnitsApi::toNumber(ui->torusAngle2->value(), format)) + .arg(Base::UnitsApi::toNumber(ui->torusAngle3->value(), format)); break; case 7: // prism cmd = QString::fromLatin1( @@ -781,12 +790,28 @@ void TaskBoxPrimitives::setPrimitive(App::DocumentObject *obj) "%1.SecondAngle=%6\n") .arg(name) .arg(ui->prismPolygon->value()) - .arg(ui->prismCircumradius->value().getValue(), 0, 'f', Base::UnitsApi::getDecimals()) - .arg(ui->prismHeight->value().getValue(), 0, 'f', Base::UnitsApi::getDecimals()) - .arg(ui->prismXSkew->value().getValue(), 0, 'f', Base::UnitsApi::getDecimals()) - .arg(ui->prismYSkew->value().getValue(), 0, 'f', Base::UnitsApi::getDecimals()); + .arg(Base::UnitsApi::toNumber(ui->prismCircumradius->value(), format)) + .arg(Base::UnitsApi::toNumber(ui->prismHeight->value(), format)) + .arg(Base::UnitsApi::toNumber(ui->prismXSkew->value(), format)) + .arg(Base::UnitsApi::toNumber(ui->prismYSkew->value(), format)); break; case 8: // wedge + // Xmin/max, Ymin/max and Zmin/max must each not be equal + if (ui->wedgeXmin->value().getValue() == ui->wedgeXmax->value().getValue()) { + QMessageBox::warning(Gui::getMainWindow(), tr("Invalid wedge parameters"), + tr("X min must not be equal to X max!")); + return false; + } + else if (ui->wedgeYmin->value().getValue() == ui->wedgeYmax->value().getValue()) { + QMessageBox::warning(Gui::getMainWindow(), tr("Invalid wedge parameters"), + tr("Y min must not be equal to Y max!")); + return false; + } + else if (ui->wedgeZmin->value().getValue() == ui->wedgeZmax->value().getValue()) { + QMessageBox::warning(Gui::getMainWindow(), tr("Invalid wedge parameters"), + tr("Z min must not be equal to Z max!")); + return false; + } cmd = QString::fromLatin1( "%1.Xmin=%2\n" "%1.Ymin=%3\n" @@ -799,16 +824,16 @@ void TaskBoxPrimitives::setPrimitive(App::DocumentObject *obj) "%1.X2max=%10\n" "%1.Z2max=%11\n") .arg(name) - .arg(ui->wedgeXmin->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->wedgeYmin->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->wedgeZmin->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->wedgeX2min->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->wedgeZ2min->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->wedgeXmax->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->wedgeYmax->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->wedgeZmax->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->wedgeX2max->value().getValue(),0,'f',Base::UnitsApi::getDecimals()) - .arg(ui->wedgeZ2max->value().getValue(),0,'f',Base::UnitsApi::getDecimals()); + .arg(Base::UnitsApi::toNumber(ui->wedgeXmin->value())) + .arg(Base::UnitsApi::toNumber(ui->wedgeYmin->value(), format)) + .arg(Base::UnitsApi::toNumber(ui->wedgeZmin->value(), format)) + .arg(Base::UnitsApi::toNumber(ui->wedgeX2min->value(), format)) + .arg(Base::UnitsApi::toNumber(ui->wedgeZ2min->value(), format)) + .arg(Base::UnitsApi::toNumber(ui->wedgeXmax->value(), format)) + .arg(Base::UnitsApi::toNumber(ui->wedgeYmax->value(), format)) + .arg(Base::UnitsApi::toNumber(ui->wedgeZmax->value(), format)) + .arg(Base::UnitsApi::toNumber(ui->wedgeX2max->value(), format)) + .arg(Base::UnitsApi::toNumber(ui->wedgeZ2max->value(), format)); break; default: @@ -823,7 +848,9 @@ void TaskBoxPrimitives::setPrimitive(App::DocumentObject *obj) } catch (const Base::PyException& e) { QMessageBox::warning(this, tr("Create primitive"), QString::fromLatin1(e.what())); + return false; } + return true; } TaskPrimitiveParameters::TaskPrimitiveParameters(ViewProviderPrimitive* PrimitiveView) : vp_prm(PrimitiveView) @@ -881,7 +908,9 @@ TaskPrimitiveParameters::~TaskPrimitiveParameters() bool TaskPrimitiveParameters::accept() { - primitive->setPrimitive(vp_prm->getObject()); + bool primitiveOK = primitive->setPrimitive(vp_prm->getObject()); + if (!primitiveOK) + return primitiveOK; Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.recompute()"); Gui::Command::doCommand(Gui::Command::Gui,"Gui.activeDocument().resetEdit()"); diff --git a/src/Mod/PartDesign/Gui/TaskPrimitiveParameters.h b/src/Mod/PartDesign/Gui/TaskPrimitiveParameters.h index 11c079fc2f..b6f49a0e86 100644 --- a/src/Mod/PartDesign/Gui/TaskPrimitiveParameters.h +++ b/src/Mod/PartDesign/Gui/TaskPrimitiveParameters.h @@ -55,7 +55,7 @@ public: TaskBoxPrimitives(ViewProviderPrimitive* vp, QWidget* parent = 0); ~TaskBoxPrimitives(); - void setPrimitive(App::DocumentObject *); + bool setPrimitive(App::DocumentObject *); public Q_SLOTS: void onBoxLengthChanged(double); diff --git a/src/Mod/PartDesign/Gui/TaskPrimitiveParameters.ui b/src/Mod/PartDesign/Gui/TaskPrimitiveParameters.ui index 77f0b7b46d..70e89795fb 100644 --- a/src/Mod/PartDesign/Gui/TaskPrimitiveParameters.ui +++ b/src/Mod/PartDesign/Gui/TaskPrimitiveParameters.ui @@ -225,7 +225,7 @@ - + @@ -755,7 +755,7 @@ - + @@ -800,6 +800,9 @@ + + Radius in local z-direction + false @@ -820,6 +823,9 @@ + + Radius in local x-direction + false @@ -840,6 +846,10 @@ + + Radius in local y-direction +If zero, it is equal to Radius2 + false @@ -964,7 +974,7 @@ - + @@ -1009,6 +1019,9 @@ + + Radius in local xy-plane + false @@ -1029,6 +1042,9 @@ + + Radius in local xz-plane + false @@ -1156,7 +1172,7 @@ - + @@ -1651,7 +1667,7 @@ - + @@ -1762,7 +1778,7 @@ - + diff --git a/src/Mod/PartDesign/Gui/Workbench.cpp b/src/Mod/PartDesign/Gui/Workbench.cpp index 73b7576c16..b07911a55e 100644 --- a/src/Mod/PartDesign/Gui/Workbench.cpp +++ b/src/Mod/PartDesign/Gui/Workbench.cpp @@ -540,7 +540,6 @@ Gui::MenuItem* Workbench::setupMenuBar() const << "Separator" << "PartDesign_Boolean" << "Separator" - //<< "PartDesign_Hole" << "PartDesign_Migrate" << "PartDesign_Sprocket" << "PartDesign_InvoluteGear"; From ef60a73cb52b151d5a1ec053973b3b3faca90f65 Mon Sep 17 00:00:00 2001 From: Chris Hennes Date: Tue, 20 Apr 2021 15:35:43 -0500 Subject: [PATCH 5/6] [OpenSCAD] Fix regression with angle specification Correct mistake introduced in 0e66abcab. --- src/Mod/OpenSCAD/OpenSCADFeatures.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Mod/OpenSCAD/OpenSCADFeatures.py b/src/Mod/OpenSCAD/OpenSCADFeatures.py index b3cd2d0a24..93332b67a2 100644 --- a/src/Mod/OpenSCAD/OpenSCADFeatures.py +++ b/src/Mod/OpenSCAD/OpenSCADFeatures.py @@ -388,10 +388,11 @@ class Frustum: class Twist: def __init__(self, obj,child=None,h=1.0,angle=0.0,scale=[1.0,1.0]): + import FreeCAD obj.addProperty("App::PropertyLink","Base","Base", "The base object that must be transformed") obj.addProperty("App::PropertyQuantity","Angle","Base","Twist Angle") - obj.Angle = App.Units.Angle # assign the Angle unit + obj.Angle = FreeCAD.Units.Angle # assign the Angle unit obj.addProperty("App::PropertyDistance","Height","Base","Height of the Extrusion") obj.addProperty("App::PropertyFloatList","Scale","Base","Scale to apply during the Extrusion") From 5ee0a355dd2318249e187881009ec8aca58fed34 Mon Sep 17 00:00:00 2001 From: wmayer Date: Wed, 21 Apr 2021 14:50:45 +0200 Subject: [PATCH 6/6] Mesh: [skip ci] fixes #0004430: Mesh_BuildRegularSolid: parametric mesh props have no units in Property editor --- src/Mod/Mesh/App/FeatureMeshSolid.cpp | 81 ++++++++++++++++++++++++++- src/Mod/Mesh/App/FeatureMeshSolid.h | 38 +++++++------ 2 files changed, 101 insertions(+), 18 deletions(-) diff --git a/src/Mod/Mesh/App/FeatureMeshSolid.cpp b/src/Mod/Mesh/App/FeatureMeshSolid.cpp index 3d320c3992..d44549f127 100644 --- a/src/Mod/Mesh/App/FeatureMeshSolid.cpp +++ b/src/Mod/Mesh/App/FeatureMeshSolid.cpp @@ -35,8 +35,8 @@ namespace Mesh { - const App::PropertyIntegerConstraint::Constraints intSampling = {0,1000,1}; - const App::PropertyFloatConstraint::Constraints floatRange = {0.0,1000.0,1.0}; + const App::PropertyIntegerConstraint::Constraints intSampling = {0,INT_MAX,1}; + const App::PropertyLength::Constraints floatRange = {0.0,FLT_MAX,1.0}; } using namespace Mesh; @@ -72,6 +72,18 @@ App::DocumentObjectExecReturn *Sphere::execute(void) } } +void Sphere::handleChangedPropertyType(Base::XMLReader &reader, const char *TypeName, App::Property *prop) +{ + if (prop == &Radius && strcmp(TypeName, "App::PropertyFloatConstraint") == 0) { + App::PropertyFloatConstraint r; + r.Restore(reader); + Radius.setValue(r.getValue()); + } + else { + Mesh::Feature::handleChangedPropertyType(reader, TypeName, prop); + } +} + // ------------------------------------------------------------- PROPERTY_SOURCE(Mesh::Ellipsoid, Mesh::Feature) @@ -108,6 +120,19 @@ App::DocumentObjectExecReturn *Ellipsoid::execute(void) } } +void Ellipsoid::handleChangedPropertyType(Base::XMLReader &reader, const char *TypeName, App::Property *prop) +{ + if ((prop == &Radius1 || prop == &Radius2) && + strcmp(TypeName, "App::PropertyFloatConstraint") == 0) { + App::PropertyFloatConstraint r; + r.Restore(reader); + static_cast(prop)->setValue(r.getValue()); + } + else { + Mesh::Feature::handleChangedPropertyType(reader, TypeName, prop); + } +} + // ------------------------------------------------------------- PROPERTY_SOURCE(Mesh::Cylinder, Mesh::Feature) @@ -150,6 +175,19 @@ App::DocumentObjectExecReturn *Cylinder::execute(void) } } +void Cylinder::handleChangedPropertyType(Base::XMLReader &reader, const char *TypeName, App::Property *prop) +{ + if ((prop == &Radius || prop == &Length || prop == &EdgeLength) && + strcmp(TypeName, "App::PropertyFloatConstraint") == 0) { + App::PropertyFloatConstraint r; + r.Restore(reader); + static_cast(prop)->setValue(r.getValue()); + } + else { + Mesh::Feature::handleChangedPropertyType(reader, TypeName, prop); + } +} + // ------------------------------------------------------------- PROPERTY_SOURCE(Mesh::Cone, Mesh::Feature) @@ -195,6 +233,19 @@ App::DocumentObjectExecReturn *Cone::execute(void) } } +void Cone::handleChangedPropertyType(Base::XMLReader &reader, const char *TypeName, App::Property *prop) +{ + if ((prop == &Radius1 || prop == &Radius2 || prop == &Length || prop == &EdgeLength) && + strcmp(TypeName, "App::PropertyFloatConstraint") == 0) { + App::PropertyFloatConstraint r; + r.Restore(reader); + static_cast(prop)->setValue(r.getValue()); + } + else { + Mesh::Feature::handleChangedPropertyType(reader, TypeName, prop); + } +} + // ------------------------------------------------------------- PROPERTY_SOURCE(Mesh::Torus, Mesh::Feature) @@ -231,6 +282,19 @@ App::DocumentObjectExecReturn *Torus::execute(void) } } +void Torus::handleChangedPropertyType(Base::XMLReader &reader, const char *TypeName, App::Property *prop) +{ + if ((prop == &Radius1 || prop == &Radius2) && + strcmp(TypeName, "App::PropertyFloatConstraint") == 0) { + App::PropertyFloatConstraint r; + r.Restore(reader); + static_cast(prop)->setValue(r.getValue()); + } + else { + Mesh::Feature::handleChangedPropertyType(reader, TypeName, prop); + } +} + // ------------------------------------------------------------- PROPERTY_SOURCE(Mesh::Cube, Mesh::Feature) @@ -266,3 +330,16 @@ App::DocumentObjectExecReturn *Cube::execute(void) return new App::DocumentObjectExecReturn("Cannot create cube", this); } } + +void Cube::handleChangedPropertyType(Base::XMLReader &reader, const char *TypeName, App::Property *prop) +{ + if ((prop == &Length || prop == &Width || prop == &Height) && + strcmp(TypeName, "App::PropertyFloatConstraint") == 0) { + App::PropertyFloatConstraint r; + r.Restore(reader); + static_cast(prop)->setValue(r.getValue()); + } + else { + Mesh::Feature::handleChangedPropertyType(reader, TypeName, prop); + } +} diff --git a/src/Mod/Mesh/App/FeatureMeshSolid.h b/src/Mod/Mesh/App/FeatureMeshSolid.h index 1eb3ad5024..60bea888c9 100644 --- a/src/Mod/Mesh/App/FeatureMeshSolid.h +++ b/src/Mod/Mesh/App/FeatureMeshSolid.h @@ -26,7 +26,7 @@ #include "MeshFeature.h" -#include +#include #include namespace Mesh @@ -42,7 +42,7 @@ class Sphere : public Mesh::Feature public: Sphere(); - App::PropertyFloatConstraint Radius; + App::PropertyLength Radius; App::PropertyIntegerConstraint Sampling; /** @name methods override Feature */ @@ -50,6 +50,7 @@ public: /// recalculate the Feature App::DocumentObjectExecReturn *execute(void); short mustExecute() const; + void handleChangedPropertyType(Base::XMLReader &reader, const char * TypeName, App::Property * prop); //@} }; @@ -62,8 +63,8 @@ class Ellipsoid : public Mesh::Feature public: Ellipsoid(); - App::PropertyFloatConstraint Radius1; - App::PropertyFloatConstraint Radius2; + App::PropertyLength Radius1; + App::PropertyLength Radius2; App::PropertyIntegerConstraint Sampling; /** @name methods override Feature */ @@ -71,6 +72,7 @@ public: /// recalculate the Feature App::DocumentObjectExecReturn *execute(void); short mustExecute() const; + void handleChangedPropertyType(Base::XMLReader &reader, const char * TypeName, App::Property * prop); //@} }; @@ -83,9 +85,9 @@ class Cylinder : public Mesh::Feature public: Cylinder(); - App::PropertyFloatConstraint Radius; - App::PropertyFloatConstraint Length; - App::PropertyFloatConstraint EdgeLength; + App::PropertyLength Radius; + App::PropertyLength Length; + App::PropertyLength EdgeLength; App::PropertyBool Closed; App::PropertyIntegerConstraint Sampling; @@ -94,6 +96,7 @@ public: /// recalculate the Feature App::DocumentObjectExecReturn *execute(void); short mustExecute() const; + void handleChangedPropertyType(Base::XMLReader &reader, const char * TypeName, App::Property * prop); //@} }; @@ -106,10 +109,10 @@ class Cone : public Mesh::Feature public: Cone(); - App::PropertyFloatConstraint Radius1; - App::PropertyFloatConstraint Radius2; - App::PropertyFloatConstraint Length; - App::PropertyFloatConstraint EdgeLength; + App::PropertyLength Radius1; + App::PropertyLength Radius2; + App::PropertyLength Length; + App::PropertyLength EdgeLength; App::PropertyBool Closed; App::PropertyIntegerConstraint Sampling; @@ -118,6 +121,7 @@ public: /// recalculate the Feature App::DocumentObjectExecReturn *execute(void); short mustExecute() const; + void handleChangedPropertyType(Base::XMLReader &reader, const char * TypeName, App::Property * prop); //@} }; @@ -130,8 +134,8 @@ class Torus : public Mesh::Feature public: Torus(); - App::PropertyFloatConstraint Radius1; - App::PropertyFloatConstraint Radius2; + App::PropertyLength Radius1; + App::PropertyLength Radius2; App::PropertyIntegerConstraint Sampling; /** @name methods override Feature */ @@ -139,6 +143,7 @@ public: /// recalculate the Feature App::DocumentObjectExecReturn *execute(void); short mustExecute() const; + void handleChangedPropertyType(Base::XMLReader &reader, const char * TypeName, App::Property * prop); //@} }; @@ -151,15 +156,16 @@ class Cube : public Mesh::Feature public: Cube(); - App::PropertyFloatConstraint Length; - App::PropertyFloatConstraint Width; - App::PropertyFloatConstraint Height; + App::PropertyLength Length; + App::PropertyLength Width; + App::PropertyLength Height; /** @name methods override Feature */ //@{ /// recalculate the Feature App::DocumentObjectExecReturn *execute(void); short mustExecute() const; + void handleChangedPropertyType(Base::XMLReader &reader, const char * TypeName, App::Property * prop); //@} };