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

ADN Club => Inventor API => Тема начата: R.I.Chernov от 01-12-2014, 13:49:19

Название: Управление адаптивностью через API
Отправлено: R.I.Chernov от 01-12-2014, 13:49:19
Добрый день, уважаемые форумчане! Честно говоря, не знаю, как верно сформулировать вопрос, просьба не судить за кривословие :)
При копировании сборочной единицы с помощью Vault, полученная копия не могла быть использована как "адаптивная". Стал разбираться.

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

Код - Visual Basic [Выбрать]
  1. Sub adaptivnost()
  2. Dim oCompDef As AssemblyComponentDefinition
  3. Set oCompDef = ThisApplication.ActiveDocument.ComponentDefinition
  4. Dim oCOcc As ComponentOccurrence
  5. Set oCOcc = oCompDef.Occurrences.Item(1)
  6. oCOcc.Adaptive = 1
  7. End Sub

В итоге я справился с задачей: отключал адаптивность, перед возвращением в Vault, и только после этого копировал сборку...

Отсюда напросились выводы, что свойство сборки, условно назовем его "возможность быть адаптивной" хранится в самой сборке. Если кому-то известно, как докапаться с помощью API до этого свойства, очень прошу поделиться. Совсем не хочется проводить вышеуказанную манипуляцию, каждый раз, когда потребуется скопировать подобный элемент.
Название: Re: Управление адаптивностью через API
Отправлено: Владимир Ананьев от 02-12-2014, 13:14:00
Адаптивность задается на уровне компонента сборки как логическое свойство объекта ComponentOccurrence:
ComponentOccurrence.Adaptive() As Boolean
Название: Re: Управление адаптивностью через API
Отправлено: R.I.Chernov от 03-12-2014, 13:31:24
Адаптивность задается на уровне компонента сборки как логическое свойство объекта ComponentOccurrence:
ComponentOccurrence.Adaptive() As Boolean

Спасибо, Владимир Николаевич! Но либо я не понял Ваш ответ, либо Вы не поняли мой вопрос :)
Еще раз попытаюсь объяснить мою ситуацию:
У меня есть сборка, назовем ее "Главная №1". В ней есть подсборка, назовем ее "лестница 1", и эта подсборка адаптивна. С помощью Vault я делаю копию "лестница 1" и получаю новую сборку "лестница 2". Так вот при вставке "лестницы 2" в главную сборку (или любую другую), нельзя сделать ее (лестницу) адаптивной: если делать это руками (правая кнопка мыши) , то там "адаптивность" не активна, если делать с помощью кода "ComponentOccurrence.Adaptive",  то выскакивает ошибка. Причем с любыми другими подсборками мой код работает, и успешно активизирует и снимает адаптивность элементов.
Я не уверен , в чем именно причина, потому и не могу сформулировать свой вопрос корректно :(
Я вижу ситуацию так:
Если я создам новую сборку "Главная №2" и вставлю туда "лестницу 1", то не получится поставить на нее (лестницу) "адаптивность", потому что лестница адаптивна в "Главная №1". И ,казалось бы, все логично: сборка может быть зависимой всего один раз: если она адаптивна в "Главная №1", то адаптивность неактивна в "Главная №2", и наоборот, как только я сниму адаптивность в "Главная №1" - эта функция станет активной в "Главная №2"... Но это абсолютно нелогично в случае с копированием, получается что я возвращаю в Vault сборку, внутри которой где-то указано, что она уже адаптивна один раз и не может быть адаптивной второй... сборка копируется, сохраняя это свойство (хотя ВСЕ элементы скопированы: т.е. ни один из них никак не связан с исходной сборкой). На основе всего этого я предположил, что это свойство "адаптивность" хранится в самой сборке (т.е. именно в той сборке, которую мы делаем адаптивной, или отменяем ее адаптивноть)... Например аналогичный логический параметр, если он "true", то сборку нельзя сделать адаптивной с помощью "ComponentOccurrence.Adaptive = true" ... если он false, то вышеуказанный код сможет его поменять.
Прошу прощения за огромное количество написанных буковок, короче сформулировать я не смог. В общем если подытожить, то я пытаюсь найти свойство внутри сборки, которое хранит информацию о "возможности или невозможности сборки быть адаптивной"
Заранее большое спасибо... даже за одно только терпение при прочтении! :)

Update: Покопался в английских интернетах и таки понял, что именно я искал..ниже расположены скрин шоты для детали и для сборки сделанные в меню "Инструменты-Процесс моделирования".  Пытаюсь найти код, чтобы иметь возможность менять нижеуказанную настройку.
Не разобрался, как вставить их с нормальным разрешением, необходимо кликнуть по изображению :)


(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs23.postimg.org%2Ftgu8nm8s7%2Fimage.jpg&hash=5bfdd143e48b752d0013162ed61cf11b) (http://postimg.org/image/tgu8nm8s7/)

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs22.postimg.org%2Fyg0g5n8n1%2Fimage.jpg&hash=91edcdb0c00dfc2fec0735600b67ceb2) (http://postimg.org/image/yg0g5n8n1/)

Название: Re: Управление адаптивностью через API
Отправлено: Владимир Ананьев от 04-12-2014, 16:25:33
Наверное, вот это:
ModelingSettings.AdaptivelyUsedInAssembly() as Boolean

Ссылку на этот объект можно получить как из документа детали, так и сборки.
Название: Re: Управление адаптивностью через API
Отправлено: R.I.Chernov от 05-12-2014, 11:22:47
Спасибо, Владимир Николаевич! Это именно то, что я искал. Ниже привожу мой итоговый код (ну может кому пригодится :) )
Код - Visual Basic [Выбрать]
  1. Sub adaptivnost_1()
  2. Dim oDoc As Inventor.Document
  3. Set oDoc = ThisApplication.ActiveDocument
  4. oDoc.ModelingSettings.AdaptivelyUsedInAssembly = 0
  5. End Sub
Хочу отметить, что данным кодом параметр можно изменить лишь на значение "false", попытка присвоить ему значение "true" заканчивается ошибкой... как я понимаю, элемент можно сделать адаптивным лишь тогда, когда он вставлен в другую сборку, используя код:
Код - Visual Basic [Выбрать]
  1.     Sub adaptivnost()
  2.     Dim oCompDef As AssemblyComponentDefinition
  3.     Set oCompDef = ThisApplication.ActiveDocument.ComponentDefinition
  4.     Dim oCOcc As ComponentOccurrence
  5.     Set oCOcc = oCompDef.Occurrences.Item(1)
  6.     oCOcc.Adaptive = 1
  7.     End Sub