From 901bbbed57eccccce4684d35108dc3a093519979 Mon Sep 17 00:00:00 2001 From: Abdullah Tahiri Date: Sun, 19 Oct 2014 07:30:27 +0200 Subject: [PATCH] Sketcher: Various Ellipse enhancements - Autoconstraints for Ellipse - Conversion of a Part.Arc of an Ellipse to Sketcher. --- src/Mod/Sketcher/App/SketchObjectPyImp.cpp | 15 +++++++++++ src/Mod/Sketcher/Gui/DrawSketchHandler.cpp | 31 +++++++++++++--------- 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/src/Mod/Sketcher/App/SketchObjectPyImp.cpp b/src/Mod/Sketcher/App/SketchObjectPyImp.cpp index df890c2ae..44126c8b2 100644 --- a/src/Mod/Sketcher/App/SketchObjectPyImp.cpp +++ b/src/Mod/Sketcher/App/SketchObjectPyImp.cpp @@ -75,12 +75,19 @@ PyObject* SketchObjectPy::addGeometry(PyObject *args) if (geo->getTypeId() == Part::GeomTrimmedCurve::getClassTypeId()) { Handle_Geom_TrimmedCurve trim = Handle_Geom_TrimmedCurve::DownCast(geo->handle()); Handle_Geom_Circle circle = Handle_Geom_Circle::DownCast(trim->BasisCurve()); + Handle_Geom_Ellipse ellipse = Handle_Geom_Ellipse::DownCast(trim->BasisCurve()); if (!circle.IsNull()) { // create the definition struct for that geom Part::GeomArcOfCircle aoc; aoc.setHandle(trim); ret = this->getSketchObjectPtr()->addGeometry(&aoc); } + else if (!ellipse.IsNull()) { + // create the definition struct for that geom + Part::GeomArcOfEllipse aoe; + aoe.setHandle(trim); + ret = this->getSketchObjectPtr()->addGeometry(&aoe); + } else { std::stringstream str; str << "Unsupported geometry type: " << geo->getTypeId().getName(); @@ -117,6 +124,7 @@ PyObject* SketchObjectPy::addGeometry(PyObject *args) if (geo->getTypeId() == Part::GeomTrimmedCurve::getClassTypeId()) { Handle_Geom_TrimmedCurve trim = Handle_Geom_TrimmedCurve::DownCast(geo->handle()); Handle_Geom_Circle circle = Handle_Geom_Circle::DownCast(trim->BasisCurve()); + Handle_Geom_Ellipse ellipse = Handle_Geom_Ellipse::DownCast(trim->BasisCurve()); if (!circle.IsNull()) { // create the definition struct for that geom boost::shared_ptr aoc(new Part::GeomArcOfCircle()); @@ -124,6 +132,13 @@ PyObject* SketchObjectPy::addGeometry(PyObject *args) geoList.push_back(aoc.get()); tmpList.push_back(aoc); } + else if (!ellipse.IsNull()) { + // create the definition struct for that geom + boost::shared_ptr aoe(new Part::GeomArcOfEllipse()); + aoe->setHandle(trim); + geoList.push_back(aoe.get()); + tmpList.push_back(aoe); + } else { std::stringstream str; str << "Unsupported geometry type: " << geo->getTypeId().getName(); diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandler.cpp b/src/Mod/Sketcher/Gui/DrawSketchHandler.cpp index bdc71f58f..b6bdcbc91 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandler.cpp +++ b/src/Mod/Sketcher/Gui/DrawSketchHandler.cpp @@ -246,20 +246,27 @@ int DrawSketchHandler::seekAutoConstraint(std::vector &suggested const Part::GeomEllipse *ellipse = dynamic_cast((*it)); Base::Vector3d center = ellipse->getCenter(); - Base::Vector3d tmpPos(Pos.fX, Pos.fY, 0.f); - double radius = ellipse->getMajorRadius(); + double a = ellipse->getMajorRadius(); + double b = ellipse->getMinorRadius(); + double phi = ellipse->getAngleXU(); + + double cf = sqrt(a*a - b*b); + + Base::Vector3d focus1P = center + cf * Base::Vector3d(cos(phi),sin(phi),0); + Base::Vector3d focus2P = center - cf * Base::Vector3d(cos(phi),sin(phi),0); + + Base::Vector3d norm = Base::Vector3d(Dir.fY,-Dir.fX).Normalize(); + + double distancetoline = norm*(tmpPos - focus1P); // distance focus1 to line + + Base::Vector3d focus1PMirrored = focus1P + 2*distancetoline*norm; // mirror of focus1 with respect to the line + + double error = abs((focus1PMirrored-focus2P).Length() - 2*a); - Base::Vector3d projPnt(0.f, 0.f, 0.f); - projPnt = projPnt.ProjToLine(center - tmpPos, Base::Vector3d(Dir.fX, Dir.fY)); - double projDist = projPnt.Length(); - - if ( (projDist < radius + tangDeviation ) && (projDist > radius - tangDeviation)) { - //Find if nearest - if (projDist < tangDeviation) { + if ( error< tangDeviation ) { tangId = i; - tangDeviation = projDist; - } + tangDeviation = error; } } else if ((*it)->getTypeId() == Part::GeomArcOfCircle::getClassTypeId()) { @@ -290,7 +297,7 @@ int DrawSketchHandler::seekAutoConstraint(std::vector &suggested tangDeviation = projDist; } } - } + } } if (tangId != Constraint::GeoUndef) {