关于CATIA VBA / Automation二次开发,小狼之前发过很多篇文章了。不过为了让一些刚接触的小伙伴更容易理解,我们再唠叨一遍:
CATIA软件里内置了一套自动化对象,好比某MOBA游戏的英雄;
我们平常用鼠标键盘,可以操纵软件建模(控制英雄走路或释放技能);
与游戏外挂/宏类似,CATIA也可以被程序脚本控制,让软件自动执行某些动作。
综合以上内容,简单说,这种用程序代码代替鼠标键盘,控制软件进行自动建模的方式,就叫做基于Automation(或者叫自动化对象)的二次开发。
这些自动化对象,能听懂的程序语言不止一种,小编之前也都发过。除了软件自带的VBA,还有比如:
今天这篇文章,我们来介绍一个python中用于catia automation开发的库——pycatia。
提示:阅读这篇文章的内容,需要各位看官有VBA和Python的基础。如果没有,建议先看一下上面链接的文章。
关于这个库,Github链接如下。
https://github.com/evereux/pycatia
根据作者本人的说法:做这个库的初衷是为了用python实现测量功能(详见我上面第三个链接里那本书第七章内容)。后来不断地完善,截止到小编发这篇文章,已经更新到0.5.8版本,几乎涵盖了CATIA常用模块的API。
和小编写的书中纯com开发不同的是,使用这个库,你可以拥有属性和方法的自动联想,提高程序编写的效率。
与其他python库一样,我们可以通过如下命令行安装:
或者,如果你用了pycharm,可以在project interpreter setting里进行安装:
以上工作就绪之后,我们便可以编写python代码啦!接下来,我们就通过开发手册里自带的这个实例,来练练手~
这个例子的原理很简单:
一个圆上有一些等距阵列的点,在偏置某一距离的平面上的另一个圆上,有同样多的点,只是位置会错开一些。我们把对应的两个点连成一条线,再进阶一下,把相邻的两根线桥接一张曲面,再上个色。
按着上面的步骤,开始写代码:
首先,导入库,初始化一些基本对象与参数:
import pycatia
from pycatia.mec_mod_interfaces.part_document import PartDocument
from math import *
import random
# 创建一个新part文档,并初始化一些基本对象
catia = pycatia.catia()
doc = catia.documents.add('Part')
doc = PartDocument(doc.com_object)
sel = doc.selection
part = doc.part
hsf = part.hybrid_shape_factory
hb = part.hybrid_bodies.add()
pt_qtt = 20 # 圆上点的数量
dis_loc = 5 # 上下两层点错位的量
r1 = 50 # 下圆半径
r2 = 30 # 上圆半径
因为后面要给元素上色,这里先自定义一个随机上色的函数:
# 自定义一个给元素随机上色的函数
def rand_color(element):
r = random.randint(0,255)
g = random.randint(0, 255)
b = random.randint(0, 255)
sel.clear()
sel.add(element)
sel.vis_properties.set_real_color(r, g, b, 1)
sel.clear()
然后,就是建模了,过程也很简单,就是“点连成线,线连成面”:
# 创建点并连线
lines = []
for i in range(pt_qtt):
# 当前循环变体下,上下两层点对应的角度
a1 = pi * 2 / pt_qtt * i
a2 = pi * 2 / pt_qtt * (i + dis_loc)
# 用三坐标的形式创建点,z值即表示两个圆所在的平面位置
pt1 = hsf.add_new_point_coord(r1 * cos(a1), r1 * sin(a1), 0)
pt2 = hsf.add_new_point_coord(r2 * cos(a2), r2 * sin(a2), 200)
# 连线并放入数组
line = hsf.add_new_line_pt_pt(pt1, pt2)
lines.append(line)
# 桥接曲面
for i in range(pt_qtt - 1):
blend = hsf.add_new_blend()
blend.set_curve(1, lines[i])
blend.set_curve(2, lines[i + 1])
hb.append_hybrid_shape(blend)
blend.compute()
rand_color(blend) # 随机上个色
# 前面循环是相邻线一对一对的,最后再把首尾连起来
blend = hsf.add_new_blend()
blend.set_curve(1, lines[pt_qtt - 1])
blend.set_curve(2, lines[0])
hb.append_hybrid_shape(blend)
blend.compute()
rand_color(blend)
# 最后 更新一下part
part.update()
最终出来的模型及特征树如下图: