diff --git a/src/Mod/Sketcher/App/Sketch.cpp b/src/Mod/Sketcher/App/Sketch.cpp index 93ab38b1a7..bdb6de7992 100644 --- a/src/Mod/Sketcher/App/Sketch.cpp +++ b/src/Mod/Sketcher/App/Sketch.cpp @@ -1711,6 +1711,16 @@ int Sketch::addEqualConstraint(int geoId1, int geoId2) } } + if (Geoms[geoId2].type == ArcOfHyperbola) { + if (Geoms[geoId1].type == ArcOfHyperbola) { + GCS::ArcOfHyperbola &a1 = ArcsOfHyperbola[Geoms[geoId1].index]; + GCS::ArcOfHyperbola &a2 = ArcsOfHyperbola[Geoms[geoId2].index]; + int tag = ++ConstraintsCounter; + GCSsys.addConstraintEqualRadii(a1, a2, tag); + return ConstraintsCounter; + } + } + if (Geoms[geoId1].type == Ellipse) { GCS::Ellipse &e1 = Ellipses[Geoms[geoId1].index]; if (Geoms[geoId2].type == ArcOfEllipse) { diff --git a/src/Mod/Sketcher/App/planegcs/Constraints.cpp b/src/Mod/Sketcher/App/planegcs/Constraints.cpp index 62a00c1d8e..47e1b58ee8 100644 --- a/src/Mod/Sketcher/App/planegcs/Constraints.cpp +++ b/src/Mod/Sketcher/App/planegcs/Constraints.cpp @@ -1247,56 +1247,56 @@ double ConstraintInternalAlignmentPoint2Ellipse::grad(double *param) } // ConstraintEqualMajorAxesEllipse -ConstraintEqualMajorAxesEllipse:: ConstraintEqualMajorAxesEllipse(Ellipse &e1, Ellipse &e2) +ConstraintEqualMajorAxesConic:: ConstraintEqualMajorAxesConic(MajorRadiusConic * a1, MajorRadiusConic * a2) { - this->e1 = e1; - this->e1.PushOwnParams(pvec); - this->e2 = e2; - this->e2.PushOwnParams(pvec); + this->e1 = a1; + this->e1->PushOwnParams(pvec); + this->e2 = a2; + this->e2->PushOwnParams(pvec); origpvec = pvec; pvecChangedFlag = true; rescale(); } -void ConstraintEqualMajorAxesEllipse::ReconstructGeomPointers() +void ConstraintEqualMajorAxesConic::ReconstructGeomPointers() { int i =0; - e1.ReconstructOnNewPvec(pvec, i); - e2.ReconstructOnNewPvec(pvec, i); + e1->ReconstructOnNewPvec(pvec, i); + e2->ReconstructOnNewPvec(pvec, i); pvecChangedFlag = false; } -ConstraintType ConstraintEqualMajorAxesEllipse::getTypeId() +ConstraintType ConstraintEqualMajorAxesConic::getTypeId() { - return EqualMajorAxesEllipse; + return EqualMajorAxesConic; } -void ConstraintEqualMajorAxesEllipse::rescale(double coef) +void ConstraintEqualMajorAxesConic::rescale(double coef) { scale = coef * 1; } -void ConstraintEqualMajorAxesEllipse::errorgrad(double *err, double *grad, double *param) +void ConstraintEqualMajorAxesConic::errorgrad(double *err, double *grad, double *param) { if (pvecChangedFlag) ReconstructGeomPointers(); double a1, da1; - a1 = e1.getRadMaj(param, da1); + a1 = e1->getRadMaj(param, da1); double a2, da2; - a2 = e2.getRadMaj(param, da2); + a2 = e2->getRadMaj(param, da2); if (err) *err = a2 - a1; if (grad) *grad = da2 - da1; } -double ConstraintEqualMajorAxesEllipse::error() +double ConstraintEqualMajorAxesConic::error() { double err; errorgrad(&err,0,0); return scale * err; } -double ConstraintEqualMajorAxesEllipse::grad(double *param) +double ConstraintEqualMajorAxesConic::grad(double *param) { //first of all, check that we need to compute anything. if ( findParamInPvec(param) == -1 ) return 0.0; diff --git a/src/Mod/Sketcher/App/planegcs/Constraints.h b/src/Mod/Sketcher/App/planegcs/Constraints.h index 17a771cfef..a3012c24fa 100644 --- a/src/Mod/Sketcher/App/planegcs/Constraints.h +++ b/src/Mod/Sketcher/App/planegcs/Constraints.h @@ -25,6 +25,7 @@ #include "Geo.h" #include "Util.h" +#include //#define _GCS_EXTRACT_SOLVER_SUBSYSTEM_ // This enables debuging code intended to extract information to file bug reports against Eigen, not for production code @@ -58,7 +59,7 @@ namespace GCS PointOnEllipse = 13, TangentEllipseLine = 14, InternalAlignmentPoint2Ellipse = 15, - EqualMajorAxesEllipse = 16, + EqualMajorAxesConic = 16, EllipticalArcRangeToEndPoints = 17, AngleViaPoint = 18, Snell = 19, @@ -422,14 +423,15 @@ namespace GCS InternalAlignmentType AlignmentType; }; - class ConstraintEqualMajorAxesEllipse : public Constraint + class ConstraintEqualMajorAxesConic : public Constraint { private: - Ellipse e1, e2; + MajorRadiusConic * e1; + MajorRadiusConic * e2; void ReconstructGeomPointers(); //writes pointers in pvec to the parameters of crv1, crv2 and poa void errorgrad(double* err, double* grad, double *param); //error and gradient combined. Values are returned through pointers. public: - ConstraintEqualMajorAxesEllipse(Ellipse &e1, Ellipse &e2); + ConstraintEqualMajorAxesConic(MajorRadiusConic * a1, MajorRadiusConic * a2); virtual ConstraintType getTypeId(); virtual void rescale(double coef=1.); virtual double error(); diff --git a/src/Mod/Sketcher/App/planegcs/GCS.cpp b/src/Mod/Sketcher/App/planegcs/GCS.cpp index 466cfc23db..7565f9a957 100644 --- a/src/Mod/Sketcher/App/planegcs/GCS.cpp +++ b/src/Mod/Sketcher/App/planegcs/GCS.cpp @@ -751,14 +751,22 @@ int System::addConstraintEqualRadius(Circle &c1, Circle &c2, int tagId) int System::addConstraintEqualRadii(Ellipse &e1, Ellipse &e2, int tagId) { - //addConstraintEqual(e1.radmaj, e2.radmaj, tagId); addConstraintEqual(e1.radmin, e2.radmin, tagId); - Constraint *constr = new ConstraintEqualMajorAxesEllipse(e1,e2); + Constraint *constr = new ConstraintEqualMajorAxesConic(&e1,&e2); constr->setTag(tagId); return addConstraint(constr); } +int System::addConstraintEqualRadii(ArcOfHyperbola &a1, ArcOfHyperbola &a2, int tagId) +{ + addConstraintEqual(a1.radmin, a2.radmin, tagId); + + Constraint *constr = new ConstraintEqualMajorAxesConic(&a1,&a2); + constr->setTag(tagId); + return addConstraint(constr); +} + int System::addConstraintEqualRadius(Circle &c1, Arc &a2, int tagId) { return addConstraintEqual(c1.rad, a2.rad, tagId); diff --git a/src/Mod/Sketcher/App/planegcs/GCS.h b/src/Mod/Sketcher/App/planegcs/GCS.h index 28a04e571e..6276171cd4 100644 --- a/src/Mod/Sketcher/App/planegcs/GCS.h +++ b/src/Mod/Sketcher/App/planegcs/GCS.h @@ -25,6 +25,7 @@ #include "SubSystem.h" #include +#include namespace GCS { @@ -208,6 +209,7 @@ namespace GCS int addConstraintEqualLength(Line &l1, Line &l2, double *length, int tagId=0); int addConstraintEqualRadius(Circle &c1, Circle &c2, int tagId=0); int addConstraintEqualRadii(Ellipse &e1, Ellipse &e2, int tagId=0); + int addConstraintEqualRadii(ArcOfHyperbola &a1, ArcOfHyperbola &a2, int tagId=0); int addConstraintEqualRadius(Circle &c1, Arc &a2, int tagId=0); int addConstraintEqualRadius(Arc &a1, Arc &a2, int tagId=0); int addConstraintP2PSymmetric(Point &p1, Point &p2, Line &l, int tagId=0); diff --git a/src/Mod/Sketcher/App/planegcs/Geo.h b/src/Mod/Sketcher/App/planegcs/Geo.h index c4abca2720..9a020ef4a2 100644 --- a/src/Mod/Sketcher/App/planegcs/Geo.h +++ b/src/Mod/Sketcher/App/planegcs/Geo.h @@ -149,7 +149,17 @@ namespace GCS virtual Arc* Copy(); }; - class Ellipse: public Curve + class MajorRadiusConic: public Curve + { + public: + virtual ~MajorRadiusConic(){} + virtual double getRadMaj(const DeriVector2 ¢er, const DeriVector2 &f1, double b, double db, double &ret_dRadMaj) = 0; + virtual double getRadMaj(double* derivparam, double &ret_dRadMaj) = 0; + virtual double getRadMaj() = 0; + DeriVector2 CalculateNormal(Point &p, double* derivparam = 0) = 0; + }; + + class Ellipse: public MajorRadiusConic { public: Ellipse(){ radmin = 0;} @@ -157,9 +167,9 @@ namespace GCS Point center; Point focus1; double *radmin; - double getRadMaj(const DeriVector2 ¢er, const DeriVector2 &f1, double b, double db, double &ret_dRadMaj); - double getRadMaj(double* derivparam, double &ret_dRadMaj); - double getRadMaj(); + virtual double getRadMaj(const DeriVector2 ¢er, const DeriVector2 &f1, double b, double db, double &ret_dRadMaj); + virtual double getRadMaj(double* derivparam, double &ret_dRadMaj); + virtual double getRadMaj(); DeriVector2 CalculateNormal(Point &p, double* derivparam = 0); virtual int PushOwnParams(VEC_pD &pvec); virtual void ReconstructOnNewPvec (VEC_pD &pvec, int &cnt); @@ -184,7 +194,7 @@ namespace GCS virtual ArcOfEllipse* Copy(); }; - class Hyperbola: public Curve + class Hyperbola: public MajorRadiusConic { public: Hyperbola(){ radmin = 0;} @@ -192,9 +202,9 @@ namespace GCS Point center; Point focus1; double *radmin; - double getRadMaj(const DeriVector2 ¢er, const DeriVector2 &f1, double b, double db, double &ret_dRadMaj); - double getRadMaj(double* derivparam, double &ret_dRadMaj); - double getRadMaj(); + virtual double getRadMaj(const DeriVector2 ¢er, const DeriVector2 &f1, double b, double db, double &ret_dRadMaj); + virtual double getRadMaj(double* derivparam, double &ret_dRadMaj); + virtual double getRadMaj(); DeriVector2 CalculateNormal(Point &p, double* derivparam = 0); virtual int PushOwnParams(VEC_pD &pvec); virtual void ReconstructOnNewPvec (VEC_pD &pvec, int &cnt);