From e44c1ce75a7b4a82db2883d83302df26e9d61cd3 Mon Sep 17 00:00:00 2001 From: WandererFan Date: Wed, 11 Mar 2026 01:08:35 -0400 Subject: [PATCH] TechDraw: Allow 3d dimension references to use point objects (#28199) * [TD]fix 3d point object reference in dimension * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- src/Mod/Measure/App/ShapeFinder.cpp | 14 +++++++++++--- src/Mod/TechDraw/Gui/DimensionValidators.cpp | 14 +++++++++++--- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/Mod/Measure/App/ShapeFinder.cpp b/src/Mod/Measure/App/ShapeFinder.cpp index d8ec29829d..ac47e37130 100644 --- a/src/Mod/Measure/App/ShapeFinder.cpp +++ b/src/Mod/Measure/App/ShapeFinder.cpp @@ -106,9 +106,17 @@ ResolveResult ShapeFinder::resolveSelection( // and ShapeFinder::getLinkAttachParent() TopoDS_Shape ShapeFinder::getLocatedShape(const App::DocumentObject& rootObject, const std::string& leafSub) { - auto resolved = resolveSelection(rootObject, leafSub); - auto target = &resolved.getTarget(); - auto shortSub = resolved.getShortSub(); + // point objects are weird. + const std::string VertexTag {"Vertex"}; + const std::string PointTag {"Point"}; + std::string objName {rootObject.getNameInDocument()}; + if (objName.find(VertexTag) != std::string::npos || objName.find(PointTag) != std::string::npos) { + return Part::Feature::getShape(&rootObject, Part::ShapeOption::Transform); + } + + ResolveResult resolved = resolveSelection(rootObject, leafSub); + App::DocumentObject* target = &resolved.getTarget(); + std::string shortSub = resolved.getShortSub(); if (!target) { return {}; } diff --git a/src/Mod/TechDraw/Gui/DimensionValidators.cpp b/src/Mod/TechDraw/Gui/DimensionValidators.cpp index ab37700d48..854311399a 100644 --- a/src/Mod/TechDraw/Gui/DimensionValidators.cpp +++ b/src/Mod/TechDraw/Gui/DimensionValidators.cpp @@ -77,10 +77,18 @@ TechDraw::DrawViewPart* TechDraw::getReferencesFromSelection(ReferenceVector& re } } else if (!selItem.getObject()->isDerivedFrom()) { App::DocumentObject* obj3d = selItem.getObject(); - // this is a regular 3d reference in form obj + long subelement - for (auto& sub3d : selItem.getSubNames()) { - ReferenceEntry ref(obj3d, sub3d); + // obj3d is a point object, in which case the sub will be empty instead of + // containing Vertex1. Inserting "Vertex1" here gets us through + // validation, but doesn't work in Measure::shapefinder. + if (ShapeExtractor::isPointType(obj3d)) { + ReferenceEntry ref(obj3d, "Vertex1"); references3d.push_back(ref); + } else { + // this is a regular 3d reference in form obj + long subelement + for (auto& sub3d : selItem.getSubNames()) { + ReferenceEntry ref(obj3d, sub3d); + references3d.push_back(ref); + } } } }