From 02c6a90c160a7feac269d8aa0fe1b490bfa5c898 Mon Sep 17 00:00:00 2001 From: wandererfan Date: Fri, 26 Jan 2024 13:41:08 -0500 Subject: [PATCH] [TD]fix extension bolt hole circle re scale/rotate --- src/Mod/TechDraw/Gui/CommandExtensionPack.cpp | 33 ++++++++++++++----- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/src/Mod/TechDraw/Gui/CommandExtensionPack.cpp b/src/Mod/TechDraw/Gui/CommandExtensionPack.cpp index ef51c387b9..346e8cb226 100644 --- a/src/Mod/TechDraw/Gui/CommandExtensionPack.cpp +++ b/src/Mod/TechDraw/Gui/CommandExtensionPack.cpp @@ -123,24 +123,39 @@ void execHoleCircle(Gui::Command* cmd) return; } Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Bolt Circle Centerlines")); - double scale = objFeat->getScale(); + + // make the bolt hole circle from 3 scaled and rotated points Base::Vector3d bigCenter = _circleCenter(Circles[0]->center, Circles[1]->center, Circles[2]->center); - float bigRadius = (Circles[0]->center - bigCenter).Length(); + double bigRadius = (Circles[0]->center - bigCenter).Length(); + // now convert the center & radius to canonical form + bigCenter = DU::invertY(bigCenter); + bigCenter = CosmeticVertex::makeCanonicalPoint(objFeat, bigCenter); + bigCenter = DU::invertY(bigCenter); + bigRadius = bigRadius / objFeat->getScale(); TechDraw::BaseGeomPtr bigCircle = - std::make_shared(bigCenter / scale, bigRadius / scale); + std::make_shared(bigCenter, bigRadius); std::string bigCircleTag = objFeat->addCosmeticEdge(bigCircle); TechDraw::CosmeticEdge* ceCircle = objFeat->getCosmeticEdge(bigCircleTag); _setLineAttributes(ceCircle); + + // make the center lines for the individual bolt holes + constexpr double ExtendFactor{1.1}; for (const TechDraw::CirclePtr& oneCircle : Circles) { - Base::Vector3d oneCircleCenter = oneCircle->center; - float oneRadius = oneCircle->radius; - Base::Vector3d delta = (oneCircle->center - bigCenter).Normalize() * (oneRadius + 2); + // convert the center to canonical form + Base::Vector3d oneCircleCenter = DU::invertY(oneCircle->center); + oneCircleCenter = CosmeticVertex::makeCanonicalPoint(objFeat, oneCircleCenter); + oneCircleCenter = DU::invertY(oneCircleCenter); + // oneCircle->radius is scaled. + float oneRadius = oneCircle->radius / objFeat->getScale(); + // what is magic number 2 (now ExtendFactor)? just a fudge factor to extend the line beyond the bolt + // hole circle? should it be a function of hole diameter? maybe 110% of oneRadius? + Base::Vector3d delta = (oneCircleCenter - bigCenter).Normalize() * (oneRadius * ExtendFactor); Base::Vector3d startPt = oneCircleCenter + delta; Base::Vector3d endPt = oneCircleCenter - delta; - startPt.y = -startPt.y; - endPt.y = -endPt.y; - std::string oneLineTag = objFeat->addCosmeticEdge(startPt / scale, endPt / scale); + startPt = DU::invertY(startPt); + endPt = DU::invertY(endPt); + std::string oneLineTag = objFeat->addCosmeticEdge(startPt, endPt); TechDraw::CosmeticEdge* ceLine = objFeat->getCosmeticEdge(oneLineTag); _setLineAttributes(ceLine); }