Вызов макроса из AddIn

Автор Тема: Вызов макроса из AddIn  (Прочитано 6055 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн filatАвтор темы

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Вызов макроса из AddIn
« : 16-03-2015, 15:49:12 »
Программа позволяет вызывать макрос из AddIn:
Код - Visual Basic [Выбрать]
  1.             Dim invVBA As InventorVBAMember
  2.             invVBA = m_inventorApplication.VBAProjects.Item(1).InventorVBAComponents.Item("Module1").InventorVBAMembers("SetFullName") '
  3.            invVBA.Execute()
Но есть одно НО: если на проект макроса установлен пароль, то вызов не происходит. Как можно решить эту проблему не снимая пароля с проекта?
« Последнее редактирование: 21-01-2019, 15:30:28 от Александр Ривилис »

Оффлайн Владимир Ананьев

  • ADN DevHelp
  • *
  • Сообщений: 148
  • Карма: 8
Re: Вызов макроса из AddIn
« Ответ #1 : 16-03-2015, 16:46:31 »

Оффлайн anton.gorschnev

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 3
Re: Вызов макроса из AddIn
« Ответ #2 : 21-01-2019, 15:22:31 »
Хочу поднять эту тему в плане запуска макроса активной детали (сборки) из Addin.
Сейчас у меня получилось что при запуске простой детали (детали  не содержащей макросов ) все в порядке (в  Addin отлавливается ошибка процедура останавливается),
при запуске детали содержащей процедуру (деталь в которой есть процедура запуска формы и сама форма) тоже все норм (запускается форма),
но если открыта простая деталь и деталь с процедурой и активна простая деталь то при отработке кнопки Addin запускается процедура с детали содержащей процедуру и соответственно
выдает ошибку. По моей задумке   при отработке кнопки Addin  должна запускаться процедура именно с активного документа для открытия нужной формы, если в активном документе такой процедуры нет то и нечего запускать не надо.
Сейчас код запуска процедуры выглядит так

Код - Visual Basic [Выбрать]
  1.   Private Sub m_sampleButton_OnExecute(Context As NameValueMap) Handles m_PartRedaktorButton.OnExecute
  2.             Dim oApp As Inventor.Application
  3.             oApp = GetObject(, "Inventor.Application")
  4.             Dim invVBA As InventorVBAMember
  5.            
  6.             Try
  7.                 invVBA = oApp.VBAProjects.Item(2).InventorVBAComponents.Item("Module3").InventorVBAMembers("M1") '
  8.                invVBA.Execute()
  9.  
  10.             Catch
  11.                 MsgBox("Не нормализованная деталь!")
  12.                 Exit Sub
  13.  
  14.             End Try
  15.  
  16.         End Sub

Как я понял мне необходимо процедуру запуска формы переместить в "ThisDocument" VBA тогда она будет срабатывать только в активном документе соответственно необходимо переписать
код в Addin   "invVBA = oApp.VBAProjects.Item(2).InventorVBAComponents.Item("Module3").InventorVBAMembers("M1") " ???
Подскажите как добраться до процедуры в "ThisDocument" VBA, или другие пути решения.
« Последнее редактирование: 21-01-2019, 15:27:03 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вызов макроса из AddIn
« Ответ #3 : 21-01-2019, 15:28:40 »
anton.gorschnev,
Напоминаю про правило форматирования кода на нашем форуме (смотри у меня в подписи).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн anton.gorschnev

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 3
Re: Вызов макроса из AddIn
« Ответ #4 : 21-01-2019, 16:09:47 »
Александр спасибо учту.
По поводу запуска макроса из Addin заметил еще одну вещь если первой открываю простую деталь то  процедура запуска формы не находится в том числе и в детали где
она есть, если первой открывал деталь с процедурой то соответственно форма пытается запустится и в детали где ее нет.

Оффлайн anton.gorschnev

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 3
Re: Вызов макроса из AddIn
« Ответ #5 : 21-01-2019, 16:33:57 »
Проблема в этом месте "ThisApplication.VBAProjects.Item(2)" коллекция наполняется по мере открытия файлов (первым всегда является "Проект_приложений") мне необходимо обращаться не по номеру коллекции а к той чей файл сейчас активен.

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вызов макроса из AddIn
« Ответ #6 : 21-01-2019, 18:49:56 »
anton.gorschnev,
ThisApplication.VBAProjects возвращает коллекцию InventorVBAProjects, состояющую из InventorVBAProject.
Каждый InventorVBAProject имеет своё имя (свойство Name).
ThisApplication.ActiveDocument возвращает активный документ Document
Document имеет свойство VBAProject, возвращающую соответствующий InventorVBAProject.
Думаю что этой информации должно быть достаточно для вызова правильной процедуры.
 
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Александр Ривилис 23-01-2019, 16:12:43

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: Вызов макроса из AddIn
« Ответ #7 : 21-01-2019, 20:45:16 »
мне необходимо обращаться не по номеру коллекции а к той чей файл сейчас активен.
Ну собственно, Александр Ривилис уже ответил, что нужно смотреть в самом активном документе,  я только дополню ответ Ривилиса примером:
Код - Visual Basic [Выбрать]
  1. Sub test()
  2.  
  3. Dim doc As Document: Set doc = ThisApplication.ActiveDocument
  4. doc.VBAProject.InventorVBAComponents.Item(3).InventorVBAMembers.Item(1).Execute
  5.  
  6. End Sub
  7.  

P.S. VBA конечно хорошо, но что мешает портировать код из VBA в VB.NET?
« Последнее редактирование: 21-01-2019, 21:47:02 от Александр Ривилис »

Оффлайн anton.gorschnev

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 3
Re: Вызов макроса из AddIn
« Ответ #8 : 23-01-2019, 09:00:47 »
Спасибо за участие.
Все заработало, ниже рабочий код.

Код - vb.net [Выбрать]
  1. Private Sub m_PartRedaktorButton_OnExecute(Context As NameValueMap) Handles m_PartRedaktorButton.OnExecute
  2.             Dim m_inventorApplication As Inventor.Application
  3.             oApp = GetObject(, "Inventor.Application")
  4.             Dim invVBA As InventorVBAMember
  5.             Dim oPartDoc As PartDocument
  6.             oPartDoc = oApp.ActiveDocument
  7.             Try
  8.                 'invVBA = oApp.VBAProjects.Item(2).InventorVBAComponents.Item("Module3").InventorVBAMembers("M1")
  9.                 invVBA = oPartDoc.VBAProject.InventorVBAComponents.Item("ZapuskForm").InventorVBAMembers("ZapuskRedactora")
  10.                 invVBA.Execute()
  11.  
  12.             Catch
  13.                 MsgBox("Не нормализованная деталь!")
  14.                 Exit Sub
  15.  
  16.             End Try
  17.  
  18.         End Sub