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

ADN Club => Inventor API => Тема начата: filat от 16-03-2015, 15:49:12

Название: Вызов макроса из AddIn
Отправлено: filat от 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()
Но есть одно НО: если на проект макроса установлен пароль, то вызов не происходит. Как можно решить эту проблему не снимая пароля с проекта?
Название: Re: Вызов макроса из AddIn
Отправлено: Владимир Ананьев от 16-03-2015, 16:46:31
Это общий вопрос, не связанный никак с Inventor API. 
Попробуйте оттолкнуться от этих постов:
http://stackoverflow.com/questions/16174469/unprotect-vbproject-from-vb-code
http://www.pcreview.co.uk/threads/programmatically-open-locked-vbaproject.3371133/
http://stackoverflow.com/questions/24804329/open-password-protected-vba-project-programmatically
Название: Re: Вызов макроса из AddIn
Отправлено: anton.gorschnev от 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, или другие пути решения.
Название: Re: Вызов макроса из AddIn
Отправлено: Александр Ривилис от 21-01-2019, 15:28:40
anton.gorschnev,
Напоминаю про правило форматирования кода на нашем форуме (смотри у меня в подписи).
Название: Re: Вызов макроса из AddIn
Отправлено: anton.gorschnev от 21-01-2019, 16:09:47
Александр спасибо учту.
По поводу запуска макроса из Addin заметил еще одну вещь если первой открываю простую деталь то  процедура запуска формы не находится в том числе и в детали где
она есть, если первой открывал деталь с процедурой то соответственно форма пытается запустится и в детали где ее нет.
Название: Re: Вызов макроса из AddIn
Отправлено: anton.gorschnev от 21-01-2019, 16:33:57
Проблема в этом месте "ThisApplication.VBAProjects.Item(2)" коллекция наполняется по мере открытия файлов (первым всегда является "Проект_приложений") мне необходимо обращаться не по номеру коллекции а к той чей файл сейчас активен.
Название: Re: Вызов макроса из AddIn
Отправлено: Александр Ривилис от 21-01-2019, 18:49:56
anton.gorschnev,
ThisApplication.VBAProjects возвращает коллекцию InventorVBAProjects, состояющую из InventorVBAProject.
Каждый InventorVBAProject имеет своё имя (свойство Name).
ThisApplication.ActiveDocument возвращает активный документ Document
Document имеет свойство VBAProject, возвращающую соответствующий InventorVBAProject.
Думаю что этой информации должно быть достаточно для вызова правильной процедуры.
 
Название: Re: Вызов макроса из AddIn
Отправлено: mikazakov от 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?
Название: Re: Вызов макроса из AddIn
Отправлено: anton.gorschnev от 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