diff --git a/src/Mod/TechDraw/App/Cosmetic.cpp b/src/Mod/TechDraw/App/Cosmetic.cpp index 740bd9d2da..35b4cd8c73 100644 --- a/src/Mod/TechDraw/App/Cosmetic.cpp +++ b/src/Mod/TechDraw/App/Cosmetic.cpp @@ -779,16 +779,16 @@ TechDraw::BaseGeomPtr CenterLine::scaledGeometry(TechDraw::DrawViewPart* partFea { // Base::Console().Message("CL::scaledGeometry() - m_type: %d\n", m_type); double scale = partFeat->getScale(); - if (m_faces.empty() && - m_edges.empty() && - m_verts.empty() ) { - Base::Console().Message("CL::scaledGeometry - no geometry to scale!\n"); - return nullptr; - } - std::pair ends; try { - if (m_type == CLTYPE::FACE) { + if (m_faces.empty() && + m_edges.empty() && + m_verts.empty() ) { +// Base::Console().Message("CL::scaledGeometry - no geometry to scale!\n"); + //CenterLine was created by points without a geometry reference, + ends = calcEndPointsNoRef(m_start, m_end, scale, m_extendBy, + m_hShift,m_vShift, m_rotate); + } else if (m_type == CLTYPE::FACE) { ends = calcEndPoints(partFeat, m_faces, m_mode, m_extendBy, @@ -873,6 +873,60 @@ void CenterLine::dump(const char* title) Base::Console().Message("CL::dump - %s \n",toString().c_str()); } +//end points for centerline with no geometry reference +std::pair CenterLine::calcEndPointsNoRef( + Base::Vector3d start, + Base::Vector3d end, + double scale, + double ext, + double hShift, double vShift, + double rotate) +{ +// Base::Console().Message("CL::calcEndPointsNoRef()\n"); + std::pair result; + Base::Vector3d p1 = start; + Base::Vector3d p2 = end; + Base::Vector3d mid = (p1 + p2) / 2.0; + + //extend + Base::Vector3d clDir = p2 - p1; + clDir.Normalize(); + p1 = p1 - (clDir * ext); + p2 = p2 + (clDir * ext); + + //rotate + if (!DrawUtil::fpCompare(rotate, 0.0)) { + //rotate p1, p2 about mid point + double revRotate = -rotate; + double cosTheta = cos(revRotate * M_PI / 180.0); + double sinTheta = sin(revRotate * M_PI / 180.0); + Base::Vector3d toOrg = p1 - mid; + double xRot = toOrg.x * cosTheta - toOrg.y * sinTheta; + double yRot = toOrg.y * cosTheta + toOrg.x * sinTheta; + p1 = Base::Vector3d(xRot, yRot, 0.0) + mid; + toOrg = p2 - mid; + xRot = toOrg.x * cosTheta - toOrg.y * sinTheta; + yRot = toOrg.y * cosTheta + toOrg.x * sinTheta; + p2 = Base::Vector3d(xRot, yRot, 0.0) + mid; + } + + //shift + if (!DrawUtil::fpCompare(hShift, 0.0)) { + double hss = hShift * scale; + p1.x = p1.x + hss; + p2.x = p2.x + hss; + } + if (!DrawUtil::fpCompare(vShift, 0.0)) { + double vss = vShift * scale; + p1.y = p1.y + vss; + p2.y = p2.y + vss; + } + + result.first = p1 / scale; + result.second = p2 / scale; + return result; +} + //end points for face centerline std::pair CenterLine::calcEndPoints(DrawViewPart* partFeat, std::vector faceNames, diff --git a/src/Mod/TechDraw/App/Cosmetic.h b/src/Mod/TechDraw/App/Cosmetic.h index 5cb982b242..934896e242 100644 --- a/src/Mod/TechDraw/App/Cosmetic.h +++ b/src/Mod/TechDraw/App/Cosmetic.h @@ -210,6 +210,14 @@ public: int mode = 0, bool flip = false); TechDraw::BaseGeomPtr scaledGeometry(TechDraw::DrawViewPart* partFeat); + + static std::pair calcEndPointsNoRef( + Base::Vector3d start, + Base::Vector3d end, + double scale, + double ext, + double hShift, double vShift, + double rotate); static std::pair calcEndPoints( TechDraw::DrawViewPart* partFeat, std::vector faceNames, diff --git a/src/Mod/TechDraw/App/CosmeticExtension.cpp b/src/Mod/TechDraw/App/CosmeticExtension.cpp index 45ac0375c0..bfb89260b0 100644 --- a/src/Mod/TechDraw/App/CosmeticExtension.cpp +++ b/src/Mod/TechDraw/App/CosmeticExtension.cpp @@ -281,7 +281,8 @@ std::string CosmeticExtension::addCenterLine(Base::Vector3d start, Base::Vector3d end) { // Base::Console().Message("CEx::addCenterLine(%s)\n", - // DrawUtil::formatVector(pos).c_str()); +// DrawUtil::formatVector(start).c_str(), +// DrawUtil::formatVector(end).c_str()); std::vector cLines = CenterLines.getValues(); TechDraw::CenterLine* cl = new TechDraw::CenterLine(start, end); cLines.push_back(cl); diff --git a/src/Mod/TechDraw/Gui/CommandExtensionPack.cpp b/src/Mod/TechDraw/Gui/CommandExtensionPack.cpp index d71c1aba9b..166817891e 100644 --- a/src/Mod/TechDraw/Gui/CommandExtensionPack.cpp +++ b/src/Mod/TechDraw/Gui/CommandExtensionPack.cpp @@ -1511,6 +1511,7 @@ void execExtendShortenLine(Gui::Command* cmd, bool extend) { Base::Vector3d P0 = genLine->points.at(0); Base::Vector3d P1 = genLine->points.at(1); bool isCenterLine = false; + TechDraw::CenterLine* centerEdge = nullptr; if (baseGeo->cosmetic) { std::string uniTag = baseGeo->getCosmeticTag(); int oldStyle = 1; @@ -1527,11 +1528,7 @@ void execExtendShortenLine(Gui::Command* cmd, bool extend) { } else if (baseGeo->source() == 2) { isCenterLine = true; - auto centerEdge = objFeat->getCenterLine(uniTag); - oldStyle = centerEdge->m_format.m_style; - oldWeight = centerEdge->m_format.m_weight; - oldColor = centerEdge->m_format.m_color; - objFeat->removeCenterLine(toDelete); + centerEdge = objFeat->getCenterLine(uniTag); } double scale = objFeat->getScale(); Base::Vector3d direction = (P1 - P0).Normalize(); @@ -1548,17 +1545,14 @@ void execExtendShortenLine(Gui::Command* cmd, bool extend) { startPt.y = -startPt.y; endPt.y = -endPt.y; if (isCenterLine) { - std::string lineTag = objFeat->addCenterLine(startPt / scale, endPt / scale); - TechDraw::CenterLine* lineEdge = objFeat->getCenterLine(lineTag); - _setLineAttributes(lineEdge, oldStyle, oldWeight, oldColor); + centerEdge->m_extendBy += activeDimAttributes.getLineStretch(); + objFeat->refreshCLGeoms(); } else { std::string lineTag = objFeat->addCosmeticEdge(startPt / scale, endPt / scale); TechDraw::CosmeticEdge* lineEdge = objFeat->getCosmeticEdge(lineTag); _setLineAttributes(lineEdge, oldStyle, oldWeight, oldColor); + objFeat->refreshCEGeoms(); } -// cmd->getSelection().clearSelection(); - objFeat->refreshCEGeoms(); - objFeat->refreshCLGeoms(); objFeat->requestPaint(); } }