Как работает oExtrude.SetAffectedBodies?

Автор Тема: Как работает oExtrude.SetAffectedBodies?  (Прочитано 11884 раз)

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

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

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

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
Здравствуйте! Подскажите пожалуйста, пытаюсь добавить тело в вырез, но не пойму, что я должен поставить в качестве аргумента в oExtrude.SetAffectedBodies... В подсказке написано Bodies as ObjectCollection.... Я подставляю тело... Вообще не понимаю...
Код - Visual Basic [Выбрать]
  1. Public Sub DecalFeature()
  2.  
  3.     Dim oPartDoc As PartDocument
  4.     Set oPartDoc = ThisApplication.ActiveDocument
  5.                
  6.     Dim oCompDef As PartComponentDefinition
  7.     Set oCompDef = oPartDoc.ComponentDefinition
  8.        
  9.     Dim oSketch As PlanarSketch
  10.     Set oSketch = oCompDef.Sketches.Item("1234")
  11.    
  12.     Dim oProfile As Profile
  13.     Set oProfile = oSketch.Profiles.AddForSolid
  14.  
  15.     Dim oExtrudeDef As ExtrudeDefinition
  16.     Set oExtrudeDef = oCompDef.Features.ExtrudeFeatures.CreateExtrudeDefinition(oProfile, kCutOperation)
  17.     Call oExtrudeDef.SetThroughAllExtent(kNegativeExtentDirection)
  18.    
  19.     Dim oExtrude As ExtrudeFeature
  20.     Set oExtrude = oCompDef.Features.ExtrudeFeatures.Add(oExtrudeDef)
  21.  
  22.    Call oExtrude.SetAffectedBodies(oCompDef.SurfaceBodies.Item(22))
  23. end sub
  24.  

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

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Re: Как работает oExtrude.SetAffectedBodies?
« Ответ #1 : 08-04-2015, 20:06:55 »
Не уверен, что я точно понял, что вы хотите. Если вы имеете ввиду добавление тела в уже построенный вырез, тогда вам нужен метод Extrudefeature.AddParticipant(). Чуть раньше он обсуждался здесь:
http://adn-cis.org/forum/index.php?topic=1901.0
В программировании я новичок...но ненадолго! ;)

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

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
Re: Как работает oExtrude.SetAffectedBodies?
« Ответ #2 : 08-04-2015, 20:58:15 »
R.I.Chernov, Спасибо за ответ! Но метод AddParticipant применяется в контексте сборок, а тут речь идет о добавлении тела в вырез в контексте детали...

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

  • ADN Club
  • **
  • Сообщений: 87
  • Карма: 20
Re: Как работает oExtrude.SetAffectedBodies?
« Ответ #3 : 09-04-2015, 08:35:22 »
но не пойму, что я должен поставить в качестве аргумента
Сами же пишите ниже: ObjectCollection!. Создайте коллекцию объектов, вставте в него тело и используйте, как аргумент...

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

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
Re: Как работает oExtrude.SetAffectedBodies?
« Ответ #4 : 09-04-2015, 10:09:48 »
Алексей Романов, Вот я и пытаюсь, делаю по-разному, вот так например:
Dim ss As ObjectCollection 
Set ss.Item(1) = ss.Add(oCompDef.SurfaceBodies.Item(22))
Call oExtrude.SetAffectedBodies(ss.Item(1))
но не работает (  .... не пойму как задать эту коллекцию
« Последнее редактирование: 09-04-2015, 10:31:15 от Pabloa »

Отмечено как Решение Павел Тер-Микаэлян 09-04-2015, 12:17:42

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

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Re: Как работает oExtrude.SetAffectedBodies?
« Ответ #5 : 09-04-2015, 11:46:28 »
Прошу не судить строго мой код, разбирался с ним параллельно с вами :)
В итоге заработало, код получился такой вот (см. прикрепленную деталь):

Код - Text [Выбрать]
  1. Sub dobavlenie_tela_v_virez()
  2. Dim oCompDef As PartComponentDefinition
  3. Set oCompDef = ThisApplication.ActiveDocument.ComponentDefinition
  4.  
  5. Dim coll As ObjectCollection
  6. Set coll = ThisApplication.TransientObjects.CreateObjectCollection
  7.  
  8. coll.Add oCompDef.SurfaceBodies.Item(1)
  9. coll.Add oCompDef.SurfaceBodies.Item(2)
  10.  
  11. oCompDef.Features.ExtrudeFeatures("Virez").SetAffectedBodies coll
  12. End Sub

П.С. Как я понял, в коллекцию нужно включать все тела, которые в итоге должны быть затронуты выдавливанием, а не только то, которое хотите добавить. Иначе он сделает вырез лишь в том теле которое добавили, а прочие вырезы удалит. Т.е. какие тела вы включите в коллекцию в строках "coll.Add" , такие он и прорежет в итоге.
В программировании я новичок...но ненадолго! ;)

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

  • ADN Club
  • **
  • Сообщений: 87
  • Карма: 20
