一、前言
继《CATIA二次开发—遍历结构树》之后,上周停更了一次 CATIA 二次开发系列,一方面是正好那个时间点,走马观花式地读完了一篇英文文献,所以选择乘热先推送—《集成NLP和逻辑推理的自动合规检查平台》;另外一方面,笔者也在思考下面的章节如何安排,因为能拎出来讲的基础知识点不多了,后面有时间的话考虑出一些实战类的视频。
其实对于二开而言,知识点比较零散,对其学习的本质是针对软件 API 的实践总结以及少量的代码编写技巧。首先来谈 API 的实践总结。没有其他捷径,就是代码写得越多,总结得越多,对 API 功能的理解也就越深刻。当你拿到一个需求,你能第一时间反应出:这个能不能通过 API 来实现?如果能,那么实现的思路大概是什么,主要用到哪些 API ;如果不能,限制在哪,有没有曲线救国的可能?这些潜意识都是长期实践积累和总结才具备的,而且这个过程别人替代不了。就如笔者一直致力于分享自己的开发经验,其实也是督促自己进一步总结归纳,在自己受益的同时,也能让读者们少走一些弯路,能够更快地入门 CATIA 二次开发,实现所需的定制功能。
其次是少量的代码编写技巧。这里的“少量”是笔者的个人观点,若有不妥,请别当真。就笔者接触到的二次开发项目而言,开发过程中,代码编写上的困难不多见,毕竟是面向百度和谷歌编程的老司机 了🚗 ,难点其实主要集中在业务逻辑层面,尤其是当产品经理也吃不准逻辑的时候就更难了。所以上学那会我就经常调侃:业主并不清楚自己要什么,但当你写出一个程序给他的时候,他才知道自己不要什么。苦了写代码的人被迫做排除法😂。
好了,前言扯得有点多,抓紧进入正题。本期内容重点是讲 CATIA 中的参数,包括参数的创建、删除、读取和写入一整套工作流。
二、方法及步骤
2.1 创建参数集/参数
2.1.1 新建参数
首先 CATIA API 中用于创建参数的方法位于 Parameters 对象中(图1),所以想要新建参数就必须拿到 Parameters 对象实例。那么怎么去拿这个实例呢,这取决于你想要在哪新建参数(图2),例如是零件级别的参数,亦或者是几何图形集中的参数,它们对应不同的对象实例获取方法(表1)。
表1.获取 Parameters 对象实例
Where you create parameter | How to get the Parameters instance |
零件级别 | activePart.Parameters |
几何图形集内部 | activePart.Parameters.SubList(hybridBody, true) |
表2 为不同类型参数新建的具体方法
表2.新建不同类型的参数
参数类型 | 方法 |
长度 | CreateDimension(“长度”,“LENGTH”,2000) |
角度 | CreateDimension(“角度”, “ANGLE”, 1.8) |
整数(Int) | CreateInteger(“整数”,5) |
实数(Real) | CreateReal(“实数”,10) |
字符串(String) | CreateString(“字符串”,“hhh”) |
布尔(Bool) | CreateBoolean(“布尔”,false) |
列表 | CreateList(“列表”) |
2.1.2 新建参数集
如果我们对参数层级有要求的话,可能就需要新建参数集来对参数进行管理,例如下图3呈现了一个参数集嵌套参数集的结构层次。
Parameters paras = activePart.Parameters; // 在零件参数集中新建“test”参数集 ParameterSet testParaSet = paras.RootParameterSet.ParameterSets.CreateSet("test"); // 在“test”参数集中新建参数 testParaSet.AllParameters.CreateBoolean("IsSuccess", false);
2.2 获取参数集/参数
2.2.1 获取参数集
同样以图3为例,如果想要获取 “test” 参数集,代码如下:
Parameters paras = activePart.Parameters; ParameterSet childParaSet = paras.RootParameterSet.ParameterSets.GetItem("test) as ParameterSet;
2.2.2 获取参数及其值
获取参数与创建参数一致,均通过 Parameters 对象完成,并同样采用GetItem方法,代码如下:
划重点:activePart.Parameters 所拿到的参数并不只是零件中 Parameters 中的参数,而是零件中的所有参数,包括几何图形集中的几何参数等等
// 此方法虽也能获取到对应的参数,但毕竟会搜索零件中所有参数来找到对应的参数,会耗费计算资源 Parameter para1 = (Parameter)activePart.Parameters.GetItem("test1"); // 合理的获取方式 Parameters allParas = activePart.Parameters; ParameterSet paras = allParas.RootParameterSet.AllParameters; Parameter para1 = (Parameter)paras.GetItem("test1"); // 获取参数值 string value = para1.ValueAsString();
🔔另一个需要注意的是:ValueAsString() 方法在获取有量纲(单位)的参数值时,会一同把单位也读取出来。例如 某参数 = 100 mm,此时 value = “100mm”。
对此笔者提供一个解决方案,并非最优,仅供参考。
// 思路:对于有量纲参数,使用正则表达式,剔除非数字字符, string[] items = para1.ValueAsString().ToCharArray(); // 这里先把第一个字符加进来,避免是负数时,负号被剔除 string realValue = items[0]; // 从1开始循环 for ( int i = 1; i < items.Count; i++ ) { if (Regex.IsMatch(items[i].ToString(),"[0-9]")) { realValue += item.ToString(); } }
2.3 删除参数集/参数
删除参数的应该不需要多讲,只要能拿到参数集或者参数,然后将其添加至选择集,即可删除。
sel.Clear(); sel.Add(para1); sel.delete();
2.4 修改参数
参数的修改包括修改参数名和参数值,分别对应不同的方法,代码如下:
// 修改参数名称 para13.Rename("changedName"); // 修改值 para13.ValuateFromString("111"); // 可以带单位赋值,以确保不受软件系统单位设置的影响 para13.ValuateFromString("100mm");
三、参考资料
《3DEXPEROENCE Automation Help》