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

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

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

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

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

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

На сайте c 29.05.2011
Сообщений: 1744
по ссылке с Яндекса
Цитата -NiK-:
Я не до конца понял чего вы пытаетесь добиться.

А я вообще не помню зачем мне это было нужно в 2016 году)))

На сайте c 31.03.2008
Сообщений: 1095
Москва
Цитата In-design:
А я вообще не помню зачем мне это было нужно в 2016 году)))

Упс, думал первое сообщение на второй странице это не самое первое :)

Поправил

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

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

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

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

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

Есть такое

https://docs.google.com/document/d/1cDxNIXZ3OeqmbWOtzxwjIVHL6MElaGXph5fwm5pvOzs/mobilebasic#h.lcfrvhh0ecci  

Если в сцене есть куча объектов, разнесённых по разным слоям, имеющих одинаковый элемент в имени, то легко выделяем их посредством

MaxScriptarCollision=For i in $*Coll collect i; unhide arCollision; select arCollision;  max hide inv

/*В переменную arCollision передаётся результат цикла, в котором  каждый элемент i из объектов, содержащих слово “Coll” заполняется в массив (collect i).

То есть:

[

$-- указатель на объект

*-- знак указывающий на то что вместо звёздочки может стоять сколько угодно, каких угодно символов

Coll--имя, по которому ищем объекты]

*/

 -- unhide arCollision; select arCollision;  max hide inv раскрыть объекты; выделить -- объекты; скрыть невыделенные

Развил тему :) Вот готовый скрипт

macroScript naneHUnH  category:"Niklit Scripts"   toolTip:"Name obj Hide Unhide"   icon:#("TrackViewTools",114)

(

StuffName=#()

try DestroyDialog naneHUnH catch()

rollout naneHUnH "Name obj Hide Unhide" width:235 height:47

(        

editText edt1 "" pos:[-2,2] width:235 height:14        

checkbox chk1 "Hide inv" pos:[170,26] width:77 height:16        

button btn_UnHide "Unhide" pos:[2,22] width:80 height:23        

button btn_Hide "Hide" pos:[84,22] width:80 height:23        

on chk1 changed hInv_State do hInv_State=off        

on edt1 entered txt do        

(                

if txt != "" do        NameForFind=execute ("$*"+txt+"*")                

global arO=For i in NameForFind collect i        

)        

on btn_UnHide pressed do        with undo on (                

select arO; unhide arO                

if chk1.checked then (max hide inv) else ()        

)                

on btn_Hide pressed do with undo on  (hide arO)

)

CreateDialog naneHUnH

)

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

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

Нет, не относительно вида из камера. А именно относительно обычных осей X Y Z.

Положения камеры только даёт нам информацию к какой оси мы сейчас повёрнуты, т.е. вокруг объекта всего 4 сектора, которые как-бы перпендикулярны плоскостям XZ и YZ.

Скрипт это распознаёт и зеркалит относительно нужной оси, по горизонту это X или Y, а по вертикали это Z.

Если же смотрим на объект сверху или снизу, то тут только оси X и Y нужны.

Вертикальной осью будет либо X, либо Y, в зависимости от поворота камеры.

Но зеркалить объект нужно ещё относительно активной опорной точки, которую мы выбрали в меню выше.

____________________________

Кто-нибудь знает, как проверить номер выбранного модификатора и записать в переменную?

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

На сайте c 15.04.2013
Сообщений: 84
Цитата kolt_050:
Кто-нибудь знает, как проверить номер выбранного модификатора и записать в переменную? Везде инфа только по проверке названия модификатора либо класса. Просто названия модификаторов могут совпадать, а нужно найти именно выделенный модификатор.

curObj = modPanel.getCurrentObject()

indexMod = modPanel.getModifierIndex $ (curObj)

На сайте c 31.03.2008
Сообщений: 1095
Москва
Цитата kolt_050:
Нет, не относительно вида из камера. А именно относительно обычных осей X Y Z.

Я и не писал про миррор относительно вида :)

Обычные оси это мировые координаты или координаты объекта?

Какая часть у вас не работает (не реализована)? Я видел гифку, что-то уже явно готово. Определить доминантную ось вьюпорта несложно.

На сайте c 14.11.2016
Сообщений: 41
Россия, Санкт-Петербург
Цитата -NiK-:
Цитата kolt_050:
Нет, не относительно вида из камера. А именно относительно обычных осей X Y Z.

Я и не писал про миррор относительно вида :)

Обычные оси это мировые координаты или координаты объекта?

Какая часть у вас не работает (не реализована)? Я видел гифку, что-то уже явно готово. Определить доминантную ось вьюпорта несложно.

Ориентация готова, сделал по аналогии с вот этим скриптомhttps://www.scriptspot.com/3ds-max/scripts/rotation-axis-snap 

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

На сайте c 31.03.2008
Сообщений: 1095
Москва
Цитата kolt_050:
Осталось только в скрипте прописать ноду координат [in] coordsys которую он должен считывать с выбранной опорной точки вида. Вот в этом и загвоздка, не понимаю, как можно считать её координаты в пространстве.

Тип центра системы координат - getCoordCenter()

Если #local, то там у каждого объекта своя точка ($.position или $.pivot).

Если #selection, то там не $.center, а усредненный центр выделенных объектов.

Если #System, то всё посложнее, но возможно вам хватит мирового центра [0,0,0].

https://pastebin.com/fbXwhhUs 

Раз вам нужны мировые координаты, то вы можете просто создать матрицу из этой точки через transMatrix.

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

Цитата TheNMax:
Цитата kolt_050:
Кто-нибудь знает, как проверить номер выбранного модификатора и записать в переменную? Везде инфа только по проверке названия модификатора либо класса. Просто названия модификаторов могут совпадать, а нужно найти именно выделенный модификатор.

