Работа с BOM. При смене уровня детализации в инвенторе выскакивает ошибка.

Автор Тема: Работа с BOM. При смене уровня детализации в инвенторе выскакивает ошибка.  (Прочитано 9451 раз)

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

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

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

  • ADN OPEN
  • Сообщений: 18
  • Карма: 0
Здравствуйте.
Есть такая проблема. Взят код практически из хелпа:
Код - Visual Basic [Выбрать]
  1.         Dim _InvDoc As Inventor.Document
  2.         _InvDoc = _invApp.ActiveDocument
  3.         oBOM = _InvDoc.ComponentDefinition.BOM
  4.         Dim oBOMView As BOMView = oBOM.BOMViews.Item("Структурированный")
  5.         Dim oBomRows As BOMRowsEnumerator = oBOMView.BOMRows
Если в инвенторе стоит уравень детализации "Главный" то все в порядке и все работает. Но если сменить уровень детализации на любой другой, то при достижении строки "Dim oBOMView As BOMView = oBOM.BOMViews.Item("Структурированный")" выскакивает ошибка как на картинке

может кто нибудь подсказать почему это происходит
И еще вопрос, может кто знает. В других уровнях детализации есть погашенные детали. Как узнать какие детали в коллекции "oBomRows" погашены? Но этот вопрос конечно будет интересен, только если решить первый вопрос.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Все просто, нужно сначала разрешить использование ВОМ
строкой oBOM.StructuredViewEnabled = True

Код - Visual Basic [Выбрать]
  1.  ' Make sure that the structured view is enabled.
  2.    oBOM.StructuredViewEnabled = True
  3.    
  4.     'Set a reference to the "Structured" BOMView
  5.    Dim oBOMView As BOMView
  6.     Set oBOMView = oBOM.BOMViews.Item("Structured")
  7.  
  8.  

По умолчанию "структурированный" и "только детали" могут быть не активированы в сборке, видимо это было в своё время сделано что бы экономить вычислительные ресурсы в крупных сборках.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
И еще вопрос, может кто знает. В других уровнях детализации есть погашенные детали. Как узнать какие детали в коллекции "oBomRows" погашены? Но этот вопрос конечно будет интересен, только если решить первый вопрос.
В 2022 версии старое понятие "Уровень детализации" отменили, теперь там Model States, на мой взгляд стало удобнее для пользователей.
Да и теперь подавленные детали выкидываются из спецификации, для подавленных прописывалось ноль в свойстве колличество.



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

  • ADN OPEN
  • Сообщений: 18
  • Карма: 0
Все просто, нужно сначала разрешить использование ВОМ
строкой oBOM.StructuredViewEnabled = True

Не помогает...
Если в строке "Dim oBOMView As BOMView = oBOM.BOMViews.Item("Структурированный")" написать вместо "Структуированный " какой нибудь бред вроде "йцукен" та же ошибка выскакивает и при уровне детализации "Главный". Может при смене детализации не структуированный писать надо, а что нибудь другое?

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

  • ADN OPEN
  • Сообщений: 18
  • Карма: 0
Написал такие строчки:
Код - vb.net [Выбрать]
  1.         ListBox1.Items.Add(oBOM.BOMViews.Item(1).Name)      ' Без имени
  2.         ListBox1.Items.Add(oBOM.BOMViews.Item(2).Name)      ' Структурированный
Отклик в коментарии.
В общем так получается. Если я заменяю строку
Код - vb.net [Выбрать]
  1. Dim oBOMView As BOMView = oBOM.BOMViews.Item("Структурированный")
на:
Код - vb.net [Выбрать]
  1. Dim oBOMView As BOMView = oBOM.BOMViews.Item(2)
то работает как и раньше. Если я заменяю на:
Код - vb.net [Выбрать]
  1. Dim oBOMView As BOMView = oBOM.BOMViews.Item(1)
то все работает вне зависимости от выбранного уровня детализации. Получается правильная строка:
Код - vb.net [Выбрать]
  1. Dim oBOMView As BOMView = oBOM.BOMViews.Item("Без имени")
Бредятина какая-то... Такое очучение, что кто-то где-то что-то напутал... Только не пойму кто и где...

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Давайте пример вашей сборки небольшой в виде файла, и я так понимаю надо просто доступ к структурированному списку
я посмотрю что там не так

Отмечено как Решение USSR_Nic 31-01-2022, 11:09:26

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

  • ADN OPEN
  • Сообщений: 18
  • Карма: 0
Код - vb.net [Выбрать]
  1.     Dim oBOMView As BOMView = oBOM.BOMViews.Item("Без имени")
