Maxscript. Проверка по куску имени из переменной.

Автор
Сообщение
На сайте c 29.05.2011
Сообщений: 1744
по ссылке с Яндекса

Граждане, кто в курсе как это сделать?

Есть, допустим переменная name="Box"

И есть куча объектов, в именах которых содержится или не содержится этот "Box".

Нужно устроить всем объектам в сцене (или в выделении) проверку на содержание в их именах этого Box'а, и объекты содержащие в имени Box уложить в другую переменную-массив.

На сайте c 09.06.2013
Сообщений: 398
Тюмень/Анталия

пусть M - это переменная-массив, тогда для всех обьектов в сцене:

M=for i in $*Box* collect i

Для выделенных:

M=for i in $*Box* where i.isSelected==true collect i

На сайте c 29.05.2011
Сообщений: 1744
по ссылке с Яндекса
Цитата Maketer:
пусть M - это переменная-массив, тогда для всех обьектов в сцене: M=for i in $*Box* collect i Для выделенных: M=for i in $*Box* where i.isSelected==true collect i

Пасиб за ответ, но нет, фишка в том, что кусок имени - это переменная величина.

Собстевенно вопрос и содержится в том, чтобы выделить все объекты, часть имени которых содержится в переменной.

Я пока решил так, но имхо как-то коряво:

    currentname = "box"

    currentnametoexecute = "$*" + currentname as string + "*"

    execute ("select" + currentnametoexecute)

На сайте c 09.06.2013
Сообщений: 398
Тюмень/Анталия

Вы же не сказали сначала, что выделить хотите этот массив с обьектами "box"))

M=for i in $*Box* collect i или

M=for i in $*Box* where i.isSelected==true collect i

далее

select M

Ваш вариант тоже работает)

На сайте c 29.05.2011
Сообщений: 1744
по ссылке с Яндекса
Цитата Maketer:
Вы же не сказали сначала, что выделить хотите этот массив с обьектами "box"))

Нет, смысл в том, что мне надо, чтобы была переменная, допустим currentname, в ней лежал кусок имени - box, sphere, xpeh, пофиг какой, и этот кусок меняется постоянно.

В вашем варианте нет переменной, в которой содержится кусок имени, по которому собираются объекты. Т.е. если надо не *box* собрать, а например *sphere*, то придётся переписывать скрипт.

В моём варианте можно менять переменную currentname, и собирать коллекции объектов по ситуации.

А вообще, это кусок скрипта из более большого скрипта, который опрашивает все объекты, находит повторяющиеся имена, и группирует объекты с повторяющимися именами в отдельные группы. Именно поэтому "референсный" кусок должен быть отдельной переменной, которую можно изменить в процессе действия скрипта, а не прибитым куском максскрипта.

На сайте c 09.06.2013
Сообщений: 398
Тюмень/Анталия

Ок, эту задачу можно решить разными способами) Вот еще вариант

Для всех обьектов:

currentName=Box

t=currentName as string

SelM=#()

for i in objects do (

a=(trimRight i.name t)

b = (trimLeft i.name t)

if a!=i.name or b!=i.name do append SelM i)

Select SelM

Для выделенных обьектов:

currentName=Box

t=currentName as string

SelM=#()

for i in selection do (

a=(trimRight i.name t)

b = (trimLeft i.name t)

if a!=i.name or b!=i.name do append SelM i)

Select SelM

На сайте c 29.05.2011
Сообщений: 1744
по ссылке с Яндекса
Maketer, тоже красота, плюсую))) Но у меня короче (гордо прохаживается))))
На сайте c 09.06.2013
Сообщений: 398
Тюмень/Анталия
Цитата In-design:
Maketer, тоже красота, плюсую))) Но у меня короче (гордо прохаживается))))

А если нужно выполнить операцию для выделенных объектов, а не для всей сцены?) 

На сайте c 29.05.2011
Сообщений: 1744
по ссылке с Яндекса

Maketer  тогда выкидывать нафик гордость и пользоваться твоей версией)))

На сайте c 14.11.2016
Сообщений: 41
Россия, Санкт-Петербург
Цитата Maketer:

Ок, эту задачу можно решить разными способами) Вот еще вариант

Для всех обьектов:

currentName=Box

t=currentName as string

SelM=#()

for i in objects do (

a=(trimRight i.name t)

b = (trimLeft i.name t)

if a!=i.name or b!=i.name do append SelM i)

Select SelM

Для выделенных обьектов:

currentName=Box

t=currentName as string

SelM=#()

for i in selection do (

a=(trimRight i.name t)

b = (trimLeft i.name t)

if a!=i.name or b!=i.name do append SelM i)

Select SelM

У меня похожая задача, но нужно проверить выбранные объекты на наличие среди них только сплайнов, чтобы можно было назначить на них модификатор Edit Spline.

Что-то вроде такого, но с программированием у меня туго, поэтому это скрипт не работает, как нужно)

if SelChek=(

for i=1 to selection.count do isKindOf selection[i] SplineShape!=1

)

then messageBox "Select ONLY SPLINE objects."

else

modPanel.addModToSelection (Edit_Spline ()) ui:on -- Add Edit Spline

)

Т.е. нужно сначала прогнать цикл, записать итоговый результат проверки в переменную и потом уже проверять на условие true или false, но и тут проблема, как прописать правильно условие, чтобы сплайн или шейп отличить от меша или камеры.Прописывать все возможные объекты точно не вариант.

На сайте c 14.11.2016
Сообщений: 41
Россия, Санкт-Петербург
Цитата Evilis:
splArr = for s in $ where (superClassOf s.baseObject == Shape) collect s;

