当前位置:   article > 正文

python OCC两种常用的二维封闭线生成三维图形方法_brepbuilderapi_makeedge 二维

brepbuilderapi_makeedge 二维

有时候构建一个规则的三维形状却有部分带着复杂的曲线,通过直接生成三维图形再进行修改是件很难又很麻烦的事情,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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

下面调用这个函数生成一个正方型二维线

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()
  • 1
  • 2
  • 3
  • 4
  • 5

下面就是生成的结果了
在这里插入图片描述
但是拉伸之前还需要将二维线生成为一个平面才行,通过下面这个函数生成

#曲线生成面
def curve_to_face(wire):
    return BRepBuilderAPI_MakeFace(wire.Wire())
  • 1
  • 2
  • 3

生成后的面是这样的
在这里插入图片描述
然后就可以拉伸了,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"])
  • 1
  • 2
  • 3
  • 4

拉伸后的模型
在这里插入图片描述
完整的调用代码

	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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

中心旋转的流程其实也是差不多的,我们用刚才的正方体平面来进行旋转,区别就是参数是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"])
  • 1
  • 2
  • 3
  • 4

完整调用代码

	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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

下面是旋转后的模型
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/97156?site
推荐阅读
相关标签
  

闽ICP备14008679号