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

ADN Club => Inventor API => Тема начата: Павел Тер-Микаэлян от 08-04-2015, 18:29:12

Название: Как работает oExtrude.SetAffectedBodies?
Отправлено: Павел Тер-Микаэлян от 08-04-2015, 18:29:12
Здравствуйте! Подскажите пожалуйста, пытаюсь добавить тело в вырез, но не пойму, что я должен поставить в качестве аргумента в 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.  
Название: Re: Как работает oExtrude.SetAffectedBodies?
Отправлено: R.I.Chernov от 08-04-2015, 20:06:55
Не уверен, что я точно понял, что вы хотите. Если вы имеете ввиду добавление тела в уже построенный вырез, тогда вам нужен метод Extrudefeature.AddParticipant(). Чуть раньше он обсуждался здесь:
http://adn-cis.org/forum/index.php?topic=1901.0 (http://adn-cis.org/forum/index.php?topic=1901.0)
Название: Re: Как работает oExtrude.SetAffectedBodies?
Отправлено: Павел Тер-Микаэлян от 08-04-2015, 20:58:15
R.I.Chernov, Спасибо за ответ! Но метод AddParticipant применяется в контексте сборок, а тут речь идет о добавлении тела в вырез в контексте детали...
Название: Re: Как работает oExtrude.SetAffectedBodies?
Отправлено: Алексей Романов от 09-04-2015, 08:35:22
но не пойму, что я должен поставить в качестве аргумента
Сами же пишите ниже: ObjectCollection!. Создайте коллекцию объектов, вставте в него тело и используйте, как аргумент...
Название: Re: Как работает oExtrude.SetAffectedBodies?
Отправлено: Павел Тер-Микаэлян от 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))
но не работает (  .... не пойму как задать эту коллекцию
Название: Re: Как работает oExtrude.SetAffectedBodies?
Отправлено: R.I.Chernov от 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" , такие он и прорежет в итоге.
Название: Re: Как работает oExtrude.SetAffectedBodies?
Отправлено: Алексей Романов от 09-04-2015, 12:09:21
В итоге заработало, код получился такой вот
Добавить нечего, все так и есть...  :)
Название: Re: Как работает oExtrude.SetAffectedBodies?
Отправлено: Павел Тер-Микаэлян от 09-04-2015, 12:17:37
Да, Спасибо:) мне кажется я бы никогда не дошел до разгадки, потому что на coll.Add (oBody) и на oExtrude.SetAffectedBodies(coll) постоянно выдавало бы ошибку несоответствия)) и я бы бился головой об стену))) сам бы скобки точно не додумался открыть))) удивительно, он же сам в подсказке пишет что надо в скобках писать))) просто разрыв шаблона))))
Название: Re: Как работает oExtrude.SetAffectedBodies?
Отправлено: Алексей Романов от 09-04-2015, 12:42:25
удивительно, он же сам в подсказке пишет что надо в скобках писать))) просто разрыв шаблона))))
У меня в варианте без скобок выдает ошибку (во второй строке), со скобками все ок (первая строка):
Код - Visual Basic [Выбрать]
  1. Call coll.Add(oCompDef.SurfaceBodies.Item(1))
  2. coll.Add oCompDef.SurfaceBodies.Item(2)

