Py::Object ArcOfCirclePy::getCircle(void) const { Handle_Geom_TrimmedCurve trim = Handle_Geom_TrimmedCurve::DownCast (getGeomArcOfCirclePtr()->handle()); Handle_Geom_Circle circle = Handle_Geom_Circle::DownCast(trim->BasisCurve()); return Py::Object(new CirclePy(new GeomCircle(circle)), true); }
// returns a string which represents the object e.g. when printed in python std::string ArcOfCirclePy::representation(void) const { Handle_Geom_TrimmedCurve trim = Handle_Geom_TrimmedCurve::DownCast (getGeomArcOfCirclePtr()->handle()); Handle_Geom_Circle circle = Handle_Geom_Circle::DownCast(trim->BasisCurve()); gp_Ax1 axis = circle->Axis(); gp_Dir dir = axis.Direction(); gp_Pnt loc = axis.Location(); Standard_Real fRad = circle->Radius(); Standard_Real u1 = trim->FirstParameter(); Standard_Real u2 = trim->LastParameter(); std::stringstream str; str << "ArcOfCircle ("; str << "Radius : " << fRad << ", "; str << "Position : (" << loc.X() << ", "<< loc.Y() << ", "<< loc.Z() << "), "; str << "Direction : (" << dir.X() << ", "<< dir.Y() << ", "<< dir.Z() << "), "; str << "Parameter : (" << u1 << ", " << u2 << ")"; str << ")"; return str.str(); }
PyObject* SketchObjectPy::addGeometry(PyObject *args) { PyObject *pcObj; PyObject* construction; // this is an optional argument default false bool isConstruction; if (!PyArg_ParseTuple(args, "OO!", &pcObj, &PyBool_Type, &construction)) { PyErr_Clear(); if (!PyArg_ParseTuple(args, "O", &pcObj)) return 0; else isConstruction=false; } else { isConstruction = PyObject_IsTrue(construction) ? true : false; } if (PyObject_TypeCheck(pcObj, &(Part::GeometryPy::Type))) { Part::Geometry *geo = static_cast<Part::GeometryPy*>(pcObj)->getGeometryPtr(); 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()); 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,isConstruction); } else if (!ellipse.IsNull()) { // create the definition struct for that geom Part::GeomArcOfEllipse aoe; aoe.setHandle(trim); ret = this->getSketchObjectPtr()->addGeometry(&aoe,isConstruction); } 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::GeomEllipse::getClassTypeId() || geo->getTypeId() == Part::GeomArcOfCircle::getClassTypeId() || geo->getTypeId() == Part::GeomArcOfEllipse::getClassTypeId() || geo->getTypeId() == Part::GeomLineSegment::getClassTypeId()) { ret = this->getSketchObjectPtr()->addGeometry(geo,isConstruction); } 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<Part::Geometry *> geoList; std::vector<boost::shared_ptr <Part::Geometry> > 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<Part::GeometryPy*>((*it).ptr())->getGeometryPtr(); // 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()); Handle_Geom_Ellipse ellipse = Handle_Geom_Ellipse::DownCast(trim->BasisCurve()); if (!circle.IsNull()) { // create the definition struct for that geom boost::shared_ptr<Part::GeomArcOfCircle> aoc(new Part::GeomArcOfCircle()); aoc->setHandle(trim); geoList.push_back(aoc.get()); tmpList.push_back(aoc); } else if (!ellipse.IsNull()) { // create the definition struct for that geom boost::shared_ptr<Part::GeomArcOfEllipse> 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(); 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::GeomEllipse::getClassTypeId() || geo->getTypeId() == Part::GeomArcOfCircle::getClassTypeId() || geo->getTypeId() == Part::GeomArcOfEllipse::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; } } } int ret = this->getSketchObjectPtr()->addGeometry(geoList,isConstruction) + 1; std::size_t numGeo = geoList.size(); Py::Tuple tuple(numGeo); for (std::size_t i=0; i<numGeo; ++i) { int geoId = ret - int(numGeo - i); tuple.setItem(i, Py::Int(geoId)); } return Py::new_reference_to(tuple); } std::string error = std::string("type must be 'Geometry' or list of 'Geometry', not "); error += pcObj->ob_type->tp_name; throw Py::TypeError(error); }