Ejemplo n.º 1
0
PyObject* GeometryCurvePy::intersect2d(PyObject *args)
{
    PyObject *c,*p;
    if (!PyArg_ParseTuple(args, "O!O!", &(Part::GeometryCurvePy::Type), &c,
                                        &(Part::PlanePy::Type), &p))
        return 0;

    try {
        Handle_Geom_Curve self = Handle_Geom_Curve::DownCast(getGeometryPtr()->handle());
        Handle_Geom_Curve curv = Handle_Geom_Curve::DownCast(static_cast<GeometryPy*>(c)->
            getGeometryPtr()->handle());
        Handle_Geom_Plane plane = Handle_Geom_Plane::DownCast(static_cast<GeometryPy*>(p)->
            getGeometryPtr()->handle());

        Handle_Geom2d_Curve curv1 = GeomAPI::To2d(self, plane->Pln());
        Handle_Geom2d_Curve curv2 = GeomAPI::To2d(curv, plane->Pln());
        Geom2dAPI_InterCurveCurve intCC(curv1, curv2);
        int nbPoints = intCC.NbPoints();
        Py::List list;
        for (int i=1; i<= nbPoints; i++) {
            gp_Pnt2d pt = intCC.Point(i);
            Py::Tuple tuple(2);
            tuple.setItem(0, Py::Float(pt.X()));
            tuple.setItem(1, Py::Float(pt.Y()));
            list.append(tuple);
        }
        return Py::new_reference_to(list);
    }
    catch (Standard_Failure) {
        Handle_Standard_Failure e = Standard_Failure::Caught();
        PyErr_SetString(PartExceptionOCCError, e->GetMessageString());
        return 0;
    }
}
// constructor method
int PlanePy::PyInit(PyObject* args, PyObject* kwds)
{
    // plane and distance for offset
    PyObject *pPlane;
    double dist;
    static char* keywords_pd[] = {"Plane","Distance",NULL};
    if (PyArg_ParseTupleAndKeywords(args, kwds, "O!d", keywords_pd, &(PlanePy::Type), &pPlane, &dist)) {
        PlanePy* pcPlane = static_cast<PlanePy*>(pPlane);
        Handle_Geom_Plane plane = Handle_Geom_Plane::DownCast
            (pcPlane->getGeometryPtr()->handle());
        GC_MakePlane mc(plane->Pln(), dist);
        if (!mc.IsDone()) {
            PyErr_SetString(PartExceptionOCCError, gce_ErrorStatusText(mc.Status()));
            return -1;
        }

        Handle_Geom_Plane plan = Handle_Geom_Plane::DownCast(getGeometryPtr()->handle());
        plan->SetPln(mc.Value()->Pln());
        return 0;
    }

    // plane from equation
    double a,b,c,d;
    static char* keywords_abcd[] = {"A","B","C","D",NULL};
    PyErr_Clear();
    if (PyArg_ParseTupleAndKeywords(args, kwds, "dddd", keywords_abcd,
                                        &a,&b,&c,&d)) {
        GC_MakePlane mc(a,b,c,d);
        if (!mc.IsDone()) {
            PyErr_SetString(PartExceptionOCCError, gce_ErrorStatusText(mc.Status()));
            return -1;
        }

        Handle_Geom_Plane plane = Handle_Geom_Plane::DownCast(getGeometryPtr()->handle());
        plane->SetPln(mc.Value()->Pln());
        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_MakePlane 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_Plane plane = Handle_Geom_Plane::DownCast(getGeometryPtr()->handle());
        plane->SetPln(mc.Value()->Pln());
        return 0;
    }

    // location and normal
    static char* keywords_cnr[] = {"Location","Normal",NULL};
    PyErr_Clear();
    if (PyArg_ParseTupleAndKeywords(args, kwds, "O!O!", keywords_cnr,
                                        &(Base::VectorPy::Type), &pV1,
                                        &(Base::VectorPy::Type), &pV2)) {
        Base::Vector3d v1 = static_cast<Base::VectorPy*>(pV1)->value();
        Base::Vector3d v2 = static_cast<Base::VectorPy*>(pV2)->value();
        GC_MakePlane mc(gp_Pnt(v1.x,v1.y,v1.z),
                        gp_Dir(v2.x,v2.y,v2.z));
        if (!mc.IsDone()) {
            PyErr_SetString(PartExceptionOCCError, gce_ErrorStatusText(mc.Status()));
            return -1;
        }

        Handle_Geom_Plane plane = Handle_Geom_Plane::DownCast(getGeometryPtr()->handle());
        plane->SetPln(mc.Value()->Pln());
        return 0;
    }

    static char* keywords_p[] = {"Plane",NULL};
    PyErr_Clear();
    if (PyArg_ParseTupleAndKeywords(args, kwds, "O!", keywords_p, &(PlanePy::Type), &pPlane)) {
        PlanePy* pcPlane = static_cast<PlanePy*>(pPlane);
        Handle_Geom_Plane plane1 = Handle_Geom_Plane::DownCast
            (pcPlane->getGeometryPtr()->handle());
        Handle_Geom_Plane plane2 = Handle_Geom_Plane::DownCast
            (this->getGeometryPtr()->handle());
        plane2->SetPln(plane1->Pln());
        return 0;
    }

    static char* keywords_n[] = {NULL};
    PyErr_Clear();
    if (PyArg_ParseTupleAndKeywords(args, kwds, "", keywords_n)) {
        // do nothing
        return 0;
    }

    PyErr_SetString(PyExc_TypeError, "Plane constructor accepts:\n"
        "-- empty parameter list\n"
        "-- Plane\n"
        "-- Plane, Distance\n"
        "-- Location, Normal\n"
        "-- Point1, Point2, Point3\n"
        "-- A, B, C, D\n"
        "   (as equation: Ax + By + Cz + D = 0.0)");
    return -1;
}