前言:为什么选择 Python + Ceroson 做 Creo 二次开发?
在产品设计迈向数字化、参数化和自动化的趋势下,企业对 CAD 系统的要求已经不再局限于手工建模,而是越来越倾向于"自动生成"、"批量驱动"、"系统协同"这样的能力。传统的 Creo 二次开发更多依赖 Cero(Pro/Toolkit),以 C/C++ 的方式直接访问 Creo 的内部结构,能够实现最深层、最全面的功能扩展,例如特征创建、草图修改、关系式操作和工程图生成等。但由于 Cero 的学习门槛较高,开发周期较长,同时需要严格匹配 Creo 版本与编译环境,它更适合专业团队开发内部插件,而不太适合快速迭代的自动化业务系统。
随着 Python 在工程领域普及,加上企业越来越多的 MES、ERP、PLM 系统需要与 CAD 互动,开发者逐渐希望以一种更轻量的方式来控制 Creo,例如自动化批量建模、读取模型结构、进行参数化计算、统一输出文件格式、驱动流程化设计等。此时,Ceroson 提供了一种非常现代的选择:它将部分 Creo 能力以 REST API 的形式暴露出来,让 Creo 变得像一个可被远程调用的服务,外部程序只需发送标准的 JSON 请求,即可完成参数设置、模型重建、文件导出、特征树读取等操作。
这样一来,Python 与 Ceroson 的结合几乎天然适合企业级自动化场景。Python 擅长处理数据、与数据库交互、读取 Excel/CSV 参数表、搭建 Web 服务,也易于与其他数字化系统联通;而 Ceroson 负责把 Python 的请求转化为 Creo 能执行的动作,从而实现"脚本控制建模"。相比传统 Cero 插件开发,这种模式更加灵活、快速,而且无需在 Creo 内部开发 UI 或管理复杂的插件部署。
理解 Creo 的二次开发体系,可以从下面这张关系示意中获得更加直观的感受:
| 层级 | 作用描述 |
|---|---|
| Cero(Toolkit/C++) | 最底层的官方 API,功能最强,适合深度建模逻辑、自定义特征、内部插件开发。 |
| Ceroson(REST API) | 对部分建模能力的网络封装,使 Creo 能像服务一样被调用,适合自动化系统和批量处理。 |
| Python/外部系统 | 作为上层控制逻辑,通过 HTTP 调用 Ceroson,实现参数驱动、批量生成、流程集成等业务需求。 |
从定位上看,Cero 更适合"增强 Creo 内部能力",而 Ceroson + Python 则属于"外部驱动 Creo 自动运行"。两者不是替代关系,而是互补关系,前者保证底层能力,后者提升利用效率。当企业希望构建自动化建模平台、从订单生成模型、从参数表批量生成零件、对模型进行结构检查、或与 MES/ERP/PLM 联动时,Python + Ceroson 往往是最便捷、开发成本最低、扩展性也最好的解决方案。
本文将从连接 Ceroson 开始,逐步展示如何使用 Python 实现特征树读取与批量参数化建模,让 Creo 在自动化流程中真正运转起来。随后内容将进入具体的实践部分。
2. 连接 Ceroson:让 Python 与 Creo 建立通信
CREOSON 是一个把 PTC Creo Parametric(下称 Creo)的功能通过 JSON + HTTP 暴露出来的中间层 --- 外部脚本(Python / JS / Web 等)通过 JSON 请求可以控制 Creo,极大方便自动化与系统集成。下面是几个重要版本与它们的主要变化/特点:
| 版本 | 主要变化 / 特点 |
|---|---|
| v3.0.0 | 最新版本(截至 2023 年 11 月发布) --- 支持 PTC Creo 12:包括随之所需的 Java 21 JRE。如果你用的是 Creo 12,推荐使用此版本。另外,这个版本新增了对"单位系统 (unit systems)" 的处理支持。([GitHub][1]) |
| v2.9.0 | 针对老版本 Creo 的兼容更新 --- 将底层调用从 J-Link Java 接口部分替换为 C++ 库调用 PTC 的 OTK(C++ API),以支持仅提供 C++ 接口的 Creo 版本。对于用户,调用方式保持不变。此版本也移除了对 32-bit Creo 的支持,因为 Creo 已多年不支持 32 位。([GitHub][1]) |
| v2.8.2 | 添加对 PTC Creo 9 的支持,并增强了部分功能 / 输出。例如 file:massprops 命令现在包括质心 (center of gravity) 输出;修正了 interface:export_image 中的宽高参数交换 bug。对于使用这些功能的人来说是重要补丁。([GitHub][1]) |
| v2.8.1 / v2.8.0 | 修复了在 Creo 7 / Creo 8 上调用 regenerate(模型重生成)可能失败的问题。为了解决版本兼容问题,引入了一个新命令 creo.set_creo_version --- 脚本可以在开始时指定 Creo 的版本以兼容不同版本行为差异。还改进了一些 drawing / material / feature / list 函数的返回值与错误处理机制。([GitHub][1]) |
| v2.6.0 | 扩展了一些基础功能:支持导入/导出 Neutral / STEP / IGES 等通用文件格式,file.massprops 返回惯性矩阵 (inertia matrices),material 函数支持通配符 (wildcard) 名称,增强对装配 & 物料处理 (assembly / material) 的支持。此外,这个版本还对内嵌 web 页面 (playground / 示例) 做了重构,包括添加批处理示例、JS 客户端 (node.js 支持) 等,有利于用作 Web-based automation 或脚本调试环境。([GitHub][1]) |
版本选择:本人的配置是creo11.0+creoson3.0,各位当然可以和我一样选择,但其实比较建议使用的还是creoson2.8.2的版本,但接下来的展示代码还是基于creo11.0+creoson3.0。
下载:creoson可在github上下载,链接点击:(这里)

