乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 51|回复: 2

从样板图形添加块-WblockCloneObjects-eWasOpenForNotify

[复制链接]

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2015-5-26 03:55:21 | 显示全部楼层 |阅读模式
我正在尝试使用WblockCloneObjects从模板绘图中添加块,但不断收到
eWasOpenForNotify
错误。
  1.         ///
  2.         /// Checks if the block definition is in the active drawing, if not, pull it from the template and add it
  3.         ///
  4.         /// Name of the block.
  5.         ///
  6.         public static ObjectId AddBlockDef(String blockName)
  7.         {
  8.             using (Transaction acTr = Active.TransactionManager.StartTransaction())
  9.             {
  10.                 BlockTable bt = (BlockTable)acTr.GetObject(Active.Database.BlockTableId, OpenMode.ForNotify);
  11.                 ObjectId blockId;
  12.                 if (!bt.Has(blockName))
  13.                 {
  14.                     ObjectIdCollection ids = new ObjectIdCollection();
  15.                     // get the template drawing
  16.                     using (Database dwtDb = new Database(false, true))
  17.                     {
  18.                         string dllPath = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
  19.                         String dwtPath =dllPath + @"\AID-Template.dwt";
  20.                         dwtDb.ReadDwgFile(dwtPath, System.IO.FileShare.ReadWrite, true, "");
  21.                         using (Transaction tr = dwtDb.TransactionManager.StartTransaction())
  22.                         {
  23.                             BlockTable dwtBt = (BlockTable)tr.GetObject(dwtDb.BlockTableId, OpenMode.ForRead);
  24.                             // does it exist
  25.                             if (dwtBt.Has(blockName))
  26.                             {
  27.                                 ids.Add(dwtBt[blockName]);
  28.                             }
  29.                             tr.Commit();
  30.                         }
  31.                     }
  32.                     if (ids.Count > 0)
  33.                     // add it to active drawing
  34.                     {
  35.                         IdMapping iMap = new IdMapping();
  36.                         Active.Database.WblockCloneObjects(ids, Active.Database.BlockTableId, iMap,
  37.                             DuplicateRecordCloning.Ignore, false); //<-- eWasOpenForNotify Error here
  38.                     }
  39.                     else
  40.                     {
  41.                         Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("\nBlock: " + blockName +" not found.");
  42.                     }
  43.                 }
  44.                 blockId = acTr.GetObject(bt[blockName], OpenMode.ForRead).ObjectId;               
  45.                 acTr.Commit();
  46.                 return blockId;
  47.             }
  48.         }

有什么想法吗?
我从这里获得了代码的基础。也许我以错误的方式去做了?理论上,模板 dwt 文件将位于支持路径中。WblockCloneObjects看起来确实是一种绕开的方式,但我知道什么......

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2015-5-26 06:29:31 | 显示全部楼层
嗨,
只要快速查看一下代码中的异常类型,就可以注意到:
block table Bt =(block table)acTr。GetObject(活动。Database.BlockTableId,OpenMode。for notify);
回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2015-5-27 00:12:23 | 显示全部楼层
将读取模式更改为读/写或读取时,它仍然会崩溃。
显然很活跃。当数据库上有任何事务处于打开状态时,无法调用Database.WblockCloneObjects。我进行了重构,将WblockCloneObjects从任何事务中取出,代码又开始工作了。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-5 02:47 , Processed in 0.215277 second(s), 58 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表