hanneng 2023-02-17 13:21 采纳率: 0%
浏览 68

用WblockCloneObjects克隆块,出现致命错误

请教一个问题,我在用 WblockCloneObjects 从外部文件克隆块时,有非常大的概率出现致命错误。
出错位置“sourceDb.WblockCloneObjects(blockIds, destDb.BlockTableId, mapping, DuplicateRecordCloning.Replace, false);”
调试拦截到的错误信息如下:0x00007FFAFDE79649 (acdb23.dll)处(位于 acad.exe 中)引发的异常: 0xC0000005: 读取位置 0x0000000000000600 时发生访问冲突。
请问一下有什么解决办法吗?
完整代码如下:

public static void ImportBlocksFromDwg(this Database destDb, string sourceFileName)
{
//创建一个新的数据库对象,作为源数据库,以读入外部文件中的对象
Database sourceDb = new Database(false, true);
try
{
//把DWG文件读入到一个临时的数据库中
sourceDb.ReadDwgFile(sourceFileName, System.IO.FileShare.Read, true, null);
sourceDb.CloseInput(true);
//创建一个变量用来存储块的ObjectId列表
ObjectIdCollection blockIds = new ObjectIdCollection();
//获取源数据库的事务处理管理器, 在源数据库中开始事务处理
using (Transaction tm = sourceDb.TransactionManager.StartTransaction())
{
//打开源数据库中的块表
BlockTable bt = tm.GetObject(sourceDb.BlockTableId, OpenMode.ForRead, false) as BlockTable;
//遍历每个块
foreach (ObjectId btrId in bt)
{
BlockTableRecord btr = tm.GetObject(btrId, OpenMode.ForRead, false) as BlockTableRecord;
//只加入命名块和非布局块到复制列表中
if (!btr.IsAnonymous && !btr.IsLayout)
{
blockIds.Add(btrId);
}
btr.Dispose();
}
bt.Dispose();
}
//定义一个IdMapping对象
IdMapping mapping = new IdMapping();
//从源数据库向目标数据库复制块表记录
//sourceDb.WblockCloneObjects(blockIds, destDb.BlockTableId, mapping, DuplicateRecordCloning.Ignore, false);
sourceDb.WblockCloneObjects(blockIds, destDb.BlockTableId, mapping, DuplicateRecordCloning.Replace, false);
}
catch (Autodesk.AutoCAD.Runtime.Exception ex)
{
Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("复制错误: " + ex.Message);
}
//操作完成,销毁源数据库
sourceDb.Dispose();
}
  • 写回答

2条回答 默认 最新

  • MarkHan_ 2023-02-17 13:52
    关注

    根据您提供的代码和错误信息,看起来问题出现在从源数据库向目标数据库复制块表记录的步骤中,具体地说是在调用 WblockCloneObjects 方法时出现了访问冲突的异常。

    这个问题可能与目标数据库中已经存在的块记录有关,如果目标数据库中已经存在相同名称的块记录,而且这些块记录的定义与源数据库中的块记录不同,那么在复制时就会出现冲突,导致访问冲突的异常。因为您的代码中使用了 DuplicateRecordCloning.Replace 参数,所以如果有冲突的话,就会把目标数据库中的块记录替换为源数据库中的块记录,这可能会引起问题。

    为了解决这个问题,您可以尝试使用 DuplicateRecordCloning.Ignore 参数代替 DuplicateRecordCloning.Replace 参数,这样就不会替换目标数据库中已经存在的块记录,而是忽略掉这些冲突。如果您需要替换冲突的块记录,可以在复制块记录之前手动删除掉目标数据库中已经存在的块记录。

    另外,您也可以尝试对源数据库和目标数据库进行一些清理操作,例如删除未使用的块记录、图层等,以减少复制过程中可能出现的冲突和错误。

    如果有帮您解决问题,麻烦点一下采纳,比心。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月17日

悬赏问题

  • ¥100 需要跳转番茄畅听app的adb命令
  • ¥50 寻找一位有逆向游戏盾sdk 应用程序经验的技术
  • ¥15 请问有用MZmine处理 “Waters SYNAPT G2-Si QTOF质谱仪在MSE模式下采集的非靶向数据” 的分析教程吗
  • ¥50 opencv4nodejs 如何安装
  • ¥15 adb push异常 adb: error: 1409-byte write failed: Invalid argument
  • ¥15 nginx反向代理获取ip,java获取真实ip
  • ¥15 eda:门禁系统设计
  • ¥50 如何使用js去调用vscode-js-debugger的方法去调试网页
  • ¥15 376.1电表主站通信协议下发指令全被否认问题
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证