спецификация в API в соответствии с сортировкой

Автор Тема: спецификация в API в соответствии с сортировкой  (Прочитано 4343 раз)

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

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

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

  • ADN OPEN
  • Сообщений: 33
  • Карма: 0
Доброго времени суток!
Существует макрос, который позволяет перебирать компоненты входящие в BOM. Загвоздка в том, что при выгрузке спецификации, я сортирую «структурированную» спецификацию по номеру (по возрастанию). Но, в API индекс каждого элемента строки не следует сортировке и перенумерации, и индекс обычно не соответствует номеру элемента.

Возможно ли программно, пройти всю Структурированную спецификацию в соответствии с сортировкой, которую я выбираю?
код макроса
Код - Visual Basic [Выбрать]
  1. Public Sub IterateRows _
  2. (oBOMRows As BOMRowsEnumerator, indent As Integer)
  3.   Dim oBOMRow As BOMRow
  4.   For Each oBOMRow In oBOMRows
  5.     ' Let's only get the first definition
  6.    ' It would only be more than one if rows were merged
  7.    Dim oDef As ComponentDefinition
  8.     Set oDef = oBOMRow.ComponentDefinitions(1)
  9.  
  10.     Dim partNumber As String
  11.     partNumber = oDef.Document.PropertySets( _
  12.       "{32853F0F-3444-11D1-9E93-0060B03C1CA6}")("Part Number").value
  13.    
  14.     Debug.Print Tab(indent); oBOMRow.itemNumber + " " + partNumber
  15.  
  16.     If Not oBOMRow.ChildRows Is Nothing Then
  17.       Call IterateRows(oBOMRow.ChildRows, indent + 1)
  18.     End If
  19.   Next
  20. End Sub
  21.  
  22. Public Sub IterateThroughStructuredBOM()
  23.   Dim oAsm As AssemblyDocument
  24.   Set oAsm = ThisApplication.ActiveDocument
  25.  
  26.   Dim oBOM As BOM
  27.   Set oBOM = oAsm.ComponentDefinition.BOM
  28.  
  29.   ' Make sure it's enabled
  30.  oBOM.StructuredViewEnabled = True
  31.   oBOM.StructuredViewFirstLevelOnly = False
  32.  
  33.   Dim oBOMView As BOMView
  34.   Set oBOMView = oBOM.BOMViews(2)
  35.  
  36.   Call IterateRows(oBOMView.BOMRows, 1)
  37. End Sub
« Последнее редактирование: 13-09-2017, 14:33:11 от fedor »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
fedor
По существу вопроса мне ответить нечего, т.к. я не специалист в Inventor, а вот по оформлению кода прошу соблюдать правило описанное у меня в подписи.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Честно сказать, мало что понял.

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

  • ADN OPEN
  • Сообщений: 33
  • Карма: 0
Поясню на картинках!
На рисунке 1 видна сортировка спецификации "По возрастанию", которая была сделана вручную,в пользовательском интерфейсе.
На 2 рисунке выгрузка компонентов входящий в BOM, сделанное через API.
Хотелось бы, чтобы выгрузка производимая в API соответствовала порядку, указанному в спецификации сборки(как на рис.1), т.е. в порядке возростания/убывания
Возможно ли программно добиться такого результата?






Оффлайн Алексей Романов

  • ADN Club
  • **
  • Сообщений: 87
  • Карма: 20
Возможно ли программно, пройти всю Структурированную спецификацию в соответствии с сортировкой, которую я выбираю?
А сортировать ВОМ через API не пробовали по номеру позиций? У меня в свое время не получилось и я сортировал кодом. Для этого цикл For Each oBOMRow In oBOMRows нужно заключить еще в один цикл перебора строк: For k=1 to oBOMRows.Count и сравнивать k и oBOMRow.itemNumber, если совпадаю, выводить в окно. Если в oBOMRow.itemNumber присутствуют точки, то брать число справа от последней точки...

Отмечено как Решение fedor 20-09-2017, 15:42:44

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Ну так то да, тут просто делается массив из строк и сортируется как вам надо, а потом выводится во внешний файл

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

  • ADN OPEN
  • Сообщений: 33
  • Карма: 0
