Как получить список компонентов каждой конфигурации iAssembly

Автор Тема: Как получить список компонентов каждой конфигурации iAssembly  (Прочитано 1806 раз)

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

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

  • ADN OPEN
  • Сообщений: 6
  • Карма: 0
Собственно пытаюсь из параметрической сборки iAssembly список компонентов для каждой конфигурации (каждого iAssemblyMember) список компонентов. Пока реализовано как приведено ниже, однако не нравится, что нужно переключать каждую конфигурацию в браузере - вопросы приведены в коде. Может это должно быть по-другому реализовано?

Код - C# [Выбрать]
  1.  
  2. public void BOMQuery()
  3.         {
  4.             if (assemblyDocument.ComponentDefinition.IsiAssemblyMember)
  5.             {
  6.                 iAssemblyFactory assemblyFactory = assemblyDocument.ComponentDefinition.iAssemblyMember.ParentFactory;
  7.                 iAssemblyTableRows tableRows = assemblyFactory.TableRows;
  8.                
  9.                 string str = "";
  10.                 foreach (iAssemblyTableRow tableRow in tableRows)
  11.                 {                                    
  12.                    //iAssemblyMember member = ....                    
  13.                    //BOM oBOM = member.Parent.BOM; <-- интересно можно ли перейти от iAssemblyFactory к каждому iAssemblyMember, а затем к его BOM
  14.                    
  15.                     BOM oBOM = assemblyFactory.Parent.BOM;
  16.  
  17.                     oBOM.StructuredViewFirstLevelOnly = true;
  18.                     oBOM.StructuredViewEnabled = true;
  19.                     BOMView oBOMView = oBOM.BOMViews[2];
  20.  
  21.                     assemblyFactory.DefaultRow = tableRow; // <-- можно ли здесь по-другому реализовать
  22.                     oBOMView.iAssemblyMemberName = tableRow.MemberName;
  23.                    
  24.                     //Пока выводим только PartNumber и количество для каждой конфигурации
  25.                     string str3 = "";
  26.                     foreach (BOMRow oRow in oBOMView.BOMRows)
  27.                     {
  28.                         Document oDoc = (Document)oRow.ComponentDefinitions[1].Document;
  29.                         string str1 = oDoc.PropertySets["Design Tracking Properties"]["Part Number"].Value.ToString();
  30.                         string str2 = oRow.ItemQuantity.ToString();
  31.                         str3 += str1 + "\t:" + str2 + "\n";
  32.                     }
  33.                     str += str3 + "\n";
  34.                 }                  
  35.                 MessageBox.Show(str);
  36.             }
  37.         }
  38.  
  39.  

Буду рад помощи, можно на можно также на VBA, VB.NET ну или ткните носом где посмотреть что-то похожее

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Как вариант проанализировать таблицу с данными из ComponentDefinition.iAssemblyFactory.TableColumns
И потом сфильтровать BOM по этим данным и пересчитать количество.
Еще мысль: с каждым iAssembly создается папка с таким же названием. В этой папке лежат прокси-файлы, можно попытаться открыть их через ApprenticeServer и считать оттуда BOM. Если приложение в виде exe-файла то работать должно. Но на прямую ApprenticeServer из AddIn не работает, только отдельный процесс запускать, а это немножко посложнее.

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

  • ADN OPEN
  • Сообщений: 6
  • Карма: 0
По исследовал проблему:
1)  таблицу ComponentDefinition.iAssemblyFactory я конечно могу прочитать, но пока я не понял что с этим можно сделать, учитывая что могут использоваться замены таблицы компонентов с исполнениями и в общем случае PartNumber может не совпадать с MemberName  - тут надо думать.....
2) насчет  ApprenticeServer
при приведении ApprenticeServerDocument к AssemblyDocument получаем exception: Unable to cast COM object of type 'System.__ComObject' to interface type 'Inventor.AssemblyDocument'.
видимо есть ограничение на использование ApprenticeServer
Код - C# [Выбрать]
  1. private void ShowBOM()
  2.         {
  3.             oApprenticeServerDoc = oApprenticeApp.Open(textFilename.Text);
  4.             if (oApprenticeServerDoc.DocumentType == DocumentTypeEnum.kAssemblyDocumentObject)
  5.             {
  6.                 AssemblyDocument assemblydoc = (AssemblyDocument)oApprenticeServerDoc.ComponentDefinition.Document; // <-- 'Unable to cast COM object of type 'System.__ComObject' to interface type 'Inventor.AssemblyDocument'.....
  7.                 BOM oBOM = assemblydoc.ComponentDefinition.BOM;
  8.                 oBOM.StructuredViewFirstLevelOnly = true;
  9.                 oBOM.StructuredViewEnabled = true;
  10.                 BOMView oBOMView = oBOM.BOMViews[2];
  11.             }
  12. }
  13.  

Мне казалось что это будет простая задача, а в получается, что данные можно получить только какими-то самыми противоестественными методами. И главное есть программа которая выполняет похожую задачу, но исходников нет, а расковырять программу написанную на C++ я не настолько хакер.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
ApprenticeServerDocument к AssemblyDocument получаем exception:
Ну это видимо не предусмотрено, ApprenticeServerDocument не совместим с AssemblyDocument.
Нужно идти в ApprenticeServerDocument.ComponentDefinition там есть ссылка на BOM сборки.

таблицу ComponentDefinition.iAssemblyFactory я конечно могу прочитать, но пока я не понял что с этим можно сделать,
дак там должны быть данные по поводу include/exclude на компоненты в iСборке