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