From 3e76189f19fe06aef1ba50d217425eea8b51259a Mon Sep 17 00:00:00 2001 From: Abdullah Tahiri Date: Wed, 21 Dec 2016 17:09:12 +0100 Subject: [PATCH] Sketcher: Focus solver internal geometry --- src/Mod/Sketcher/App/Constraint.h | 3 ++- src/Mod/Sketcher/App/Sketch.cpp | 29 +++++++++++++++++++++++++++ src/Mod/Sketcher/App/Sketch.h | 1 + src/Mod/Sketcher/App/planegcs/GCS.cpp | 6 ++++++ src/Mod/Sketcher/App/planegcs/GCS.h | 1 + 5 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/Mod/Sketcher/App/Constraint.h b/src/Mod/Sketcher/App/Constraint.h index 30bcdcbfae..f7b78de9d8 100644 --- a/src/Mod/Sketcher/App/Constraint.h +++ b/src/Mod/Sketcher/App/Constraint.h @@ -66,7 +66,8 @@ enum InternalAlignmentType { EllipseFocus2 = 4, HyperbolaMajor = 5, HyperbolaMinor = 6, - HyperbolaFocus = 7 + HyperbolaFocus = 7, + ParabolaFocus = 8 }; /// define if you want to use the end or start point diff --git a/src/Mod/Sketcher/App/Sketch.cpp b/src/Mod/Sketcher/App/Sketch.cpp index a2f034cb08..4f67310adb 100644 --- a/src/Mod/Sketcher/App/Sketch.cpp +++ b/src/Mod/Sketcher/App/Sketch.cpp @@ -1092,6 +1092,9 @@ int Sketch::addConstraint(const Constraint *constraint) case HyperbolaFocus: rtn = addInternalAlignmentHyperbolaFocus(constraint->First,constraint->Second); break; + case ParabolaFocus: + rtn = addInternalAlignmentParabolaFocus(constraint->First,constraint->Second); + break; default: break; } @@ -2249,6 +2252,32 @@ int Sketch::addInternalAlignmentHyperbolaFocus(int geoId1, int geoId2) return -1; } +int Sketch::addInternalAlignmentParabolaFocus(int geoId1, int geoId2) +{ + std::swap(geoId1, geoId2); + + geoId1 = checkGeoId(geoId1); + geoId2 = checkGeoId(geoId2); + + if (Geoms[geoId1].type != ArcOfParabola) + return -1; + if (Geoms[geoId2].type != Point) + return -1; + + int pointId1 = getPointId(geoId2, start); + + if (pointId1 >= 0 && pointId1 < int(Points.size())) { + GCS::Point &p1 = Points[pointId1]; + + GCS::ArcOfParabola &a1 = ArcsOfParabola[Geoms[geoId1].index]; + + int tag = ++ConstraintsCounter; + GCSsys.addConstraintInternalAlignmentParabolaFocus(a1, p1, tag); + return ConstraintsCounter; + } + return -1; +} + double Sketch::calculateAngleViaPoint(int geoId1, int geoId2, double px, double py) { geoId1 = checkGeoId(geoId1); diff --git a/src/Mod/Sketcher/App/Sketch.h b/src/Mod/Sketcher/App/Sketch.h index 0d88fa2ab7..77c06fc866 100644 --- a/src/Mod/Sketcher/App/Sketch.h +++ b/src/Mod/Sketcher/App/Sketch.h @@ -311,6 +311,7 @@ public: int addInternalAlignmentHyperbolaMajorDiameter(int geoId1, int geoId2); int addInternalAlignmentHyperbolaMinorDiameter(int geoId1, int geoId2); int addInternalAlignmentHyperbolaFocus(int geoId1, int geoId2); + int addInternalAlignmentParabolaFocus(int geoId1, int geoId2); //@} public: //This func is to be used during angle-via-point constraint creation. It calculates diff --git a/src/Mod/Sketcher/App/planegcs/GCS.cpp b/src/Mod/Sketcher/App/planegcs/GCS.cpp index 289bfe9d56..5c874e19fa 100644 --- a/src/Mod/Sketcher/App/planegcs/GCS.cpp +++ b/src/Mod/Sketcher/App/planegcs/GCS.cpp @@ -987,6 +987,12 @@ int System::addConstraintInternalAlignmentHyperbolaFocus(Hyperbola &e, Point &p1 return addConstraintEqual(e.focus1.y, p1.y, tagId); } +int System::addConstraintInternalAlignmentParabolaFocus(Parabola &e, Point &p1, int tagId) +{ + addConstraintEqual(e.focus1.x, p1.x, tagId); + return addConstraintEqual(e.focus1.y, p1.y, tagId); +} + //calculates angle between two curves at point of their intersection p. If two //points are supplied, p is used for first curve and p2 for second, yielding a diff --git a/src/Mod/Sketcher/App/planegcs/GCS.h b/src/Mod/Sketcher/App/planegcs/GCS.h index 981e766f6d..c002eb5525 100644 --- a/src/Mod/Sketcher/App/planegcs/GCS.h +++ b/src/Mod/Sketcher/App/planegcs/GCS.h @@ -230,6 +230,7 @@ namespace GCS int addConstraintInternalAlignmentHyperbolaMajorDiameter(Hyperbola &e, Point &p1, Point &p2, int tagId=0); int addConstraintInternalAlignmentHyperbolaMinorDiameter(Hyperbola &e, Point &p1, Point &p2, int tagId=0); int addConstraintInternalAlignmentHyperbolaFocus(Hyperbola &e, Point &p1, int tagId=0); + int addConstraintInternalAlignmentParabolaFocus(Parabola &e, Point &p1, int tagId=0); double calculateAngleViaPoint(Curve &crv1, Curve &crv2, Point &p); double calculateAngleViaPoint(Curve &crv1, Curve &crv2, Point &p1, Point &p2);