From f24b589d679ba6d13c67233bef54a5acc95ed536 Mon Sep 17 00:00:00 2001 From: DeepSOIC Date: Sun, 12 Oct 2014 02:58:54 +0400 Subject: [PATCH] Sketcher Ellipse bug fix: - Fix placement of equality symbols at ellipses and arcs of ellipses --- src/Mod/Sketcher/Gui/ViewProviderSketch.cpp | 66 +++++++++++++-------- 1 file changed, 42 insertions(+), 24 deletions(-) diff --git a/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp b/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp index 73641af6a..5b735c2b7 100644 --- a/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp +++ b/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp @@ -3126,73 +3126,91 @@ Restart: if (geo1->getTypeId() != Part::GeomLineSegment::getClassTypeId() || geo2->getTypeId() != Part::GeomLineSegment::getClassTypeId()) { if (Constr->Type == Equal) { - double r1,r2,angle1,angle2; + double r1a,r1b,r2a,r2b; + double angle1,angle1plus=0., angle2, angle2plus=0.;//angle1 = rotation of object as a whole; angle1plus = arc angle (t parameter for ellipses). if (geo1->getTypeId() == Part::GeomCircle::getClassTypeId()) { // TODO: ellipse const Part::GeomCircle *circle = dynamic_cast(geo1); - r1 = circle->getRadius(); + r1a = circle->getRadius(); + r1b=r1a; angle1 = M_PI/4; midpos1 = circle->getCenter(); } else if (geo1->getTypeId() == Part::GeomArcOfCircle::getClassTypeId()) { const Part::GeomArcOfCircle *arc = dynamic_cast(geo1); - r1 = arc->getRadius(); + r1a = arc->getRadius(); + r1b=r1a; double startangle, endangle; arc->getRange(startangle, endangle); angle1 = (startangle + endangle)/2; midpos1 = arc->getCenter(); } else if (geo1->getTypeId() == Part::GeomEllipse::getClassTypeId()) { - // TODO: ellipse const Part::GeomEllipse *ellipse = dynamic_cast(geo1); - r1 = ellipse->getMajorRadius(); - angle1 = -ellipse->getAngleXU(); + r1a = ellipse->getMajorRadius(); + r1b = ellipse->getMinorRadius(); + angle1 = ellipse->getAngleXU(); + angle1plus = M_PI/4; midpos1 = ellipse->getCenter(); } else if (geo1->getTypeId() == Part::GeomArcOfEllipse::getClassTypeId()) { - // TODO: ellipse const Part::GeomArcOfEllipse *aoe = dynamic_cast(geo1); - r1 = aoe->getMajorRadius(); + r1a = aoe->getMajorRadius(); + r1b = aoe->getMinorRadius(); double startangle, endangle; aoe->getRange(startangle, endangle); - angle1 = (startangle + endangle)/2-aoe->getAngleXU(); + angle1 = aoe->getAngleXU(); + angle1plus = (startangle + endangle)/2; midpos1 = aoe->getCenter(); } else break; if (geo2->getTypeId() == Part::GeomCircle::getClassTypeId()) { const Part::GeomCircle *circle = dynamic_cast(geo2); - r2 = circle->getRadius(); + r2a = circle->getRadius(); + r2b=r2a; angle2 = M_PI/4; midpos2 = circle->getCenter(); } else if (geo2->getTypeId() == Part::GeomArcOfCircle::getClassTypeId()) { const Part::GeomArcOfCircle *arc = dynamic_cast(geo2); - r2 = arc->getRadius(); + r2a = arc->getRadius(); + r2b=r2a; double startangle, endangle; arc->getRange(startangle, endangle); angle2 = (startangle + endangle)/2; midpos2 = arc->getCenter(); } else if (geo2->getTypeId() == Part::GeomEllipse::getClassTypeId()) { - // TODO: ellipse const Part::GeomEllipse *ellipse = dynamic_cast(geo2); - r2 = ellipse->getMajorRadius(); - angle2 = -ellipse->getAngleXU(); + r2a = ellipse->getMajorRadius(); + r2b = ellipse->getMinorRadius(); + angle2 = ellipse->getAngleXU(); + angle2plus = M_PI/4; midpos2 = ellipse->getCenter(); } else if (geo2->getTypeId() == Part::GeomArcOfEllipse::getClassTypeId()) { - // TODO: ellipse const Part::GeomArcOfEllipse *aoe = dynamic_cast(geo2); - r2 = aoe->getMajorRadius(); + r2a = aoe->getMajorRadius(); + r2b = aoe->getMinorRadius(); double startangle, endangle; aoe->getRange(startangle, endangle); - angle1 = (startangle + endangle)/2-aoe->getAngleXU(); - midpos1 = aoe->getCenter(); + angle2 = aoe->getAngleXU(); + angle2plus = (startangle + endangle)/2; + midpos2 = aoe->getCenter(); } else break; - norm1 = Base::Vector3d(cos(angle1),sin(angle1),0); - dir1 = Base::Vector3d(-norm1.y,norm1.x,0); - midpos1 += r1*norm1; + Base::Vector3d majDir, minDir, rvec; + majDir = Base::Vector3d(cos(angle1),sin(angle1),0);//direction of major axis of ellipse + minDir = Base::Vector3d(-majDir.y,majDir.x,0);//direction of minor axis of ellipse + rvec = (r1a*cos(angle1plus)) * majDir + (r1b*sin(angle1plus)) * minDir; + midpos1 += rvec; + rvec.Normalize(); + norm1 = rvec; + dir1 = Base::Vector3d(-rvec.y,rvec.x,0);//DeepSOIC: I'm not sure what dir is supposed to mean. - norm2 = Base::Vector3d(cos(angle2),sin(angle2),0); - dir2 = Base::Vector3d(-norm2.y,norm2.x,0); - midpos2 += r2*norm2; + majDir = Base::Vector3d(cos(angle2),sin(angle2),0);//direction of major axis of ellipse + minDir = Base::Vector3d(-majDir.y,majDir.x,0);//direction of minor axis of ellipse + rvec = (r2a*cos(angle2plus)) * majDir + (r2b*sin(angle2plus)) * minDir; + midpos2 += rvec; + rvec.Normalize(); + norm2 = rvec; + dir2 = Base::Vector3d(-rvec.y,rvec.x,0); } else // Parallel can only apply to a GeomLineSegment break; } else {