Не всегда работает VBA скрипт пользовательского свойства в Architecture

Автор Тема: Не всегда работает VBA скрипт пользовательского свойства в Architecture  (Прочитано 5281 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
В Architecture 2016 создано пользовательское свойство с помощью скрипта VBA. В принципе, все работает и работает правильно... но не всегда. Если запустить Architecture и открыть нужный чертеж, то это свойство вычисляется и мы видим нужное значение. А вот если до запуска Architecture была открыт какая-либо другая программа 2016 линейки и остается открытой во время запуска архитектуры, то этот же код в этом же чертеже уже перестает работать. Выяснили, что ошибка происходит в строке:
Код - Visual Basic [Выбрать]
  1. Set SpaceObject = acadApp.ActiveDocument.ObjectIDToObject([Идентификаторобъекта])
но что с этим делать, и как исправить, пока не знаем.
Кто-нибудь с подобными проблемами сталкивался?

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Наверняка неправильное получение acadApp. Попробуй получить его как ObjectIDToObject([Идентификаторобъекта]).Document.Application
Хотя, честно говоря, я не очень понимаю необходимости определения пространства, в котором лежит объект. А если сильно надо - то почему бы не взять нечто типа ObjectIdToObject(ObjectIDToObject([Идентификаторобъекта]).OwnerId) ?
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Наверняка неправильное получение 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

Как его можно изменить, чтобы цеплялся к "правильному" автокаду?

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Если я правильно понимаю, то это пользовательское свойство должно брать для вхождения объекта Space какие-то данные. Зачем при этом использовать столь загогулистый метод?
Насколько я помню, можно сделать более хитро и менее заморочено: ставим объекты, потом для них выполняем маркировку, и данные считываем уже с маркировки.
P.S. Если свойство прописывается на вхождение объекта, то, может, попробовать нечто типа
RESULT = CStr(ObjectIDToObject([ObjectID]).Location(2)
?
« Последнее редактирование: 21-09-2016, 21:45:17 от Алексей Кулик »
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Как его можно изменить, чтобы цеплялся к "правильному" автокаду?
А код этот выполняется внутри AutoCAD или снаружи? Если внутри, то браться должен текущий AutoCAD, а если снаружи, то ты ничего не сделаешь. Только завершать остальные сеансы AutoCAD.
Внутри правильнее так:
Код - Visual Basic [Выбрать]
  1. Set acadApp = ThisDrawing.Application
и вместо
Код - Visual Basic [Выбрать]
  1. acadApp.ActiveDocument
использовать
Код - Visual Basic [Выбрать]
  1. ThisDrawing
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Это не VBA, а, скорее урезанный вариант VBS. Работает только в вертикальных приложениях типа АА / МЕР
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Подправил #3.
P.S. Лично я вообще старался не вызывать указатели на AcadApplication без крайней на то нужды: потери памяти дикие, а эффект часто практически нулевой. Я подозреваю, что в стиле объекта можно создать одно или несколько дополнительных свойств, которые и будут высчитывать все что необходимо, базируясь на значениях друг друга.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Это не VBA, а, скорее урезанный вариант VBS. Работает только в вертикальных приложениях типа АА / МЕР
И получить его Application прямым способом нельзя?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Насколько я помню, нет. Я вопросом этим плотно занимался примерно лет 9-10 назад, но не думаю, что с тех пор что-то в этом отношении поменялось.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!