From 337cd392449943692d8c7da1ea25f696cb6f2afd Mon Sep 17 00:00:00 2001 From: PaddleStroke Date: Sun, 21 Apr 2024 07:57:13 +0200 Subject: [PATCH] TechDraw: Improve Arc Length dimension tool so that it can do any edge length: arc of ellipse, bspline. --- src/Mod/TechDraw/Gui/CommandCreateDims.cpp | 24 ++++++- src/Mod/TechDraw/Gui/CommandExtensionDims.cpp | 70 +++++++++---------- src/Mod/TechDraw/Gui/Workbench.cpp | 4 +- 3 files changed, 61 insertions(+), 37 deletions(-) diff --git a/src/Mod/TechDraw/Gui/CommandCreateDims.cpp b/src/Mod/TechDraw/Gui/CommandCreateDims.cpp index b26ca27803..14a565a303 100644 --- a/src/Mod/TechDraw/Gui/CommandCreateDims.cpp +++ b/src/Mod/TechDraw/Gui/CommandCreateDims.cpp @@ -163,7 +163,8 @@ public: bool has1Ellipse() const { return s_pts == 0 && s_lns == 0 && s_cir == 0 && s_ell == 1 && s_spl == 0 && s_fcs == 0; } bool has2Ellipses() const { return s_pts == 0 && s_lns == 0 && s_cir == 0 && s_ell == 2 && s_spl == 0 && s_fcs == 0; } - bool has1SplineAndMore() const { return s_pts >= 0 && s_lns >= 0 && s_cir >= 0 && s_ell >= 0 && s_spl >= 1 && s_fcs == 0; } + bool has1Spline() const { return s_pts == 0 && s_lns == 0 && s_cir == 0 && s_ell == 0 && s_spl == 1 && s_fcs == 0; } + bool has1SplineAndMore() const { return s_spl >= 1 && s_fcs == 0; } size_t s_pts, s_lns, s_cir, s_ell, s_spl, s_fcs; }; @@ -732,6 +733,7 @@ protected: if (selection.has2Ellipses()) { makeCts_2Ellipses(selAllowed, pos); } } else if (selection.hasSplineAndCo()) { + if (selection.has1Spline()) { makeCts_1Spline(selAllowed, pos); } if (selection.has1SplineAndMore()) { makeCts_1SplineAndMore(selAllowed, pos); } } return selAllowed; @@ -947,6 +949,13 @@ protected: if (availableDimension == AvailableDimension::SECOND) { restartCommand(QT_TRANSLATE_NOOP("Command", "Add Radius dimension")); createRadiusDiameterDimension(selEllipseArc[0], pos, false); + if (selEllipseArc[0].geomEdgeType() != TechDraw::ARCOFELLIPSE) { + availableDimension = AvailableDimension::RESET; + } + } + if (availableDimension == AvailableDimension::THIRD) { + restartCommand(QT_TRANSLATE_NOOP("Command", "Add Arc Length dimension")); + createArcLengthDimension(selEllipseArc[0], pos); availableDimension = AvailableDimension::RESET; } } @@ -966,6 +975,17 @@ protected: } } + void makeCts_1Spline(bool& selAllowed, QPoint& pos) + { + //Edge length + if (availableDimension == AvailableDimension::FIRST) { + restartCommand(QT_TRANSLATE_NOOP("Command", "Add edge length dimension")); + createArcLengthDimension(selSplineAndCo[0], pos); + selAllowed = true; + availableDimension = AvailableDimension::RESET; + } + } + void makeCts_1SplineAndMore(bool& selAllowed, QPoint& pos) { //Extend @@ -1379,6 +1399,8 @@ CmdTechDrawRadiusDimension::CmdTechDrawRadiusDimension() sWhatsThis = "TechDraw_RadiusDimension"; sStatusTip = sToolTipText; sPixmap = "TechDraw_RadiusDimension"; + sAccel = "D"; + eType = ForEdit; } void CmdTechDrawRadiusDimension::activated(int iMsg) diff --git a/src/Mod/TechDraw/Gui/CommandExtensionDims.cpp b/src/Mod/TechDraw/Gui/CommandExtensionDims.cpp index 64e32d561c..5a777b5b5f 100644 --- a/src/Mod/TechDraw/Gui/CommandExtensionDims.cpp +++ b/src/Mod/TechDraw/Gui/CommandExtensionDims.cpp @@ -2305,6 +2305,8 @@ void CmdTechDrawExtensionCreateLengthArc::activated(int iMsg) { TechDraw::DrawViewDimension* dim = makeArcLengthDimension(ref); if (dim) { + objFeat->refreshCEGeoms(); + objFeat->requestPaint(); Gui::Command::commitCommand(); } else { @@ -2366,42 +2368,40 @@ DrawViewDimension* TechDrawGui::makeArcLengthDimension(const ReferenceEntry& ref int geoId = DrawUtil::getIndexFromName(ref.getSubName()); BaseGeomPtr geom = dvp->getGeomByIndex(geoId); - if (ref.geomEdgeType() == TechDraw::ARCOFCIRCLE) { - TechDraw::AOCPtr arcTag = std::static_pointer_cast(geom); - float radius = arcTag->radius; - Base::Vector3d centerPt = arcTag->center; - centerPt.y = -centerPt.y; - Base::Vector3d startPt = arcTag->startPnt; - startPt.y = -startPt.y; - Base::Vector3d endPt = arcTag->endPnt; - endPt.y = -endPt.y; - - std::stringstream startName, endName, formatSpec; - double scale = dvp->getScale(); - Base::Vector3d cvPoint = CosmeticVertex::makeCanonicalPoint(dvp, startPt); - std::string startVertTag = dvp->addCosmeticVertex(cvPoint); - int startVertNumber = dvp->add1CVToGV(startVertTag); - startName << "Vertex" << startVertNumber; - cvPoint = CosmeticVertex::makeCanonicalPoint(dvp, endPt); - std::string endVertTag = dvp->addCosmeticVertex(cvPoint); - int endVertNumber = dvp->add1CVToGV(endVertTag); - endName << "Vertex" << endVertNumber; - - dim = _createLinDimension(dvp, startName.str(), endName.str(), "Distance"); - TechDraw::pointPair pp = dim->getLinearPoints(); - Base::Vector3d mid = (pp.first() + pp.second()) / 2.0; - dim->X.setValue(mid.x); - dim->Y.setValue(-mid.y); - Base::Vector3d radVec1 = startPt - centerPt; - Base::Vector3d radVec2 = endPt - centerPt; - float alpha = acos((radVec1 * radVec2) / (radVec1.Length() * radVec2.Length())); - float arcLength = alpha * radius / scale; - dim->Arbitrary.setValue(true); - formatSpec << "◠ " << arcLength; - dim->FormatSpec.setValue(formatSpec.str()); - dvp->refreshCEGeoms(); - dvp->requestPaint(); + // Find the edge length. + TechDraw::BaseGeomPtr edge = dvp->getEdge(ref.getSubName()); + if (!edge) { + return nullptr; } + GProp_GProps edgeProps; + BRepGProp::LinearProperties(edge->getOCCEdge(), edgeProps); + double length = edgeProps.Mass(); + + Base::Vector3d startPt = edge->getStartPoint(); + Base::Vector3d endPt = edge->getEndPoint(); + startPt.y = -startPt.y; + endPt.y = -endPt.y; + + std::stringstream startName, endName, formatSpec; + double scale = dvp->getScale(); + Base::Vector3d cvPoint = CosmeticVertex::makeCanonicalPoint(dvp, startPt); + std::string startVertTag = dvp->addCosmeticVertex(cvPoint); + int startVertNumber = dvp->add1CVToGV(startVertTag); + startName << "Vertex" << startVertNumber; + cvPoint = CosmeticVertex::makeCanonicalPoint(dvp, endPt); + std::string endVertTag = dvp->addCosmeticVertex(cvPoint); + int endVertNumber = dvp->add1CVToGV(endVertTag); + endName << "Vertex" << endVertNumber; + + dim = _createLinDimension(dvp, startName.str(), endName.str(), "Distance"); + TechDraw::pointPair pp = dim->getLinearPoints(); + Base::Vector3d mid = (pp.first() + pp.second()) / 2.0; + dim->X.setValue(mid.x); + dim->Y.setValue(-mid.y); + + dim->Arbitrary.setValue(true); + formatSpec << "◠ " << length; + dim->FormatSpec.setValue(formatSpec.str()); return dim; } diff --git a/src/Mod/TechDraw/Gui/Workbench.cpp b/src/Mod/TechDraw/Gui/Workbench.cpp index 7087966df1..a3abac5e24 100644 --- a/src/Mod/TechDraw/Gui/Workbench.cpp +++ b/src/Mod/TechDraw/Gui/Workbench.cpp @@ -347,7 +347,9 @@ Gui::ToolBarItem* Workbench::setupToolBars() const *extattribs << "TechDraw_ExtensionPosChainDimensionGroup"; *extattribs << "TechDraw_ExtensionCascadeDimensionGroup"; *extattribs << "TechDraw_ExtensionAreaAnnotation"; - *extattribs << "TechDraw_ExtensionArcLengthAnnotation"; + if (separatedTools) { + *extattribs << "TechDraw_ExtensionArcLengthAnnotation"; + } *extattribs << "TechDraw_ExtensionCustomizeFormat"; Gui::ToolBarItem* extcenter = new Gui::ToolBarItem(root);