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

ADN Club => Адаптация AutoCAD и вертикальных приложений => Тема начата: Алексей Терно от 21-09-2016, 11:03:49

Название: Не всегда работает VBA скрипт пользовательского свойства в Architecture
Отправлено: Алексей Терно от 21-09-2016, 11:03:49
В Architecture 2016 создано пользовательское свойство с помощью скрипта VBA. В принципе, все работает и работает правильно... но не всегда. Если запустить Architecture и открыть нужный чертеж, то это свойство вычисляется и мы видим нужное значение. А вот если до запуска Architecture была открыт какая-либо другая программа 2016 линейки и остается открытой во время запуска архитектуры, то этот же код в этом же чертеже уже перестает работать. Выяснили, что ошибка происходит в строке:
Код - Visual Basic [Выбрать]
  1. Set SpaceObject = acadApp.ActiveDocument.ObjectIDToObject([Идентификаторобъекта])
но что с этим делать, и как исправить, пока не знаем.
Кто-нибудь с подобными проблемами сталкивался?
Название: Re: Не всегда работает VBA скрипт пользовательского свойства в Architecture
Отправлено: Алексей Кулик от 21-09-2016, 14:10:25
Наверняка неправильное получение acadApp. Попробуй получить его как ObjectIDToObject([Идентификаторобъекта]).Document.Application
Хотя, честно говоря, я не очень понимаю необходимости определения пространства, в котором лежит объект. А если сильно надо - то почему бы не взять нечто типа ObjectIdToObject(ObjectIDToObject([Идентификаторобъекта]).OwnerId) ?
Название: Re: Не всегда работает VBA скрипт пользовательского свойства в Architecture
Отправлено: Алексей Терно от 21-09-2016, 14:34:25
Наверняка неправильное получение acadApp
Я тоже так думаю - похоже, что находит первый запущенный.

Вот код:
Код - Visual Basic [Выбрать]
  1. Set acadApp = GetObject(,"AutoCAD.Application")
  2. acadVerString = acadApp.ActiveDocument.GetVariable("ACADVER")
  3.  
  4. Select Case acadVerString
  5.         Case "20.1s (LMS Tech)"  'ACA-2016
  6.                 aecBaseVer = "AecX.AecBaseApplication.7.8"
  7.         Case Else
  8.                 aecBaseVer = "Unknown"
  9. End Select
  10.  
  11. If aecBaseVer = "Unknown" Then
  12.         RESULT = "Unknown Version"
  13. Else
  14.         Set aecBase = acadApp.GetInterfaceObject(aecBaseVer)
  15.         aecBase.Init acadApp
  16.         Set SpaceObject = acadApp.ActiveDocument.ObjectIDToObject([ObjectID])
  17.         Set UtilityObject = aecBase.ActiveDocument.Utility
  18.  
  19.         SpaceObjectLocation = UtilityObject.ConvertToVariantArray(SpaceObject.location)
  20.         LocationX = SpaceObjectLocation(0)
  21.         LocationY = SpaceObjectLocation(1)
  22.         LocationZ = SpaceObjectLocation(2)
  23.  
  24.         RESULT = CStr(LocationZ)
  25. End If

Как его можно изменить, чтобы цеплялся к "правильному" автокаду?
Название: Re: Не всегда работает VBA скрипт пользовательского свойства в Architecture
Отправлено: Алексей Кулик от 21-09-2016, 16:11:45
Если я правильно понимаю, то это пользовательское свойство должно брать для вхождения объекта Space какие-то данные. Зачем при этом использовать столь загогулистый метод?
Насколько я помню, можно сделать более хитро и менее заморочено: ставим объекты, потом для них выполняем маркировку, и данные считываем уже с маркировки.
P.S. Если свойство прописывается на вхождение объекта, то, может, попробовать нечто типа
RESULT = CStr(ObjectIDToObject([ObjectID]).Location(2)
?
Название: Re: Не всегда работает VBA скрипт пользовательского свойства в Architecture
Отправлено: Александр Ривилис от 21-09-2016, 18:09:51
Как его можно изменить, чтобы цеплялся к "правильному" автокаду?
А код этот выполняется внутри AutoCAD или снаружи? Если внутри, то браться должен текущий AutoCAD, а если снаружи, то ты ничего не сделаешь. Только завершать остальные сеансы AutoCAD.
Внутри правильнее так:
Код - Visual Basic [Выбрать]
  1. Set acadApp = ThisDrawing.Application
и вместо
Код - Visual Basic [Выбрать]
  1. acadApp.ActiveDocument
использовать
Код - Visual Basic [Выбрать]
  1. ThisDrawing
Название: Re: Не всегда работает VBA скрипт пользовательского свойства в Architecture
Отправлено: Алексей Кулик от 21-09-2016, 21:44:32
Это не VBA, а, скорее урезанный вариант VBS. Работает только в вертикальных приложениях типа АА / МЕР
Название: Re: Не всегда работает VBA скрипт пользовательского свойства в Architecture
Отправлено: Алексей Кулик от 21-09-2016, 21:47:19
Подправил #3.
P.S. Лично я вообще старался не вызывать указатели на AcadApplication без крайней на то нужды: потери памяти дикие, а эффект часто практически нулевой. Я подозреваю, что в стиле объекта можно создать одно или несколько дополнительных свойств, которые и будут высчитывать все что необходимо, базируясь на значениях друг друга.
Название: Re: Не всегда работает VBA скрипт пользовательского свойства в Architecture
Отправлено: Александр Ривилис от 21-09-2016, 21:58:36
Это не VBA, а, скорее урезанный вариант VBS. Работает только в вертикальных приложениях типа АА / МЕР
И получить его Application прямым способом нельзя?
Название: Re: Не всегда работает VBA скрипт пользовательского свойства в Architecture
Отправлено: Алексей Кулик от 21-09-2016, 22:02:56
Насколько я помню, нет. Я вопросом этим плотно занимался примерно лет 9-10 назад, но не думаю, что с тех пор что-то в этом отношении поменялось.