XaraMathers Posted September 7, 2020 Report Share Posted September 7, 2020 Уважаемые друзья, всем доброго дня! Столкнулся с неприятной проблемой при попытке адаптировать написанное для AutoCAD ранее .NET-приложение под NanoCAD. По всей видимости, есть определенная разница в API (как бы могло быть иначе) между этими САПР. А именно, проблема с тем, что многие классы и методы не реализованы, а вместо этого стоят «заглушки» - так, что ли? Кто-нибудь сталкивался с чем-то подобным? Нормальной документации по Nano20.1 SDK не нашел, и как будто в темноте черную кошку ищу, получается. В частности, вот пример: обычное объявление static LayerTable lt; В Нано дает одно, а в акаде другое (см. скриншоты). Как говорится, то ли лыжи не едут... NanoCAD: AutoCAD: Заранее всем спасибо! Quote Link to comment Share on other sites More sharing options...
ISL Posted September 7, 2020 Report Share Posted September 7, 2020 Приведите, пожалуйста, код, в котором получено значение lt. Quote Link to comment Share on other sites More sharing options...
Robink Posted September 7, 2020 Report Share Posted September 7, 2020 using (Transaction tr = db.TransactionManager.StartTransaction()) { var lt = tr.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable; } Quote Link to comment Share on other sites More sharing options...
XaraMathers Posted September 7, 2020 Author Report Share Posted September 7, 2020 8 минут назад, Robink сказал: var lt = tr.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable; Почти 14 минут назад, ISL сказал: Приведите, пожалуйста, код, в котором получено значение lt. lt = tr.GetObject(dbSource.LayerTableId, OpenMode.ForRead) as LayerTable; Собственно, Robink попал в точку Quote Link to comment Share on other sites More sharing options...
ISL Posted September 7, 2020 Report Share Posted September 7, 2020 Взял пример SDK HelloHost, добавил в команду HelloHost_Example1 строки: Database db = HostApplicationServices.WorkingDatabase; using (Transaction tr = db.TransactionManager.StartTransaction()) { var lt = tr.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable; } Собрал в VS2012, загрузил в 20.1 x64: Что я делаю не так? Quote Link to comment Share on other sites More sharing options...
XaraMathers Posted September 7, 2020 Author Report Share Posted September 7, 2020 2 часа назад, ISL сказал: Что я делаю не так? Вы знаете, мне кажется, что это я что-то делаю не так... Один и тот же (со своими библиотеками, само собой) код в автокаде отрабатывает, а в нанокаде - нет... В момент закрытия транзакции в акаде значение lt остается в неизменном виде, а в нано - сразу после tr.Commit(); слетает, и выглядит, как у меня на скриншоте выше. Quote Link to comment Share on other sites More sharing options...
ISL Posted September 7, 2020 Report Share Posted September 7, 2020 Ну так это давно известно, что AutoCAD не соответствует своей собственной документации и рекомендациям по времени жизни объектов, которые живут дольше, чем должны. Но практика работы с большими приложениями, работающими под обеими платформами, показывает, что отказ от обращений к закрытым объектам повышает надёжность приложений. У нас всё просто: закрыли — значит закрыли, проблема видна сразу. В АвтоКАДе же такой код почти всегда работает, но иногда сборщик мусора приходит чуть раньше и начинаются блуждающие проблемы. Справедливо и для C++, где нет сборщика мусора, но эффект есть. Quote Link to comment Share on other sites More sharing options...
XaraMathers Posted September 7, 2020 Author Report Share Posted September 7, 2020 14 минут назад, ISL сказал: закрыли — значит закрыли А Вы не могли бы дать совет, как вынести значение за пределы транзакции? Иначе переделывать код уж ооочень долго придётся... Quote Link to comment Share on other sites More sharing options...
Robink Posted September 7, 2020 Report Share Posted September 7, 2020 Лучше переделывайте Quote Link to comment Share on other sites More sharing options...
XaraMathers Posted September 7, 2020 Author Report Share Posted September 7, 2020 49 минут назад, Robink сказал: Лучше переделывайте Спасибо, последую совету, я поместил все в одну транзакцию. Вопрос мой касаемо выноса значения за пределы tr наверное так, спортивного интереса ради Quote Link to comment Share on other sites More sharing options...
Robink Posted September 7, 2020 Report Share Posted September 7, 2020 http://bushman-andrey.blogspot.com/2013/01/database-autocad.html 1 2 Quote Link to comment Share on other sites More sharing options...
ISL Posted September 8, 2020 Report Share Posted September 8, 2020 Чисто из спортивного интереса, вынести данные из транзакции (именно данные, а не объект) можно при помощи Clone(), но это получится уже другой объект, не добавленный в базу чертежа. Quote Link to comment Share on other sites More sharing options...
XaraMathers Posted September 14, 2020 Author Report Share Posted September 14, 2020 (edited) Дорогие друзья! Случилась несколько иная проблема, но симптомы похожи: Document adoc = App.DocumentManager.MdiActiveDocument; Editor ed = adoc.Editor; try { PromptNestedEntityResult rs; rs = ed.GetNestedEntity("\nВыберите объект внешней ссылки: "); } Выбрасывает Exception при выборе любой внешней ссылки: При выборе любого другого элемента объект успешно берется, но нужный мне код не выполняется. В этот транзакции ни при чем. Не понимаю, что я делаю не так... Опять же, в акаде все работало нормально... Подскажите пожалуйста, "куда копать?" Edited September 14, 2020 by XaraMathers Quote Link to comment Share on other sites More sharing options...
ISL Posted September 14, 2020 Report Share Posted September 14, 2020 В 20.1 описанного эффекта не наблюдаю. В какой версии смотрите? Quote Link to comment Share on other sites More sharing options...
XaraMathers Posted September 14, 2020 Author Report Share Posted September 14, 2020 1 час назад, ISL сказал: В 20.1 описанного эффекта не наблюдаю. В какой версии смотрите? Версия 20.1 СПДС Quote Link to comment Share on other sites More sharing options...
ISL Posted September 14, 2020 Report Share Posted September 14, 2020 Может, от файлов зависит? Я попробовал пару — не повторяется. Опять же, добавлял код в пример HelloHost. Quote Link to comment Share on other sites More sharing options...
XaraMathers Posted September 16, 2020 Author Report Share Posted September 16, 2020 (edited) В 14.09.2020 в 17:55, ISL сказал: Может, от файлов зависит? Я попробовал пару — не повторяется. Опять же, добавлял код в пример HelloHost. Сделал тестовую процедуру: public void TestCommand() { Document adoc = HostMgd.ApplicationServices.Application.DocumentManager.MdiActiveDocument; if (adoc == null) return; Editor ed = adoc.Editor; try { PromptNestedEntityResult rss; rss = ed.GetNestedEntity("\nВыберите объект внешней ссылки: "); if (rss.Status != PromptStatus.OK) return; ObjectId idSel = rss.ObjectId; ObjectId[] objIds = rss.GetContainers();//список id контейнеров } catch (System.Exception ex) { App.ShowModalDialog(new ErrorForm("Ошибка при выгрузке вложенной внешней ссылки", ex)); } } В момент rss = ed.GetNestedEntity сразу сваливается с ошибкой "Error during command executing: 'Параметр задан неверно'." Что тут не так-то?... АП: И да, пробовал на разных файлах с разными xref... Edited September 16, 2020 by XaraMathers Quote Link to comment Share on other sites More sharing options...
XaraMathers Posted September 22, 2020 Author Report Share Posted September 22, 2020 В 14.09.2020 в 17:55, ISL сказал: Может, от файлов зависит? Я попробовал пару — не повторяется. Опять же, добавлял код в пример HelloHost. А можете добавить вышеприведенный код? Отработает? Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.