У меня в свое время не получилось и я сортировал кодом. Для этого цикл For Each oBOMRow In oBOMRows нужно заключить еще в один цикл перебора строк: For k=1 to oBOMRows.Count и сравнивать k и oBOMRow.itemNumber, если совпадаю, выводить в окно. Если в oBOMRow.itemNumber присутствуют точки, то брать число справа от последней точки
Если я вас правильно понял, то предложенный вами метод, ничего в сортировке не меняет. и список идет в порядке следования
Т.е. если деталь с позицией 10, находится в API на первом месте, то цикл For проходит до i=10, а затем выгружает информацию по данной детали, при этом игнорируя остальные

Код - Visual Basic [Выбрать]
  1. Public Sub IterateRows _
  2. (oBOMRows As BOMRowsEnumerator, indent As Integer)
  3.   Dim oBOMRow As BOMRow
  4.   For Each oBOMRow In oBOMRows
  5.     For i = 1 To oBOMRows.Count
  6.         ' rename ItNumber
  7.        Dim ItemNumber As String
  8.         If InStrRev(oBOMRows.Item(i).ItemNumber, ".") > 0 Then
  9.             ItemNumber = Right$(oBOMRow.ItemNumber, InStrRev(oBOMRow.ItemNumber, ".") - 1)
  10.         Else
  11.             ItemNumber = oBOMRow.ItemNumber
  12.         End If
  13.         If ItemNumber = i Then
  14.             ' Let's only get the first definition
  15.            ' It would only be more than one if rows were merged
  16.            Dim oDef As ComponentDefinition
  17.             Set oDef = oBOMRow.ComponentDefinitions(1)
  18.            
  19.             Dim partNumber As String
  20.             partNumber = oDef.Document.PropertySets( _
  21.               "{32853F0F-3444-11D1-9E93-0060B03C1CA6}")("Part Number").Value
  22.            
  23.             Debug.Print Tab(indent); oBOMRow.ItemNumber + " " + partNumber
  24.            
  25.             If Not oBOMRow.ChildRows Is Nothing Then
  26.               Call IterateRows(oBOMRow.ChildRows, indent + 1)
  27.             End If
  28.             Exit For
  29.         End If
  30.     Next
  31.   Next
  32. End Sub
  33.  
  34. Public Sub IterateThroughStructuredBOM()
  35.   Dim oAsm As AssemblyDocument
  36.   Set oAsm = ThisApplication.ActiveDocument
  37.  
  38.   Dim oBOM As BOM
  39.   Set oBOM = oAsm.ComponentDefinition.BOM
  40.  
  41.   ' Make sure it's enabled
  42.  oBOM.StructuredViewEnabled = True
  43.   oBOM.StructuredViewFirstLevelOnly = False
  44.  
  45.   Dim oBOMView As BOMView
  46.   Set oBOMView = oBOM.BOMViews(2)
  47.  
  48.   Call IterateRows(oBOMView.BOMRows, 1)
  49. End Sub

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Если я правильно понял Алексей Романов то нужно изменить порядок циклов. Внешним должен быть For i = 1 To oBOMRows.Count
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Романов

  • ADN Club
  • **
  • Сообщений: 87
  • Карма: 20
Если я вас правильно понял,
Нет, вы неправильно поняли, цикл For i = 1 To oBOMRows.Count должен быть внешним, в нем просто идет перебор позиций по порядку, а во внутреннем ищутся соответствующие записи (4 и 5 строку поменяйте местами)... Александр Ривилис абсолютно правильно понял)))
UPD У меня в строке ItemNumber = Right$(oBOMRow.ItemNumber, InStrRev(oBOMRow.ItemNumber, ".") - 1) возникает ошибка, в моем случае это участок кода устроен так:
Код - Visual Basic [Выбрать]
  1. Dim ItemNumber As String
  2. ItemNumber = oBOMRow.ItemNumber
  3. If InStr(ItemNumber, ".") > 0 Then
  4.     ItemNumber = Right$(ItemNumber, Len(ItemNumber) - InStrRev(ItemNumber, "."))
  5. End If

« Последнее редактирование: 16-09-2017, 06:41:52 от Алексей Романов »

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

  • ADN OPEN
  • Сообщений: 33
  • Карма: 0
Большое спасибо!)
сработало!)