python - 如何在 pythonOCC 中使用样条线?

标签 python spline cad opencascade

我有一个关于如何在 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)

但是我怎么得到:

  1. bspline 的导数?
  2. bspline 的结?
  3. 结是 pt2d_list 吗?
  4. bspline 的控制点?
  5. 样条的系数?

以及如何在 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 来实现这一点。 查看此功能: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;

关于python - 如何在 pythonOCC 中使用样条线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19356410/

相关文章:

git - 我可以将 git 与 .dwg (autocad) 一起使用吗?

python - 为什么这个记忆化的 Euler14 实现在 Raku 中比 Python 慢得多?

python - yfinance 打印最大行数 python

python - 类似于划船划水的代码

c++ - 了解曲线全局逼近算法

cad - KiCAD 使用 CvPcb 将组件与封装关联

c++ - 将工程应用程序从独立移动到内部 CAD

python - 如何从数据帧创建序列并将它们放入数组的数组或列表中?

python - Scrapy:进行表单登录,然后使用该 session

python - 给定三个维度的散乱数据,需要在特定点对数据进行插值和求函数