乐于分享
好东西不私藏

Creo二次开发:Creo插件A维工具批量删除模型参数

Creo二次开发:Creo插件A维工具批量删除模型参数

在日常工作中,你是否遇到过这样的困扰:

  • 为了适配新的 PLM 系统,需要删除成百上千个零件中的旧参数?

  • 历史遗留模型中充斥着混乱的自定义参数,手动删除点到手酸?

  • 在大型装配体(ASM)中,一个个查找并清理参数简直是效率杀手?

今天分享一段Creo二次开发插件A维工具中的批量上次模型参数的源码。
这之前批量检查参数一样,需要先在设置界面设置需要批量删除的参数,每行一个参数。
设置完成后就可以通过下面几个按钮调用这个功能,
  • 如果当前模型是装配图,想批量删除当前装配图及其子零部件,点击“批量删除参数(ASM)”
  • 如果你已经有一个需要删除参数的零件清单,这可以用“批量删除参数(Excel)”
  • 甚至你可以用“批量删除参数(WD)”按钮批量处理整个工作目录中的文件
点击批量处理按钮后,会弹出下面窗口,左边是要删除的参数,和在设置界面里一样的,在这里可以修改要删除的参数会同步保存,右边显示将要删除参数的零件清单。
确认无误后,点击左下角Delete按钮,等待程序运行结束。

一、 核心代码逻辑拆解

我们来看这段 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 自动化的朋友们一点启发。

#Creo二次开发 #Creo插件A维工具

最后附上源码:

	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 == nullreturn 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, typefalsefalsefalsefalse);					if(model == nullcontinue;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;	}