在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
相关产品推荐
相关产品推荐

