Вставка библиотечных компонентов

Автор Тема: Вставка библиотечных компонентов  (Прочитано 11158 раз)

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

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

Оффлайн Павел Тер-МикаэлянАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
Доброго времени суток! А подскажите пожалуйста, мне нужно программно вставить много деталей из библиотеки как пользовательские, я сначала вставляю их как библиотечные, а потом пересохраняю Call oPartDoc.SaveAs, но при этом иконка деталей все равно библиотечная, и они как то друг с другом связаны, изменяя одну деталь, изменяются все остальные, хотя у каждой детали свое новое место на диске.... Можно ли сразу вставить их как пользовательские, указав место сохранения на диске, по типу ручной вставки? И еще вопрос, как можно в библиотечной детали, например в трубе, изменить длину? Если это пользовательская то я просто могу зайти в нее и изменить параметр, а если библиотечная, то такой способ не получится, потому что она защищена от записи.

Оффлайн Владимир Ананьев

  • ADN DevHelp
  • *
  • Сообщений: 148
  • Карма: 8
Re: Вставка библиотечных компонентов
« Ответ #1 : 27-11-2014, 20:25:25 »
Вот слегка модифицированный пример из Inventor API Help.
Он вставляет в новую сборку первые несколько членов указанного семейства болтов. 
Новые компоненты создаются как пользовательские в явно указанной папке.
Основную работу выполняет метод family.CreateMember(...).
Код - Visual Basic [Выбрать]
  1. Sub PlaceFromContentCenter_2()
  2.     'новая сборка
  3.    Dim asmDoc As AssemblyDocument
  4.     Set asmDoc = ThisApplication.Documents.Add(kAssemblyDocumentObject)
  5.     'определение сборки
  6.    Dim asmDef As AssemblyComponentDefinition
  7.     Set asmDef = asmDoc.ComponentDefinition
  8.    
  9.     ' Get the node in the content browser based on the names of the nodes in the hierarchy.
  10.    ' найдем узел в браузере CC по именам узлов в иерархической цепочке
  11.    Dim hexHeadNode As ContentTreeViewNode
  12.     Set hexHeadNode = ThisApplication.ContentCenter.TreeViewTopNode _
  13.             .ChildNodes.Item("Fasteners") _
  14.             .ChildNodes.Item("Bolts") _
  15.             .ChildNodes.Item("Hex Head")
  16.    
  17.     ' Find a specific family.  In this case it's using the display name,
  18.    ' but any family characteristic could be searched for.
  19.    ' Найдем конкретное семейство. Здесь ищем по отображаемому имени.
  20.    ' Можно искать и по другим характеристикам.
  21.    Dim family As ContentFamily
  22.     Dim checkFamily As ContentFamily
  23.     For Each checkFamily In hexHeadNode.Families
  24.         If checkFamily.DisplayName = "DIN EN 24016" Then
  25.             Set family = checkFamily
  26.             Exit For
  27.         End If
  28.     Next
  29.    
  30.     If Not family Is Nothing Then
  31.         ' Place one instance of each member.
  32.        ' вставка членов семейства CC
  33.        Dim offset As Double
  34.         offset = 0
  35.         Dim row As ContentTableRow
  36.         'корневое имя вех деталей. Здесь это просто временная папка.
  37.        'к имени будет подставляться индекс, напр. NewPart-4, NewPart-5 и т.д.
  38.        Dim filename As String
  39.         filename = "c:\TEMP\AAA\NewPart-"
  40.        
  41.         'вставим в свою демо-сборку первые несколько членов семейства
  42.        Dim i As Integer
  43.         For i = 1 To 5    'family.TableRows.Count
  44.            Set row = family.TableRows.Item(i)
  45.             ' Create the member (part file) from the table.
  46.            ' Генерация детали, определяемой параметрами в строке row
  47.            Dim failureReason As MemberManagerErrorsEnum
  48.             Dim failureMessage As String
  49.             Dim memberFilename As String
  50.             memberFilename = family.CreateMember(row, _
  51.                     failureReason, failureMessage, kRefreshOutOfDateParts, _
  52.                     True, filename & CStr(i) & ".ipt")
  53.            
  54.             ' Place the part into the assembly.
  55.            ' вставляем деталь в сборку
  56.            Dim transMatrix As Matrix
  57.             Set transMatrix = ThisApplication.TransientGeometry.CreateMatrix
  58.             transMatrix.Cell(2, 4) = offset
  59.             Dim Occ As ComponentOccurrence
  60.             Set Occ = asmDef.Occurrences.Add(memberFilename, transMatrix)
  61.            
  62.             ' Compute the position for the next placement based on the size of the part just placed.
  63.            ' вычисляем смещение для следующего компонента.  Используется размер предыдущего компонента.
  64.            Dim minY As Double
  65.             Dim maxY As Double
  66.             minY = Occ.RangeBox.MinPoint.y
  67.             maxY = Occ.RangeBox.MaxPoint.y
  68.             offset = offset + ((maxY - minY) * 1.1)
  69.         Next
  70.     End If
  71.    
  72.     Beep
  73.     ThisApplication.ActiveView.Fit
  74. End Sub
