Программное добавление "детали-подосновы"

Автор Тема: Программное добавление "детали-подосновы"  (Прочитано 4581 раз)

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

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

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Доброго времени суток, уважаемые форумчане. Снова ищу вашей помощи. Вопрос мой содержится в теме, но все же повторюсь и подробнее обрисую ситуацию. У меня есть сборка, в ней начерчен эскиз, по эскизу выполнено выдавливание, которое "прорезает" одну из подсборок. Подсборка представляет из себя массив, количество элементов которого постоянно меняется, в связи с чем мое выдавливание (после очередного изменения) не прорезает подсборку так, как мне нужно - требуется добавлять детали подосновы. Подскажите пожалуйста, какой командой это можно сделать? Можно ли добавить как "деталь-подоснову" всю подсборку, или же надо перебирать ее вхождения?
В программировании я новичок...но ненадолго! ;)

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Нашел методы AliasFreeformFeature.RemoveParticipant и  ExtrudeFeature.AddParticipant но так и не заставил их работать :(
В программировании я новичок...но ненадолго! ;)

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

  • ADN Club
  • **
  • Сообщений: 87
  • Карма: 20
Можно ли добавить как "деталь-подоснову" всю подсборку, или же надо перебирать ее вхождения?
Можно добавлять только детали, сборки тут не при делах. Вот примерный код:
Код - Visual Basic [Выбрать]
  1. Dim aDoc As AssemblyDocument
  2. Set aDoc = ThisApplication.ActiveDocument
  3. Dim eF As ExtrudeFeature
  4. Set eF = aDoc.ComponentDefinition.Features.ExtrudeFeatures(1)
  5. Dim oOc As ComponentOccurrence
  6. Set oOc = aDoc.ComponentDefinition.Occurrences.ItemByName("Ролик:2")
  7. ' add Occurrence
  8. eF.AddParticipant oOc
  9. ' remove Occurrence
  10. eF.RemoveParticipant oOc

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Спасибо, Алексей. Часа три потратил чтобы понять, почему мой код не работает, хотя он полностью идентичен вашему :(. В описании метода ExtrudeFeature.AddParticipant вычитал такую вот фразу "An error occurs if the input ComponentOccurrence is not a leaf occurrence". Поправьте пожалуйста если ошибаюсь, детали подсборки не соответствуют понятию "leaf occurrence"? То есть их нельзя внести как деталь подоснову с помощью этого метода?

П.С. Ну и если это так, то можно ли что-то поделать? Ведь в пользовательском интерфейсе как деталь подоснову можно внести любой элемент (деталь любого уровня)?

П.П.С. Решил добавить сборку и код на котором экспериментировал. Если попробовать добавить "Part 2" как подоснову, то выдает ошибку
Код - Visual Basic [Выбрать]
  1. Sub podosnova_test()
  2. Dim oCompDef As AssemblyComponentDefinition
  3. Set oCompDef = ThisApplication.ActiveDocument.ComponentDefinition
  4. Dim occP1 As ComponentOccurrence: Dim occP2 As ComponentOccurrence
  5. Set occP1 = oCompDef.Occurrences.ItemByName("Part1")
  6. Set occP2 = oCompDef.Occurrences.ItemByName("Sub").Definition.Occurrences.ItemByName("Part2")
  7. Dim eF As ExtrudeFeature: Set eF = oCompDef.Features.ExtrudeFeatures(1)
  8. Call eF.AddParticipant(occP1)
  9. 'Call eF.RemoveParticipant(occP1) 'ошибка, если подосновы нет в выдавливании
  10. 'Call eF.AddParticipant(occP2) ' не работает :(
  11. End Sub
« Последнее редактирование: 27-02-2015, 15:00:01 от R.I.Chernov »
В программировании я новичок...но ненадолго! ;)

Отмечено как Решение R.I.Chernov 27-02-2015, 15:59:19

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Покопался еще и методом тыка сгенерировал такой вот код:
Код - Visual Basic [Выбрать]
  1. Dim PartName As String: PartName = "Part2"
  2. Dim i As Integer
  3. Dim oCompDef As AssemblyComponentDefinition
  4. Set oCompDef = ThisApplication.ActiveDocument.ComponentDefinition
  5. Dim eF As ExtrudeFeature: Set eF = oCompDef.Features.ExtrudeFeatures(1)
  6. Dim occP2 As ComponentOccurrence
  7. For Each occP2 In oCompDef.Occurrences.AllReferencedOccurrences(oCompDef)
  8. If occP2.Name = PartName Then Call eF.AddParticipant(occP2)
  9. Next

П.С. Но в голове у меня возник следующий парадокс: Если таким методом можно обратится сразу ко всем вхождениям любой сборки, то зачем делать сложнейшие многоуровневые переборы с помощью рекурсивной процедуры, которые неоднократно встречал во многих кодах?
В программировании я новичок...но ненадолго! ;)