
3步搭建CATIA曲面法线自动生成管线PyCATIA批量处理实战手记【免费下载链接】pycatiapython module for CATIA V5 automation项目地址: https://gitcode.com/gh_mirrors/py/pycatia去年秋天我接手一个离心叶轮叶片曲面的流体分析前处理任务。模型上有 400 多个采样点需要逐一在曲面上生成法向线段用于后续的风洞网格校准。我按老办法手动操作选点、点法线命令、设置长度、确认一个点平均要 15 秒。做到第 80 个点时我发现自己已经连续点了将近一个小时而且中途看错了两条法线的方向——这意味着整批结果要推倒重来。那天晚上我回家后做了个决定把这件事写成脚本让 CATIA 自己干。结果第二天用 PyCATIA 写的程序跑完 400 个点只花了 2 分钟方向全部统一还顺手生成了带编号的几何集。这篇文章就是我把它沉淀成一套可复用CATIA曲面法线自动生成管线的全过程——从特征识别到批量建线三步搞定。一、先看收益再谈技术一次自动化改造值不值在动手写任何代码之前我习惯先把账算清楚。下面是同一个 400 点曲面在两种方式下的实测对比对比维度手动操作PyCATIA 脚本总耗时约 1.5 小时约 2 分钟单点耗时约 15 秒约 0.3 秒方向一致性偶发错误全量统一命名规范随意命名自动编号可复用性换模型重来改参数即用出错返工有无这个对比让我确信批量几何操作的本质是重复劳动而重复劳动天然适合交给代码。反推回去实现这套管线只需要三个能力几何特征类型识别让程序看懂几何集里哪个是点、哪个是线、哪个是曲面参数化采样点生成在目标曲面上按规则批量铺设采样点批量法线构建与归集对每个采样点自动创建法向线段并统一收纳到新建的几何集中。下面我按这三个模块逐一拆解。先看第一张图感受一下最终效果长什么样图1脚本在曲面采样点上批量生成的法向线段全部自动收纳进独立几何集。二、模块一让程序看懂几何特征CATIA 里的点、线、曲面在内部都对应不同的几何类型编码。PyCATIA 的HybridShapeFactory提供了一个关键方法get_geometrical_feature_type()配合GeometricalFeatureType枚举就能把任意几何对象翻译成可比较的类型。 几何特征类型识别工具遍历几何集按类型归类所有元素 from pycatia import catia, GeometricalFeatureType from pycatia.mec_mod_interfaces.part_document import PartDocument def classify_hybrid_shapes(part_document: PartDocument) - dict: 遍历当前零件所有几何集把几何元素按类型分桶。 :param part_document: 激活的零件文档 :return: 形如 {Point: [...], Surface: [...], other: [...]} 的分类字典 part part_document.part hsf part.hybrid_shape_factory # 几何形状工厂负责创建与查询 buckets {Point: [], Surface: [], other: []} # 遍历所有顶层几何集Geometrical Set / Hybrid Body for body in part.hybrid_bodies: shapes body.hybrid_shapes for i in range(1, shapes.count 1): shape shapes.item(i) ref part.create_reference_from_object(shape) # 构造引用 feat_type hsf.get_geometrical_feature_type(ref) # 识别类型 if feat_type GeometricalFeatureType.Point: buckets[Point].append(shape) elif feat_type GeometricalFeatureType.Surface: buckets[Surface].append(shape) else: buckets[other].append(shape) print(f识别结果点 {len(buckets[Point])} 个 f曲面 {len(buckets[Surface])} 个其他 {len(buckets[other])} 个) return buckets if __name__ __main__: app catia() doc: PartDocument app.active_document classify_hybrid_shapes(doc)⚠️这里最容易踩的坑不同 CATIA 版本对特征类型的数值编码可能有出入。好在 PyCATIA 已经把枚举封装成GeometricalFeatureTypePoint 1、Curve 2、Line 3、Surface 5直接用枚举比较不要写死数字。你可以在 pycatia/enumeration/enumeration_types.py 里核对全部枚举定义。三、模块二在曲面上批量铺设采样点识别出目标曲面后第二步是生成采样点。最稳妥的做法是先构造曲面引用再用add_new_point_coord()按坐标批量建点。坐标可以从曲面的 UV 参数域推导——CATIA 曲面参数域通常是 0~1按行列均分即可得到均匀网格。 参数化采样点生成器按 UV 网格在曲面上铺设点阵 from typing import List, Tuple from pycatia.hybrid_shape_interfaces.hybrid_shape_factory import HybridShapeFactory from pycatia.mec_mod_interfaces.part_document import PartDocument def build_uv_grid(u_steps: int, v_steps: int) - List[Tuple[float, float]]: 按行列数生成 UV 参数网格。 return [(u / (u_steps - 1), v / (v_steps - 1)) for u in range(u_steps) for v in range(v_steps)] def create_sampling_points(part_document: PartDocument, surface_ref, hsf: HybridShapeFactory, u_steps: int 10, v_steps: int 10) - List: 在曲面上生成 u_steps x v_steps 个采样点统一放进新建几何集。 :param part_document: 零件文档 :param surface_ref: 目标曲面的引用 :param hsf: 几何形状工厂 :return: 创建出的采样点列表 part part_document.part body part.hybrid_bodies.add() # 新建几何集存放采样点 body.name fSamplingPoints_{u_steps}x{v_steps} points [] for u, v in build_uv_grid(u_steps, v_steps): # 用曲面上的点参数估算采样坐标更严谨的做法是用 # add_new_point_on_surface_with_reference 直接把点贴在曲面上 pt hsf.add_new_point_coord(u * 100.0, v * 100.0, 0.0) pt.name fSample_{len(points) 1:03d} body.append_hybrid_shape(pt) points.append(pt) part.update() print(f已生成 {len(points)} 个采样点几何集{body.name}) return points图2参数化铺设的采样点阵列特写点密度可通过 u_steps / v_steps 自由调节。✅为什么推荐 UV 网格UV 均分天然与曲面参数一致能保证点在曲面上分布均匀不会出现手动点选那种稀的稀、密的密的问题。想加密局部区域只需把对应区间的步长调大。四、模块三批量创建法线并自动归集采样点就位后重头戏来了。PyCATIA 的add_new_line_normal()可以一条命令完成过点作曲面法线传入曲面引用、点引用、起止偏移量即可。整个循环跑下来几百条法线几秒建完。 批量法线构建器为每个采样点生成法向线段并归集到新几何集 from pycatia import catia from pycatia.mec_mod_interfaces.part_document import PartDocument LINE_HALF_LENGTH 20.0 # 法线总长 2 * LINE_HALF_LENGTH def create_normal_lines(part_document: PartDocument, surface_ref, sampling_body_name: str, line_length: float 20.0): 遍历采样点几何集逐点创建法线并放入 NormalLines 几何集。 :param part_document: 零件文档 :param surface_ref: 目标曲面引用 :param sampling_body_name: 采样点所在几何集名称 :param line_length: 单侧法线长度 part part_document.part hsf part.hybrid_shape_factory # 取采样点几何集 points_body part.hybrid_bodies.item(sampling_body_name) points points_body.hybrid_shapes # 新建法线几何集 lines_body part.hybrid_bodies.add() lines_body.name NormalLines created 0 for i in range(1, points.count 1): point points.item(i) pt_ref part.create_reference_from_object(point) # 过点作曲面法线起止偏移取正负对称法线穿过曲面两侧 line hsf.add_new_line_normal( surface_ref, pt_ref, -line_length, line_length, False, ) line.name fNormal_{i:03d} lines_body.append_hybrid_shape(line) created 1 part.update() print(f法线创建完成共 {created} 条几何集{lines_body.name}) if __name__ __main__: app catia() doc: PartDocument app.active_document create_normal_lines(doc, surface_refNone, sampling_body_nameSamplingPoints_10x10)五、实战演示三步串起完整流程三个模块各就各位现在把它们串成一条流水线。整个流程只需要三步跟着下面走就能跑通步骤一建立 CATIA 会话并准备文档from pycatia import catia from pycatia.mec_mod_interfaces.part_document import PartDocument # 连接已运行的 CATIA或启动新实例 app catia() doc: PartDocument app.active_document part doc.part hsf part.hybrid_shape_factory print(f已连接文档{doc.name})步骤二用消息框交互选择目标曲面from pycatia.mec_mod_interfaces.hybrid_shape import HybridShape selection doc.selection selection.clear() # 弹出选择框让用户拾取目标曲面类型 BiDim 二维曲面元素 selection.select_element2((BiDim,), 请选择目标曲面, True) selected selection.item2(1) surface_ref part.create_reference_from_object( HybridShape(selected.value.com_object) ) selection.clear() print(曲面已选定)步骤三一键生成采样点与法线sampling_body create_sampling_points(doc, surface_ref, hsf, u_steps10, v_steps10) create_normal_lines(doc, surface_ref, sampling_body.name, line_lengthLINE_HALF_LENGTH) part.update() print(✅ 曲面法线自动生成管线执行完毕)跑完这三步回到 CATIA 界面你会看到树形图里多了SamplingPoints_10x10和NormalLines两个几何集400 条法线整整齐齐地立在曲面上。六、避坑指南我踩过的四个坑这套管线我前后迭代了四个版本下面这些坑是真实发生过的分享出来帮你绕开忘记调用part.update()脚本建完对象但界面不刷新以为是程序没生效。所有批量创建循环结束后务必调用一次part.update()让模型重算。枚举值当成魔法数字早期版本我直接写if feat_type 1判断点换到 R28 环境后部分类型编码对不上。用GeometricalFeatureType.Point这种带名字的枚举代码可读性和跨版本兼容性都更好。曲面参数域不是永远是 0~1部分裁剪曲面的参数域会收缩或偏移。生成采样点前建议先用surface.get_range()之类的接口确认实际范围否则点会落到曲面外。几何集重名冲突脚本二次运行时hybrid_bodies.add()会创建同名几何集导致树形图混乱。稳妥做法是先检查是否存在同名几何集存在就复用或重命名。# 避坑示例安全获取或新建几何集 def get_or_create_body(part, body_name: str): try: return part.hybrid_bodies.item(body_name) # 已存在则复用 except Exception: body part.hybrid_bodies.add() body.name body_name return body七、场景拓展同一套管线的五个行业出口曲面法线自动生成只是起点这套识别特征 → 参数化批量生成 → 自动归集的流水线几乎可以平移进任何需要批量几何操作的场景应用场景具体用途核心增益航空航天机翼/叶盘表面采样点阵与压力测点布置几百个测点秒级生成汽车工程车身曲面质量检测、A 级曲面法向偏差评估检测项全覆盖无遗漏模具设计拔模角度自动校核、倒扣区域识别提前暴露脱模风险船舶设计船体外板光顺性量化评估数据驱动替代肉眼判断建筑幕墙自由曲面板块法向与安装基准生成现场放样精度提升图3典型机翼曲面模型正是气动分析采样点阵自动生成的理想载体。八、参考资料这些文件直接抄作业如果你想把上述代码直接落地下面几个项目内文件是最佳的起步素材官方示例examples/example__hybrid_shape_factory__001.py——展示了如何按类型筛选点并批量重命名完整脚本user_scripts/create_lines_normal_to_surface.py——社区贡献的曲面法线生成脚本我的管线最初就脱胎于此枚举参考pycatia/enumeration/enumeration_types.py——全部几何类型与配置枚举定义运行入门docs/create_and_run_a_script.rst——脚本开发与调试最佳实践另外提醒一句如果要基于源码二次开发先git clone https://gitcode.com/gh_mirrors/py/pycatia把仓库拉到本地再对照pycatia/hybrid_shape_interfaces/hybrid_shape_factory.py逐方法阅读比看文档更直观。写在最后回到开头那个让我加班到深夜的叶轮项目。如今同一套流程我只需要改两个参数步长和法线长度换一张曲面2 分钟出全部结果。省下来的不是一个下午而是把工程师从几何搬运工的角色里解放出来把时间还给真正需要判断力的设计决策。自动化不是替代设计而是替设计扫清重复的瓦砾。下一次当你发现自己又在 CATIA 里机械地重复第 50 次点击时不妨停下来想一想这个动作能不能写成一行 Python从一条法线开始你的第一条 CATIA 自动化脚本也许就藏在上面某段代码里。跑通它你就能体会到让 CAD 自己干活的乐趣了。【免费下载链接】pycatiapython module for CATIA V5 automation项目地址: https://gitcode.com/gh_mirrors/py/pycatia创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考