Creo二次开发:Creo插件A维工具批量删除模型参数
在日常工作中,你是否遇到过这样的困扰:
-
为了适配新的 PLM 系统,需要删除成百上千个零件中的旧参数?
-
历史遗留模型中充斥着混乱的自定义参数,手动删除点到手酸?
-
在大型装配体(ASM)中,一个个查找并清理参数简直是效率杀手?

-
如果当前模型是装配图,想批量删除当前装配图及其子零部件,点击“批量删除参数(ASM)” -
如果你已经有一个需要删除参数的零件清单,这可以用“批量删除参数(Excel)” -
甚至你可以用“批量删除参数(WD)”按钮批量处理整个工作目录中的文件 


一、 核心代码逻辑拆解
我们来看这段 DeleteParameters 函数。它的核心功能是接收一组待删除的参数列表,遍历指定的模型集合,并逐一执行清理动作。
1. 智能识别与纠错
在处理海量模型时,稳定性是第一位的。代码中首先对模型类型进行了严格校验:
if (!(type.equals("asm") || type.equals("prt")||type.equals("drw")||type.equals("frm"))) {result = AppConstants.RUN_RESULT_INVAILD_TYPE;if(AppConstants.IS_DEBUG_MODE) log.debug(result);newTableData[i][2] = String.valueOf(result);continue;}
它能自动识别零件(PRT)、组件(ASM)、工程图(DRW)和格式文件(FRM),甚至考虑到了钣金件(SMT)的特殊性并将其转换为 PRT 处理。这种“鲁棒性”设计,能有效防止程序因遇到不支持的文件格式而崩溃。
2. 自动化加载与静默处理
代码利用 TKLoadAndOpenObjs.openAndLoadWithFileNameAndExtensionSeperatly 实现模型的后台自动加载。这意味着工程师不需要手动打开每一个文件,程序会在内存中完成“加载—查找—删除”的闭环,极大地提升了处理速度。
3. 结果状态的实时反馈
为了让用户知道程序运行到了哪一步,代码引入了 newTableData 二维数组来记录每一个零件的处理结果(成功、失败或无法打开),并最终通过 UI 界面(statusLabel)反馈给用户。这种“所见即所得”的交互方式,是成熟工具的标配。
二、 实战避坑指南:给开发者的建议
在编写这类自动化脚本时,有几个细节直接决定了工具的成败:
-
自动保存(Auto Save): 代码中有一个精巧的设计:
if (TKCreatMenuAndButtons.bolAutoSave) { TKCommon.SaveObject(proeSession, model); }。 批量修改后,如果程序意外中断或忘记保存,工作就白费了。通过开关控制自动保存,既保证了数据安全,又给了用户灵活选择的空间。 -
异常处理机制: 在 CAD 自动化中,最常见的问题是模型由于被锁定、检出失败或损坏而无法打开。代码通过
try-catch嵌套,确保即便某个零件处理失败,程序也能跳过它继续处理下一个,而不是直接“罢工”。 -
日志记录(Logging):
log.debug的高频使用,让开发调试变得非常简单。对于这种批量后台任务,日志是排查问题的唯一线索。
三、 结语
Creo 的强大不仅在于其建模功能,更在于其开放的二次开发生态。希望通过今天的分享,能给正在探索 Creo 自动化的朋友们一点启发。
最后附上源码:
private boolean DeleteParameters(Vector<String>deletedParameters, String[][] parts) throws Exception {// Session curSession = pfcGlobal.GetProESession();// 复制数组boolean returnResult = true;String[][] newTableData = new String[parts.length][3];Model model = null;try {if(parts == null) return false;String componentFilenameandSurfix = null;for (int i = 0; i < parts.length; i++) {String pn = parts[i][0];String type = parts[i][1];if(type.equals("smt")) type = "prt";newTableData[i][0] = pn;newTableData[i][1] = type;componentFilenameandSurfix = pn + "." + type;mesg = "Delete parameters for "+ componentFilenameandSurfix;if(AppConstants.IS_DEBUG_MODE) log.debug(mesg);if (!(type.equals("asm") || type.equals("prt")||type.equals("drw")||type.equals("frm"))) {result = AppConstants.RUN_RESULT_INVAILD_TYPE;if(AppConstants.IS_DEBUG_MODE) log.debug(result);newTableData[i][2] = String.valueOf(result);continue;}try {model = TKLoadAndOpenObjs.openAndLoadWithFileNameAndExtensionSeperatly(pn, type, false, false, false, false);if(model == null) continue;} catch (Exception e) {result = AppConstants.RUN_RESULT_CANT_OPEN;newTableData[i][2] = String.valueOf(result);mesg = "Can't open file " + componentFilenameandSurfix;TKLogger.DisplayErrorMessage(mesg);if(AppConstants.IS_DEBUG_MODE) log.error("Exception:", e);continue;}for(int parameterIndex = 0; parameterIndex < deletedParameters.size(); parameterIndex++) {String parameterToDelete = deletedParameters.get(parameterIndex);boolean bolResult = DeleteParamByName(model, parameterToDelete);returnResult = returnResult && bolResult;if(AppConstants.IS_DEBUG_MODE) log.debug("Delete Param " + parameterToDelete + " for:" + componentFilenameandSurfix + "\t result:" + bolResult);if(bolResult) {result = AppConstants.RUN_RESULT_SUCCESS;}else {result = AppConstants.RUN_RESULT_FAILURE;}newTableData[i][2] = String.valueOf(result);}if (TKCreatMenuAndButtons.bolAutoSave) {TKCommon.SaveObject(proeSession, model);}}statusLabel.setText("Total item:" + parts.length + " Done.");statusLabel.setOpaque(true);statusLabel.setBackground(Color.GREEN);//refreshTable(table, newTableData);} catch (Exception e) {mesg = "Something wrong Exception thrown by DeleteParameters_callback () method: " + e.toString();if(AppConstants.IS_DEBUG_MODE) log.error("Exception:", e);TKLogger.DisplayErrorMessage(mesg);} finally {//refreshTable(tableObjectsList, newTableData);}return returnResult;}
夜雨聆风