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

ADN Club => Inventor API => Тема начата: anton.gorschnev от 12-03-2019, 16:52:36

Название: События в VBA
Отправлено: anton.gorschnev от 12-03-2019, 16:52:36
Добрый день. Помогите разобраться с  событиями в VBA для объектов Inventor. Если несложно поделитесь примером кода с пояснениями в VBA например на событие OnSaveDocument.
В Excel все просто выберешь объект и его события на вкладках, в  Inventor эти списки пустые возможно необходимо подключения библиотеки событий?
Название: Re: События в VBA
Отправлено: mikazakov от 13-03-2019, 08:19:22
События могут вызываться только из класса, поэтому к макросу нужно создать класс.
В общем здесь можно поступить двояко: можно прявязаться к событию приложения, а можно привязаться к событию конкретного документа
Через события приложения. Макрос:
Код - Visual Basic [Выбрать]
  1. Sub ApplicationSaveRun()
  2.  
  3. Dim SaveEvent As ApplicationSave
  4. Set SaveEvent = New ApplicationSave
  5.  
  6. Dim flag As Boolean: flag = True
  7.  
  8. Do While flag
  9. DoEvents
  10. Loop
  11.  
  12. End Sub
  13.  

Теперь создайте класс с именем ApplicationSave и вставьте туда следующий код:

Код - Visual Basic [Выбрать]
  1. Private WithEvents e_onsave As ApplicationEvents
  2.  
  3. Private Sub Class_Initialize()
  4. Set e_onsave = ThisApplication.ApplicationEvents
  5. End Sub
  6.  
  7. Private Sub e_onsave_OnSaveDocument(ByVal DocumentObject As Document, ByVal BeforeOrAfter As EventTimingEnum, ByVal Context As NameValueMap, HandlingCode As HandlingCodeEnum)
  8.  
  9.     If BeforeOrAfter = kBefore Then MsgBox "Before Save"
  10.     If BeforeOrAfter = kAfter Then MsgBox "kAfter Save"
  11.     If BeforeOrAfter = kAbort Then MsgBox "Abort Save"
  12.    
  13. End Sub
  14.  

**********************************************
теперь вариант через привязку к событию самого документа
Код - Visual Basic [Выбрать]
  1. Sub DocumentSaveRun()
  2.  
  3. Dim SaveEvent As DocumentSave
  4. Set SaveEvent = New DocumentSave
  5.  
  6. Call SaveEvent.SetDocument(ThisApplication.ActiveDocument)
  7.  
  8. Dim flag As Boolean: flag = True
  9.  
  10. Do While flag
  11. DoEvents
  12. Loop
  13.  
  14. End Sub
  15.  

Теперь создайте класс с именем DocumentSave и вставьте туда следующий код:

Код - Visual Basic [Выбрать]
  1. Private WithEvents e_doc_save As DocumentEvents
  2.  
  3. Public Sub SetDocument(ByVal doc As Document)
  4. Set e_doc_save = doc.DocumentEvents
  5. End Sub
  6.  
  7. Private Sub e_doc_save_OnSave(ByVal BeforeOrAfter As EventTimingEnum, ByVal Context As NameValueMap, HandlingCode As HandlingCodeEnum)
  8.     If BeforeOrAfter = kBefore Then MsgBox "Before Save"
  9.    
  10.     If BeforeOrAfter = kAfter Then MsgBox "kAfter Save"
  11.    
  12.     If BeforeOrAfter = kAbort Then MsgBox "Abort Save"
  13.  
  14. End Sub
  15.  


P.S. Только не пойму, почему то функция DoEvents ресурсы жрет одного процессора, видимо потому что VBA сам по себе корявый.
Название: Re: События в VBA
Отправлено: anton.gorschnev от 13-03-2019, 10:53:21
Большое спасибо.
Получается бесполезная вещь "события" в VBA.
Чтобы отреагировать на событие необходимо в ручную запустить процедуру отслеживания этого события или я не  до конца разобрался.
Я рассчитывал получить эффект как VB.NET по коду

Код - vb.net [Выбрать]
  1. Private m_ApplicationEvents As Inventor.ApplicationEvents
  2. Public Sub Activate(ByVal addInSiteObject As Inventor.ApplicationAddInSite, _
  3. ByVal firstTime As Boolean) _
  4. Implements Inventor.ApplicationAddInServer.Activate
  5. m_inventorApplication = addInSiteObject.Application
  6. m_ApplicationEvents = m_inventorApplication.ApplicationEvents
  7. AddHandler m_ApplicationEvents.OnOpenDocument, _
  8. AddressOf Me.m_ApplicationEvents_OnOpenDocument
  9. End Sub
  10. Private Sub m_ApplicationEvents_OnOpenDocument( _
  11. ByVal DocumentObject As Inventor._Document, _
  12. ByVal FullDocumentName As String, _
  13. ByVal BeforeOrAfter As Inventor.EventTimingEnum, _
  14. ByVal Context As Inventor.NameValueMap, _
  15. ByRef HandlingCode As Inventor.HandlingCodeEnum)
  16. System.Windows.Forms.MessageBox.Show(_
  17. "OnOpenDocument: " + DocumentObject.DisplayName)
  18. End Sub

А сейчас получается необходимо запустить процедур

Код - Visual Basic [Выбрать]
  1. Sub DocumentSaveRun()
  2.  
  3. Dim SaveEvent As DocumentSave
  4. Set SaveEvent = New DocumentSave
  5.  
  6. Call SaveEvent.SetDocument(ThisApplication.ActiveDocument)
  7.  
  8. Dim flag As Boolean: flag = True
  9.  
  10. Do While flag
  11. DoEvents
  12. Loop
  13.  
  14. End Sub

чтобы начать отслеживать событие сохранения.
Название: Re: События в VBA
Отправлено: mikazakov от 13-03-2019, 14:09:38
Получается бесполезная вещь "события" в VBA.
Да как и сам VBA, от VBA есть одна полезная вещь: посмотреть текущее состояние инвентора.
Название: Re: События в VBA
Отправлено: mikazakov от 13-03-2019, 20:21:31
Я рассчитывал получить эффект как VB.NET по коду
В случае с AddIn происходит событие загрузки AddIn при загрузки инвентора, поэтому в AddIn все события "автоматически" подключатся, а макрос в VBA, что то должно вызвать, либо AddIn либо iLogic либо юзер с кнопки. Раньше были автомакросы, то ли 4 то ли 5 видов, срабатывали при определенных событиях, но это оказалось злом и от этого разрабы отказались. AddIn, как говорится, рулит.
Название: Re: События в VBA
Отправлено: anton.gorschnev от 14-03-2019, 08:26:56
Всем спасибо за ответы, очень помогло. На событие подписываюсь в ADDin, по наступлению которого запускаю макрос в документе. Наверное самое оптимальное решение на стадии отладки и тестирования. После отладки буду переходить полностью  на VB.NET.
Возник попутный вопрос. Может кто в курсе как отключить сообщение Inventor  что в открываемой документе есть макрос,
сообщение вызывается при открытии деталей из библиотеки  или созданию документа по шаблону.

(https://i.postimg.cc/d7yk7XWm/1.png) (https://postimg.cc/d7yk7XWm)
Название: Re: События в VBA
Отправлено: mikazakov от 14-03-2019, 20:51:48
попробуйте, что бы не появлялось окно
Код - Visual Basic [Выбрать]
  1. ThisApplication.SilentOperation = True
  2.  
  3. ThisApplication.SilentOperation = False
  4.