« Последнее редактирование: 27-11-2014, 21:25:50 от Александр Ривилис »

Оффлайн Владимир Ананьев

  • ADN DevHelp
  • *
  • Сообщений: 148
  • Карма: 8
Re: Вставка библиотечных компонентов
« Ответ #2 : 27-11-2014, 20:32:14 »
По второму вопросу, вероятно, поможет следующая ветка на форуме:
http://forums.autodesk.com/t5/inventor-customization/vba-ipart-value-from-ipart-table/m-p/5382239#M52566

Оффлайн Павел Тер-МикаэлянАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
Re: Вставка библиотечных компонентов
« Ответ #3 : 28-11-2014, 10:47:25 »
По второму вопросу, вероятно, поможет следующая ветка на форуме:
http://forums.autodesk.com/t5/inventor-customization/vba-ipart-value-from-ipart-table/m-p/5382239#M52566
Спасибо большое за ответ! Про вставку понял. А теперь по поводу размера библиотечного компонента. В той ссылке, которую вы прислали описывается как изменить размер параметрической детали через ComponentOccurrence\Definition\iPartMember\iPartFactory\iPartTableColumns\iPartTableRows\item\value, но у вставленного библиотечного компонента нету iPartMember, его значение Nothing. Как же быть? family.CreateMember не может сразу вставлять детали с разным параметром, трубы разной длины например? Я могу поменять размер уже вставленного компонента вот так: component.Definition.Parameters.Item("PL").Value=500, но тогда у всех одинаковых библиотечных элементов параметр "PL" становится одинаковый, то есть происходит тоже самое, как и в случае, если поменять параметр вручную и поставить галочку "Заменить все".
« Последнее редактирование: 28-11-2014, 11:02:42 от Pabloa »

Оффлайн Владимир Ананьев

  • ADN DevHelp
  • *
  • Сообщений: 148
  • Карма: 8
Re: Вставка библиотечных компонентов
« Ответ #4 : 28-11-2014, 11:42:17 »
Если не сложно, загрузите демо-сборку с парой-тройкой ваших труб + код короткой тестовой программы, на которой у вас всплывает проблема.  Спасибо.

