• <div id="ogoia"><li id="ogoia"></li></div>
  • <div id="ogoia"><div id="ogoia"></div></div>
    <xmp id="ogoia"><li id="ogoia"></li>
    <small id="ogoia"><li id="ogoia"></li></small>
  • <div id="ogoia"><li id="ogoia"></li></div>
  • <menu id="ogoia"></menu>
  • <s id="ogoia"><menu id="ogoia"></menu></s> <small id="ogoia"><div id="ogoia"></div></small><label id="ogoia"></label>
    <menu id="ogoia"><menu id="ogoia"></menu></menu>
    <button id="ogoia"></button>
  • <div id="ogoia"><small id="ogoia"></small></div><xmp id="ogoia"><div id="ogoia"></div>
  • <div id="ogoia"><div id="ogoia"></div></div>
  • <div id="ogoia"></div>
  • <menu id="ogoia"><div id="ogoia"></div></menu>
  • <div id="ogoia"><div id="ogoia"></div></div>
  • <div id="ogoia"><li id="ogoia"></li></div>
  • <div id="ogoia"><div id="ogoia"></div></div>
  • <div id="ogoia"><li id="ogoia"></li></div>
  • <div id="ogoia"><button id="ogoia"></button></div>
  • <div id="ogoia"><li id="ogoia"></li></div>
    <small id="ogoia"><li id="ogoia"></li></small>
    <small id="ogoia"></small>
  • <small id="ogoia"></small>
    <small id="ogoia"><div id="ogoia"></div></small>
  • <div id="ogoia"><button id="ogoia"></button></div>
  • <small id="ogoia"><li id="ogoia"></li></small><small id="ogoia"><li id="ogoia"></li></small>
  • <div id="ogoia"><li id="ogoia"></li></div>
  • <div id="ogoia"><li id="ogoia"></li></div>
  • <div id="ogoia"><button id="ogoia"></button></div>

    PythonOCC基础使用:基础建模指令(重要!!!)

    总目录 >> PythonOCC入门进阶到实战(目前已更新入门篇、基础篇和进阶篇)

    欢迎加入pythonocc的中文社区QQ群:860536842 获取更多信息

    opencascade的c++版的入门教程(https://www.opencascade.com/doc/occt-7.2.0/overview/html/occt__tutorial.html#sec1)讲述基础知识,是以建造一个瓶子作为例子,在这个过程中将使用的函数进行了细致的讲解.
    pythonocc的基础教程也会遵循此原则.接下来我们将完成瓶子的建造.
    在这里插入图片描述

    定义模型

    在这里插入图片描述在这里插入图片描述

    模型的建造将分为四个步骤:

    • 建造瓶子的轮廓(profile)
    • 建造瓶子的实体(body)
    • 建造瓶颈处的螺纹(thread)
    • 结果混合(及轮廓加本体加螺纹)

    一、建造瓶子的轮廓(profile)

    1.定义支撑点

    要创建瓶子的轮廓,首先要创建特征点及其坐标,如下面(xoy)平面中所示。这些点将是定义轮廓几何图形的支撑。
    在这里插入图片描述
    我们将会使用如下函数来描述 三维坐标点(使用笛卡尔坐标系:xyz坐标系)from OCC.Core.gp import gp_Pnt

    • 点函数gp_Pnt
    aPnt1 = gp_Pnt(-width / 2.0, 0, 0)
    aPnt2 = gp_Pnt(-width / 2.0, -thickness / 4.0, 0)
    aPnt3 = gp_Pnt(0, -thickness / 2.0, 0)
    aPnt4 = gp_Pnt(width / 2.0, -thickness / 4.0, 0)
    aPnt5 = gp_Pnt(width / 2.0, 0, 0)
    

    结果如图所示:
    在这里插入图片描述我们可以通过aPnt1.X() 来查看具体点的x值。注意此X为大写的。同理Y,Z

       print(aPnt1.X())
    

    -25.0

    2.轮廓:定义几何图形(geometry)

    基础知识补充: 我们在绘制图形的时候,一般会使用到 线Geom_Line,圆形Geom_Circle,这些是属于比较简单的图形,对于更为复杂的图形,我们使用贝塞尔曲线(Bezier)和B样条曲线(bspline )

    借助先前定义的点,可以计算瓶子轮廓几何图形的一部分。如下图所示,它由两段(segments)GC_MakeSegment和一段弧(arc)组成GC_MakeArcOfCircle
    在这里插入图片描述

    from OCC.Core.GC import GC_MakeArcOfCircle, GC_MakeSegment
    
    aArcOfCircle = GC_MakeArcOfCircle(aPnt2, aPnt3, aPnt4)
    aSegment1 = GC_MakeSegment(aPnt1, aPnt2)
    aSegment2 = GC_MakeSegment(aPnt4, aPnt5)
    

    注意aArcOfCircle ,Segment此处是无法在屏幕中显示出来的,必须经过下面拓扑信息的处理

    3.轮廓:定义拓扑信息(topology)

    我们已经创建了轮廓的几何图形aArcOfCircle,Segment,但这三条曲线是独立的,彼此之间没有关系。为了简化建模,将这三条曲线作为一个实体进行操作。这可以通过使用 TopoDS包 (topology data structure 拓扑信息结构)来实现:它定义几何图形、实体之间的关系,这些几何图形、实体可以链接在一起以表示更加复杂的形状。
    在这里插入图片描述
    参考上面的表格,建造轮廓的思路,应如下:

    • 三条曲线(edge:edge1,edge2,edge3)
    • 由三组曲线构成一条线(wire)

    在这里插入图片描述
    使用BRepBuilderAPI_MakeEdge 类可以做出曲线(edge),使用BRepBuilderAPI_MakeWire类可以做出线(wire)

    from OCC.Core.BRepBuilderAPI import BRepBuilderAPI_MakeEdge, BRepBuilderAPI_MakeWire
    
    aEdge1 = BRepBuilderAPI_MakeEdge(aSegment1.Value())
    aEdge2 = BRepBuilderAPI_MakeEdge(aArcOfCircle.Value())
    aEdge3 = BRepBuilderAPI_MakeEdge(aSegment2.Value())
    
    aWire = BRepBuilderAPI_MakeWire(aEdge1.Edge(), aEdge2.Edge(), aEdge3.Edge())
    
    

    在这里插入图片描述显示如上的东西,需要注意使用aEdge2.Edge(),aWire.Wire()才可以displayShape显示出来。

    4.完成轮廓

    基础知识补充:要对形状(包括线,体)进行矩阵转换,我么借助的是 gp_Trsf 类;这种矩阵变换可以是平移、旋转、缩放、镜像或这些的组合。

    我们的wire线进行镜面对称后,可以完成轮廓。因此我们需要定义一个关于全局坐标系X轴;gp_Ax1这个类可以用来定任意轴(因此我们可以使用该类定义x轴);此类需要两个参数:点,方向(三维矢量)。当然x轴还有更简单的方法gp_OX()

    from OCC.Core.BRepBuilderAPI import  BRepBuilderAPI_Transform
    from OCC.Core.TopoDS import topods
    from OCC.Core.gp import  gp_OX, gp_Trsf
    
    # 指定x轴
    xAxis = gp_OX()
    
    # 定义镜像
    aTrsf = gp_Trsf()# 定义一个矩阵变换
    aTrsf.SetMirror(xAxis)#矩阵变换内容为 对x轴进行镜像
    
    # 运用矩阵变换:镜像
    aBRespTrsf = BRepBuilderAPI_Transform(aWire.Wire(), aTrsf)
    aMirroredShape = aBRespTrsf.Shape()#得到shape
    aMirroredWire = topods.Wire(aMirroredShape)#得到镜像后的wire
    

    在这里插入图片描述将现有wire添加至更大的wire中,最终得到myWireProfile

    mkWire = BRepBuilderAPI_MakeWire()
    mkWire.Add(aWire.Wire())
    mkWire.Add(aMirroredWire)
    myWireProfile = mkWire.Wire()
    

    二、建造瓶子实体(body)

    1.实体化轮廓(其实就是拉伸轮廓)

    要实现瓶子的建造,首先需要创建一个实体形状。最简单的方法是使用先前创建的轮廓并沿方向拉伸。Prism函数可以实现相应功能;它接受一个形状和一个方向作为输入,并根据以下规则生成一个新形状:
    在这里插入图片描述
    在这里插入图片描述目前我们生成 的轮廓是线(wire),参考形状生成表(见上),我们需要首先生成面(face),然后才能体(solid)。

    我们使用如下函数:

    • BRepBuilderAPI_MakeFace,根据闭合线生成面
    • BRepPrimAPI_MakePrism,拓扑信息实体化,支持最简单的方体,锥形,圆柱,球体,还有基础形状的扫略拉伸,(注意:扫描,拉伸,回转拉伸本质相同)

    为了生成实体,我们使用以下代码:

    from OCC.Core.gp import  gp_Vec
    from OCC.Core.BRepBuilderAPI import BRepBuilderAPI_MakeFace
    from OCC.Core.BRepPrimAPI import BRepPrimAPI_MakePrism
    
    #计算面
    myFaceProfile = BRepBuilderAPI_MakeFace(myWireProfile)
    
    #计算体
    aPrismVec = gp_Vec(0, 0, height)#指定有限向量finite vector
    myBody = BRepPrimAPI_MakePrism(myFaceProfile.Face(), aPrismVec)
    myBody.Shape()
    

    在这里插入图片描述

    2.倒圆角

    为所有的边(edge)倒角,并且倒角的半径为厚度的1/12
    在这里插入图片描述
    为了完成该功能,我们将使用如下函数:

    • BRepFilletAPI_MakeFillet 类,该类(你可以指定你想倒的任意边edge,并不是所有的边都必须倒的)
    • TopExp_Explorer 类,为了使用倒角函数,需要知道边edges,而这个TopExp_Explorer 函数可以用来探索该实体的edge,返回的结果为子形状(sub-shape);同时该函数的经常会使用其子函数MoreCurrentNext 放进循环中,他们分别代表 是否有更多子形状去挖掘,知道当前被探索到的子形状是哪一个,移动到下一个子形状去探索。

    在探索边的函数TopExp_Explorer 中,我们会取得所有edge,然后成为倒角的边,以下为实现函数:

    #指定倒角实体
    mkFillet=BRepFilletAPI_MakeFillet(myBody.Shape())
    #探索实体中的边edge
    anEdgeExplorer = TopExp_Explorer(myBody.Shape(), TopAbs_EDGE)
    
    #进行探索循环
    while anEdgeExplorer.More():
    	#获得当前边
        anEdge = topods.Edge(anEdgeExplorer.Current())
    	#倒角当前边
        mkFillet.Add(thickness/12.,anEdge)
    	#移动下一个边
        anEdgeExplorer.Next()
    

    运行displayShape(mkFillet.Shape())可以显示如下图:
    在这里插入图片描述

    3.添加瓶子的颈部

    要在瓶子上加一个瓶颈,首先将创建一个圆柱体,并将其与瓶身融合(fuse合并)。半径为厚度的1/4。高度为高度的1/10。
    在这里插入图片描述
    要定位圆柱体,需要使用gp_Ax2类定义坐标系,(之前的ax1坐标系仅仅只有一个方向)从一个点和两个方向Z轴方向和X方向定义右手坐标系(Y方向自动计算出来)。为了使得颈部与瓶身顶面中心对齐,(也就是处在全局坐标系下的(0,0,myheight)可以定义一个局部坐标系;

    同时为了生成圆柱体 ,我们使用BRepPrimAPI_MakeCylinder

    neckLocation=gp_Pnt(0,0,height)
    neckAxis=gp_DZ()
    neckAx2=gp_Ax2(neckLocation,neckAxis)
    
    neckRadius=thickness/4
    neckHeight=height/10
    MKCylibnder=BRepPrimAPI_MakeCylinder(neckAx2,neckRadius,neckHeight)
    
    myBody= BRepAlgoAPI_Fuse(mkFillet.Shape(),MKCylibnder.Shape()
    
    

    在这里插入图片描述

    4.创建一个中空的实体

    我们现在创建的瓶子是实体,不能够装水,因此我们需要将其挖空,分为以下步骤:

    • 移去一个或多余的面,获得一个壁的表面W1
    • 获取一个平行的表面w2(D是正值,则w2在外面,D是负值,则在里面)
    • 从w1和w2中计算实体
      在这里插入图片描述
      为此我们可以使用 BRepOffsetAPI_MakeThickSolid类来去实现有一定厚度的实体。要找到具有这些特征的面,我们将使用explorer函数寻找合适的面face。

    在探测每一个面的时候,我们需要知道每一个面的几何特征(即他到底是平面还是曲面。)因此我们使用BRep_Tool 类,其中Surface 去探测面face,Curve 去探测边edge,Point去探测 点 vertex。

    而我们想要确认的是 是不是平面,我们将使用到 Geom_Plane类。
    对于形状的收集是 TopTools 包,因为BRepOffsetAPI_MakeThickSolid 需要一系列的东西,正好使用到TopTools_ListOfShape 类.

    代码如下:

    def face_is_plane(face):
        """
          如果TopoDS_Shape是平面, 则返回True
        """
        hs = BRep_Tool_Surface(face)
        downcast_result = Geom_Plane.DownCast(hs)
        # 如果不能往下转换downcast, 说明这个面不是平面
        if downcast_result is None:
            return False
        else:
            return True
    
    
    def geom_plane_from_face(aFace):
        """
        返回一个平面
        """
        return Geom_Plane.DownCast(BRep_Tool_Surface(aFace))
    
    faceToRemove = None
    zMax = -1
    
    # We have to work our way through all the faces to find the highest Z face so we can remove it for the shell
    aFaceExplorer = TopExp_Explorer(myBody.Shape(), TopAbs_FACE)
    while aFaceExplorer.More():
        aFace = topods.Face(aFaceExplorer.Current())
    
        if face_is_plane(aFace):
            aPlane = geom_plane_from_face(aFace)
    
            # We want the highest Z face, so compare this to the previous faces
            aPnt = aPlane.Location()
            aZ = aPnt.Z()
            if aZ > zMax:
                zMax = aZ
                faceToRemove = aFace
    
        aFaceExplorer.Next()
    
    facesToRemove = TopTools_ListOfShape()
    facesToRemove.Append(faceToRemove)
    
    myBody = BRepOffsetAPI_MakeThickSolid(myBody.Shape(), facesToRemove, -thickness / 50.0, 0.001)
    

    在这里插入图片描述

    三、创建螺纹(thread)

    展开阅读全文

    没有更多推荐了,返回首页

    加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】|