继《CATIA二次开发—遍历结构树》之后,上周停更了一次 CATIA 二次开发系列,一方面是正好那个时间点,走马观花式地读完了一篇英文文献,所以选择乘热先推送—《集成NLP和逻辑推理的自动合规检查平台》;另外一方面,笔者也在思考下面的章节如何安排,因为能拎出来讲的基础知识点不多了,后面有时间的话考虑出一些实战类的视频。
其实对于二开而言,知识点比较零散,对其学习的本质是针对软件 API 的实践总结以及少量的代码编写技巧。首先来谈 API 的实践总结。没有其他捷径,就是代码写得越多,总结得越多,对 API 功能的理解也就越深刻。当你拿到一个需求,你能第一时间反应出:这个能不能通过 API 来实现?如果能,那么实现的思路大概是什么,主要用到哪些 API ;如果不能,限制在哪,有没有曲线救国的可能?这些潜意识都是长期实践积累和总结才具备的,而且这个过程别人替代不了。就如笔者一直致力于分享自己的开发经验,其实也是督促自己进一步总结归纳,在自己受益的同时,也能让读者们少走一些弯路,能够更快地入门 CATIA 二次开发,实现所需的定制功能。
其次是少量的代码编写技巧。这里的“少量”是笔者的个人观点,若有不妥,请别当真。就笔者接触到的二次开发项目而言,开发过程中,代码编写上的困难不多见,毕竟是面向百度和谷歌编程的老司机 了🚗 ,难点其实主要集中在业务逻辑层面,尤其是当产品经理也吃不准逻辑的时候就更难了。所以上学那会我就经常调侃:业主并不清楚自己要什么,但当你写出一个程序给他的时候,他才知道自己不要什么。苦了写代码的人被迫做排除法😂。
好了,前言扯得有点多,抓紧进入正题。本期内容重点是讲 CATIA 中的参数,包括参数的、、和一整套 工作流 。

图1.用于创建参数的对象
首先 CATIA API 中用于创建参数的方法位于 Parameters 对象中(图1),所以想要新建参数就必须拿到 Parameters 对象 实例 。那么怎么去拿这个实例呢,这取决于你想要在哪新建参数(图2),例如是零件级别的参数,亦或者是几何图形集中的参数,它们对应不同的对象实例获取方法(表1)。

图2.左为零件级别新建参数,右为几何图形集内新建参数
表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(“列表”) |
如果我们对有要求的话,可能就需要新建参数集来对参数进行管理,例如下图3呈现了一个参数集嵌套参数集的结构层次。

图3.新建参数集并添加参数
Parameters paras = activePart.Parameters;
// 在零件参数集中新建“test”参数集
ParameterSet testParaSet = paras.RootParameterSet.ParameterSets.CreateSet("test");
// 在“test”参数集中新建参数
testParaSet.AllParameters.CreateBoolean("IsSuccess", false);
同样以图3为例,如果想要获取 “test” 参数集,代码如下:
Parameters paras = activePart.Parameters;
ParameterSet childParaSet = paras.RootParameterSet.ParameterSets.GetItem("test) as ParameterSet;
获取参数与创建参数一致,均通过 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();
}
}
删除参数的应该不需要多讲,只要能拿到参数集或者参数,然后将其添加至选择集,即可删除。
sel.Clear();
sel.Add(para1);
sel.delete();
参数的修改包括修改参数名和参数值,分别对应不同的方法,代码如下:
// 修改参数名称
para13.Rename("changedName");
// 修改值
para13.ValuateFromString("111");
// 可以带单位赋值,以确保不受软件系统单位设置的影响
para13.ValuateFromString("100mm");
《3DEXPEROENCE Automation Help》

免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删