Оффлайн Павел Тер-МикаэлянАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
Re: Вставка библиотечных компонентов
« Ответ #5 : 28-11-2014, 12:23:25 »
Ниже два примера
Код - Visual Basic [Выбрать]
  1. 1) Вот здесь трубы вставляются все одинаковые, а нужно чтобы разные
  2. '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  3.    Set oFamily = oContentCenter.TreeViewTopNode.ChildNodes. _
  4.     Item("Арматура трубопроводов").ChildNodes. _
  5.     Item("Трубопроводы").ChildNodes. _
  6.     Item("Трубы").Families. _
  7.     Item(51)
  8.    
  9.     TrubaFile(1) = oFamily.CreateMember(20, error, strErrorMessage, kRefreshOutOfDateParts)
  10.  
  11. 'Вставка труб по матрице
  12. For i = 1 To zmeevik_N_T_rad
  13. 'абзац можно не читать
  14. zmeevik_alpha(i) = zmeevik_alpha(i) - 2 * Atn((zmeevik_D_otvod_rad / zmeevik_D_okr_rad) / Sqr(-(zmeevik_D_otvod_rad / zmeevik_D_okr_rad) ^ 2 + 1)) + 0 'чтобы первая труба совпадала с осью (0-угол поворота первой трубы)
  15. zmeevik_Az_T_osn(i) = 0
  16. zmeevik_Ax_T_osn(i) = zmeevik_D_okr_rad * 0.5 * Sin(zmeevik_alpha(i))
  17. zmeevik_Ay_T_osn(i) = zmeevik_D_okr_rad * 0.5 * Cos(zmeevik_alpha(i))
  18. Set oTrans = oApp.TransientGeometry.CreateVector(zmeevik_Ax_T_osn(i) * 0.1, zmeevik_Ay_T_osn(i) * 0.1, zmeevik_Az_T_osn(i) * 0.1)
  19. oPositionMatrix.SetTranslation oTrans
  20.  
  21. Set component = oAssyDoc.ComponentDefinition.Occurrences.Add(TrubaFile(1), oPositionMatrix)
  22. component.Grounded = True 'базовый
  23. component.Definition.Parameters.Item("PL").Value = zmeevik_L_T_rad*i / 10 'меняется текущий компонент и все остальные
  24. Next
  25.     End Sub
  26. '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  27.  
  28. вот здесь трубы разной длины, но при этом они пользовательские и тратится время на сохранение на диск
  29. '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  30.    Set oFamily = oContentCenter.TreeViewTopNode.ChildNodes. _
  31.     Item("Арматура трубопроводов").ChildNodes. _
  32.     Item("Трубопроводы").ChildNodes. _
  33.     Item("Трубы").Families. _
  34.     Item(51)
  35.    
  36. 'Вставка труб по матрице
  37. For i = 1 To zmeevik_N_T_rad
  38.  
  39. 'абзац можно не читать
  40. zmeevik_alpha(i) = zmeevik_alpha(i) - 2 * Atn((zmeevik_D_otvod_rad / zmeevik_D_okr_rad) / Sqr(-(zmeevik_D_otvod_rad / zmeevik_D_okr_rad) ^ 2 + 1)) + 0 'чтобы первая труба совпадала с осью (0-угол поворота первой трубы)
  41. zmeevik_Az_T_osn(i) = 0
  42. zmeevik_Ax_T_osn(i) = zmeevik_D_okr_rad * 0.5 * Sin(zmeevik_alpha(i))
  43. zmeevik_Ay_T_osn(i) = zmeevik_D_okr_rad * 0.5 * Cos(zmeevik_alpha(i))
  44. Set oTrans = oApp.TransientGeometry.CreateVector(zmeevik_Ax_T_osn(i) * 0.1, zmeevik_Ay_T_osn(i) * 0.1, zmeevik_Az_T_osn(i) * 0.1)
  45. oPositionMatrix.SetTranslation oTrans
  46.  
  47.  
  48. TrubaFile(i) = oFamily.CreateMember(20, error, strErrorMessage, kRefreshOutOfDateParts, _
  49.                     True, "W:\Users\Труба " & i & ".ipt")
  50.  
  51. Set component = oAssyDoc.ComponentDefinition.Occurrences.Add(TrubaFile(i), oPositionMatrix)
  52. component.Grounded = True 'базовый
  53. component.Definition.Parameters.Item("PL").Value = zmeevik_L_T_rad*i / 10 'меняется только текущий компонент
  54. Next
  55.     End Sub
  56. '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  57.  
  58.  

Вопрос в том, как можно изменить параметр, не пользовательской, а библиотечной трубы (длину) програмнно, чтобы остальные трубы одновременно не поменялись .... Вручную если нажать в дереве на компонент, правая кнопка, изменить размер и изменить параметр "PL", то поменяется только текущая труба, а вот когда программно его меняешь через component.Definition.Parameters.Item("PL").Value , то меняются все трубы

p.s. просто я понял что намного быстрее вставлять библиотечные, чем ждать каждый раз сохранения на диск
« Последнее редактирование: 28-11-2014, 23:58:17 от Александр Ривилис »

Оффлайн Павел Тер-МикаэлянАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
Re: Вставка библиотечных компонентов
« Ответ #6 : 28-11-2014, 14:14:36 »
Код - Visual Basic [Выбрать]
  1.  
  2. Private Sub proooopppp()
  3.  
  4. Dim oApp As Inventor.Application
  5. Set oApp = ThisApplication
  6. Dim oDoc As Document
  7. Set oDoc = oApp.ActiveDocument
  8.     Dim oCompDef As Inventor.ComponentDefinition
  9.     Set oCompDef = oDoc.ComponentDefinition
  10.     Dim oCompOcc As ComponentOccurrence
  11.         Dim oCompOcc2 As ComponentOccurrence
  12.  
  13.     Set oCompOcc = oCompDef.Occurrences.ItemByName("Труба")
  14.      Set oCompOcc2 = oCompDef.Occurrences.ItemByName("Труба(другая)")
  15.      
  16. oCompOcc.Definition.Parameters.Item("L").Value = 500
  17. oCompOcc2.Definition.Parameters.Item("L").Value = 200
  18.  
  19.  

Смотрите какая ситуация. Прикрепляю свою сборку. Она состоит из библиотечных труб. После вставки у компонента "Труба" я вручную изменил параметр "L" (правой кнопкой по компоненту, "изменить размер") После чего, выполняя следующий макрос данная труба меняется, но остальные трубы не меняются. А вот если изменить этот параметр у любой другой трубы, например  "Труба(другая)" , то меняются все остальные трубы. То есть после того как я вручную поменял длину, то какое то свойство у этой трубы  изменилось и она не изменяет остальные трубы... И я не могу понять что это за свойство ассоциирует один библиотечный компонент с другими такими же в сборке, может вы мне поможете... Или  подскажите как можно сравнить все дерево объектов у двух компонентов, найти различия... пытаюсь через окно Locals, но это очень уж тяжело.
« Последнее редактирование: 28-11-2014, 23:57:31 от Александр Ривилис »

Отмечено как Решение Павел Тер-Микаэлян 28-11-2014, 21:15:15

Оффлайн Владимир Ананьев

  • ADN DevHelp
  • *
  • Сообщений: 148
  • Карма: 8
Re: Вставка библиотечных компонентов
« Ответ #7 : 28-11-2014, 16:33:08 »
Попробуйте вот этот код.  У меня работает.
Библиотека задается именем, строка таблицы - просто номером.
Длина - строковым представлением с указанием единиц измерения ("777 мм").