curObj = modPanel.getCurrentObject()

indexMod = modPanel.getModifierIndex $ (curObj)

Супер! То что надо было! Сделал условие для колапса стека для выбранного модификатора.

local curObj = modPanel.getCurrentObject()

local indexMod = modPanel.getModifierIndex $ (curObj)

if subObjectLevel == 0 then maxOps.CollapseNodeTo $ indexMod off

_____________________

Пытаюсь сейчас ещё разобраться с таймерами. Например мне нужно на 3 секунды вывести сообщение на экран, но не в меседже, а просто текстом поверх экрана. timer <name> [interval:<number>] [active:<boolean>]

Вот пример со всплывающим окном.

rollout test "Test Timer"

(

timer clock "testClock" interval:1000 --tick once a second

label test"1"

on clock tick do

(

valUp = (test.text as integer)+1

test.text = valUp as string

)

)

createDialog test

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

Вы бы на чем то одном сконцентрировались )))

if (valUp==3) then (destroyDialog ::test)

Есть такое) но в голове идей море)

Сделал такую надпись, но она не пропадает почему-то после таймера.

(

global GW_displayText

try(unregisterRedrawViewsCallbackGW_displayText)catch()

(

fn GW_displayText = (

wPos = GW.GetWinSizeX()*0.5 

hPos = GW.GetWinSizeY()*0.2

gw.htext [wPos,hPos,0] "DUPLICATE COMPLETE" color:red

gw.updateScreen()

)

registerRedrawViewsCallback GW_displayText

(

timer clock "testClock" interval:1000 --tick once a second

on clock tick do

(

N = K+1

K=N

if (N==3) do (unregisterRedrawViewsCallback GW_displayText)

)

)

)

На сайте c 31.03.2008
Сообщений: 1095
Москва

Этот форум плохо предназначен для пересылки кода. Используйте pastebin.

Вообще зря вы оккупировали чужую тему вопросами с ней не связанными :) лучше бы создали свою.

Цитата kolt_050:
Сделал такую надпись, но она не пропадает почему-то после таймера.

https://pastebin.com/w5Jn0wp5 

Окно создается за пределами монитора, чтобы сделать вид, что его нету.

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

Этот форум плохо предназначен для пересылки кода. Используйте pastebin.

Вообще зря вы оккупировали чужую тему вопросами с ней не связанными :) лучше бы создали свою.

Цитата kolt_050:
Сделал такую надпись, но она не пропадает почему-то после таймера.

https://pastebin.com/w5Jn0wp5  

Окно создается за пределами монитора, чтобы сделать вид, что его нету.

Спасибо) Буду им теперь пользоваться.

Отдельно функция надписи работает нормально.Но стоит добавить таймер и она даже не появляется.

Вообще зря вы оккупировали чужую тему вопросами с ней не связанными :) лучше бы создали свою.

Согласен, тут уже другая тема пошла.

________________________________

Всем привет! Есть ли функция для проверки выбора базового объекта в стеке модификаторов?

Индекса то у него нет, по логике должен быть = 0, но нет)

А то приходится проверку делать, выбирая базовый модификатор и сравнивая с выбранным ранее в стеке.

local SelMod = Filters.GetModOrObj()

modPanel.setCurrentObject $.baseObject

local CurObj = Filters.GetModOrObj()

modPanel.setCurrentObject SelMod

На сайте c 31.03.2008
Сообщений: 1095
Москва
Цитата kolt_050:
Всем привет! Есть ли функция для проверки выбора базового объекта в стеке модификаторов? Индекса то у него нет, по логике должен быть = 0, но нет)

modPanel.getCurrentObject() == $.baseobject

На сайте c 14.11.2016
Сообщений: 41
Россия, Санкт-Петербург
Цитата -NiK-:
modPanel.getCurrentObject() == $.baseobject

Логично) Спасибо!

Если #local, то там у каждого объекта своя точка ($.position или $.pivot).

Если #selection, то там не $.center, а усредненный центр выделенных объектов.

Если #System, то всё посложнее, но возможно вам хватит мирового центра [0,0,0].

https://pastebin.com/fbXwhhUs  

Раз вам нужны мировые координаты, то вы можете просто создать матрицу из этой точки через transMatrix.

Создал отдельную тему, т.к. уже сам миррор не пойму, как запустить через transMatrix.

Мне просто очень трудно разобраться в правилах написания таких команд, синтаксис для меня пока как в тумане.

Цитата -NiK-:
Цитата kolt_050:
Всем привет! Есть ли функция для проверки выбора базового объекта в стеке модификаторов? Индекса то у него нет, по логике должен быть = 0, но нет)

modPanel.getCurrentObject() == $.baseobject

Есть идея сделать на 2 горячие клавиши перебор модификаторов снизу вверх и обратно.

Столкнулся с проблемой, как посчитать все модификаторы, чтобы на последнем он перешёл на базовый модификатор, а не выдавал ошибку. И наоборот, чтобы с базового перешёл вверх на последний по нумерации модификатор, т.е. который прямо над ним.

Вот пример кода:

https://pastebin.com/adEVxGpY 

_____________________________

Либо начинать выполнение скрипта, только когда выбран последний модификатор из списка, чтобы записать его номер.

Есть ли возможность создать условие для проверки на ошибку? Чтобы вместо окна с ошибкой сработал например return()?

Или это через try и catch можно как-то сделать?

_____________________________________

В общем, чтобы не перебирать и не считать количество модификаторов в сцене, сделал такой цикл:

https://pastebin.com/WiJmgYdb 

Больше 20-ти модификаторов, думаю редко кто добавляет, или 100 поставить?))

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