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

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

opencascade的c++版的入门教程(https://www.opencascade.com/doc/occt-7.2.0/overview/html/occt__tutorial.html#sec1)讲述基础知识,是以建造一个瓶子做为例子,在这个过程当中将使用的函数进行了细致的讲解.

pythonocc的基础教程也会遵循此原则.接下来咱们将完成瓶子的建造.

python

定义模型

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

建造瓶子的轮廓(profile)

建造瓶子的实体(body)

建造瓶颈处的螺纹(thread)

结果混合(及轮廓加本体加螺纹)

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

1.定义支撑点

要建立瓶子的轮廓,首先要建立特征点及其坐标,以下面(xoy)平面中所示。这些点将是定义轮廓几何图形的支撑。

咱们将会使用以下函数来描述 三维坐标点(使用笛卡尔坐标系:xyz坐标系)from OCC.Core.gp import gp_Pntweb

点函数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,Zshell

print(aPnt1.X())

-25.0svg

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

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

借助先前定义的点,能够计算瓶子轮廓几何图形的一部分。以下图所示,它由两段(segments)GC_MakeSegment和一段弧(arc)组成GC_MakeArcOfCircle。

ui

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此处是没法在屏幕中显示出来的,必须通过下面拓扑信息的处理this

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

咱们已经建立了轮廓的几何图形aArcOfCircle,Segment,但这三条曲线是独立的,彼此之间没有关系。为了简化建模,将这三条曲线做为一个实体进行操做。这能够经过使用 TopoDS包 (topology data structure 拓扑信息结构)来实现:它定义几何图形、实体之间的关系,这些几何图形、实体能够连接在一块儿以表示更加复杂的形状。

参考上面的表格,建造轮廓的思路,应以下:spa

三条曲线(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()

2、建造瓶子实体(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);同时该函数的常常会使用其子函数More,Current,Next 放进循环中,他们分别表明 是否有更多子形状去挖掘,知道当前被探索到的子形状是哪个,移动到下一个子形状去探索。

在探索边的函数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)

3、建立螺纹(thread)

pythonocc_PythonOCC基础使用:基础建模指令(重要!!!)相关推荐

  1. 做笔记,零基础学3D建模快速方法

    多数想要学习3D建模的同学在刚刚开始学的时候,都会放下豪言壮语:我一定会通过这些视频教程和书自学成功. 随后通常半个月以后再聊到3D建模的自学情况时,往往普遍多数的同学都会不好意思的回答:哎,老师,别 ...

  2. 零基础学习3D建模,第一步:3D建模软件有哪些?给你科普一下

    1.建模软件有很多,为大家科普下建模软件有哪些: 高模:Maya.3Dmax.Zbrush 中模:Maya.3Dmax 低模:Maya.3Dmax.Topogun 展UV:Maya.Zbrush.Un ...

  3. mysql 访问寄存器_汇编寄存器(内存访问)基础知识之三---mov指令

    1 内存中字的存储 一个字型数据占2个内存单元,内存里面一个内存单元一个字节(8位),高地址单位放高8位,低地址单元放低8位. 注意:0号是地址单元,1是高地址单元(上是低地址,下面是高地址) (1) ...

  4. 零基础学3D建模,应该怎么开始学?你需要注意这些!

    丑化说在前头,如果想真正学好3D建模,需要花费很多时间和功夫,不要想着轻松也不要想着一蹴而就,如果只是三分钟热度,不如趁早放弃,这些话不仅仅针对于3D建模的学习,任何专业技能的学习都一样. 面对陌生的 ...

  5. Redis基础 概念 数据类型 常用指令 Jedis 持久化

    Redis基础 概念 数据类型 常用指令 Jedis 持久化 1. Redis 简介 1.1 NoSQL概念 1.1.1 问题现象 1.1.2 NoSQL的概念 1.2 Redis概念 1.2.1 r ...

  6. 3D建模:0基础如何学习建模及行业应用范围

    最近很多人问我如何0基础学习3D建模,以及3D建模行业的前景如何. 今天统一给大家写一篇行业介绍,以及3D建模可以应用到哪些领域. 一.应用范围 先解释一下什么是3D建模: 总的来说,3D是一种视觉的 ...

  7. (2O21全新升级)初学者教程零基础学习游戏建模

    入门游戏建模,从零基础变成有基础:包括美术基础,软件基础(3Dmax,ZBrush,PS) 主要包括:3Dmax基础.UV拆分和摆放.贴图绘制基础. (1)底模软件(3dmax或Maya) 你可以从基 ...

  8. 零基础学3D建模一般要多久?

    零基础学3D次世代建模到入门,根据每个人的吸收能力,基本需要6-9个月的时间. 6-9个月是那种集训,周一到周五,每天12个小时以上的练习量. 我们的零基础次世代建模课程是7个月的时间,7(月)*4( ...

  9. 做3d建模的工作工资是不是很高?从零基础学习3D建模到学成功,需要多久?

    关于3D建模,尤其是3D游戏建模这一块,希望能够解决大家思想上困扰,对未来的迷茫,找准自己的方向,谁的青春不迷茫,可谁不想让自己的青春绽放? 建模福利领取: 如果你想自己制作游戏动漫模型,这里专门建立 ...

  10. 美术0基础学游戏建模能入行么?

    建模是工具,美术基础是内力,工具只是熟能生巧的过程,美术基础决定在建模行业的上线 美术基础的高低影响学习建模的速度和作品质量,以及工作后能力,甚至薪资待遇.虽然现在3D建模对于美术的门槛降低了不少,一 ...

最新文章

  1. 9.path Sum III(路径和 III)
  2. Perfect Security (01字典树删除点)
  3. [c++]引入了头文件和动态库,为什么找不到函数实现
  4. FPGA之道(31)VHDL编写注意事项
  5. 分布式数据库管理系统
  6. MSSQL 从备份文件还原数据库脚本
  7. reactjs定义组件:类式组件
  8. python numpy pandas 书 全_用Python做数据分析,Numpy,Pandas,matp
  9. java 图类_Java集合类,一张图说清楚!
  10. Rust笔记1 rust基本概念
  11. python资料-大牛分享python资料
  12. CloudFlare:免费CDN加速-自定义节点IP教程
  13. 一款基于java开发的开源监控平台
  14. python实现 文件排版
  15. 页错误异常处理(page fault)的实现
  16. OpenGL ES SDK for Android - 3
  17. winsxs探索之sxstrace错误跟踪工具
  18. python自动化办公 51cto_用Python开发钉钉群机器人,自动办公神器
  19. Vue项目清理本地缓存并删除node_modules (清除不掉揍我)
  20. 最全的Android单元测试教程

热门文章

  1. html滚动条样式自定义,CSS自定义浏览器滚动条样式
  2. 我的世界服务器防止右键无限钓鱼,我的世界右键钓杆定向发射火球技巧攻略
  3. AI全自动钓鱼,原神游戏沦陷!(硬核开源)
  4. 小程序第三讲 组件间传值 props
  5. 使用vsftpd搭建ftp,用户无法上传文件
  6. H5 下载word文件时预览失败,提示无法预览此文件,它可能已损坏,有部分可可以查看预览
  7. 量子力学是否证明了世界是唯心主义?物质到底是虚无还是实在的
  8. 程序员无休止加班的真正原因!
  9. 使用性能监视器找出SQLServer硬件瓶颈
  10. python决策树export_机器学习--决策树--dot转存pdf