Re: Как работает oExtrude.SetAffectedBodies?
« Ответ #6 : 09-04-2015, 12:09:21 »
В итоге заработало, код получился такой вот
Добавить нечего, все так и есть...  :)

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

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
Re: Как работает oExtrude.SetAffectedBodies?
« Ответ #7 : 09-04-2015, 12:17:37 »
Да, Спасибо:) мне кажется я бы никогда не дошел до разгадки, потому что на coll.Add (oBody) и на oExtrude.SetAffectedBodies(coll) постоянно выдавало бы ошибку несоответствия)) и я бы бился головой об стену))) сам бы скобки точно не додумался открыть))) удивительно, он же сам в подсказке пишет что надо в скобках писать))) просто разрыв шаблона))))

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

  • ADN Club
  • **
  • Сообщений: 87
  • Карма: 20
Re: Как работает oExtrude.SetAffectedBodies?
« Ответ #8 : 09-04-2015, 12:42:25 »
удивительно, он же сам в подсказке пишет что надо в скобках писать))) просто разрыв шаблона))))
У меня в варианте без скобок выдает ошибку (во второй строке), со скобками все ок (первая строка):
Код - Visual Basic [Выбрать]
  1. Call coll.Add(oCompDef.SurfaceBodies.Item(1))
  2. coll.Add oCompDef.SurfaceBodies.Item(2)


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

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Re: Как работает oExtrude.SetAffectedBodies?
« Ответ #9 : 09-04-2015, 13:21:29 »
У меня в варианте без скобок выдает ошибку

Прочел ваше сообщение и вспомнил : я пару раз уже натыкался на подобные парадоксы (в некоторых других командах). Вывод я сделал такой (правда не тестировал всегда ли он работает, думаю, это скорее частный случай):
Если вначале строки пишете "Call", то аргумент должен быть в скобках, если не пишете, то аргумент пишется через пробел. Т.е. в моем коде можно подставить любую из следующих строк:
Код - Text [Выбрать]
  1. coll.Add oCompDef.SurfaceBodies.Item(1)
  2. coll.Add oCompDef.SurfaceBodies.Item(2)
  3.  
  4. Call coll.Add(oCompDef.SurfaceBodies.Item(1))
  5. Call coll.Add(oCompDef.SurfaceBodies.Item(2))

Не знаю, Алексей, на каком языке вы программируете,  у меня в VBA работают все 4 вышеуказанные строки.
В программировании я новичок...но ненадолго! ;)

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

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
Re: Как работает oExtrude.SetAffectedBodies?
« Ответ #10 : 09-04-2015, 13:25:39 »
вот оно что, будем знать  :D

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

  • ADN Club
  • **
  • Сообщений: 87
  • Карма: 20
Re: Как работает oExtrude.SetAffectedBodies?
« Ответ #11 : 09-04-2015, 15:51:45 »
на каком языке вы программируете,  у меня в VBA работают все 4 вышеуказанные строки.
VBA 7.1 (AI2015). По моим наблюдениям процедура с явным вызовом через Call срабатывает всегда, без Call не на всех машинах, через раз...

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

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Re: Как работает oExtrude.SetAffectedBodies?
« Ответ #12 : 09-04-2015, 16:31:24 »
VBA 7.1 (AI2015)
У вас не работает строка "coll.Add oCompDef.SurfaceBodies.Item(2)"?
Быть может причина еще в том, что у меня AI2013? Слышал от знакомых, что программный код немного менялся.

П.С. Если можете, помогите пожалуйста разобраться:
Залез в "Хелп- О программе" мне пишет, что программа Visual Basic 6.3. И тут я "завис".
Я всегда считал, что в AI встроен VBA, как в экселе. Вы , Алесей, также пишите, что у вас в AI2015 стоит VBA... Почему у меня Visual Basic? Или я чего не понимаю, и это одно и то же? В очередной раз осознал, насколько я еще "ущербный" программист, что даже не понимаю толком, в чем пишу :(
В программировании я новичок...но ненадолго! ;)

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

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как работает oExtrude.SetAffectedBodies?
« Ответ #13 : 09-04-2015, 16:52:46 »
Я всегда считал, что в AI встроен VBA, как в экселе. Вы , Алесей, также пишите, что у вас в AI2015 стоит VBA... Почему у меня Visual Basic?
VBA - это Visual Basic for Application
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
Re: Как работает oExtrude.SetAffectedBodies?
« Ответ #14 : 09-04-2015, 18:12:54 »
Возвращаясь к насущному, после выполнения метода oExtrude.SetAffectedBodies(ObjectColl), почему-то сбрасывается вся коллекция объектов: в ObjectColl появляются пустые Item, из-за чего не получается использовать одну и туже коллекцию несколько раз... Приходится каждый раз при создании вырезов очищать коллекцию и загонять в нее снова тела ... Может я что-то не то делаю?
Код - Visual Basic [Выбрать]
  1.       For Each oBody In oCompDef.SurfaceBodies
  2.                 If oBody.Name = "11" Or oBody.Name = "31" Or _
  3.                    oBody.Name = "12" Or oBody.Name = "32" Then
  4.                    Call ObjectColl.Add(oBody)
  5.                  End If
  6.       Next
  7.      
  8.     Call oExtrude.SetAffectedBodies(ObjectColl)  - СБРАСЫВАЕТСЯ КОЛЛЕКЦИЯ ТЕЛ
  9.