pythonOCC版 瓶子代码
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- ##Copyright 2009-2015 Thomas Paviot (tpaviot@gmail.com)
- ##
- ##This file is part of pythonOCC.
- ##
- ##pythonOCC is free software: you can redistribute it and/or modify
- ##it under the terms of the GNU Lesser General Public License as published by
- ##the Free Software Foundation, either version 3 of the License, or
- ##(at your option) any later version.
- ##
- ##pythonOCC is distributed in the hope that it will be useful,
- ##but WITHOUT ANY WARRANTY; without even the implied warranty of
- ##MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ##GNU Lesser General Public License for more details.
- ##
- ##You should have received a copy of the GNU Lesser General Public License
- ##along with pythonOCC. If not, see <http://www.gnu.org/licenses/>.
- import math
- from OCC.gp import gp_Pnt, gp_OX, gp_Vec, gp_Trsf, gp_DZ, gp_Ax2, gp_Ax3, gp_Pnt2d, gp_Dir2d, gp_Ax2d
- from OCC.GC import GC_MakeArcOfCircle, GC_MakeSegment
- from OCC.GCE2d import GCE2d_MakeSegment
- from OCC.Geom import Geom_Plane, Geom_CylindricalSurface, Handle_Geom_Plane, Handle_Geom_Surface
- from OCC.Geom2d import Geom2d_Ellipse, Geom2d_TrimmedCurve, Handle_Geom2d_Ellipse, Handle_Geom2d_Curve
- from OCC.BRepBuilderAPI import BRepBuilderAPI_MakeEdge, BRepBuilderAPI_MakeWire, BRepBuilderAPI_MakeFace, \
- BRepBuilderAPI_Transform
- from OCC.BRepPrimAPI import BRepPrimAPI_MakePrism, BRepPrimAPI_MakeCylinder
- from OCC.BRepFilletAPI import BRepFilletAPI_MakeFillet
- from OCC.BRepAlgoAPI import BRepAlgoAPI_Fuse
- from OCC.BRepOffsetAPI import BRepOffsetAPI_MakeThickSolid, BRepOffsetAPI_ThruSections
- from OCC.BRepLib import breplib
- from OCC.BRep import BRep_Tool_Surface, BRep_Builder
- from OCC.TopoDS import topods, TopoDS_Edge, TopoDS_Compound
- from OCC.TopExp import TopExp_Explorer
- from OCC.TopAbs import TopAbs_EDGE, TopAbs_FACE
- from OCC.TopTools import TopTools_ListOfShape
- from OCC.Display.SimpleGui import *
- def face_is_plane(face):
- """
- 判断 TopoDS_Shape 是不是 plane
- """
- hs = BRep_Tool_Surface(face)
- downcast_result = Handle_Geom_Plane.DownCast(hs)
- # 不能通过Handle_Geom_Plane转换的不是平面
- return not downcast_result.IsNull()
- def geom_plane_from_face(aFace):
- """
- 通过 planar surface 得到 geometric plane
- """
- return Handle_Geom_Plane.DownCast(BRep_Tool_Surface(aFace)).GetObject()
- height = 70
- width = 50
- thickness = 30
- if 1:
- # 准备用来创建 瓶身 的点
- 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)
- # 瓶底断面线段和圆弧
- aArcOfCircle = GC_MakeArcOfCircle(aPnt2, aPnt3, aPnt4)
- aSegment1 = GC_MakeSegment(aPnt1, aPnt2)
- aSegment2 = GC_MakeSegment(aPnt4, aPnt5)
- # 除了下面的方法, 也可以不用上面的segment,而通过点直接创建线段edges
- aEdge1 = BRepBuilderAPI_MakeEdge(aSegment1.Value())
- aEdge2 = BRepBuilderAPI_MakeEdge(aArcOfCircle.Value())
- aEdge3 = BRepBuilderAPI_MakeEdge(aSegment2.Value())
- # 通过edges 创建 wire
- aWire = BRepBuilderAPI_MakeWire(aEdge1.Edge(), aEdge2.Edge(), aEdge3.Edge())
- # 得到X轴的便捷方式
- xAxis = gp_OX()
- # 设置镜像轴
- aTrsf = gp_Trsf()
- aTrsf.SetMirror(xAxis)
- # 应用镜像变换
- aBRespTrsf = BRepBuilderAPI_Transform(aWire.Wire(), aTrsf)
- # 得到镜像 shape
- aMirroredShape = aBRespTrsf.Shape()
- # 通过通用shape得到 wire
- aMirroredWire = topods.Wire(aMirroredShape)
- # 组合两个wire
- mkWire = BRepBuilderAPI_MakeWire()
- mkWire.Add(aWire.Wire())
- mkWire.Add(aMirroredWire)
- myWireProfile = mkWire.Wire()
- # 创建用于体拉伸 sweep 的面
- myFaceProfile = BRepBuilderAPI_MakeFace(myWireProfile)
- # 我们把面沿Z轴拉伸到指定高度
- aPrismVec = gp_Vec(0, 0, height)
- myBody = BRepPrimAPI_MakePrism(myFaceProfile.Face(), aPrismVec)
- # 通过explorer对所有边加倒角
- mkFillet = BRepFilletAPI_MakeFillet(myBody.Shape())
- anEdgeExplorer = TopExp_Explorer(myBody.Shape(), TopAbs_EDGE)
- while anEdgeExplorer.More():
- anEdge = topods.Edge(anEdgeExplorer.Current())
- mkFillet.Add(thickness / 12.0, anEdge)
- anEdgeExplorer.Next()
- myBody = mkFillet
- # 创建瓶颈
- neckLocation = gp_Pnt(0, 0, height)
- neckAxis = gp_DZ()
- neckAx2 = gp_Ax2(neckLocation, neckAxis)
- myNeckRadius = thickness / 4.0
- myNeckHeight = height / 10.0
- mkCylinder = BRepPrimAPI_MakeCylinder(neckAx2, myNeckRadius, myNeckHeight)
- myBody = BRepAlgoAPI_Fuse(myBody.Shape(), mkCylinder.Shape())
- # 下面找到Z最高的面, 并将它移除
- faceToRemove = None
- zMax = -1
- # 遍历所有的面, 查找Z最高的面
- 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)
- 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)
- # 建立需要创建螺纹的瓶颈表面
- neckAx2_Ax3 = gp_Ax3(neckLocation, gp_DZ())
- aCyl1 = Geom_CylindricalSurface(neckAx2_Ax3, myNeckRadius * 0.99)
- aCyl2 = Geom_CylindricalSurface(neckAx2_Ax3, myNeckRadius * 1.05)
- # 建立创建螺纹的曲线
- aPnt = gp_Pnt2d(2.0 * math.pi, myNeckHeight / 2.0)
- aDir = gp_Dir2d(2.0 * math.pi, myNeckHeight / 4.0)
- anAx2d = gp_Ax2d(aPnt, aDir)
- aMajor = 2.0 * math.pi
- aMinor = myNeckHeight / 5.0
- anEllipse1 = Geom2d_Ellipse(anAx2d, aMajor, aMinor)
- anEllipse2 = Geom2d_Ellipse(anAx2d, aMajor, aMinor / 8.0)
- anArc1 = Geom2d_TrimmedCurve(Handle_Geom2d_Ellipse(anEllipse1), 0, math.pi)
- anArc2 = Geom2d_TrimmedCurve(Handle_Geom2d_Ellipse(anEllipse2), 0, math.pi)
- anEllipsePnt1 = anEllipse1.Value(0)
- anEllipsePnt2 = anEllipse1.Value(math.pi)
- aSegment = GCE2d_MakeSegment(anEllipsePnt1, anEllipsePnt2)
- # 构建用于螺纹的边和环
- anEdge1OnSurf1 = BRepBuilderAPI_MakeEdge(Handle_Geom2d_Curve(anArc1), Handle_Geom_Surface(aCyl1))
- anEdge2OnSurf1 = BRepBuilderAPI_MakeEdge(aSegment.Value(), Handle_Geom_Surface(aCyl1))
- anEdge1OnSurf2 = BRepBuilderAPI_MakeEdge(Handle_Geom2d_Curve(anArc2), Handle_Geom_Surface(aCyl2))
- anEdge2OnSurf2 = BRepBuilderAPI_MakeEdge(aSegment.Value(), Handle_Geom_Surface(aCyl2))
- threadingWire1 = BRepBuilderAPI_MakeWire(anEdge1OnSurf1.Edge(), anEdge2OnSurf1.Edge())
- threadingWire2 = BRepBuilderAPI_MakeWire(anEdge1OnSurf2.Edge(), anEdge2OnSurf2.Edge())
- # 计算边和环的三维表现
- breplib.BuildCurves3d(threadingWire1.Shape())
- breplib.BuildCurves3d(threadingWire2.Shape())
- # 创建螺纹的表面
- aTool = BRepOffsetAPI_ThruSections(True)
- aTool.AddWire(threadingWire1.Wire())
- aTool.AddWire(threadingWire2.Wire())
- aTool.CheckCompatibility(False)
- myThreading = aTool.Shape()
- # 构建组合结果
- aRes = TopoDS_Compound()
- aBuilder = BRep_Builder()
- aBuilder.MakeCompound(aRes)
- aBuilder.Add(aRes, myBody.Shape())
- aBuilder.Add(aRes, myThreading)
- display, start_display, add_menu, add_function_to_menu = init_display()
- display.DisplayColoredShape(aRes)
- start_display()
pythonOCC版 瓶子代码的更多相关文章
- 编译opengl编程指南第八版示例代码通过
最近在编译opengl编程指南第八版的示例代码,如下 #include <iostream> #include "vgl.h" #include "LoadS ...
- 数据结构(c语言版)代码
第1章 绪论 文档中源码及测试数据存放目录:数据结构\▲课本算法实现\▲01 绪论 概述 第一章作为绪论,主要介绍了数据结构与算法中的一些基本概念和术语.对于这些概念术语 ...
- 学会使用Hdlbits网页版Verilog代码仿真验证平台
给大家推荐一款网页版的 Verilog代码编辑仿真验证平台,这个平台是国外的一家开源FPGA学习网站,通过“https://hdlbits.01xz.net/wiki/Main_Page” 地址链接进 ...
- Python系列教程-详细版 | 图文+代码,快速搞定Python编程(附全套速查表)
作者:韩信子@ShowMeAI 教程地址:http://showmeai.tech/article-detail/python-tutorial 声明:版权所有,转载请联系平台与作者并注明出处 引言 ...
- 正则表达式学习笔记(附:Java版示例代码)
具体学习推荐:正则表达式30分钟入门教程 . 除换行符以外的任意字符\w word,正常字符,可以当做变量名的,字母.数字.下划线.汉字\s space,空白符 ...
- JAVA版Kafka代码及配置解释
伟大的程序员版权所有,转载请注明:http://www.lenggirl.com/bigdata/java-kafka.html.html 一.JAVA代码 kafka是吞吐量巨大的一个消息系统,它是 ...
- 铭飞MCMS内容管理系统完整开源版J2EE代码
当前版本:4.6.0铭飞MS官网:http://ms.mingsoft.net官网同时提供一键运行版本下载,请步移官网....QQ交流群号1:221335098很多人说铭飞MCMS是大天朝国唯一完整开 ...
- 【伪一周小结(没错我一周就做了这么点微小的工作)】HDOJ-1241 Oil Deposits 初次AC粗糙版对比代码框架重构版
2016 11月最后一周 这一周复习了一下目前大概了解的唯一算法--深度优先搜索算法(DFS).关于各种细节的处理还是极为不熟练,根据题意判断是否还原标记也无法轻松得出结论.不得不说,距离一个准ACM ...
- 2048聚合版开源代码,cocos2d-js编写,基于CocosEditor开发工具,可运行Android,ios,html5等
1. [代码][JavaScript]代码 /** * @GameName : * 2048 * * @DevelopTool: * Cocos2d-x Editor (CocosEd ...
随机推荐
- 【原创】redhat5安装oracle10g
安装缺失的包: 用 root 用户身份运行以下命令: rpm -q gcc make binutils openmotif setarch compat-db compat-gcc compat-gc ...
- dubbo之泛化实现
实现泛化调用 泛化接口调用方式主要用于客户端没有 API 接口及模型类元的情况,参数及返回值中的所有 POJO 均用 Map 表示,通常用于框架集成,比如:实现一个通用的服务测试框架,可通过 Gene ...
- POJ 3041 - 最大二分匹配
这道题实现起来还是比较简单的,但是理解起来可能有点困难. 我最开始想到的是贪心法,每次消灭当前小行星最多的一行或一列.然而WA了.Discuss区里已经有高人给出反例. 下面给出正确的解法 我们把行和 ...
- C# 检测dll的新版本号方法
FileVersionInfo info = FileVersionInfo.GetVersionInfo(YourFileNameHere);string version = info.FileMa ...
- [Jxoi2012]奇怪的道路 题解(From luoguBlog)
题面 状压好题 1<= n <= 30, 0 <= m <= 30, 1 <= K <= 8 这美妙的范围非状压莫属 理所当然地,0和1代表度的奇偶 dp[i][j ...
- React Native未来导航者:react-navigation 使用详解
该库包含三类组件: (1)StackNavigator:用来跳转页面和传递参数 (2)TabNavigator:类似底部导航栏,用来在同一屏幕下切换不同界面 (3)DrawerNavigator:侧滑 ...
- Oracle经验积累
Oracle 常用Funtion ----行转列 开始---- select u_id, wmsys.wm_concat(goods) goods_sum from shopping group by ...
- transparent
transparent属性用来指定全透明色彩
- [转载]ext4文件系统的delalloc选项造成单次写延迟增加的分析
转载http://www.cnblogs.com/cobbliu/p/5603472.html 最近我们的服务进程遇到kill -15后处于Z的状态,变为了僵尸进程,经过/proc/{thread_i ...
- USACO 4.1 Fence Loops
Fence Loops The fences that surround Farmer Brown's collection of pastures have gotten out of contro ...