我有一个两部分的问题,关于如何在pythonOCC中使用样条线。

首先,我知道我可以用

array = []
array.append(gp_Pnt2d (0,0))
array.append(gp_Pnt2d (1,2))
array.append(gp_Pnt2d (2,3))
array.append(gp_Pnt2d (4,3))
array.append(gp_Pnt2d (5,5))

pt2d_list = point2d_list_to_TColgp_Array1OfPnt2d(array)
SPL1      = Geom2dAPI_PointsToBSpline(pt2d_list).Curve()
display.DisplayShape(make_edge2d(SPL1) , update=True)

我希望bspline可以通过
BSPL1      = Geom2dAPI_PointsToBSpline(pt2d_list)

但是我如何获得:
  • bspline的导数?
  • bspline的结?
  • 结点是pt2d_list吗?
  • bspline的控制点?
  • 样条系数?

  • 以及如何删除或增加bspline的结?

    其次,在pythonOCC中加载CAD图.stp文件时,如下所示:
    from OCC import TopoDS, StlAPI
    shape = TopoDS.TopoDS_Shape()
    stl_reader = StlAPI.StlAPI_Reader()
    stl_reader.Read(shape,str(filename))
    display.DisplayShape(shape)
    

    如何使数据结,bspline和系数之类的形状变形。

    最佳答案

    我已经使用python-boost做到了这一点。
    checkout 此功能:http://letslearncomputing.blogspot.com/2013/04/c-program-for-cubic-spline-interpolation.html
    您可以在此处获得所需的5个值。

    您只需要将代码修改为C++(而不是C)

    BOOST_PYTHON_MODULE(Spline)
    {
        import_array();
        boost::python::numeric::array::set_module_and_type("numpy", "ndarray");
        class_<Spline, Spline*>("Spline", init<>())
            .def("spline", &Spline::spline)
            ;
    }
    

    因此,在Python中,您可以使用:
    from Spline.Spline import *
    operation = Spline()
    value, error_ = operation.spline(np.array(your_x_array), np.array(your_y_array), 0.01)
    

    Cpp类别:
    #define NUMBER_OF_SAMPLES 14
    class Spline
    {
    public:
        boost::python::list spline(numeric::array& x_val, numeric::array& y_val, double look_up_val);
    };
    

    然后在boost::python::list Spline::spline(numeric::array& x_val, numeric::array& y_val, double p)函数中,您将获得:
    PyArrayObject* x_pyArr = (PyArrayObject*)PyArray_FROM_O(x_val.ptr());
    
    PyArrayObject* y_pyArr = (PyArrayObject*)PyArray_FROM_O(y_val.ptr());
    int size = *(x_pyArr->dimensions), i , j;
    double* data_x = (double*)x_pyArr->data;
    double* data_y = (double*)y_pyArr->data;
    double h[NUMBER_OF_SAMPLES], a, b, c, d, s[NUMBER_OF_SAMPLES] = { 0 }, F[NUMBER_OF_SAMPLES], f[NUMBER_OF_SAMPLES], x[NUMBER_OF_SAMPLES], m[NUMBER_OF_SAMPLES][NUMBER_OF_SAMPLES] = { 0 }, temp;
    
    for (int i = 0; i < size; i++)
    {
        x[i] = *(data_x + i);
        f[i] = *(data_y + i);
    }
    

    以此类推,根据链接中的代码。我在Spline::spline函数中返回一个python列表:
    boost::python::list return_val;
    // ....
    return_val.append(sum);
    return_val.append(result);
    return return_val;
    

    10-04 12:45