Перебор и сортировка деталей в сборке

Автор Тема: Перебор и сортировка деталей в сборке  (Прочитано 4112 раз)

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

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

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

  • ADN OPEN
  • Сообщений: 37
  • Карма: 0
Приветствую! Возникла необходимость подсчёта и сортировки (листовой/обычный) деталей в сборке, и входящих подсборках. Может быть кто-то сталкивался с подобным?
Если долго мучиться - что-нибудь получится.

Оффлайн R.I.Chernov

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Добрый день. Могу помочь лишь советом,как мне это видится. Тема "перебора в принципе" обсуждалась вот в этом топике: http://adn-cis.org/forum/index.php?topic=1926.msg7743#msg7743
Вам необходимо дополнительно организовать проверку на принадлежность к листовому материалу, детали и т.п.
В программировании я новичок...но ненадолго! ;)

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

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

Оффлайн R.I.Chernov

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Теперь вопрос в другом. Как теперь отличить листовую деталь от обычной?

Я не знаю, как именно будет удобно.Честно, я этим не занимался никогда, поэтому и советовать особо ничего не хочу. Ну для примера вам вот такие пару переборов накатал (прошу учесть, что это перебор только верхних вхождений, ибо целью ставил показать как можно сравнивать, и ничего более):

Код - Visual Basic [Выбрать]
  1. Sub test_sub()
  2.     Dim oDoc As Inventor.Document
  3.     Set oDoc = ThisApplication.ActiveDocument
  4.     Dim oCD As ComponentDefinition
  5.     Set oCD = oDoc.ComponentDefinition
  6.    
  7.     Dim i As Integer
  8.     Dim oCD2 As ComponentDefinition
  9.    
  10.     For i = 1 To oCD.Occurrences.Count
  11.         Set oCD2 = oCD.Occurrences.Item(i).Definition
  12.         Debug.Print oCD2.Type
  13.     Next
  14.    
  15. ' знаения будут в виде числового кода, см.справку "ObjectTypeEnum"
  16. ' например:
  17. '    150995200 - kSheetMetalComponentDefinitionObject
  18. '    83886592 - kPartComponentDefinitionObject
  19.    
  20.     For i = 1 To oCD.Occurrences.Count
  21.         Set oCD2 = oCD.Occurrences.Item(i).Definition
  22.         If oCD2.Type = kPartComponentDefinitionObject Then
  23.         Debug.Print "Деталь"
  24.         ElseIf oCD2.Type = kSheetMetalComponentDefinitionObject Then
  25.         Debug.Print "Листовой материал"
  26.         Else
  27.         Debug.Print "Неизвестный тип"
  28.         End If
  29.     Next
  30. End Sub
В программировании я новичок...но ненадолго! ;)

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

  • ADN OPEN
  • Сообщений: 37
  • Карма: 0
Большое спасибо! Объясню замысел: необходимо выгружать dxf из сборки и подсборок. На данный момент получилось так:

Код - Visual Basic [Выбрать]
  1. Dim oCompDef As AssemblyComponentDefinition
  2. oCompDef = ThisApplication.ActiveDocument.ComponentDefinition
  3. Dim occ As ComponentOccurrence
  4. Dim odoc As Document
  5.  
  6. 'поиск виртуальных вхождений
  7. 'в главной сборке
  8. For Each occ In oCompDef.Occurrences
  9.      If  occ.Definition.Type = 150995200 Then
  10.          MsgBox(occ.Name)
  11.         End If
  12.            
  13. Next

Для того чтобы запустить выгрузку dxf мне нужно открыть найденную листовую деталь, а этого не сделать без пути к ней и имени файла. На этом и застрял ))
« Последнее редактирование: 07-04-2017, 12:36:22 от Bookvoed »
Если долго мучиться - что-нибудь получится.

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

  • ADN OPEN
  • Сообщений: 37
  • Карма: 0
Разобрался, спасибо!

Код - Visual Basic [Выбрать]
  1. Dim oCompDef As AssemblyComponentDefinition
  2. oCompDef = ThisApplication.ActiveDocument.ComponentDefinition
  3. Dim occ As ComponentOccurrence
  4. Dim odoc As Document
  5. Dim oFile As String
  6.  
  7.  
  8. 'в главной сборке
  9.  
  10. For Each occ In oCompDef.Occurrences
  11.      If  occ.Definition.Type = 150995200 Then
  12.                 oFile = occ.ReferencedDocumentDescriptor.ReferencedFileDescriptor.FullFileName
  13.     End If        
  14. Next
  15.  
  16. 'в подсборках
  17.  
  18. For Each odoc In oCompDef.Document.AllReferencedDocuments
  19.         occ = oCompDef.Occurrences.AllReferencedOccurrences(odoc).Item(1)
  20.                 If  occ.Definition.Type = 150995200 Then
  21.                         oFile = occ.ReferencedDocumentDescriptor.ReferencedFileDescriptor.FullFileName
  22.         End If        
  23. Next
  24.  
Если долго мучиться - что-нибудь получится.

Оффлайн R.I.Chernov

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Разобрался, спасибо!
Я рад, что смог вам помочь. Но есть два совета для рассмотрения:
 - если конечно вас не интересуют только листовой материал, то стоит добавить логику, когда попадается " не листовой"
 - я повторюсь, что не селен в переборах, но насколько мне известно, перебор  ( в вашем случае) в "oCompDef.Document.AllReferencedDocuments" затрагивает все вхождения всех уровней, то есть любые документы, на который ссылается данный файл. То есть он также затрагивает и вхождения "верхнего уровня", а значит те документы, который уже "нашел" первый пербор, продублируются и во втором. Т.е. по факту, если я правильно понял вашу задумку, вам стоит первый перебор вобще исключить.
В программировании я новичок...но ненадолго! ;)

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

  • ADN OPEN
  • Сообщений: 37
  • Карма: 0
-интересует только листовой;
-точно, можно половину выкинуть =)
Если долго мучиться - что-нибудь получится.

Оффлайн R.I.Chernov

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
-точно, можно половину выкинуть =)
Оптимизация кода - дело хорошее! )) Предлагаю вам выложить итоговый вариант, и пометить его как решение, чтобы закрыть данный топик.
В программировании я новичок...но ненадолго! ;)

Отмечено как Решение Bookvoed 07-04-2017, 16:12:46

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

  • ADN OPEN
  • Сообщений: 37
  • Карма: 0
Код - Visual Basic [Выбрать]
  1. Dim oCompDef As AssemblyComponentDefinition
  2. oCompDef = ThisApplication.ActiveDocument.ComponentDefinition
  3. Dim occ As ComponentOccurrence
  4. Dim odoc As Document
  5. Dim oFile As String
  6.  
  7.  For Each odoc In oCompDef.Document.AllReferencedDocuments
  8.         occ = oCompDef.Occurrences.AllReferencedOccurrences(odoc).Item(1)
  9.                 If  occ.Definition.Type = 150995200 Then
  10.                         oFile = occ.ReferencedDocumentDescriptor.ReferencedFileDescriptor.FullFileName
  11.                         MsgBox(oFile)
  12.             End If        
  13. Next
Если долго мучиться - что-нибудь получится.