开篇:为什么一定要把 CATIA 模型做成视频
在方案评审室,客户不会等你慢慢旋转模型;在远程汇报里,静态截图又很难讲清装配关系。一段 30 秒的 CATIA 模型视频,能把复杂的运动副、间隙配合、维修路径一次性讲透,既节省返工,也减少差旅。把“三维设计”转成“动态展示”,本质上是把技术语言翻译成决策语言,让非 CAD 用户也能秒懂。
——这就是今天想聊的:用 Python 把 CATIA 自动“录屏”,一键生成高清演示视频。
痛点盘点:手动录屏的四大坑
效率低
工程师一边拖动鼠标一边录,3 分钟视频往往要拍十几次,后期还要剪。大型装配体卡顿
超过 5 万个零件的装配,手动旋转时帧率掉到个位数,录出来像 PPT 翻页。镜头运动不流畅
人手拖动无法保证匀速,客户看着“晃晕”,注意力全在画面抖动,不在产品。版本差异
同事用 R2020 录的宏,到你 R2022 就打不开,脚本一升级全报废。
技术路线对比:CATIA 动画模块 vs Python 自动化
| 维度 | CATIA 自带动画 | Python + CATIA API |
|---|---|---|
| 批量生成 | 手动逐条 | for 循环一键出片 |
| 镜头精度 | 关键帧靠眼估 | 贝塞尔曲线数学插值 |
| 大模型 | 容易崩 | LOD+多线程,帧率稳 |
| 后期合成 | 额外导入 PR | 直接 ffmpeg 编码 |
| 可维护性 | 版本绑定 | 源码可控,Git 管理 |
结论:动画模块做“创意广告”够用;做“工程汇报”还是脚本靠谱。
核心代码:从 0 到 1 的自动化脚本
以下代码基于 Python 3.8,依赖库:pywin32,numpy,scipy,opencv-python,ffmpeg-python。CATIA 必须运行在 Windows 且已注册 COM 接口。
1. 启动 CATIA 并获取文档对象
import win32com.client as win32 import time, os catia = win32.Dispatch('CATIA.Application') catia.Visible = True # 方便调试,生产环境可 False docs = catia.Documents prd_root = docs.Open(r"D:\assy.CATProduct") # 装配体路径2. 贝塞尔曲线生成相机路径
from scipy.interpolate import splev, splrep import numpy as np def bezier_cam_path(p0, p1, p2, p3, n_frames=900): """ p0~p3: 4 个 3D 坐标点,控制相机位置 return: (n_frames, 3) 数组 """ t = np.linspace(0, 1, n_frames) # 三次贝塞尔公式 path = (1-t)**3*p0 + 3*(1-t)**2*t*p1 + 3*(1-t)*t**2*p2 + t**3*p3 return path示意图:
(图中绿色点为控制点,红色曲线为相机中心轨迹,蓝色箭头为 Look-At 向量)
3. 逐帧渲染与多线程分发
from concurrent.futures import ThreadPoolExecutor import cv2 def render_one_frame(i, cam_pos, look_at): # 设置相机 cam = catia.ActiveWindow.ActiveViewer.Viewpoint3D cam.PutOrigin(cam_pos) # 相机位置 cam.PutTargetPoint(look_at) # 目标点 catia.ActiveWindow.ActiveViewer.Update() # 高分辨率截屏 tmp_png = f"tmp/frame_{i:05d}.png" catia.ActiveWindow.ActiveViewer.CaptureToFile(tmp_png) return tmp_png n_frames = 900 positions = bezier_cam_path(...) # 上文函数 with ThreadPoolExecutor(max_workers=6) as pool: tasks = [pool.submit(render_one_frame, i, pos, target) for i, pos in enumerate(positions)]4. 视频编码
import ffmpeg ( ffmpeg .input('tmp/frame_%05d.png', framerate=30) .output('catia_demo.mp4', vcodec='libx264', crf=18, pix_fmt='yuv420p') .run() )至此,一杯咖啡的功夫,900 帧 4K 视频自动出炉。
性能优化:让大装配也能跑满 30 fps
内存管理——LOD(Level of Detail)
在 CATIA 里调用Part.Tessellation对象,把公差从 0.01 mm 放宽到 0.1 mm,三角面片数立减 60%,显存占用腰斩。GPU 加速对比
- Quadro P2200:驱动对 CAD 有专属优化,但 CUDA 核心仅 1280,4K 帧率 12 fps
- RTX 4070:CUDA 5888 + NVENC 硬编,同场景 4K 帧率 28 fps
结论:纯渲染管线吃 CUDA 数量,RTX 游戏卡性价比反而更高。
多线程阈值
线程数 ≤ 物理核心 *1.2,超线程对 OpenGL 上下文切换收益有限;经验值 6 核 12 线程机器开 8 worker 最稳。
避坑指南:血泪踩出来的 5 个细节
中文路径
CATIA COM 接口对 Unicode 支持老旧,输出目录务必英文,否则CaptureToFile直接返回E_FAIL。版本兼容
录制宏时把“引用库”改成最低目标版本(如 R19),高版本向下兼容,反之不行。视频编码
甲方要 PPT 嵌入时选 H.264 + AAC,封装 MP4;如果继续后期合成,优先 PNG 序列 + ProRes 422,防止二次压缩。64 位进程
Python 一定用 64 位,与 CATIA 保持一致,否则 COM 调用会随机闪退。显存监控
每渲染 200 帧调用nvidia-ml-py检查显存,剩余 <500 MiB 时主动gc.collect(),防止 OOM 导致 CATIA 崩溃。
未来一步:把视频搬进 VR 头显
视频是线性播放,VR 才带自由度。下一步,如果把贝塞尔路径改成 6DoF 轨迹,导出 FBX+Omniverse,就能在 Quest3 里手势拆解装配。问题是:
——在 VR 里,用户想“伸手抓零件”时,CATIA 的 B-rep 数据如何实时串流到 Unity?
欢迎一起思考,也许下一篇就写它。
写在最后
把上面的脚本跑通后,我最大的感受是“可控”:
镜头节奏、分辨率、压缩码率,甚至相机光圈,都能写进代码里版本管理。再也不用半夜三点还在屏幕前手动旋转模型。
如果你也想试试“让 CATIA 自己演自己”,不妨到火山引擎的从0打造个人豆包实时通话AI动手实验逛一圈。虽然实验主打语音对话,但里面关于 Python 调用大模型、多线程任务编排的思路,和本文的批量渲染脚本异曲同工,对工程自动化同样受用。
小白也能顺利体验,我亲测半小时就跑完官方 Demo——把 AI 和 CAD 串起来,也许下一个提效 10 倍的点子就在你手里诞生。