乐筑天下

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

eWrongDatabase on Database.Wblock 自 AutoCAD 2017 起

[复制链接]

14

主题

32

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
88
发表于 2018-6-19 08:23:28 | 显示全部楼层 |阅读模式
你好,
我有一个问题。从今天开始,我测试我的代码以将autocadversion从2014年更改为2017年。
在2014年工作正常,但在2017年抛出eWrongDatase错误。我的失败是什么?
2014年的代码工作:
  1.                                                     // objectIds selected by typevalue selection on editor
  2.                                                     selectedIds = new ObjectIdCollection(acPromptSelectionResult.Value.GetObjectIds());
  3.                                                     if (selectedIds != null)
  4.                                                     {
  5.                                                         if (selectedIds.Count > 0)
  6.                                                         {
  7.                                                             String newFilename = "";
  8.                                                             if (item.UseCurrentDwgName)
  9.                                                             {
  10.                                                                 newFilename = System.IO.Path.GetFileName(myTransaction.AcDocument.Name);
  11.                                                                 newFilename = newFilename.Remove(newFilename.Length - 4);
  12.                                                                 if (!ClassStringTools.IsNullOrWhiteSpace(item.Prefix))
  13.                                                                     newFilename = item.Prefix + newFilename;
  14.                                                                 if (!ClassStringTools.IsNullOrWhiteSpace(item.Postfix))
  15.                                                                     newFilename += item.Postfix;
  16.                                                                 newFilename += ".dwg";
  17.                                                             }
  18.                                                             else
  19.                                                             {
  20.                                                                 newFilename = item.ManualSeparationName;
  21.                                                                 if (!newFilename.ToLower().EndsWith(".dwg"))
  22.                                                                     newFilename += ".dwg";
  23.                                                             }
  24.                                                             if (System.IO.Directory.Exists(item.Path))
  25.                                                             {
  26.                                                                 newFilename = ClassFileTools.addBackslashIfMissing(item.Path) + newFilename;
  27.                                                                 Database oldACDatabase = HostApplicationServices.WorkingDatabase;
  28.                                                                 using (Document newDoc = DocumentCollectionExtension.Add(Application.DocumentManager, AppSettingsSeparation.getSettings().NewDWGTemplate))
  29.                                                                     //Application.DocumentManager.Add(AppSettingsSeparation.getSettings().NewDWGTemplate))
  30.                                                                 {
  31.                                                                     Boolean canWrite = true;
  32.                                                                     using (DocumentLock newDocLoc = newDoc.LockDocument())
  33.                                                                     {
  34.                                                                         using (Database newDb = newDoc.Database)
  35.                                                                         {                                                                           
  36.                                                                             try
  37.                                                                             {
  38.                                                                                 if (System.IO.File.Exists(newFilename))
  39.                                                                                 {
  40.                                                                                     if (!ClassFileTools.DeleteToRecycleBin(newFilename))
  41.                                                                                         canWrite = false;
  42.                                                                                 }
  43.                                                                                 if (canWrite)
  44.                                                                                 {
  45.                                                                                    // -------- now chrashed -----
  46.                                                                                    myTransaction.AcDatabase.Wblock(newDb, selectedIds, Point3d.Origin, DuplicateRecordCloning.Ignore);
  47.                                                                                    // <<< this crashed.
  48.                                                                                 }
  49.                                                                             }
  50.                                                                             catch (System.Exception ex)
  51.                                                                             {
  52.                                                                                 clEditor.LogException(ex);
  53.                                                                                 Log.LogException(ex);
  54.                                                                             }
  55.                                                                         }
  56.                                                                     }
  57.                                                                     if (canWrite)
  58.                                                                     {
  59.                                                                         try
  60.                                                                         {
  61.                                                                             clTransaction newTransaction = clSingletonTransaktionsManager.Instance.getTransaction(newDoc, TRANSACTIONNAME); // is my transactionmanager
  62.                                                                             clDatabase.purgeGeoPlaceMarker(newTransaction);
  63.                                                                             if (iAmNotAutoCAD)
  64.                                                                                 clKillProxy.cleanCivilObjects(newTransaction);
  65.                                                                             clSingletonTransaktionsManager.Instance.CommitTransaction(newTransaction);
  66.                                                                             clTransaction.lockDatabase(newDoc);
  67.                                                                             newDoc.Database.SaveAs(newFilename, DwgVersion.Newest);
  68.                                                                             newDoc.CloseAndDiscard();
  69.                                                                             result = true;
  70.                                                                         }
  71.                                                                         catch (System.Exception ex)
  72.                                                                         {
  73.                                                                             Log.LogException(ex);
  74.                                                                             clEditor.LogException(ex);
  75.                                                                             result = false;
  76.                                                                         }
  77.                                                                     }
  78.                                                                     else
  79.                                                                     {
  80.                                                                         newDoc.CloseAndDiscard();
  81.                                                                         result = false;
  82.                                                                     }
  83.                                                                 }
  84.                                                                 Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument = sourceDocument;
  85.                                                                 }
  86.                                                             }
  87.                                                         }
  88.                                                     }

有任何机构在2017年工作的例子吗?
问候马里奥

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

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

使用道具 举报

4

主题

219

帖子

4

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
238
发表于 2018-6-19 09:45:25 | 显示全部楼层

请参阅发生崩溃的代码行中的红色粗体部分。您没有显示“myTransaction”对象是什么(我只能猜测它是一个可能继承或包含事务类的自定义类),以及它的属性 AcDatabase 是什么(以及如何获取它)。根据代码逻辑,AcDatabase 应该是当前图形(在代码打开要阻止的数据的新图形之前)。
您没有显示的另一个关键内容是执行代码的上下文:应用程序上下文或文档上下文。同样,根据代码的最后一行判断,您将MdiDocument设置为“sourceDocument”,我猜您在应用程序上下文中运行代码(您设置了CommandFlags.Session标志)。
由于 Acad2014 版本(即 2015 及更高版本)之后的 Acad2014 的主要变化是删除了 Fiber,如果在执行命令/自定义应用程序期间活动文档发生更改,这将导致问题,我怀疑这是崩溃的可能原因,因为您声称它适用于 Acad2014。
从我的代码逻辑中可以看出,我认为您的代码不需要在应用程序上下文中运行,因为您打开了一个新文档以将数据复制到其中,因此它不必是 MdiActiveDocument。是的,如果没有 CommandFlags.Sessioon 标志,在文档上下文中运行的代码仍然可以在 AutoCAD 中打开文档,新打开的文档根本不会成为 MdiActiveDocument。虽然如果你有 CommandFlas.Session,那么喵喳地打开的文档会自动变成 NdiActiveDocument。
在没有看到更多相关代码的情况下,我建议您尝试以下两种方法之一:
1.删除“CommandFlags.Session”标志(如果您使用了它
),或者2.更改此行
myTransaction.AcDatabase.Wblock(....);

sourceDatabase.Wblock(...);//假设变量“sourceDatabase”被正确地指向从中选择实体的有效数据库。
回复

使用道具 举报

14

主题

32

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
88
发表于 2018-6-20 05:28:54 | 显示全部楼层
你好,袁,
谢谢你的回答。解决方案是“删除会话标志”。
@显示到“我的事务”...是我自己的transactionmanager。在过去的11年里,我从2007年开始在autocad上编程。在这段时间里,发展了许多图书馆....
如果新autocad版本中的这些库有问题,从post中混合出我自己的库代码是很棘手的。非常感谢和问候马里奥
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-6-8 05:16 , Processed in 0.500085 second(s), 58 queries .

© 2020-2025 乐筑天下

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