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

ADN Club => Inventor API => Тема начата: filat от 02-06-2015, 08:36:33

Название: Различия между VBA и VB.Net
Отправлено: filat от 02-06-2015, 08:36:33
В VBA я достаточно часто в сборках для Dim sDoc As AssemblyDocument использовал обращение  sDoc.ComponentDefinition...
В часности для проверки  If oDoc.ComponentDefinition.iAssemblyMember Is Nothing ThenНо в VB.Net так не получается!? Debug в VS показывает, что такое обращение нельзя реализовать.
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fib4.keep4u.ru%2Fb%2F2015%2F06%2F02%2F33%2F335844005207f9fa86f694ed2125c831.jpg&hash=12ec3e7a4e1151a27bfadb57be8e8a63) (http://keep4u.ru)
Как это можно обойти?
Название: Re: Различия между VBA и VB.Net
Отправлено: Алексей Романов от 02-06-2015, 10:44:50
В VBA я достаточно часто в сборках для Dim sDoc As AssemblyDocument использовал обращение
filat, Так можно делать, но правильно будет:
Код - Visual Basic [Выбрать]
  1. If oDoc.ComponentDefinition.IsiAssemblyMember = False Then
Название: Re: Различия между VBA и VB.Net
Отправлено: filat от 03-06-2015, 11:37:55
C ComponentDefinition для сборок вообще какие-то странные вещи творятся: то он существует и код работает, то он не существует - и хоть ты тресни...
Четко заметил, что для VS в режиме Debug после загрузки компа код при первом запуске срабатывет нормально, а потом ComponentDefinition перестает вычеслятся до полной перезаргузки компа!
Название: Re: Различия между VBA и VB.Net
Отправлено: filat от 16-06-2015, 15:06:15
Получилось побороть пропадание ComponentDefinition с помощью дополнительной строки oDoc.Update - как ни странно помогло, но продвинуться далеко не получилось. Далее сохраняю документ через SaveAs с параметром True и обращаюсь через oDoc = m_inventorApplication.Documents.ItemByName(oName)  - документ oDoc есть, новый, все чин-чинарем, но вот только к параметрам ComponentDefinition уже нелья - происходит ошибка и Update в этом случае тоже уже не помогает...
Название: Re: Различия между VBA и VB.Net
Отправлено: Алексей Романов от 16-06-2015, 17:45:48
и обращаюсь через oDoc = m_inventorApplication.Documents.ItemByName(oName)  - документ oDoc есть, новый, все чин-чинарем, но вот только к параметрам ComponentDefinition уже нелья - происходит ошибка
Ты на эту строку поставь в отладке останов и посмотри объект oDoc, че там в ComponentDefinition находится...
Название: Re: Различия между VBA и VB.Net
Отправлено: filat от 17-06-2015, 08:40:23
Сваял такой участок кода ( речь идет об iAssembly и AddI VB.Net - похоже это имеет особое значение!):
Код - vb.net [Выбрать]
  1.                     Try
  2.                         If oDoc.ComponentDefinition.IsiAssemblyMember = False Then
  3.                         End If
  4.                     Catch ex As Exception
  5.                         MsgBox("5 ComponentDefinition не существует. Аварийное отключение программы!")
  6.                         Exit Sub
  7.                     End Try
  8.                     m_inventorApplication.SilentOperation = True ' Блокирует все запросы подтверждения
  9.                     Call oDoc.SaveAs(noName, True) ' Сохраняем элемент под новым именем
  10.                     Try
  11.                         If oDoc.ComponentDefinition.IsiAssemblyMember = False Then
  12.                         End If
  13.                     Catch ex As Exception
  14.                         MsgBox("6 ComponentDefinition не существует. Аварийное отключение программы!")
  15.                         Exit Sub
  16.                     End Try
  17.                     If m_inventorApplication.ActiveDocument.FullFileName = noName Then
  18.                         oDoc = m_inventorApplication.ActiveDocument
  19.                     Else
  20.                         Try
  21.                             oDoc = m_inventorApplication.Documents.ItemByName(noName) ' теряет ComponentDefinition
  22.                             Try
  23.                                 If oDoc.ComponentDefinition.IsiAssemblyMember = False Then
  24.                                 End If
  25.                             Catch ex1 As Exception
  26.                                 MsgBox("7 ComponentDefinition не существует. Аварийное отключение программы!")
  27.                                 Exit Sub
  28.                             End Try
  29.                         Catch ex As Exception
  30.                             oDoc = m_inventorApplication.Documents.Open(noName, False)
  31.                             Try
  32.                                 If oDoc.ComponentDefinition.IsiAssemblyMember = False Then
  33.                                 End If
  34.                             Catch ex1 As Exception
  35.                                 MsgBox("8 ComponentDefinition не существует. Аварийное отключение программы!")
  36.                                 Exit Sub
  37.                             End Try
  38.                         End Try
  39.                     End If

Код показывает, что перед сохранением параметрической сборки  ComponentDefinition у переменной существует. После SaveAs с параметром True  в переменной  oDoc остается прежний файл у которого продолжает существовать  ComponentDefinition. А вот при обращении к новому файлу  ItemByNameм (по сигналу ошибка срабатывает сообщение №7)  в перменной oDoc появляется новая параметрическая сборка у которой просто отсутствует пространство переменных  ComponentDefinition. Остановка кода в этом месте показала тоже самое - причину понять не могу - как такое может быть!? Видимо действительно нужно изобритать велосипед и пытаться организовать код через сохранение файла средствами винды...
P.S. Простые сборки проходят через этот код без проблем...
Название: Re: Различия между VBA и VB.Net
Отправлено: filat от 17-06-2015, 09:30:39
Похоже мой вопрос не правомочен...
Я удалил все имеющиеся в коде отработчики событий  и код стал работать нормально... Сейчас буду пытаться отследить какой именно участок кода убивает ComponentDefinition в iAssembly.
Название: Re: Различия между VBA и VB.Net
Отправлено: filat от 17-06-2015, 12:02:05
Но все это очень не понятно: как можно убить пространство имен ComponentDefinition!?
И при этом, для данного файла, в этот же момент в VBA ComponentDefinition продолжает существовать и с ним можно нормально работать!
Интересно, а есть ли способ его восстановить без перезапуска программы?
Название: Re: Различия между VBA и VB.Net
Отправлено: filat от 18-06-2015, 09:22:28
Продолжая расследовать это темное дело, я заметил, что в событиях Открытия, Закрытия, Сохранения документа у переменной ByVal DocumentObject As Inventor._Document при открытии детали присутствует член ComponentDefinition, а вот у сборок в этой переменно, почему-то член ComponentDefinition отсутствует и нужно выполнять сначало передачу специальной соответствующей переменной, для нормального продолжения работы кода...
Прошу выполнить проверку следующих вариантов кода и высказать свои соображения:
Код - vb.net [Выбрать]
  1.         Private Sub m_ApplicationEvents_OnOpenDocument(ByVal DocumentObject As Inventor._Document, ByVal FullDocumentName As String, ByVal BeforeOrAfter As Inventor.EventTimingEnum, ByVal Context As Inventor.NameValueMap, ByRef HandlingCode As Inventor.HandlingCodeEnum) Handles m_ApplicationEvents.OnOpenDocument
  2.             If BeforeOrAfter = EventTimingEnum.kAfter Then
  3.                 If DocumentObject.DocumentType = DocumentTypeEnum.kPartDocumentObject Then
  4.                     Try
  5.                         If DocumentObject.ComponentDefinition.iPartMember Is Nothing Then
  6.                         End If
  7.                     Catch ex As Exception
  8.                         MsgBox("Not found ComponentDefinition OnOpenDoc Part: " & DocumentObject.FullFileName)
  9.                     End Try
  10.                 ElseIf DocumentObject.DocumentType = DocumentTypeEnum.kAssemblyDocumentObject Then
  11.                     Try
  12.                         If DocumentObject.ComponentDefinition.IsiAssemblyMember = False Then
  13.                         End If
  14.                     Catch ex As Exception
  15.                         MsgBox("Not found ComponentDefinition OnOpenDoc Assembly: " & DocumentObject.FullFileName)
  16.                     End Try
  17.                 End If
  18.             End If
  19.         End Sub

Код - vb.net [Выбрать]
  1.         Private Sub m_ApplicationEvents_OnOpenDocument(ByVal DocumentObject As Inventor._Document, ByVal FullDocumentName As String, ByVal BeforeOrAfter As Inventor.EventTimingEnum, ByVal Context As Inventor.NameValueMap, ByRef HandlingCode As Inventor.HandlingCodeEnum) Handles m_ApplicationEvents.OnOpenDocument
  2.             If BeforeOrAfter = EventTimingEnum.kAfter Then
  3.                 If DocumentObject.DocumentType = DocumentTypeEnum.kPartDocumentObject Then
  4.                     Try
  5.                         If DocumentObject.ComponentDefinition.iPartMember Is Nothing Then
  6.                         End If
  7.                     Catch ex As Exception
  8.                         MsgBox("Not found ComponentDefinition OnOpenDoc Part: " & DocumentObject.FullFileName)
  9.                     End Try
  10.                 ElseIf DocumentObject.DocumentType = DocumentTypeEnum.kAssemblyDocumentObject Then
  11.                     Dim sDoc As AssemblyDocument
  12.                     sDoc = DocumentObject
  13.                     Try
  14.                         If sDoc.ComponentDefinition.IsiAssemblyMember = False Then
  15.                         End If
  16.                     Catch ex As Exception
  17.                         MsgBox("Not found ComponentDefinition OnOpenDoc Assembly: " & DocumentObject.FullFileName)
  18.                     End Try
  19.                     sDoc = Nothing
  20.                 End If
  21.             End If
  22.         End Sub
Название: Re: Различия между VBA и VB.Net
Отправлено: filat от 18-06-2015, 13:58:05
Чтоб небыло подобных проблем, нужно соблюдать принципы наследования!
Название: Re: Различия между VBA и VB.Net
Отправлено: mikazakov от 19-06-2015, 06:55:55
Чтоб небыло подобных проблем, нужно соблюдать принципы наследования!
Филат хотел сказать, что нужно строже следить за приведением типов.
Название: Re: Различия между VBA и VB.Net
Отправлено: filat от 24-06-2015, 10:23:31
Я вот сейчас отрабатываю ошибки проверки сужающих преобразований и осталось полторы сотни, которые я не пойму как можно устранить. Например:
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fib4.keep4u.ru%2Fb%2F2015%2F06%2F24%2F43%2F4346d72295f9266a1f03cb2d3d3d372b.jpg&hash=a74e5419c3285749a4037c8fa371219a) (http://keep4u.ru)
И есть еще длиные формулировки, которые программа считает проблемными:
Код - vb.net [Выбрать]
  1. oPropSet = oOcc.ReferencedDocumentDescriptor.ReferencedDocument.PropertySets.Item("{32853F0F-3444-11D1-9E93-0060B03C1CA6}")
Их нужно дробить и вводить дополнительные промежуточные переменные?
Название: Re: Различия между VBA и VB.Net
Отправлено: mikazakov от 24-06-2015, 10:56:25
проверки сужающих преобразований
Сдается мне, что ты m_Comp не привел к PartComponentDefinition
Либо:

CType(m_Comp, PartComponentDefinition)

либо
DirectCast(m_Comp, PartComponentDefinition)
Название: Re: Различия между VBA и VB.Net
Отправлено: filat от 24-06-2015, 11:27:25
Сдается мне, что ты m_Comp не привел к PartComponentDefinition
У меня именно так и было...
А оказывается, что ему нужно:
Код - vb.net [Выбрать]
  1. Dim m_Comp As SheetMetalComponentDefinition
  2. m_Comp = CType(PartDoc.ComponentDefinition, SheetMetalComponentDefinition)
Название: Re: Различия между VBA и VB.Net
Отправлено: filat от 24-06-2015, 11:32:21
А что программе может не нравиться в строке:
Код - vb.net [Выбрать]
  1. oText  = CreateObject("WScript.Network").userName ' Получаем имя пользователя
Название: Re: Различия между VBA и VB.Net
Отправлено: mikazakov от 24-06-2015, 11:43:02
А что программе может не нравиться в строке:
Как, что, Филат, CreateObject("WScript.Network") возвращает объект типа Object, а у Object нет члена UserName
Поэтому тебе здесь юзать только конвертацию типов CType и приводить к WScript.Network