Python de 3DCAD ~ Spline Surface ~

pyhonocc-core(OPEN CASCADE)로 Spline Surface를 제작합니다.STEP으로 뱉는 김에

Surface 생성 코드


코드는 이것입니다.
빨간색 서피스와 파란색 서피스는 모양 자체가 같지만 gp에서는Ax3을 사용하여 변경합니다.

간이 된 부분만 발췌하다.
def spl_face(px, py, pz, axs=gp_Ax3()):
    nx, ny = px.shape
    pnt_2d = TColgp_Array2OfPnt(1, nx, 1, ny)
    for row in range(pnt_2d.LowerRow(), pnt_2d.UpperRow() + 1):
        for col in range(pnt_2d.LowerCol(), pnt_2d.UpperCol() + 1):
            i, j = row - 1, col - 1
            pnt = gp_Pnt(px[i, j], py[i, j], pz[i, j])
            pnt_2d.SetValue(row, col, pnt)
            #print (i, j, px[i, j], py[i, j], pz[i, j])

    api = GeomAPI_PointsToBSplineSurface(pnt_2d, 3, 8, GeomAbs_G2, 0.001)
    api.Interpolate(pnt_2d)
    face = BRepBuilderAPI_MakeFace(api.Surface(), 1e-6).Face()
    face.Location(set_loc(gp_Ax3(), axs))
    return face
px,py,pz는 (n×n)의np이다.아리를meshgrid로 생성되어 해당 서피스의 Grid 데이터를 pz로 가져옵니다.
그리고 Tcolgp.Array2 Offnt라는 Open CASCADE의 gpPnt 대신 2D 정렬(for loop 섹션), GeomapIPoints Tob Spline Surface를 먹입니다.
GeomAPI_PointsToBSplineSurface는 실질적인 SplineSurface를 생성하는 함수입니다. 자세한 내용은 여기. 참조.
TColgp_Arrray2Ofpnt 이후의 두 수치(3,8)는 Spline의 근사 다항식을 생성할 때 가장 작은 순서와 가장 큰 순서입니다.
GeomAbs_G2는 부드러움을 정의합니다.기타 GeomAbs도 있어요.C0, GeomAbs_C1, GeomAbs_C2, GeomAbs_G1 등이 있다.G2는 2단계 미분 가능성을 가리킨다.
마지막으로 0.001은 입력한 점 그룹과 서피스의 오차가 이 값보다 낮도록 서피스를 생성합니다.

예외 값만 입력


예쁜 그룹 데이터를 넣어도 재미없기 때문에 생성된 데이터에 이상값을 넣어 보세요.
코드는 여기.입니다.
데이터 생성 부분만 발췌하다.
px = np.linspace(-1, 1, 100) * 100 + 50
py = np.linspace(-1, 1, 200) * 100 - 50
mesh = np.meshgrid(px, py)
data = mesh[0]**2 / 1000 + mesh[1]**2 / 2000
data[100, 50] = 100.0
(200x100)의 2차원 아라리의 대체적인 중간부분(10050)은 100.0으로 튀어나온 형상이다.

중간 부분이 이상하게 도약하는 모양으로 변했다.돌출된 부분에 당기면서 주변 모양이 변형됐고, 스플라인을 사용한 이상 어떻게든 일어날 수 있었다.
이렇게 이상한 모양이라도 Open CASCADE의 강점은 생길 수 있다(정확 여부는 잠시 논하지 않는다).

좋은 웹페이지 즐겨찾기