赞
踩
有时候构建一个规则的三维形状却有部分带着复杂的曲线,通过直接生成三维图形再进行修改是件很难又很麻烦的事情,OCC库中可以通过对一个平面进行不同操作来生成三维图形,常用的方法有下面两种
先来介绍平面向量拉伸,复杂的曲线可以自己去研究怎么生成,这里只演示一个正方行二维线段如何拉伸成长方体
首先需要四个点生成一个正方形封闭线段,这是生成函数
#二维直线生成 def create_segment(pnt_list,close=True): if len(pnt_list)==1: return None #下面基本就是如果close为True,那么图形就会封闭 #通过点集生成Edge,再将Edge添加到wire中 wire = BRepBuilderAPI_MakeWire() for i in range(0,len(pnt_list)): if i==len(pnt_list)-1 and close: segment=BRepBuilderAPI_MakeEdge(pnt_list[0], pnt_list[len(pnt_list)-1]) elif i!=len(pnt_list)-1: segment=BRepBuilderAPI_MakeEdge(pnt_list[i],pnt_list[i+1]) else: continue wire.Add(segment.Edge()) return wire
下面调用这个函数生成一个正方型二维线
my_shape = create_segment([gp_Pnt(0,0,0),gp_Pnt(0,1,0),gp_Pnt(1,1,0),gp_Pnt(1,0,0)])
#显示
display,start_display,add_menu,add_function_to_menu = init_display()
display.DisplayShape(my_shape.Wire(), update=True)
start_display()
下面就是生成的结果了
但是拉伸之前还需要将二维线生成为一个平面才行,通过下面这个函数生成
#曲线生成面
def curve_to_face(wire):
return BRepBuilderAPI_MakeFace(wire.Wire())
生成后的面是这样的
然后就可以拉伸了,Vec的参数就是决定拉伸的方向和距离,也就是这里向z轴拉伸了2个单位的距离
def stretch_plane(shape,**kwargs):
if len(kwargs)==0:
return BRepPrimAPI_MakePrism(shape.Shape(),gp_Vec(0,0,2))
return BRepPrimAPI_MakeRevol(shape.Shape(), kwargs["vec"])
拉伸后的模型
完整的调用代码
my_shape = create_segment([gp_Pnt(0,0,0),gp_Pnt(0,1,0),gp_Pnt(1,1,0),gp_Pnt(1,0,0)])
my_shape = curve_to_face(my_shape)
my_shape = stretch_plane(my_shape)
display,start_display,add_menu,add_function_to_menu = init_display()
display.DisplayShape(my_shape.Shape(), update=True)
start_display()
中心旋转的流程其实也是差不多的,我们用刚才的正方体平面来进行旋转,区别就是参数是Ax1,他不决定距离,只决定方向,这里我是传了ax1参数,使平面绕X轴进行旋转
def revol_shape(shape,**kwargs):
if len(kwargs)==0:
return BRepPrimAPI_MakeRevol(shape.Shape(),gp_Ax1(gp_Pnt(0,0,0),gp_Dir(0,0,1)))
return BRepPrimAPI_MakeRevol(shape.Shape(), kwargs["ax1"])
完整调用代码
my_shape = create_segment([gp_Pnt(0,0,0),gp_Pnt(0,1,0),gp_Pnt(1,1,0),gp_Pnt(1,0,0)])
my_shape = curve_to_face(my_shape)
my_shape = revol_shape(my_shape,ax1=gp_Ax1(gp_Pnt(0,0,0),gp_Dir(1,0,0)))
display,start_display,add_menu,add_function_to_menu = init_display()
display.DisplayShape(my_shape.Shape(), update=True)
start_display()
下面是旋转后的模型
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。