AutoCAD Civil3D 2022 ActiveX匹配对象名称报错求助
Civil 3D遍历无站点对齐集合报错排查(No method or operation has been applied)
已在Civil 3D中定义相关库,尝试将选中的CAD文本对象内容与无站点对齐对象名称匹配时,触发错误提示No method or operation has been applied,问题出在遍历AeccAlignmentsSiteless集合的代码部分,C#和VB.NET实现均存在该问题。
原问题代码
AcadApplication ACAD = (AcadApplication)System.Runtime.InteropServices.Marshal.GetActiveObject("AutoCAD.Application.24"); AcadDocument ADOC = ACAD.ActiveDocument; AeccApplication CivilApp = ACAD.GetInterfaceObject("AeccXUiLand.AeccApplication.13.4"); AeccDocument AeccDoc = (AeccDocument)CivilApp.ActiveDocument; AeccAlignmentsSiteless aliS = AeccDoc.AlignmentsSiteless; AeccAlignment TAlignment; object o1; object o2; AcadText AliName = null; ADOC.Utility.GetEntity(out o1, out o2, "Select an alignment name on CAD"); AliName = (AcadText)o1; // HERE THE PROBLEM! foreach (AeccAlignment item in aliS) { if (AliName.TextString == item.Name.ToString()) { TAlignment = item; break; } }
问题原因与修复方案
AeccAlignmentsSiteless是COM对象集合,不支持C#原生foreach遍历(未实现兼容的IEnumerable接口),必须通过COM集合标准的Item属性结合索引访问,且COM集合索引通常从1开始而非0。
修改后的代码
AcadApplication ACAD = (AcadApplication)System.Runtime.InteropServices.Marshal.GetActiveObject("AutoCAD.Application.24"); AcadDocument ADOC = ACAD.ActiveDocument; AeccApplication CivilApp = ACAD.GetInterfaceObject("AeccXUiLand.AeccApplication.13.4"); AeccDocument AeccDoc = (AeccDocument)CivilApp.ActiveDocument; AeccAlignmentsSiteless aliS = AeccDoc.AlignmentsSiteless; AeccAlignment TAlignment = null; object o1; object o2; ADOC.Utility.GetEntity(out o1, out o2, "Select an alignment name on CAD"); // 增加类型校验,避免非文本对象导致的转换错误 if (!(o1 is AcadText)) { ADOC.Utility.Prompt("请选择CAD文本对象!"); return; } AcadText AliName = (AcadText)o1; // 改用COM集合兼容的遍历方式 int alignmentCount = aliS.Count; for (int i = 0; i < alignmentCount; i++) { // COM集合索引从1开始 AeccAlignment item = aliS.Item(i + 1) as AeccAlignment; if (item != null && AliName.TextString.Equals(item.Name, StringComparison.OrdinalIgnoreCase)) { TAlignment = item; break; } }
额外优化说明
- 增加了选中对象的类型校验,避免非文本对象导致的类型转换异常
- 使用
StringComparison.OrdinalIgnoreCase增强匹配鲁棒性(若需严格大小写匹配可移除该参数) - 增加空值判断,防止
Item返回null时引发空引用异常
内容的提问来源于stack exchange,提问作者H3LLF1R3
相关产品推荐
相关产品推荐

