From d974d6897bb37594ee1c66afc24355d269e9d3bd Mon Sep 17 00:00:00 2001 From: wmayer Date: Tue, 26 Aug 2014 13:09:37 +0200 Subject: [PATCH] + fixes #0001713: Allow Part.Arc to be used as Sketcher geometry --- src/Mod/Sketcher/App/SketchObjectPyImp.cpp | 69 +++++++++++++++++++++- 1 file changed, 67 insertions(+), 2 deletions(-) diff --git a/src/Mod/Sketcher/App/SketchObjectPyImp.cpp b/src/Mod/Sketcher/App/SketchObjectPyImp.cpp index ecf5969b7..c4029076c 100644 --- a/src/Mod/Sketcher/App/SketchObjectPyImp.cpp +++ b/src/Mod/Sketcher/App/SketchObjectPyImp.cpp @@ -23,8 +23,11 @@ #include "PreCompiled.h" #ifndef _PreComp_ # include +# include #endif +#include + #include #include #include @@ -67,16 +70,77 @@ PyObject* SketchObjectPy::addGeometry(PyObject *args) if (PyObject_TypeCheck(pcObj, &(Part::GeometryPy::Type))) { Part::Geometry *geo = static_cast(pcObj)->getGeometryPtr(); - return Py::new_reference_to(Py::Int(this->getSketchObjectPtr()->addGeometry(geo))); + int ret; + // An arc created with Part.Arc will be converted into a Part.ArcOfCircle + 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()); + if (!circle.IsNull()) { + // create the definition struct for that geom + Part::GeomArcOfCircle aoc; + aoc.setHandle(trim); + ret = this->getSketchObjectPtr()->addGeometry(&aoc); + } + else { + std::stringstream str; + str << "Unsupported geometry type: " << geo->getTypeId().getName(); + PyErr_SetString(PyExc_TypeError, str.str().c_str()); + return 0; + } + } + else if (geo->getTypeId() == Part::GeomPoint::getClassTypeId() || + geo->getTypeId() == Part::GeomCircle::getClassTypeId() || + geo->getTypeId() == Part::GeomArcOfCircle::getClassTypeId() || + geo->getTypeId() == Part::GeomLineSegment::getClassTypeId()) { + ret = this->getSketchObjectPtr()->addGeometry(geo); + } + else { + std::stringstream str; + str << "Unsupported geometry type: " << geo->getTypeId().getName(); + PyErr_SetString(PyExc_TypeError, str.str().c_str()); + return 0; + } + return Py::new_reference_to(Py::Int(ret)); } else if (PyObject_TypeCheck(pcObj, &(PyList_Type)) || PyObject_TypeCheck(pcObj, &(PyTuple_Type))) { std::vector geoList; + std::vector > tmpList; Py::Sequence list(pcObj); for (Py::Sequence::iterator it = list.begin(); it != list.end(); ++it) { if (PyObject_TypeCheck((*it).ptr(), &(Part::GeometryPy::Type))) { Part::Geometry *geo = static_cast((*it).ptr())->getGeometryPtr(); - geoList.push_back(geo); + + // An arc created with Part.Arc will be converted into a Part.ArcOfCircle + 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()); + if (!circle.IsNull()) { + // create the definition struct for that geom + boost::shared_ptr aoc(new Part::GeomArcOfCircle()); + aoc->setHandle(trim); + geoList.push_back(aoc.get()); + tmpList.push_back(aoc); + } + else { + std::stringstream str; + str << "Unsupported geometry type: " << geo->getTypeId().getName(); + PyErr_SetString(PyExc_TypeError, str.str().c_str()); + return 0; + } + } + else if (geo->getTypeId() == Part::GeomPoint::getClassTypeId() || + geo->getTypeId() == Part::GeomCircle::getClassTypeId() || + geo->getTypeId() == Part::GeomArcOfCircle::getClassTypeId() || + geo->getTypeId() == Part::GeomLineSegment::getClassTypeId()) { + geoList.push_back(geo); + } + else { + std::stringstream str; + str << "Unsupported geometry type: " << geo->getTypeId().getName(); + PyErr_SetString(PyExc_TypeError, str.str().c_str()); + return 0; + } } } @@ -87,6 +151,7 @@ PyObject* SketchObjectPy::addGeometry(PyObject *args) int geoId = ret - int(numGeo - i); tuple.setItem(i, Py::Int(geoId)); } + return Py::new_reference_to(tuple); }