Код - Visual Basic [Выбрать]
  1. Sub PlaceStdTube_FromContentCenter_1()
  2.     'новая сборка
  3.    Dim asmDoc As AssemblyDocument
  4.     Set asmDoc = ThisApplication.Documents.Add(kAssemblyDocumentObject)
  5. '    Set asmDoc = ThisApplication.ActiveDocument
  6.    
  7.     'определение сборки
  8.    Dim asmDef As AssemblyComponentDefinition
  9.     Set asmDef = asmDoc.ComponentDefinition
  10.  
  11.     ' найдем узел в браузере CC по именам узлов в иерархической цепочке
  12.    Dim oNode As ContentTreeViewNode
  13.     Set oNode = ThisApplication.ContentCenter.TreeViewTopNode _
  14.             .ChildNodes.Item("Tube & Pipe") _
  15.             .ChildNodes.Item("Conduits") _
  16.             .ChildNodes.Item("Pipes")
  17.    
  18.     ' Найдем конкретное семейство. Здесь ищем по отображаемому имени.
  19.    ' Можно искать и по другим характеристикам.
  20.    Dim family As ContentFamily
  21.     Dim checkFamily As ContentFamily
  22.     For Each checkFamily In oNode.Families
  23.         If checkFamily.DisplayName = "Pipe GOST 550-75" Then
  24.             Set family = checkFamily
  25.             Exit For
  26.         End If
  27.     Next
  28.    
  29.     If Not family Is Nothing Then
  30.         'формируем набор опций для создаваемого компонента.
  31.        'в данном случае мы указываем значение параметра PL
  32.        Dim map As NameValueMap
  33.         Set map = ThisApplication.TransientObjects.CreateNameValueMap
  34.         Call map.Add("PL", "777 мм")
  35.        
  36.         Dim failureReason As MemberManagerErrorsEnum
  37.         Dim failureMessage As String
  38.         Dim memberFilename As String
  39.         'первый аргумент - номер строки в таблице вариантов. Я взял 7.
  40.        'можно предварительно организовать поиск по таблице
  41.        'по набору других характеристик (диаметр, толщина стенки и т.п.)
  42.        memberFilename = family.CreateMember( _
  43.             7, _
  44.             failureReason, failureMessage, , False, , _
  45.             map)
  46.                
  47.         ' вставляем трубу в сборку (с некотороым смещением относительно нуля)
  48.        Dim oMatrix As Matrix
  49.         Set oMatrix = ThisApplication.TransientGeometry.CreateMatrix
  50.         oMatrix.Cell(2, 4) = 5  ' 50 mm
  51.        Dim Occ As ComponentOccurrence
  52.         Set Occ = asmDef.Occurrences.Add(memberFilename, oMatrix)
  53.     Else
  54.         MsgBox "Семейство не найдено   :)"
  55.     End If
  56.    
  57.     Beep
  58.     ThisApplication.ActiveView.Fit
  59. End Sub

Оффлайн Павел Тер-МикаэлянАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
Re: Вставка библиотечных компонентов
« Ответ #8 : 28-11-2014, 21:20:55 »
Попробуйте вот этот код.  У меня работает.
Библиотека задается именем, строка таблицы - просто номером.
Длина - строковым представлением с указанием единиц измерения ("777 мм").

Код - Visual Basic [Выбрать]
  1. Sub PlaceStdTube_FromContentCenter_1()
  2.     'новая сборка
  3.    Dim asmDoc As AssemblyDocument
  4.     Set asmDoc = ThisApplication.Documents.Add(kAssemblyDocumentObject)
  5. '    Set asmDoc = ThisApplication.ActiveDocument
  6.    
  7.     'определение сборки
  8.    Dim asmDef As AssemblyComponentDefinition
  9.     Set asmDef = asmDoc.ComponentDefinition
  10.  
  11.     ' найдем узел в браузере CC по именам узлов в иерархической цепочке
  12.    Dim oNode As ContentTreeViewNode
  13.     Set oNode = ThisApplication.ContentCenter.TreeViewTopNode _
  14.             .ChildNodes.Item("Tube & Pipe") _
  15.             .ChildNodes.Item("Conduits") _
  16.             .ChildNodes.Item("Pipes")
  17.    
  18.     ' Найдем конкретное семейство. Здесь ищем по отображаемому имени.
  19.    ' Можно искать и по другим характеристикам.
  20.    Dim family As ContentFamily
  21.     Dim checkFamily As ContentFamily
  22.     For Each checkFamily In oNode.Families
  23.         If checkFamily.DisplayName = "Pipe GOST 550-75" Then
  24.             Set family = checkFamily
  25.             Exit For
  26.         End If
  27.     Next
  28.    
  29.     If Not family Is Nothing Then
  30.         'формируем набор опций для создаваемого компонента.
  31.        'в данном случае мы указываем значение параметра PL
  32.        Dim map As NameValueMap
  33.         Set map = ThisApplication.TransientObjects.CreateNameValueMap
  34.         Call map.Add("PL", "777 мм")
  35.        
  36.         Dim failureReason As MemberManagerErrorsEnum
  37.         Dim failureMessage As String
  38.         Dim memberFilename As String
  39.         'первый аргумент - номер строки в таблице вариантов. Я взял 7.
  40.        'можно предварительно организовать поиск по таблице
  41.        'по набору других характеристик (диаметр, толщина стенки и т.п.)
  42.        memberFilename = family.CreateMember( _
  43.             7, _
  44.             failureReason, failureMessage, , False, , _
  45.             map)
  46.                
  47.         ' вставляем трубу в сборку (с некотороым смещением относительно нуля)
  48.        Dim oMatrix As Matrix
  49.         Set oMatrix = ThisApplication.TransientGeometry.CreateMatrix
  50.         oMatrix.Cell(2, 4) = 5  ' 50 mm
  51.        Dim Occ As ComponentOccurrence
  52.         Set Occ = asmDef.Occurrences.Add(memberFilename, oMatrix)
  53.     Else
  54.         MsgBox "Семейство не найдено   :)"
  55.     End If
  56.    
  57.     Beep
  58.     ThisApplication.ActiveView.Fit
  59. End Sub

