You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:33:35