本人选择的是具有setup的win64版本,里面有个readme介绍怎么使用,非常简单。
接下来两张给出两份代码实现读取零件特征树以及批量参数建模。
3. 读取特征树:理解模型结构的第一步
在成功连接 Ceroson 并确认 Python 已经能够与 Creo 建立稳定通信后,真正有意义的自动化操作就可以开始了。而在所有建模自动化任务中,"读取特征树"往往是最基础也最关键的一步。特征树不仅表示一个零件(或装配)的构建过程,也是后续判断模型结构、提取信息、进行参数化修改的重要依据。如果说参数是模型的"变量",那么特征树就是模型的"骨架"。任何自动化系统如果不了解模型的特征结构,就无法做更进一步的判断或操作。
通过 Ceroson,我们可以直接调用 feature.list 来获取当前模型的完整特征列表。这个接口会返回一个 JSON 数组,每个元素代表一个特征,其中包含特征类型、特征 ID、名称、状态等字段。相比在 Creo 中手动查看特征树,JSON 的结构化形式更适合机器处理,也便于外部系统做进一步数据分析。例如,自动检测模型是否有未重建的特征、是否存在被抑制(suppress)的关键几何、是否存在命名不规范的特征,乃至判断模型是否符合企业 PLM 或工艺规则。
编写代码如下:
python
import requests
import json
CREOSON = "http://localhost:9056/creoson"
def creoson3(command, function, sessionId=None, data=None):
"""发送 Creoson 3.0 请求"""
payload = {
"command": command,
"function": function,
"sessionId": sessionId,
"data": data or {}
}
return requests.post(CREOSON, json=payload).json()
# ======================================================
# 1) 建立 Session
# ======================================================
session = creoson3("connection", "connect")
sid = session.get("sessionId")
# ======================================================
# 2) 获取当前激活模型
# ======================================================
active = creoson3("file", "get_active", sid)
active_data = active.get("data", {})
file = active_data.get("file")
dirname = active_data.get("dirname", "")
# 修复 Creoson 的路径格式(D:D:/xxx → D:/xxx)
if dirname:
dirname = dirname.replace("D:D:", "D:").replace("C:C:", "C:").replace("E:E:", "E:")
# ======================================================
# 3) 输出一句话状态总结
# ======================================================
if not sid:
print("❌ Creoson 连接失败,请检查 Creoson 是否运行。")
exit()
if not file:
print(f"✔ 已连接 Creoson(sessionId={sid}),但 Creo 中没有激活模型。")
exit()
print(f"✔ 已连接 Creoson(sessionId={sid}),当前激活模型:{file}(路径:{dirname})")
# ======================================================
# 4) 调用 feature.list 获取特征树
# ======================================================
resp = creoson3("feature", "list", sid, {"file": file})
feat_data = resp.get("data", {})
featlist = feat_data.get("featlist", [])
if not featlist:
print("⚠ 未返回 featlist,可能模型无特征或 Creoson 版本不兼容。")
exit()
print(f"\n⭐ 特征总数:{len(featlist)}\n")
# ======================================================
# 5) 输出特征树(每个特征一行、一条 JSON)
# ======================================================
print("===== 完整特征树(每条特征一行) =====\n")
for feature in featlist:
# 提取关键字段
simple = {
"status": feature.get("status"),
"feat_number": feature.get("feat_number"),
"name": feature.get("name", ""),
"type": feature.get("type", ""),
"feat_id": feature.get("feat_id")
}
# 转为紧凑 JSON,一行显示
one_line = json.dumps(simple, ensure_ascii=False, separators=(", ", ": "))
print(" " + one_line + ",")
print("\n🎉 特征树输出完成!")
注意:必须启动creoson服务,本代码只能get到打开的.part文件,但是creo默认一般会将修改后的零件格式变为.part.1或者.part.2之类的,这种零件是不能get到。本人比较讨厌这个设置,已经关闭了这个设置。
这里我们运行前需要先用creo打开一个零件,然后运行这段代码就会输出已打开零件的特征树。运行结果如下:

输出结果成功打印了零件模型特征树。
4. 批量参数化建模:让 Creo 成为可编程的建模引擎
在理解了特征树结构、掌握了参数读取与修改之后,Creo 的自动化能力就可以进一步扩展到批量建模场景中。企业内许多设计任务本质上都是"同一个模板模型 + 一批不同的参数",例如不同长度、直径的标准件,不同孔数和间距的连接板,或者多个配置略有不同的装配体。如果人工逐个建模,不但耗时,而且容易出现尺寸输入错误、不一致命名等问题。利用 Ceroson 与 Python,我们可以把整个建模过程变成一条清晰、可重复、可追踪的自动化流水线。
批量建模的核心思想是将模型参数外置化,把本来需要在 Creo 界面里输入的尺寸和值,转移到 CSV 或 Excel 表格中进行统一管理。每一行参数代表一个具体的配置,字段名称与 Creo 模型中的参数名称一一对应。Python 脚本在运行时读取参数表,依次对模板模型设置参数、重建模型、另存为新的文件名,并根据需要备份到指定目录。这样,一个包含几十乃至几百个变体的产品族就能在数秒或数分钟内自动生成。
除了圆柱体,企业内部最常见的批量建模需求包括:自动生成不同尺寸的结构件、批量修改孔的数量或直径、自动根据 Excel 推导特征参数、批量生成不同装配配置、以及生成多个不同尺寸的工程图。无论需求是什么,其核心逻辑始终一致:外部数据驱动模型内部参数,Python 循环控制建模过程,Ceroson 向 Creo 发出实际的建模命令。

当然我这里为了演示没必要真的写个参数CSV来生成十几个不同模型。以一个参数化的拉伸圆柱为例子:模板模型中已经定义了圆柱的直径和拉伸长度两个参数,直径为100,长度为200。通过 Python 调用 Ceroson,将直径改为 200、长度改为 100,模型即可自动更新;随后另存为新的文件名称并备份到指定路径,整个操作在脚本中只需要几行代码。当把这个流程扩展到 Excel 参数表,就能够生成一批直径、长度各不相同的新零件,而不需要人工参与。
以下是示例代码,它会读取已经打开的零件模板,修改相关参数,并生成修改参数的模型在原来目录并保存一份输出在output:

