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

ADN Club => Inventor API => Тема начата: fedor от 13-09-2017, 09:38:26

Название: спецификация в API в соответствии с сортировкой
Отправлено: fedor от 13-09-2017, 09:38:26
Доброго времени суток!
Существует макрос, который позволяет перебирать компоненты входящие в 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
Название: Re: спецификация в API в соответствии с сортировкой
Отправлено: Александр Ривилис от 13-09-2017, 11:21:50
fedor
По существу вопроса мне ответить нечего, т.к. я не специалист в Inventor, а вот по оформлению кода прошу соблюдать правило описанное у меня в подписи.
Название: Re: спецификация в API в соответствии с сортировкой
Отправлено: mikazakov от 13-09-2017, 12:40:30
Честно сказать, мало что понял.
Название: Re: спецификация в API в соответствии с сортировкой
Отправлено: fedor от 13-09-2017, 13:55:24
Поясню на картинках!
На рисунке 1 видна сортировка спецификации "По возрастанию", которая была сделана вручную,в пользовательском интерфейсе.
На 2 рисунке выгрузка компонентов входящий в BOM, сделанное через API.
Хотелось бы, чтобы выгрузка производимая в API соответствовала порядку, указанному в спецификации сборки(как на рис.1), т.е. в порядке возростания/убывания
Возможно ли программно добиться такого результата?


(https://s26.postimg.org/ojqw1iz9h/BOM_s_sortirovkoi.png) (https://postimg.org/image/ojqw1iz9h/)

(https://s26.postimg.org/5soyrd4p1/image.png) (https://postimg.org/image/5soyrd4p1/)
Название: Re: спецификация в API в соответствии с сортировкой
Отправлено: Алексей Романов от 14-09-2017, 17:24:24
Возможно ли программно, пройти всю Структурированную спецификацию в соответствии с сортировкой, которую я выбираю?
А сортировать ВОМ через API не пробовали по номеру позиций? У меня в свое время не получилось и я сортировал кодом. Для этого цикл For Each oBOMRow In oBOMRows нужно заключить еще в один цикл перебора строк: For k=1 to oBOMRows.Count и сравнивать k и oBOMRow.itemNumber, если совпадаю, выводить в окно. Если в oBOMRow.itemNumber присутствуют точки, то брать число справа от последней точки...
Название: Re: спецификация в API в соответствии с сортировкой
Отправлено: mikazakov от 14-09-2017, 17:50:59
Ну так то да, тут просто делается массив из строк и сортируется как вам надо, а потом выводится во внешний файл
Название: Re: спецификация в API в соответствии с сортировкой
Отправлено: fedor от 15-09-2017, 11:32:19
У меня в свое время не получилось и я сортировал кодом. Для этого цикл 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
Название: Re: спецификация в API в соответствии с сортировкой
Отправлено: Александр Ривилис от 15-09-2017, 12:17:29
Если я правильно понял Алексей Романов то нужно изменить порядок циклов. Внешним должен быть For i = 1 To oBOMRows.Count
Название: Re: спецификация в API в соответствии с сортировкой
Отправлено: Алексей Романов от 15-09-2017, 19:47:21
Если я вас правильно понял,
Нет, вы неправильно поняли, цикл 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

Название: Re: спецификация в API в соответствии с сортировкой
Отправлено: fedor от 20-09-2017, 15:43:39
Большое спасибо!)
сработало!)