Спасибо! Очень нужная вещь! А где можно посмотреть список всех супер-классов? А то еле нашёл GeometryClass))

P.s. Туплю, можно же просто через команду superClassOf $ проверить)

Всё работает. Вот, что вышло)

local NObj= selection.count

local GeoArr=( for s in $ where (superClassOf s.baseObject == GeometryClass) collect s).count

local SplArr=( for s in $ where (superClassOf s.baseObject == Shape) collect s).count

if SplArr==NObj then modPanel.addModToSelection (Edit_Spline ()) ui:on -- Add Edit Spline

else

   if (GeoArr)+(SplArr) == NObj then modPanel.addModToSelection (Edit_Poly ()) ui:on -- Add Edit Poly

   else messageBox "Select SPLINE or/and GEOMETRY objects."

На сайте c 31.03.2008
Сообщений: 1097
Москва
Цитата kolt_050:
А где можно посмотреть список всех супер-классов?

superclasses :)

На сайте c 14.11.2016
Сообщений: 41
Россия, Санкт-Петербург
Цитата -NiK-:
Цитата kolt_050:
А где можно посмотреть список всех супер-классов?

superclasses :)

Спасибо!

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

Но вот с Mirror относительно опорной точки объекта или вида, которая может меняться в панели меню, у меня проблемы. Нигде не могу найти информацию по этому поводу. Как учитывать именно отображаемую опорную точку, а не локальную или центра координат.

На сайте c 16.03.2016
Сообщений: 2149
Москва
А чего все до сих пор на макскрипте пишут? Макс вроде Пайтон поддерживает давно..
На сайте c 14.11.2016
Сообщений: 41
Россия, Санкт-Петербург
Цитата dontpiter:
А чего все до сих пор на макскрипте пишут? Макс вроде Пайтон поддерживает давно..

Давно уже хочу на нём научиться программировать, но руки всё не доходят)

На сайте c 14.11.2016
Сообщений: 41
Россия, Санкт-Петербург
Цитата Evilis:

по второму, мне немного сложно вас понять :) возможно это Mirror , и это coordsys вам поможет

Скрипт нужен для того, чтобы не париться на счёт выбора осей по которым нужно отзеркалить объект и не тратить время на диалоговое окно стандартного инструмента Mirror в максе.

Мне гораздо быстрее просто повернуть камеру вокруг объекта, выбрав нужный ракурс для отображения объекта по горизонту или по вертикали.

Вот пример:https://gifyu.com/image/SsW3q 

Пока я сделал его только для локальной опорной точки самого объекта.

Осталось только в скрипте прописать ноду координат [in] coordsys <matrix3> которую он должен считывать с выбранной опорной точки вида. Вот в этом и загвоздка, не понимаю, как можно считать её координаты в пространстве.

На сайте c 22.09.2021
Сообщений: 2
Account is banned

Пожизненный бан

проверить на щэйп или тип удобнее если сделать нужный предикат как отдельную функцию например

fn is_shape geo = canconvertto geo SplineShape /* add more tests if needed */

local shapes_only = for obj in selection where is_shape obj collect obj;

для мирор под камеру, если нужно выбрать обсолютную ось достатончо просто сдеьать крос вектор камеры и вверх, потом выбрать самую длиную ось, если не обсолютную ось а прям под камеру все тоже самое только перпендикулярный вектор камеры и верх переводим в угол поворота относительно поворота обьекта, скармливаем в mod.Mirror_Center.rotation

На сайте c 29.05.2011
Сообщений: 1744
по ссылке с Яндекса
Цитата dontpiter:
А чего все до сих пор на макскрипте пишут? Макс вроде Пайтон поддерживает давно..

1) не все переходят на новые версии макса, я год пытаюсь к 2021 привыкнуть, он более падучий, чем богоподобный 2014, интерфейс менее удобный, и до сих пор не нашёл где выключается зум в полигон с колеса мыши, а не в бесконечность, до сих пор чертыхаюсь

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

3) максскрипт работает и зачем пересаживаться на пайтон?)))

На сайте c 14.11.2016
Сообщений: 41
Россия, Санкт-Петербург
Цитата QuixelMega:

для мирор под камеру, если нужно выбрать обсолютную ось достатончо просто сдеьать крос вектор камеры и вверх, потом выбрать самую длиную ось, если не обсолютную ось а прям под камеру все тоже самое только перпендикулярный вектор камеры и верх переводим в угол поворота относительно поворота обьекта, скармливаем в mod.Mirror_Center.rotation

Нашёл ещё такой вот приём, но как использовать не совсем понятно.

Нормализованные XYZ векторы камеры въюпорта

Их можно использовать для рассчёта положений, трансформаций и перемещений относительно камеры въюпорта

VectViewX=(inverse(getViewTM())).row1

VectViewY=(inverse(getViewTM())).row2

VectViewZ=inverse(getViewTM())).row3

point wirecolor:red        size: 1        pos: VectViewX

point wirecolor:green        size: 1        pos: VectViewY

point wirecolor:blue        size: 1        pos: VectViewZ

На сайте c 31.03.2008
Сообщений: 1097
Москва
Цитата kolt_050:
Нашёл ещё такой вот приём, но как использовать не совсем понятно.

Я не до конца понял чего вы пытаетесь добиться.

Вам нужно, чтобы объект зеркалился по осям текущей системы координат? И из этих осей должны выбираться 2 наиболее перпендикулярные вьюпорту?

Камера это типа наш вьюпорт. Тогда вертикальный миррор выбирает ось (1), а горизонтальный (2)? Это если выбраны локальные координаты объекта. Если выбраны мировые координаты, то соответственно выбирать нужно из них?

Поправьте меня.

Читают эту тему: