Сообщество программистов Autodesk в СНГ

ADN Club => VBA => Тема начата: wl2000 от 23-11-2015, 21:48:53

Название: Ошибка в Private Sub AcadDocument_ObjectErased(ByVal ObjectID As LONG_PTR)
Отправлено: wl2000 от 23-11-2015, 21:48:53
Здравствуйте,

Происходит ошибка: Method 'ObjectIdToObject' of object 'IAcadDocument' failed

при выполнении следующего:

Код - Visual Basic [Выбрать]
  1. Private Sub AcadDocument_ObjectErased(ByVal ObjectID As LONG_PTR)
  2. Dim tempObj As AcadObject
  3.     Set tempObj = ThisDrawing.ObjectIdToObject(ObjectID) 'здесь ошибка
  4. End Sub

AutoCAD 2016, Windows 10 x64

Подскажите в чем проблема. Заранее спасибо
Название: Re: Ошибка в Private Sub AcadDocument_ObjectErased(ByVal ObjectID As LONG_PTR)
Отправлено: Александр Ривилис от 23-11-2015, 21:56:36
wl2000
Приветствую на форуме!
Происходит ошибка: Method 'ObjectIdToObject' of object 'IAcadDocument' failed
Всегда (т.е. при удалении любого примитива)?
Название: Re: Ошибка в Private Sub AcadDocument_ObjectErased(ByVal ObjectID As LONG_PTR)
Отправлено: wl2000 от 23-11-2015, 22:03:05
Я, собственно, только начал работать с макросом, где это нужно, поэтому я не могу сказать, что раньше работало, а сейчас нет. У меня только вхождения блоков в этом проекте - при попытке их удаления всегда происходит такая ошибка
Название: Re: Ошибка в Private Sub AcadDocument_ObjectErased(ByVal ObjectID As LONG_PTR)
Отправлено: Александр Ривилис от 23-11-2015, 22:07:51
Если я не ошибаюсь, то именно так и должно быть. Т.е. по ObjectId для удалённого объекта сам объект в VBA получить нельзя.
Название: Re: Ошибка в Private Sub AcadDocument_ObjectErased(ByVal ObjectID As LONG_PTR)
Отправлено: wl2000 от 23-11-2015, 22:21:24
Тогда, получается, при этом событии невозможно понять какой объект был удалён?
Название: Re: Ошибка в Private Sub AcadDocument_ObjectErased(ByVal ObjectID As LONG_PTR)
Отправлено: Александр Ривилис от 23-11-2015, 23:07:09
Тогда, получается, при этом событии невозможно понять какой объект был удалён?
Именно так. Нашёл тему, которой уже скоро 15 лет: http://forums.autodesk.com/t5/visual-basic-customization/objecterased-event-question/m-p/346276
Итак. Средствами VBA это сделать нельзя (можно при помощи ObjectARX и AutoCAD .NET API). Разве что до операции удаления хранить коллекцию ObjectID и описаний объектов, которые тебя интересуют и потом находить по ObjectID удалённого объекта его описание.
Название: Re: Ошибка в Private Sub AcadDocument_ObjectErased(ByVal ObjectID As LONG_PTR)
Отправлено: wl2000 от 23-11-2015, 23:35:30
Вас понял. Спасибо большое
Название: Re: Ошибка в Private Sub AcadDocument_ObjectErased(ByVal ObjectID As LONG_PTR)
Отправлено: Александр Ривилис от 23-11-2015, 23:38:30
Пожалуйста. Я бы рекомендовал использовать в AutoCAD не VBA, а .NET API.
Название: Re: Ошибка в Private Sub AcadDocument_ObjectErased(ByVal ObjectID As LONG_PTR)
Отправлено: wl2000 от 23-11-2015, 23:42:46
я пробовал - не понравилось
Название: Re: Ошибка в Private Sub AcadDocument_ObjectErased(ByVal ObjectID As LONG_PTR)
Отправлено: Александр Ривилис от 24-11-2015, 00:20:50
я пробовал - не понравилось
"Это ты просто его готовить не умеешь!" (c) :)
Возможности AutoCAD .NET API значительно шире возможностей VBA в AutoCAD.
Название: Re: Ошибка в Private Sub AcadDocument_ObjectErased(ByVal ObjectID As LONG_PTR)
Отправлено: wl2000 от 24-11-2015, 00:30:00
возможности гораздо шире, я это знаю
но и неудобства тоже большие - транзакции всякие, невозможно редактировать код "на лету", для проверки работы нужно компилировать код и запускать автокад (много-много раз, а это медленно очень)

может, действительно, не умею готовить
Название: Re: Ошибка в Private Sub AcadDocument_ObjectErased(ByVal ObjectID As LONG_PTR)
Отправлено: Александр Ривилис от 24-11-2015, 01:00:22
но и неудобства тоже большие - транзакции всякие
Можно и не пользоваться ими. Я тут неоднократно приводил примеры как обходится без транзакций.
невозможно редактировать код "на лету"
Для меня это - достоинство. Иначе в случае аварийной ситуации, когда AutoCAD вылетает, теряешь все изменения кода.
для проверки работы нужно компилировать код и запускать автокад
Это пожалуй единственное неудобство. Ну тогда ObjectARX - там можно загружать/выгружать приложение. Единственно что практически любая ошибка и AutoCAD крэшится.
много-много раз
А вот это зависит от того, насколько чистый код ты сразу пишешь. Например, для проверки вот этого кода мне понадобилось два запуска AutoCAD (и то в первый раз я создавал тестовый блок): http://adn-cis.org/forum/index.php?topic=3229.msg13471#msg13471
Название: Re: Ошибка в Private Sub AcadDocument_ObjectErased(ByVal ObjectID As LONG_PTR)
Отправлено: wl2000 от 24-11-2015, 08:33:52
Я тут неоднократно приводил примеры как обходится без транзакций
где можно посмотреть?
Название: Re: Ошибка в Private Sub AcadDocument_ObjectErased(ByVal ObjectID As LONG_PTR)
Отправлено: Александр Ривилис от 24-11-2015, 09:24:46
где можно посмотреть?
Ну вот несколько штук:
http://adn-cis.org/sozdanie-polyline3d-bez-ispolzovaniya-tranzakczii.html
http://adn-cis.org/preobrazovanie-koordinat-tochki-iz-prostranstva-lista-v-prostranstvo-modeli-net-api.html
http://adn-cis.org/kak-udalit-neispolzuemyie-i-neobrabotannyie-ssyilki-na-dannyie-%28datalink%29.html
http://adn-cis.org/kak-poluchit-neispolzuemyie-vneshnie-ssyilki-rastryi-i-podlozhki.html
Название: Re: Ошибка в Private Sub AcadDocument_ObjectErased(ByVal ObjectID As LONG_PTR)
Отправлено: wl2000 от 24-11-2015, 09:44:24
а вот там где про 3Дполилинию без транзакций - это ко всем примитивам применимо?
Название: Re: Ошибка в Private Sub AcadDocument_ObjectErased(ByVal ObjectID As LONG_PTR)
Отправлено: Александр Ривилис от 24-11-2015, 09:46:03
а вот там где про 3Дполилинию без транзакций - это ко всем примитивам применимо?
Конечно.
Название: Re: Ошибка в Private Sub AcadDocument_ObjectErased(ByVal ObjectID As LONG_PTR)
Отправлено: wl2000 от 24-11-2015, 09:48:56
Спасибо Александр. Может и правда на .нет начать переходить.
Название: Re: Ошибка в Private Sub AcadDocument_ObjectErased(ByVal ObjectID As LONG_PTR)
Отправлено: Александр Ривилис от 24-11-2015, 09:54:47
Может и правда на .нет начать переходить.
Я считаю, что уже пора. И сразу на C#. Хотябы по той причине, что на нём примеров значительно больше, чем на VB.NET.
Название: Re: Ошибка в Private Sub AcadDocument_ObjectErased(ByVal ObjectID As LONG_PTR)
Отправлено: wl2000 от 24-11-2015, 09:58:17
неет. только не на C#

никаких фигурных скобочек и точек с запятой!