Решение проблемы извлечения сгруппированных объектов из контейнера.

Не так давно решил попробовать в тяжелых сценах использовать контейнеры. Однако у меня возникла ситуация с нехваткой памяти и я решил избавиться от контейнеров. Но вытащить объекты из контейнера с сохранением групп оказалось не просто. Проблема описана здесь  ещё в 2014 году и до сих пор сохраняется (тестировал в 2018-ом максе)

Я нашёл способ корректного извлечения, однако его реализация вручную оказалась трудоёмким процессом. В связи с этим я написал скрипт, который проделывает все необходимые операции. А именно, анализирует выделенные объекты на структуру имеющихся внутри контейнера групп и запоминает, потом всё разгруппировывается, извлекается из контейнера и сгруппировывается в том же порядке. Количество вложенных групп не ограничено. Объекты могут принадлежать сразу к нескольким контейнерам. По окончании скрипта будут выделены те контейнеры, из которых производилось извлечение.

Всё. 

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

Если тема будет интересна для развития или обнаружите ещё какие-то недоработки - пишите в личные сообщения.

Скачать скрипт можно отсюда

Установка такая: Перетащите макроскрипт в окно макса. Потом Customize -> Customize user interface... -> Вкладка Toolbars -> Category #PankovScripts  -> перетащить "Remove selected from multiple Containers with groups" на панель задач. 

Когда будут выделены объекты входящие в контейнер, кнопка будет активироваться.

ПС: Кнопка интерфейса каждый раз ищет в выделении принадлежность к контейнерам. Предполагаю, что это может вызвать подтормаживание интерфейса. В таком случае можно воспользоваться скриптом (*.ms) без установки. Просто выделите необходимые объекты и запустите скрипт (*.ms). Тогда ни каких лишних действий производиться не будет.

3dsmaxскриптконтейнеризвлечениегруппыбагошибканельзя сдвинутьне получается сдвинутьне двигается

Комментарии (15)

+3
Yehat
Задам, наверное, дурацкий вопрос: для чего нужны контейнеры? Плюсы, минусы использования по сравнению с xRef, например. Лень рыться самому, и никогда их не юзал.
0
ElizabethBess
Тоже интересно. в каких случаях его выгодно применять? может полезная штука
+2
-NiK-
Например, контейнер можно открыть>изменить>сохранить>закрыть из той сцены куда он вставлен. А хреф нужно открывать отдельно и редактировать как сцену, насколько я помню. Ну то есть удобно не только для многопользовательской работы. Но...
Не факт, что автодеск написал хоть одну строку кода по контейнерам с 2010 макса, и если это так, то читай ниже :)
+3
PankovEA
Контейнеры придуманы для командной работы над сложной сценой. Сцена разбивается на логические куски и каждый 3Д художник может открыть для редактирования одну из частей. причём эти части можно загружать, выгружать, обновлять, назначать для них прокси. В общем удобно.
В моём случае надо было расставить много однотипных домов, Я использовал контейнеры в качестве инстансов, что бы при добавлении деталей другие дома обновлялись. Но в отличии от инстансов, как мне показалось, каждый контейнер загружается в отдельную память даже если имеет идентичную геометрию. Ну и вносить небольшие правки в отдельные дома тоже приходится создавать копию, то есть нельзя отдельную часть сделать копией или назначить другой материал, только копию целиком.
0
Slazzo
Контейнеры в первую очередь для многопользовательской параллельной работы в одной сцене, в краце это тот же макс файл но с мутексом и его можно просто мерджить как любого другого макс файла, т.е. скрипты не нужны.
0
Yehat
Что такое мутекс?
+1
Slazzo
трудно гуглить?https://dic.academic.ru/dic.nsf/ruwiki/1050141 
простыми словами это замок который позволяет только одному потоку (процес/пользыватель) изменить состояние объекта, пока кто-то меняет никто не может читать/менять объект пока замок не освободиться, помогает избежать проблемы когда два потока меняет одновременно объект и при записи выигрывает только один или никто и объект становиться в неопределенное состояние
0
-NiK-
Они уже перестали залипать в этом состоянии после определенных манипуляций? :D
Помню как в 2010 они появились, я стал нимношк их юзать и потом сцена не открывалась с баганутым контейнером. Решение то несложное было, но нервировало достаточно, чтобы забыть об их существовании навсегда.
Щас уже такого нет? Не хочу проверять на себе :)
0
PankovEA
Мерджить из контейнера, всё же не получается. У меня макс 2015. Единственный способ корректно извлечь объекты - этот скрипт.
Пробовал даже переименовывать файл в расширение *.max и открыть. В итоге был создан контейнер и в нём его содержимое. С мэрждем этого переименованного файла такая же песня.
0
Slazzo
Нужно только при мердже пропустить ноду Container... и загрузить нужные объекты
+1
PankovEA
Попробовал, действительно работает.
Ну тогда что сделано, то сделано. Если кому надо только часть извлекать. Всё же делать это одной кнопкой проще. Плюс ко всему извлекая объекты они находятся там где они должны находиться. В контейнере начало координат находится в пивоте контейнера, а сам контейнер в сцене может быть сдвинут или даже масштабирован.
0
Yehat
А, понял. Это продвинутый, но глючный иксреф. По-автодесковски.

Можно ли затолкать всю сцену в контейнер, залочить замок, чтобы когда передал её, то поменять не смогли?
0
Slazzo
нет, замок работает только на одном открытом файле, например скопировать в другую папку можно свободно его открыть так как никто этим файлом уже не пользуется, или можно мержить даже с заболоченного контейнера, есть определённые сценарий где контейнеры могут остаться заблокированы или при крэше макс может забыть его закрыть но все случай решаемые.
0
Action-sen
А почему просто не открыть контейнер, не выделить все дочерние объекты и не отлинковать их от контейнера?