void CirclePy::setYAxis(Py::Object arg) { PyObject* p = arg.ptr(); Base::Vector3d val; if (PyObject_TypeCheck(p, &(Base::VectorPy::Type))) { val = static_cast<Base::VectorPy*>(p)->value(); } else if (PyTuple_Check(p)) { val = Base::getVectorFromTuple<double>(p); } else { std::string error = std::string("type must be 'Vector', not "); error += p->ob_type->tp_name; throw Py::TypeError(error); } Handle_Geom_Circle circle = Handle_Geom_Circle::DownCast(getGeomCirclePtr()->handle()); try { gp_Ax2 pos; pos = circle->Position(); pos.SetYDirection(gp_Dir(val.x, val.y, val.z)); circle->SetPosition(pos); } catch (Standard_Failure) { throw Py::Exception("cannot set Y axis"); } }
Py::Object CirclePy::getYAxis(void) const { Handle_Geom_Circle circle = Handle_Geom_Circle::DownCast(getGeomCirclePtr()->handle()); gp_Ax1 axis = circle->YAxis(); gp_Dir dir = axis.Direction(); return Py::Vector(Base::Vector3d(dir.X(), dir.Y(), dir.Z())); }
// constructor method int ArcOfCirclePy::PyInit(PyObject* args, PyObject* /*kwds*/) { PyObject* o; double u1, u2; PyObject *sense=Py_True; if (PyArg_ParseTuple(args, "O!dd|O!", &(Part::CirclePy::Type), &o, &u1, &u2, &PyBool_Type, &sense)) { try { Handle_Geom_Circle circle = Handle_Geom_Circle::DownCast (static_cast<CirclePy*>(o)->getGeomCirclePtr()->handle()); GC_MakeArcOfCircle arc(circle->Circ(), u1, u2, PyObject_IsTrue(sense) ? Standard_True : Standard_False); if (!arc.IsDone()) { PyErr_SetString(PartExceptionOCCError, gce_ErrorStatusText(arc.Status())); return -1; } getGeomArcOfCirclePtr()->setHandle(arc.Value()); return 0; } catch (Standard_Failure) { Handle_Standard_Failure e = Standard_Failure::Caught(); PyErr_SetString(PartExceptionOCCError, e->GetMessageString()); return -1; } catch (...) { PyErr_SetString(PartExceptionOCCError, "creation of arc failed"); return -1; } } PyErr_Clear(); PyObject *pV1, *pV2, *pV3; if (PyArg_ParseTuple(args, "O!O!O!", &(Base::VectorPy::Type), &pV1, &(Base::VectorPy::Type), &pV2, &(Base::VectorPy::Type), &pV3)) { Base::Vector3d v1 = static_cast<Base::VectorPy*>(pV1)->value(); Base::Vector3d v2 = static_cast<Base::VectorPy*>(pV2)->value(); Base::Vector3d v3 = static_cast<Base::VectorPy*>(pV3)->value(); GC_MakeArcOfCircle arc(gp_Pnt(v1.x,v1.y,v1.z), gp_Pnt(v2.x,v2.y,v2.z), gp_Pnt(v3.x,v3.y,v3.z)); if (!arc.IsDone()) { PyErr_SetString(PartExceptionOCCError, gce_ErrorStatusText(arc.Status())); return -1; } getGeomArcOfCirclePtr()->setHandle(arc.Value()); return 0; } // All checks failed PyErr_SetString(PyExc_TypeError, "ArcOfCircle constructor expects a circle curve and a parameter range or three points"); return -1; }
// returns a string which represents the object e.g. when printed in python std::string CirclePy::representation(void) const { Handle_Geom_Circle circle = Handle_Geom_Circle::DownCast(getGeomCirclePtr()->handle()); gp_Ax1 axis = circle->Axis(); gp_Dir dir = axis.Direction(); gp_Pnt loc = axis.Location(); Standard_Real fRad = circle->Radius(); std::stringstream str; str << "Circle ("; str << "Radius : " << fRad << ", "; str << "Position : (" << loc.X() << ", "<< loc.Y() << ", "<< loc.Z() << "), "; str << "Direction : (" << dir.X() << ", "<< dir.Y() << ", "<< dir.Z() << ")"; str << ")"; return str.str(); }
// 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); }
// constructor method int CylinderPy::PyInit(PyObject* args, PyObject* kwds) { // cylinder and distance for offset PyObject *pCyl; double dist; static char* keywords_cd[] = {"Cylinder","Distance",NULL}; if (PyArg_ParseTupleAndKeywords(args, kwds, "O!d", keywords_cd, &(CylinderPy::Type), &pCyl, &dist)) { CylinderPy* pcCylinder = static_cast<CylinderPy*>(pCyl); Handle_Geom_CylindricalSurface cylinder = Handle_Geom_CylindricalSurface::DownCast (pcCylinder->getGeomCylinderPtr()->handle()); GC_MakeCylindricalSurface mc(cylinder->Cylinder(), dist); if (!mc.IsDone()) { PyErr_SetString(PartExceptionOCCError, gce_ErrorStatusText(mc.Status())); return -1; } Handle_Geom_CylindricalSurface cyl = Handle_Geom_CylindricalSurface::DownCast (getGeomCylinderPtr()->handle()); cyl->SetCylinder(mc.Value()->Cylinder()); return 0; } static char* keywords_c[] = {"Cylinder",NULL}; PyErr_Clear(); if (PyArg_ParseTupleAndKeywords(args, kwds, "O!", keywords_c, &(CylinderPy::Type), &pCyl)) { CylinderPy* pcCylinder = static_cast<CylinderPy*>(pCyl); Handle_Geom_CylindricalSurface cyl1 = Handle_Geom_CylindricalSurface::DownCast (pcCylinder->getGeomCylinderPtr()->handle()); Handle_Geom_CylindricalSurface cyl2 = Handle_Geom_CylindricalSurface::DownCast (this->getGeomCylinderPtr()->handle()); cyl2->SetCylinder(cyl1->Cylinder()); return 0; } PyObject *pV1, *pV2, *pV3; static char* keywords_ppp[] = {"Point1","Point2","Point3",NULL}; PyErr_Clear(); if (PyArg_ParseTupleAndKeywords(args, kwds, "O!O!O!", keywords_ppp, &(Base::VectorPy::Type), &pV1, &(Base::VectorPy::Type), &pV2, &(Base::VectorPy::Type), &pV3)) { Base::Vector3d v1 = static_cast<Base::VectorPy*>(pV1)->value(); Base::Vector3d v2 = static_cast<Base::VectorPy*>(pV2)->value(); Base::Vector3d v3 = static_cast<Base::VectorPy*>(pV3)->value(); GC_MakeCylindricalSurface mc(gp_Pnt(v1.x,v1.y,v1.z), gp_Pnt(v2.x,v2.y,v2.z), gp_Pnt(v3.x,v3.y,v3.z)); if (!mc.IsDone()) { PyErr_SetString(PartExceptionOCCError, gce_ErrorStatusText(mc.Status())); return -1; } Handle_Geom_CylindricalSurface cyl = Handle_Geom_CylindricalSurface::DownCast (getGeomCylinderPtr()->handle()); cyl->SetCylinder(mc.Value()->Cylinder()); return 0; } static char* keywords_cc[] = {"Circle",NULL}; PyErr_Clear(); PyObject *pCirc; if (PyArg_ParseTupleAndKeywords(args, kwds, "O!", keywords_cc, &(CirclePy::Type), &pCirc)) { CirclePy* pcCircle = static_cast<CirclePy*>(pCirc); Handle_Geom_Circle circ = Handle_Geom_Circle::DownCast (pcCircle->getGeomCirclePtr()->handle()); GC_MakeCylindricalSurface mc(circ->Circ()); if (!mc.IsDone()) { PyErr_SetString(PartExceptionOCCError, gce_ErrorStatusText(mc.Status())); return -1; } Handle_Geom_CylindricalSurface cyl = Handle_Geom_CylindricalSurface::DownCast (getGeomCylinderPtr()->handle()); cyl->SetCylinder(mc.Value()->Cylinder()); return 0; } static char* keywords_n[] = {NULL}; PyErr_Clear(); if (PyArg_ParseTupleAndKeywords(args, kwds, "", keywords_n)) { Handle_Geom_CylindricalSurface cyl = Handle_Geom_CylindricalSurface::DownCast (getGeomCylinderPtr()->handle()); cyl->SetRadius(1.0); return 0; } // All checks failed PyErr_SetString(PyExc_TypeError, "Cylinder constructor accepts:\n" "-- empty parameter list\n" "-- Cylinder\n" "-- Cylinder, Distance\n" "-- Point1, Point2, Point3\n" "-- Circle"); return -1; }
// constructor method int CirclePy::PyInit(PyObject* args, PyObject* kwds) { // circle and distance for offset PyObject *pCirc; double dist; static char* keywords_cd[] = {"Circle","Distance",NULL}; if (PyArg_ParseTupleAndKeywords(args, kwds, "O!d", keywords_cd, &(CirclePy::Type), &pCirc, &dist)) { CirclePy* pcCircle = static_cast<CirclePy*>(pCirc); Handle_Geom_Circle circle = Handle_Geom_Circle::DownCast (pcCircle->getGeomCirclePtr()->handle()); GC_MakeCircle mc(circle->Circ(), dist); if (!mc.IsDone()) { PyErr_SetString(PartExceptionOCCError, gce_ErrorStatusText(mc.Status())); return -1; } Handle_Geom_Circle circ = Handle_Geom_Circle::DownCast(getGeomCirclePtr()->handle()); circ->SetCirc(mc.Value()->Circ()); return 0; } // center, normal and radius PyObject *pV1, *pV2, *pV3; static char* keywords_cnr[] = {"Center","Normal","Radius",NULL}; PyErr_Clear(); if (PyArg_ParseTupleAndKeywords(args, kwds, "O!O!d", keywords_cnr, &(Base::VectorPy::Type), &pV1, &(Base::VectorPy::Type), &pV2, &dist)) { Base::Vector3d v1 = static_cast<Base::VectorPy*>(pV1)->value(); Base::Vector3d v2 = static_cast<Base::VectorPy*>(pV2)->value(); GC_MakeCircle mc(gp_Pnt(v1.x,v1.y,v1.z), gp_Dir(v2.x,v2.y,v2.z), dist); if (!mc.IsDone()) { PyErr_SetString(PartExceptionOCCError, gce_ErrorStatusText(mc.Status())); return -1; } Handle_Geom_Circle circle = Handle_Geom_Circle::DownCast(getGeomCirclePtr()->handle()); circle->SetCirc(mc.Value()->Circ()); return 0; } static char* keywords_c[] = {"Circle",NULL}; PyErr_Clear(); if (PyArg_ParseTupleAndKeywords(args, kwds, "O!", keywords_c, &(CirclePy::Type), &pCirc)) { CirclePy* pcCircle = static_cast<CirclePy*>(pCirc); Handle_Geom_Circle circ1 = Handle_Geom_Circle::DownCast (pcCircle->getGeomCirclePtr()->handle()); Handle_Geom_Circle circ2 = Handle_Geom_Circle::DownCast (this->getGeomCirclePtr()->handle()); circ2->SetCirc(circ1->Circ()); return 0; } static char* keywords_ppp[] = {"Point1","Point2","Point3",NULL}; PyErr_Clear(); if (PyArg_ParseTupleAndKeywords(args, kwds, "O!O!O!", keywords_ppp, &(Base::VectorPy::Type), &pV1, &(Base::VectorPy::Type), &pV2, &(Base::VectorPy::Type), &pV3)) { Base::Vector3d v1 = static_cast<Base::VectorPy*>(pV1)->value(); Base::Vector3d v2 = static_cast<Base::VectorPy*>(pV2)->value(); Base::Vector3d v3 = static_cast<Base::VectorPy*>(pV3)->value(); GC_MakeCircle mc(gp_Pnt(v1.x,v1.y,v1.z), gp_Pnt(v2.x,v2.y,v2.z), gp_Pnt(v3.x,v3.y,v3.z)); if (!mc.IsDone()) { PyErr_SetString(PartExceptionOCCError, gce_ErrorStatusText(mc.Status())); return -1; } Handle_Geom_Circle circle = Handle_Geom_Circle::DownCast(getGeomCirclePtr()->handle()); circle->SetCirc(mc.Value()->Circ()); return 0; } // default circle static char* keywords_n[] = {NULL}; PyErr_Clear(); if (PyArg_ParseTupleAndKeywords(args, kwds, "", keywords_n)) { Handle_Geom_Circle circle = Handle_Geom_Circle::DownCast(getGeomCirclePtr()->handle()); circle->SetRadius(1.0); return 0; } PyErr_SetString(PyExc_TypeError, "Circle constructor accepts:\n" "-- empty parameter list\n" "-- Circle\n" "-- Circle, Distance\n" "-- Center, Normal, Radius\n" "-- Point1, Point2, Point3"); return -1; }
Py::Object CirclePy::getCenter(void) const { Handle_Geom_Circle circle = Handle_Geom_Circle::DownCast(getGeomCirclePtr()->handle()); gp_Pnt loc = circle->Location(); return Py::Vector(Base::Vector3d(loc.X(), loc.Y(), loc.Z())); }
void CirclePy::setRadius(Py::Float arg) { Handle_Geom_Circle circle = Handle_Geom_Circle::DownCast(getGeomCirclePtr()->handle()); circle->SetRadius((double)arg); }
Py::Float CirclePy::getRadius(void) const { Handle_Geom_Circle circle = Handle_Geom_Circle::DownCast(getGeomCirclePtr()->handle()); return Py::Float(circle->Radius()); }
int convert_to_ifc(const Handle_Geom_Curve& c, IfcSchema::IfcCurve*& curve, bool advanced) { if (c->DynamicType() == STANDARD_TYPE(Geom_Line)) { IfcSchema::IfcDirection* d; IfcSchema::IfcCartesianPoint* p; Handle_Geom_Line line = Handle_Geom_Line::DownCast(c); if (!convert_to_ifc(line->Position().Location(), p, advanced)) { return 0; } if (!convert_to_ifc(line->Position().Direction(), d, advanced)) { return 0; } IfcSchema::IfcVector* v = new IfcSchema::IfcVector(d, 1.); curve = new IfcSchema::IfcLine(p, v); return 1; } else if (c->DynamicType() == STANDARD_TYPE(Geom_Circle)) { IfcSchema::IfcAxis2Placement3D* ax; Handle_Geom_Circle circle = Handle_Geom_Circle::DownCast(c); convert_to_ifc(circle->Position(), ax, advanced); curve = new IfcSchema::IfcCircle(ax, circle->Radius()); return 1; } else if (c->DynamicType() == STANDARD_TYPE(Geom_Ellipse)) { IfcSchema::IfcAxis2Placement3D* ax; Handle_Geom_Ellipse ellipse = Handle_Geom_Ellipse::DownCast(c); convert_to_ifc(ellipse->Position(), ax, advanced); curve = new IfcSchema::IfcEllipse(ax, ellipse->MajorRadius(), ellipse->MinorRadius()); return 1; } #ifdef USE_IFC4 else if (c->DynamicType() == STANDARD_TYPE(Geom_BSplineCurve)) { Handle_Geom_BSplineCurve bspline = Handle_Geom_BSplineCurve::DownCast(c); IfcSchema::IfcCartesianPoint::list::ptr points(new IfcSchema::IfcCartesianPoint::list); TColgp_Array1OfPnt poles(1, bspline->NbPoles()); bspline->Poles(poles); for (int i = 1; i <= bspline->NbPoles(); ++i) { IfcSchema::IfcCartesianPoint* p; if (!convert_to_ifc(poles.Value(i), p, advanced)) { return 0; } points->push(p); } IfcSchema::IfcKnotType::IfcKnotType knot_spec = opencascade_knotspec_to_ifc(bspline->KnotDistribution()); std::vector<int> mults; std::vector<double> knots; std::vector<double> weights; TColStd_Array1OfInteger bspline_mults(1, bspline->NbKnots()); TColStd_Array1OfReal bspline_knots(1, bspline->NbKnots()); TColStd_Array1OfReal bspline_weights(1, bspline->NbPoles()); bspline->Multiplicities(bspline_mults); bspline->Knots(bspline_knots); bspline->Weights(bspline_weights); opencascade_array_to_vector(bspline_mults, mults); opencascade_array_to_vector(bspline_knots, knots); opencascade_array_to_vector(bspline_weights, weights); bool rational = false; for (std::vector<double>::const_iterator it = weights.begin(); it != weights.end(); ++it) { if ((*it) != 1.) { rational = true; break; } } if (rational) { curve = new IfcSchema::IfcRationalBSplineCurveWithKnots( bspline->Degree(), points, IfcSchema::IfcBSplineCurveForm::IfcBSplineCurveForm_UNSPECIFIED, bspline->IsClosed(), false, mults, knots, knot_spec, weights ); } else { curve = new IfcSchema::IfcBSplineCurveWithKnots( bspline->Degree(), points, IfcSchema::IfcBSplineCurveForm::IfcBSplineCurveForm_UNSPECIFIED, bspline->IsClosed(), false, mults, knots, knot_spec ); } return 1; } #endif return 0; }