Спасибо большое)) Чувствую еще многому надо учиться)) Мы с коллегами с нетерпением ждем следующего Autodesk University)))

Оффлайн Павел Тер-МикаэлянАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
Re: Вставка библиотечных компонентов
« Ответ #9 : 03-12-2014, 15:13:55 »
У меня возник еще один вопрос:
Код - Visual Basic [Выбрать]
  1. Dim map As NameValueMap
  2. Set map = ThisApplication.TransientObjects.CreateNameValueMap
  3. Call map.Add("OD", "200")
  4. TrubaFile = oFamily.CreateMember(1, failureReason, failureMessage, , False, , map)
  5. component = oCompDef2.Occurrences.Add(TrubaFile, oPositionMatrix)
  6.  
вот здесь мы вставляем компонент, у которого один пользовательский параметр "OD" равен 200. А если нужно вставить компонент с несколькими заданными пользовательскими параметрами, то как быть? Писал вот так, но не получилось
Код - Visual Basic [Выбрать]
  1. Call map.Add("OD", "200")
  2. Call map.Add("PL", "1000")
  3. TrubaFile = oFamily.CreateMember(1, failureReason, failureMessage, , False, , map)
  4.  


« Последнее редактирование: 03-12-2014, 17:23:46 от Александр Ривилис »

Оффлайн Павел Тер-МикаэлянАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
Re: Вставка библиотечных компонентов
« Ответ #10 : 03-12-2014, 15:36:07 »
У меня возник еще один вопрос:
Dim map As NameValueMap
Set map = ThisApplication.TransientObjects.CreateNameValueMap
Call map.Add("OD", "200")
TrubaFile = oFamily.CreateMember(1, failureReason, failureMessage, , False, , map)
component = oCompDef2.Occurrences.Add(TrubaFile, oPositionMatrix)
вот здесь мы вставляем компонент, у которого один пользовательский параметр "OD" равен 200. А если нужно вставить компонент с несколькими заданными пользовательскими параметрами, то как быть? Писал вот так, но не получилось
Call map.Add("OD", "200")
Call map.Add("PL", "1000")
TrubaFile = oFamily.CreateMember(1, failureReason, failureMessage, , False, , map)
А нет, работает) прошу прощения)

Оффлайн Владимир Ананьев

  • ADN DevHelp
  • *
  • Сообщений: 148
  • Карма: 8
Re: Вставка библиотечных компонентов
« Ответ #11 : 04-12-2014, 16:28:41 »
Ну и славно,  поздравляю  :)

Оффлайн Павел Тер-МикаэлянАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
Re: Вставка библиотечных компонентов
« Ответ #12 : 08-12-2014, 12:41:05 »
Ну и славно,  поздравляю  :)
Вообще, информация о том, что при CreateMember можно указывать свойство map As NameValueMap, очень ценная) Хоть и об этом сказано в справке, но примеров нет) поэтому вдвойне спасибо)