一、前言
我的一天 🌞 (按照推文发送的时间来说应该是我的昨天):早上7:40起床,洗漱吃完早饭9:00坐在电脑面前,打开Typora,看看自己整理的论文思路,再看一看GoodNote中的其他学者的论文。嗯,不出所料,这一块能写的点别人都一个不落地写过了。稍微有点了思路,于是想码点字,写一个删一个,写一行删一行,就这样来来回回,陷入自我怀疑。10:00实在坐不住了,骑车去淞南公园转一转,调整一下心态,发现大爷大妈的生活比我精彩多了。11:00去新江湾吃个牛丼饭,可能是在宿舍没状态,所以吃完饭就骑车去了公司。到了公司正好12:30,平时午休的点,困了,先来一觉。13:00开始起来干活,到17:00时共计码了400个字,也就是说平均每小时100个字😂,就这效率还感觉整个人被掏空了。食堂吃个晚饭,就骑车回去了,19:00准时到长江西路羽毛球馆打球,遇到高手还被教育了一顿,顺利地把写论文的精神压力转移到身体上。21:00离开球馆,22:00洗完澡,22:30再次回到宿舍的电脑面前,发现自己还欠一篇推文,不过推文比论文简单多了,怎么写都行,不看专家脸色,就算写得不好,粉丝也不可能顺着网线来打我啊。
二、方法及步骤
不扯了,今天这期还是继续CATIA二次开发系列,主要讲Selection的内容。因为之前做过Revit二次开发的缘故,在接触到CATIA选择的时候,我发现两者截然不同。Revit API中的select,字面意思,就是用于过滤选择的(印象里是这样的,如有不妥可私信我),而CATIA中的Selection被赋予了很多功能,例如隐藏、删除、更改几何样式等都需要通过Selection来完成。当然这也很容易理解,试想一下软件的实际操作,如果你想隐藏一个元素,是不是先得先选中它,然后在它的基础上右击Hide,完成隐藏。在Revit中,只要在代码层面拿到对应的元素实例就可以进行隐藏等操作了,而CATIA在获取元素实例后需要先将其添加至选择集,然后对当前选择集进行属性设置,实现隐藏等功能。
讲起来很简单,但在实际代码编写过程中,还会遇到很多像这样的坑,例如你想把一个HybridShape从一个Part复制到另一个Part,想想好像挺简单的一个事,遍历结构树,拿到被复制元素,Copy();然后再遍历结构树拿到另一个Part,执行Paste()。但如果你的ActivePart不是被复制元素所在的那个Part,这个程序是走不通的。下面的内容我就直接上干货了,写完可以早点休息。
2.1 单选
Selection selection = CATIA.ActiveEditor.Selection; // 清空选择 selection.Clear(); Array filter = Array.CreateInstance(typeof(object),1); // ElemType 是元素类型,一般为VPMReference HybridBody等 filter.SetValue(ElemType, 0); // iMaySkipInteractiveSelection为true,程序首先去判断当前已选元素是否符合要求,再决定是否需要交互选择(即同下) // iMaySkipInteractiveSelection为false,用户去树中选择一个符合要求的元素,然后程序清空Selection并加当前选择加入Selection string status = selection.SelectElement(filter, ref msg, false);
2.2 多选
// 建议使用SelectElement3;不推荐使用SelectMultipleElements public string GetSelectedElems(INFITF.Application CATIA, string ElemType, string msg) { Selection selection = CATIA.ActiveEditor.Selection; selection.Clear(); Array filter = Array.CreateInstance(typeof(object), 1); filter.SetValue(ElemType, 0); string status = selection.SelectElement3(filter, ref msg, true, CATMultiSelectionMode.CATMultiSelTriggWhenSelPerf, false); return status; }
🔔选择之后一定要对status进行判断,否则程序是有缺陷的
2.3 删除
Selection.Delete();
2.4 隐藏元素
// 先加入选择集 Selection sel = CATIA.ActiveEditor.Selection; sel.Clear(); sel.Add(splitStarCurve); sel.Add(extraStartPoint); sel.Add(extraEndPoint); // 隐藏 sel.VisProperties.SetShow( CatVisPropertyShow.catVisPropertyNoShowAttr); sel.Clear();
2.5 修改几何样式
Selection sel = activeEditor.Selection; sel.Add(StartLine_L); sel.VisProperties.SetRealColor(255,0,0,0); sel.VisProperties.SetRealLineType(2, 0); sel.Clear();
2.6 隔离(使用StartCommand)
大家可以多多尝试 StartCommand,发掘一些新的功能字符串
ActiveEditor.Selection.Clear(); ActiveEditor.Selection.Add(item); CATIA.StartCommand("Isolate"); ActiveEditor.Selection.Clear();
三、参考资料
《3DEXPEROENCE Automation Help》