From 21354e9a8bbb57ae3216274ca3d7cef1f036eca7 Mon Sep 17 00:00:00 2001 From: DeepSOIC Date: Wed, 8 Oct 2014 02:10:04 +0400 Subject: [PATCH] Sketcher Ellipse bug fixes: - Fix of internal geometry creation - Fix swapped negative and positive ends of major radius line on creation - Removing the fudge factor (no longer needed) - Fix to restore internal alignment - autodecide on constraint creation which point of the line is closer to the position --- src/Mod/Sketcher/App/freegcs/GCS.cpp | 68 ++++++++++++++++--- src/Mod/Sketcher/Gui/CommandSketcherTools.cpp | 5 +- 2 files changed, 61 insertions(+), 12 deletions(-) diff --git a/src/Mod/Sketcher/App/freegcs/GCS.cpp b/src/Mod/Sketcher/App/freegcs/GCS.cpp index 4ef5f6aab..cb0b259e3 100644 --- a/src/Mod/Sketcher/App/freegcs/GCS.cpp +++ b/src/Mod/Sketcher/App/freegcs/GCS.cpp @@ -829,18 +829,70 @@ int System::addConstraintInternalAlignmentPoint2Ellipse(Ellipse &e, Point &p1, I int System::addConstraintInternalAlignmentEllipseMajorDiameter(Ellipse &e, Point &p1, Point &p2, int tagId) { - addConstraintInternalAlignmentPoint2Ellipse(e,p1,EllipsePositiveMajorX,tagId); - addConstraintInternalAlignmentPoint2Ellipse(e,p1,EllipsePositiveMajorY,tagId); - addConstraintInternalAlignmentPoint2Ellipse(e,p2,EllipseNegativeMajorX,tagId); - return addConstraintInternalAlignmentPoint2Ellipse(e,p2,EllipseNegativeMajorY,tagId); + //chechk which of the points is closer to satisfying positivemajor + double err1=0.0, err2=0.0; + { + ConstraintInternalAlignmentPoint2Ellipse constr (e,p1,EllipsePositiveMajorX); + err1+=abs(constr.error()); + }; + { + ConstraintInternalAlignmentPoint2Ellipse constr (e,p1,EllipsePositiveMajorY); + err1+=abs(constr.error()); + }; + { + ConstraintInternalAlignmentPoint2Ellipse constr (e,p2,EllipsePositiveMajorX); + err2+=abs(constr.error()); + }; + { + ConstraintInternalAlignmentPoint2Ellipse constr (e,p2,EllipsePositiveMajorY); + err2+=abs(constr.error()); + }; + if(err1<=err2){ + //p1 is closer to positivemajor + addConstraintInternalAlignmentPoint2Ellipse(e,p1,EllipsePositiveMajorX,tagId); + addConstraintInternalAlignmentPoint2Ellipse(e,p1,EllipsePositiveMajorY,tagId); + addConstraintInternalAlignmentPoint2Ellipse(e,p2,EllipseNegativeMajorX,tagId); + return addConstraintInternalAlignmentPoint2Ellipse(e,p2,EllipseNegativeMajorY,tagId); + } else { + //p2 is closer to positivemajor. Assign constraints back-to-front. + addConstraintInternalAlignmentPoint2Ellipse(e,p2,EllipsePositiveMajorX,tagId); + addConstraintInternalAlignmentPoint2Ellipse(e,p2,EllipsePositiveMajorY,tagId); + addConstraintInternalAlignmentPoint2Ellipse(e,p1,EllipseNegativeMajorX,tagId); + return addConstraintInternalAlignmentPoint2Ellipse(e,p1,EllipseNegativeMajorY,tagId); + } } int System::addConstraintInternalAlignmentEllipseMinorDiameter(Ellipse &e, Point &p1, Point &p2, int tagId) { - addConstraintInternalAlignmentPoint2Ellipse(e,p1,EllipsePositiveMinorX,tagId); - addConstraintInternalAlignmentPoint2Ellipse(e,p1,EllipsePositiveMinorY,tagId); - addConstraintInternalAlignmentPoint2Ellipse(e,p2,EllipseNegativeMinorX,tagId); - return addConstraintInternalAlignmentPoint2Ellipse(e,p2,EllipseNegativeMinorY,tagId); + //chechk which of the points is closer to satisfying positivemajor + double err1=0.0, err2=0.0; + { + ConstraintInternalAlignmentPoint2Ellipse constr (e,p1,EllipsePositiveMinorX); + err1+=abs(constr.error()); + }; + { + ConstraintInternalAlignmentPoint2Ellipse constr (e,p1,EllipsePositiveMinorY); + err1+=abs(constr.error()); + }; + { + ConstraintInternalAlignmentPoint2Ellipse constr (e,p2,EllipsePositiveMinorX); + err2+=abs(constr.error()); + }; + { + ConstraintInternalAlignmentPoint2Ellipse constr (e,p2,EllipsePositiveMinorY); + err2+=abs(constr.error()); + }; + if(err1<=err2){ + addConstraintInternalAlignmentPoint2Ellipse(e,p1,EllipsePositiveMinorX,tagId); + addConstraintInternalAlignmentPoint2Ellipse(e,p1,EllipsePositiveMinorY,tagId); + addConstraintInternalAlignmentPoint2Ellipse(e,p2,EllipseNegativeMinorX,tagId); + return addConstraintInternalAlignmentPoint2Ellipse(e,p2,EllipseNegativeMinorY,tagId); + } else { + addConstraintInternalAlignmentPoint2Ellipse(e,p2,EllipsePositiveMinorX,tagId); + addConstraintInternalAlignmentPoint2Ellipse(e,p2,EllipsePositiveMinorY,tagId); + addConstraintInternalAlignmentPoint2Ellipse(e,p1,EllipseNegativeMinorX,tagId); + return addConstraintInternalAlignmentPoint2Ellipse(e,p1,EllipseNegativeMinorY,tagId); + }; } int System::addConstraintInternalAlignmentEllipseFocus1(Ellipse &e, Point &p1, int tagId) diff --git a/src/Mod/Sketcher/Gui/CommandSketcherTools.cpp b/src/Mod/Sketcher/Gui/CommandSketcherTools.cpp index c4d7a1944..3ec78dbb1 100644 --- a/src/Mod/Sketcher/Gui/CommandSketcherTools.cpp +++ b/src/Mod/Sketcher/Gui/CommandSketcherTools.cpp @@ -866,9 +866,6 @@ void CmdSketcherRestoreInternalAlignmentGeometry::activated(int iMsg) phi=aoe->getAngleXU(); } - majord*=0.99; - minord*=0.99; - Base::Vector3d majorpositiveend = center + majord * Base::Vector3d(cos(phi),sin(phi),0); Base::Vector3d majornegativeend = center - majord * Base::Vector3d(cos(phi),sin(phi),0); @@ -885,7 +882,7 @@ void CmdSketcherRestoreInternalAlignmentGeometry::activated(int iMsg) { Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.addGeometry(Part.Line(App.Vector(%f,%f,0),App.Vector(%f,%f,0)))", Obj->getNameInDocument(), - majornegativeend.x,majornegativeend.y,majorpositiveend.x,majorpositiveend.y); // create line for major axis + majorpositiveend.x,majorpositiveend.y,majornegativeend.x,majornegativeend.y); // create line for major axis Gui::Command::doCommand(Doc,"App.ActiveDocument.%s.addConstraint(Sketcher.Constraint('InternalAlignment:EllipseMajorDiameter',%d,%d)) ", selection[0].getFeatName(),currentgeoid+incrgeo+1,GeoId); // constrain major axis