не работает.
Работает только так:
Код - vb.net [Выбрать]
  1.     Dim oBOMView As BOMView = oBOM.BOMViews.Item(1)

Если написать так:
Код - vb.net [Выбрать]
  1.         oBOM = _InvDoc.ComponentDefinition.BOM          'Получаем ссылку на объект BOM, предоставляемый описанием сборки — её объектом ComponentDefinition.
  2.         oBOM.StructuredViewEnabled = True
  3.         oBOM.StructuredViewFirstLevelOnly = True
  4.         Dim oBOMView As BOMView = oBOM.BOMViews.Item(1)
то ошибка выпадает на строке:
Код - vb.net [Выбрать]
  1. oBOM.StructuredViewFirstLevelOnly = True
при уровне детализации "Главный" эта строка ничего не меняет True, False, без разницы. Получаю одно и то же. Впрочем как и строка
Код - vb.net [Выбрать]
  1.      oBOM.StructuredViewEnabled = True
почему то ни на что не влияет... Беда.
« Последнее редактирование: 29-01-2022, 01:47:17 от Александр Ривилис »

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

  • ADN OPEN
  • Сообщений: 18
  • Карма: 0
Давайте пример вашей сборки небольшой в виде файла, и я так понимаю надо просто доступ к структурированному списку
я посмотрю что там не так
Мне кажется дело не в сборке, а в моем коде или инвенторе. Инвентор у меня 2020.

Оффлайн filat

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Не помогает...
Если в строке "Dim oBOMView As BOMView = oBOM.BOMViews.Item("Структурированный")" написать вместо "Структуированный " какой нибудь бред вроде "йцукен"
А так пробовали? :
Код - vb.net [Выбрать]
  1.             Dim lang As String = ""
  2.             If m_inventorApplication.LanguageName = "English" Then
  3.                 lang = "Structured"
  4.             ElseIf m_inventorApplication.LanguageName = "Russian" Then
  5.                 lang = "Структурированный"
  6.             End If
  7.             fBOMView = fBOM.BOMViews.Item(lang)

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

  • ADN OPEN
  • Сообщений: 18
  • Карма: 0
Не помогает...
Если в строке "Dim oBOMView As BOMView = oBOM.BOMViews.Item("Структурированный")" написать вместо "Структуированный " какой нибудь бред вроде "йцукен"
А так пробовали? :
Код - vb.net [Выбрать]
  1.             Dim lang As String = ""
  2.             If m_inventorApplication.LanguageName = "English" Then
  3.                 lang = "Structured"
  4.             ElseIf m_inventorApplication.LanguageName = "Russian" Then
  5.                 lang = "Структурированный"
  6.             End If
  7.             fBOMView = fBOM.BOMViews.Item(lang)
А смысл? У меня русский. И если вписать "Структуированный" то все работает. Но не везде. Если поставить циферку 1 то все работает везде.

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

  • ADN OPEN
  • Сообщений: 18
  • Карма: 0
еще есть вопрос. Если деталь погашена, то при попытке получить
Код - vb.net [Выбрать]
  1. Dim oCompDef As ComponentDefinition = oRow.ComponentDefinitions.Item(1)
выскакивает ошибка и при поиощи Try Catch я могу вычислить погашенную деталь. Но использовать Try Catch не комильфо, моло ли по каким причинам ошибка выскочила. как на уровне oRow выудить информацию о том, что деталь погашена?
Код - vb.net [Выбрать]
  1. Dim oRow As BOMRow = oBomRows.Item(i)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Посмотреть
oRow.ComponentDefinitions.count

как на уровне oRow выудить информацию о том, что деталь погашена?
Наверное все таки деталь подавленная, а не погашенная. Погашенная, это когда она не видимая.
Подавленная в версиях до 2022 в память компьютера вообще не загружалась, поэтому попытка к ней обратиться выдаёт ошибку.
В 2022 ситуация другая
 


А так можно по полному имени из BomRow.ReferencedFileDescriptor.FullFileName поискать сборке AssemblyComponentDefinition.Occurences там можно найти свойство Occurence.Suppressed

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

  • ADN OPEN
  • Сообщений: 18
  • Карма: 0
да. уже сам понял, что не загружается. В верхней сборке не получить параметр о погашенности детали или сборки, потому, что она не загружена. Класс. Но строчка в коллекции oBomRows  создается пустая. Есть еще условия при которых в коллекции oBomRows создается пустая строка? Если нет, так и вычислим погашенные детали и сборки.
Еще вопрос. Как узнать имя текущего уровня детализации?

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
AssemblyDocument.AssemblyComponentDefinition.RepresentationsManager.ActiveLevelOfDetailRepresentation

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

  • ADN OPEN
  • Сообщений: 18
  • Карма: 0