Название: Re: Как работает oExtrude.SetAffectedBodies?
Отправлено: R.I.Chernov от 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 вышеуказанные строки.
Название: Re: Как работает oExtrude.SetAffectedBodies?
Отправлено: Павел Тер-Микаэлян от 09-04-2015, 13:25:39
вот оно что, будем знать  :D
Название: Re: Как работает oExtrude.SetAffectedBodies?
Отправлено: Алексей Романов от 09-04-2015, 15:51:45
на каком языке вы программируете,  у меня в VBA работают все 4 вышеуказанные строки.
VBA 7.1 (AI2015). По моим наблюдениям процедура с явным вызовом через Call срабатывает всегда, без Call не на всех машинах, через раз...
Название: Re: Как работает oExtrude.SetAffectedBodies?
Отправлено: R.I.Chernov от 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? Или я чего не понимаю, и это одно и то же? В очередной раз осознал, насколько я еще "ущербный" программист, что даже не понимаю толком, в чем пишу :(
Название: Re: Как работает oExtrude.SetAffectedBodies?
Отправлено: Александр Ривилис от 09-04-2015, 16:52:46
Я всегда считал, что в AI встроен VBA, как в экселе. Вы , Алесей, также пишите, что у вас в AI2015 стоит VBA... Почему у меня Visual Basic?
VBA - это Visual Basic for Application
Название: Re: Как работает oExtrude.SetAffectedBodies?
Отправлено: Павел Тер-Микаэлян от 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.  
Название: Re: Как работает oExtrude.SetAffectedBodies?
Отправлено: R.I.Chernov от 09-04-2015, 19:43:28
VBA - это Visual Basic for Application

Спасибо,Александр, но понятнее не стало. Нажимаю Alt+F11 в экселе и в инвенторе. Открываются две идентичные по интерфейсу программы. В экслеле в сведении о программе написано что это "Visual Basic for Application", в инвенторе что это "Visual Basic". Получается, в них интегрированы разные программы?

П.С. Перечитал свое сообщение, вероятно со стороны непонятно, что именно я не "догоняю". Смотрите, я всегда считал так:
(напоминаю, что я конструктор, а не программист :) )
Есть такой язык Visual Basic, мне не известный. Майкрософт его слегка упростила и адаптировала под работу например с Excel или Word и назвала VBA. Чем именно упростила, я не в курсе, понимал лишь то, что эти два языка - не одно и то же. Далее где-то вычитал что Автодеск договорилась с Майкрософт, чтобы в свои продукты VBA вставлять. В связи с чем и считал, что и в инвенторе и в автокаде стоит VBA, такой же как в excel по сути, но со своей объектной моделью. Сегодня я вычитал в "информации о программе", что работаю я в Visual Basic. И это новое знание идет в разрез со всем вышеуказанным моим представлением о данной теме. Тогда как Алексей Романов пишет, что работает в "VBA 7.1 (AI2015)" , что совсем меня ступорит: "у меня в 2013AI VB, а у него в 2015 VBA?" Помогите мне разобраться пожалуйста! :)
Название: Re: Как работает oExtrude.SetAffectedBodies?
Отправлено: Александр Ривилис от 09-04-2015, 21:55:07
У меня нет Inventor'а никакой версии, зато есть AutoCAD. Смотрим внимательно на окно About VBA в AutoCAD 2008:
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F15518%2F7842324.3%2F0_fbce7_6983192e_orig.png&hash=f67194382ded880281489053a0ed37b9)
Как видишь в одном месте написано VBA, в другом Visual Basic.
А в AutoCAD 2015 так:
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F4803%2F7842324.3%2F0_fbcef_90cdb3de_orig.png&hash=fffe3fe938ae313ada43fa348d81c407)
А вообще для таких вопросов есть Гугл, Википедия и т.д.
Название: Re: Как работает oExtrude.SetAffectedBodies?
Отправлено: Алексей Романов от 10-04-2015, 05:38:13
У меня нет Inventor'а никакой версии
В АИ точно как в Акаде. Тут есть различие в разрядности, версия VBA 6.5 - 32 разрядная (АИ2013), 7.1 - 64 разрядная (с АИ2014)...

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs10.postimg.org%2Fq0nlxtp1x%2Fvba_AI.jpg&hash=6c91ab1db7008267028e3c8db81e3331) (http://postimg.org/image/q0nlxtp1x/)
Название: Re: Как работает oExtrude.SetAffectedBodies?
Отправлено: R.I.Chernov от 10-04-2015, 14:13:12
Как видишь в одном месте написано VBA, в другом Visual Basic.
Ну да, у меня тоже внизу написано VBA, не заметил. Спасибо.
Название: Re: Как работает oExtrude.SetAffectedBodies?
Отправлено: Павел Тер-Микаэлян от 10-04-2015, 14:34:24
я попытаюсь задать еще раз вопрос, может в тот раз не понятно прозвучало:
Находясь в контексте детали после создания коллекции объектов и занесения в нее тел Call ObjectColl.Add(oBody) я пытаюсь добавить эту коллекцию в существующий вырез Call oExtrude.SetAffectedBodies(ObjectColl)... После такого добавления внутри каждого члена коллекции все исчезает, например в ObjectColl.Item(1) все пусто, хотя число членов остается, то есть ObjectColl.Count есть, но использовать ObjectColl снова я не могу... приходится ее очищать ObjectColl.Clear и заносить туда снова тела.... Может кто-нибудь знает, почему так происходит?
Название: Re: Как работает oExtrude.SetAffectedBodies?
Отправлено: Алексей Романов от 15-04-2015, 18:24:24
приходится ее очищать ObjectColl.Clear и заносить туда снова тела.... Может кто-нибудь знает, почему так происходит?
В описании не нашел, почему так работает, можно долго кувыркаться...
Попробуй код заполнения коллекции оформить функцией и вызывать ее перед использованием коллекции...
Название: Re: Как работает oExtrude.SetAffectedBodies?
Отправлено: Александр Ривилис от 15-04-2015, 19:14:07
Может кто-нибудь знает, почему так происходит?
Думаю что это побочный эффект. В AutoCAD API тоже такое бывает, когда функция воздействует на свои аргументы, не смотря на то, что вроде бы она такого делать не должна.
Название: Re: Как работает oExtrude.SetAffectedBodies?
Отправлено: Павел Тер-Микаэлян от 16-04-2015, 15:17:02
Ясно, спасибо за ответы!!