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

在Design Automation运行AutoCAD插件时遇eNotAllowedForThisProxy错误求助

解决Design Automation中AutoCAD对象克隆的eNotAllowedForThisProxy错误

错误原因

eNotAllowedForThisProxy错误源于源DWG文件包含代理对象——这类对象依赖第三方应用的自定义实体,而Design Automation环境未加载对应第三方插件,导致无法正常克隆。本地运行正常是因为你的AutoCAD安装了对应插件,能识别这些实体。

解决方案

1. 过滤代理对象(最直接的临时方案)

在收集要复制的对象ID时,添加判断排除代理对象,只克隆AutoCAD原生支持的实体:

foreach (ObjectId entityId in modelSpace)
{
    Entity entity = acTrans.GetObject(entityId, OpenMode.ForRead) as Entity;
    if (entity != null && !entity.IsProxy) // 新增:跳过代理对象
    {
        acObjIdColl.Add(entityId);
    }
}

2. 加载第三方插件(需保留代理对象时)

如果必须复制代理对象,需将对应第三方插件(.arx/.dbx格式)打包到Design Automation的活动包中,并在代码中加载:

// 在打开源数据库前加载插件,路径为活动包内的相对路径
Application.LoadApplication(@"ThirdPartyPlugin.arx");

注意:确保插件兼容AutoCAD Core Console(Design Automation基于此运行)。

3. 调整克隆参数与目标空间权限

  • 目标模型空间需以ForWrite模式打开,否则无法写入克隆对象
  • 修改DuplicateRecordCloning参数为Replace,避免重复记录冲突
// 打开目标模型空间时改为ForWrite
BlockTableRecord acBlkTblRecNewDoc = acTrans.GetObject(
    acBlkTblNewDoc[BlockTableRecord.ModelSpace],
    OpenMode.ForWrite) as BlockTableRecord;

// 执行克隆时替换重复记录
acExDb.WblockCloneObjects(acObjIdColl, acBlkTblRecNewDoc.ObjectId, acIdMap, DuplicateRecordCloning.Replace, false);

4. 优化源数据库打开方式

调整源数据库的打开参数,避免自动修复代理对象引发的问题:

Database acExDb = new Database(false, true);
// 使用OpenForRead模式,关闭自动审计修复
acExDb.ReadDwgFile(dwgPath, FileOpenMode.OpenForRead, false, string.Empty);

修改后的完整代码

Database acExDb = new Database(false, true);
acExDb.ReadDwgFile(dwgPath, FileOpenMode.OpenForRead, false, string.Empty);

ObjectIdCollection acObjIdColl = new ObjectIdCollection();
using (DocumentLock acLckDocCur = acDoc.LockDocument())
{
    using (Transaction acTrans = acExDb.TransactionManager.StartTransaction())
    {
        BlockTable bt = acTrans.GetObject(acExDb.BlockTableId, OpenMode.ForRead) as BlockTable;
        BlockTableRecord modelSpace = acTrans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord;
        foreach (ObjectId entityId in modelSpace)
        {
            Entity entity = acTrans.GetObject(entityId, OpenMode.ForRead) as Entity;
            if (entity != null && !entity.IsProxy)
            {
                acObjIdColl.Add(entityId);
            }
        }
        acTrans.Commit();
    }
}

Database acDbNewDoc = acDoc.Database;
using (DocumentLock acLckDoc = acDoc.LockDocument())
{
    using (Transaction acTrans = acDbNewDoc.TransactionManager.StartTransaction())
    {
        BlockTable acBlkTblNewDoc = acTrans.GetObject(acDbNewDoc.BlockTableId, OpenMode.ForRead) as BlockTable;
        BlockTableRecord acBlkTblRecNewDoc = acTrans.GetObject(
            acBlkTblNewDoc[BlockTableRecord.ModelSpace],
            OpenMode.ForWrite) as BlockTableRecord;
        
        IdMapping acIdMap = new IdMapping();
        acExDb.WblockCloneObjects(acObjIdColl, acBlkTblRecNewDoc.ObjectId, acIdMap, DuplicateRecordCloning.Replace, false);
        acTrans.Commit();
    }
}

内容的提问来源于stack exchange,提问作者mahmoud hafez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 08:55:58