From d82fe9e34c759f13cb48fdee8f47816fc1b178b4 Mon Sep 17 00:00:00 2001 From: Ajinkya Dahale Date: Sun, 5 Jun 2022 21:40:20 +0530 Subject: [PATCH] [Sketcher] Support splitting ellipses --- src/Mod/Sketcher/App/SketchObject.cpp | 22 +++++++++++++++++++ .../Sketcher/Gui/DrawSketchHandlerSplitting.h | 2 ++ 2 files changed, 24 insertions(+) diff --git a/src/Mod/Sketcher/App/SketchObject.cpp b/src/Mod/Sketcher/App/SketchObject.cpp index 3355edda18..9e4c7e161b 100644 --- a/src/Mod/Sketcher/App/SketchObject.cpp +++ b/src/Mod/Sketcher/App/SketchObject.cpp @@ -3053,6 +3053,28 @@ int SketchObject::split(int GeoId, const Base::Vector3d &point) ok = true; } } + else if (geo->getTypeId() == Part::GeomEllipse::getClassTypeId()) { + const Part::GeomEllipse *curve = static_cast(geo); + + // find split point + curve->closestParameter(point, splitParam); + double period = curve->getLastParameter() - curve->getFirstParameter(); + startParam = splitParam; + endParam = splitParam + period; + + // create new arc + auto newArc = new Part::GeomArcOfEllipse(Handle(Geom_Ellipse)::DownCast(curve->handle()->Copy())); + newArc->setRange(startParam, endParam, false); + int newId = addGeometry(newArc); + if (newId >= 0) { + newIds.push_back(newId); + setConstruction(newId, GeometryFacade::getConstruction(geo)); + exposeInternalGeometry(newId); + + transferConstraints(GeoId, PointPos::mid, newId, PointPos::mid); + ok = true; + } + } else if (geo->getTypeId() == Part::GeomArcOfCircle::getClassTypeId()) { const Part::GeomArcOfCircle *arc = static_cast(geo); diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandlerSplitting.h b/src/Mod/Sketcher/Gui/DrawSketchHandlerSplitting.h index e4d1066ba8..15a4b2f87d 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandlerSplitting.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandlerSplitting.h @@ -52,6 +52,7 @@ public: const Part::Geometry *geom = Sketch->getGeometry(GeoId); if (geom->getTypeId() == Part::GeomLineSegment::getClassTypeId() || geom->getTypeId() == Part::GeomCircle::getClassTypeId() + || geom->getTypeId() == Part::GeomEllipse::getClassTypeId() || geom->isDerivedFrom(Part::GeomArcOfConic::getClassTypeId()) || geom->getTypeId() == Part::GeomBSplineCurve::getClassTypeId()) { return true; @@ -89,6 +90,7 @@ public: const Part::Geometry *geom = sketchgui->getSketchObject()->getGeometry(GeoId); if (geom->getTypeId() == Part::GeomLineSegment::getClassTypeId() || geom->getTypeId() == Part::GeomCircle::getClassTypeId() + || geom->getTypeId() == Part::GeomEllipse::getClassTypeId() || geom->isDerivedFrom(Part::GeomArcOfConic::getClassTypeId()) || geom->getTypeId() == Part::GeomBSplineCurve::getClassTypeId()) { try {