2013-10-14 18 views
18

我有一個關於如何在pythonOCC中使用樣條的兩部分問題。如何在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) 

,我想到的是,B樣條可以通過

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) 

我如何獲取數據出像結,B樣條,和係數的形狀。

+0

您是否在其他地方找到答案?你可以請與我們分享:D? – Jiloc

+0

絕望老................. –

回答

0

我用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;