以下是代码:
python
import requests
import os
CREOSON_URL = "http://localhost:9056/creoson"
# 你想生成的新模型名称
NEW_NAME = "PRT0002.prt"
# 你希望额外备份到的目录
OUTPUT_DIR = r"D:/Creo11/output"
def creoson(command, function, data=None, sessionId=None):
"""调用 creoson 的小工具函数"""
payload = {
"command": command,
"function": function
}
if data is not None:
payload["data"] = data
if sessionId is not None:
payload["sessionId"] = sessionId
resp = requests.post(CREOSON_URL, json=payload)
resp.raise_for_status()
return resp.json()
# ========== 1. 连接 creoson ==========
conn = creoson("connection", "connect")
sessionId = conn.get("sessionId")
if not sessionId:
print("❌ 连接 creoson 失败:", conn)
raise SystemExit
# ========== 2. 获取当前激活模型 ==========
active = creoson("file", "get_active", sessionId=sessionId)
active_data = active.get("data") or {}
file_name = active_data.get("file")
dirname = active_data.get("dirname") or ""
if not file_name:
print("❌ 没有激活模型,请先在 creo 中打开一个零件。返回:", active)
raise SystemExit
# 修正一下奇怪的 "D:D:/xxx" 形式
if len(dirname) > 3 and dirname[0] == dirname[2] == ":":
# 例如 "D:D:/Creo11/creo_model/" -> "D:/Creo11/creo_model/"
dirname = dirname[2:]
print(f"✅ 已连接(sessionId={sessionId}),当前模型:{file_name},目录:{dirname}")
# ========== 3. 修改参数 ==========
params_to_set = {
"LASHENCHANGDU": 100.0,
"YUANZHIJING": 200.0,
}
for pname, pval in params_to_set.items():
res = creoson(
"parameter",
"set",
data={"file": file_name, "name": pname, "value": pval},
sessionId=sessionId,
)
if res.get("status", {}).get("error"):
print(f"⚠ 设置参数 {pname} 失败:", res)
else:
print(f"✔ 参数 {pname} 已设为 {pval}")
# ========== 4. 重建模型 ==========
regen = creoson(
"file",
"regenerate",
data={"file": file_name, "display": True},
sessionId=sessionId,
)
if regen.get("status", {}).get("error"):
print("⚠ 重建模型失败:", regen)
else:
print("✔ 模型重建完成!")
# ========== 5. 在 session 中改名为 PRT0002.prt ==========
rename_res = creoson(
"file",
"rename",
data={
"file": file_name,
"new_name": NEW_NAME,
"onlysession": True # 只在内存中改名,不动磁盘上的原文件
},
sessionId=sessionId,
)
if rename_res.get("status", {}).get("error"):
print("❌ session 内重命名失败:", rename_res)
raise SystemExit
else:
print(f"✔ 已在内存中将 {file_name} 改名为 {NEW_NAME}")
# ========== 6. 保存新名字的模型(在原目录生成 PRT0002.prt) ==========
save_res = creoson(
"file",
"save",
data={"file": NEW_NAME},
sessionId=sessionId,
)
if save_res.get("status", {}).get("error"):
print("❌ 保存新零件失败:", save_res)
raise SystemExit
else:
new_full_path = os.path.join(dirname, NEW_NAME)
print(f"🎉 新零件已保存到原目录:{new_full_path}")
# ========== 7. 再备份一份到 output 目录 ==========
os.makedirs(OUTPUT_DIR, exist_ok=True)
backup_res = creoson(
"file",
"backup",
data={
"file": NEW_NAME, # 刚刚保存好的新模型名
"target_dir": OUTPUT_DIR # 目标目录
},
sessionId=sessionId,
)
if backup_res.get("status", {}).get("error"):
print("⚠ 备份到 output 目录失败(但原目录里已经有 PRT0002.prt):", backup_res)
else:
print(f"✅ 已额外备份一份到:{os.path.join(OUTPUT_DIR, NEW_NAME)}")
# ========== 8. 断开连接(可选) ==========
creoson("connection", "disconnect", sessionId=sessionId)
以下是运行结果:

总结:让 Creo 真正走向自动化与可编程化
通过前面几个章节的讲解,我们已经完成了从基础认识到实操应用的完整链路:首先明确了为什么 Python + Ceroson 会逐渐成为企业首选的 Creo 自动化方案,随后介绍了 Creo 二次开发体系中 Cero 与 Ceroson 的协同关系,再从连接 Ceroson 开始,展示了如何让 Python 与 Creo 建立稳定通信,并进一步解析了特征树读取和参数修改的底层逻辑。最后,我们将这些能力组合起来,实现了一个能够批量生成不同参数化模型的自动化建模流程,让 Creo 从"交互式建模软件"真正转变为一个"可编程的建模引擎"。
无论是自动生成结构件族模型,还是批量调整特征参数、创建不同配置、输出文件,甚至将 Creo 融入 MES、ERP、PLM 等更大的数字化体系,Python + Ceroson 的方式都具备低耦合、易迭代、易部署、扩展性强等优势。它不要求开发者具备 C++ 或 Toolkit 的复杂知识,也无需构建复杂的插件 UI,只要掌握基本的 HTTP 与 JSON 结构,就能控制 Creo 执行大多数自动化任务。对于企业来说,这大幅降低了 CAD 自动化的门槛,为更长期的数字化、智能化设计打下基础。