Приветствую. Почти дописал скрипт по пакетному рендерингу сцен с подгрузкой их в студию. Осталось пара мелочей и одна глобальная задача - сделать код который создает список максовских файлов из указанной дериктории + поддериктории. Можете посоветовать что-нибудь?
Поясню - жмакаю кнопу, открывается диалог, там жмакаю папку и потом ОК, открывается скриптовый диалог с полными путями находящихся внутри указанной папки файлов. Либо просто сразу записывается в текстдок. но мне нужен совет по функции получаения адресов в директории
fn walkDir dir pattern =
(
dirArr = GetDirectories (dir + "\\*"😉
for d in dirArr do
(
join dirArr (getDirectories (d + "\\*"😉)
)
append dirArr (dir + "\\"😉 -- Need to include the original top level directory
for f in dirArr do
(
join fileListing (getFiles (f + pattern))
)
)
пример вызова: walkDir (CheckPath.text as string) "*.max"
я сбор инфы с этим делал, примерно 750м (да да, за 3 года то накопилось сцен..) файле макс валится - мелкие утечки памяти видимо его добивают
on btn2 pressed do
(
lbx1.items = for obj in selection where (classof obj == Editable_Poly) or (classof obj == Editable_Mesh) collect obj.name
)
работает, но как реализовать само добавление объектов в listbox, т.е. в массив obj ?
если массив пуст (если ничего не выбрано) то при btn2 pressed, все правильно добавляется в массив obj и отображается в listbox, НО если сразу после этого добавить еще объектов, то массив тупо заменяется именами новых объектов, и при этом никакого добавления не происходит.
+= действительно добавляет, но теперь встает другая проблема - получается одни и те же объекты можно добавлять в массив сколько угодно раз, а это не допустимо.
как избежать повторного добавления объектов?
и причем не просто с одинаковыми именами, а реально разных, чтобы выбирая два разных объекта с одинаковыми именами они добавлялись в массив (а от туда в listbox), а объект который уже был добавлен, не добавлялся
Создаем вспомогательный Listbox. Его можно спрятать (visible=false).
rollout test "Test"
(
listbox lbx1 "Objects names:" pos:[8,155] width:147 height:8
listbox lbx1_id "Objects id:" pos:[200,155] width:147 height:8
button btn2 "Add Selected" pos:[8,288] width:84 height:23
on btn2 pressed do
(
lbx1_items=lbx1.items; lbx1_id_items=lbx1_id.items;
for obj in selection where (classof obj == Editable_Poly) or (classof obj == Editable_Mesh) do
(
temp=0;
for obj_id in lbx1_id_items do if(obj.inode.handle==(obj_id as integer))then (temp=1;exit;)
if(temp==0)then (append lbx1_items obj.name; append lbx1_id_items (obj.inode.handle as string);)
)--for obj in selection where ...
lbx1.items=lbx1_items; lbx1_id.items=lbx1_id_items;
)--on btn2 pressed do
)--rollout test "Test"
createDialog test 400 400
on btn2 pressed do
(
for i = 1 to selection.count do
(
if (classof selection[i] == Editable_Poly) or (classof selection[i] == Editable_Mesh) do
(
append obj selection[i].name
)
)
lbx1.items = obj
)
как мне теперь добавить в мою утилиту свиток?
утилита сама посебе представляет собой свиток на панели Utilities, так вот надо в этот свиток добавить еще один.
on btn2 pressed do
(
for i = 1 to selection.count do
(
if (classof selection[i] == Editable_Poly) or (classof selection[i] == Editable_Mesh) do
(
append obj selection[i].name
)
)
lbx1.items = obj
)
как мне после append obj selection.name, пройтись по массиву obj и убрать повторяющиеся объекты (.inode.handle) ?
if obj != #() then
(
for i = 1 to obj.count do
(
for k = 1 to obj.count do
(
if obj[i].inode.handle = obj[k].inode.handle then deleteItem obj i
)
)
)
lbx1.items = for i in obj collect i.name
Привет всем)
Хотел спросить по поводу Rotation Script Controller.
При настройке Rotation script мы управляем через Quat 0 [X,Y,Z] Но он как-то некорректно работает) С искажениями. Как будто это я вращаю объект по каким-то остаточным погрешностям, а не по абсолютным значениям.
И еще я ищу скрипт эмулирующий работу Link Tool
1. (Что, вообще, должен делать скрипт?) Такой вариант подходит?
C_RX = $Camera001.rotation.controller.'X Rotation'
C_RY = $Camera001.rotation.controller.'Y Rotation'
C_RZ = $Camera001.rotation.controller.'Z Rotation'
X = C_RX
Y = C_RY
Z = C_RZ
(eulerAngles X Y Z) as quat
Да, теперь все работает отлично, спасибо огромное)
igorznagЧто, вообще, должен делать скрипт?)
Я сейчас пытаюсь описать работу привязки объекта к камере с особыми условиями. Объект должен находиться во всей области захвата камеры и перемещаться вместе с ней, но при изменении дистанции между камерой и объектом он должен изменять свой размер не меняя своей позиции. Иными словами он должен находиться всегда в 0й точке координат. Движение камеры прописано таким образом, что 0я точка координат будет все время в поле ее зрения.
Я описал движение объекта, находящегося перед камерой, но только для 2х осей, проблема возникает в том, что при повороте 3й оси система координат тоже меняется и это ставит в небольшой тупик.
C_RX = $Camera001.rotation.controller.'X Rotation'
C_RY = $Camera001.rotation.controller.'Y Rotation'
C_RZ = $Camera001.rotation.controller.'Z Rotation'
X = sin(C_RZ)*cos(C_RX)
Y = cos(C_RX)*cos(C_RZ)
Z = sin(C_RX)
[ X, Y, Z ]
Есть ли возможность изменить систему координат? Или может кто-нибудь дописать скрипт на 3ю ось?
P.S. Parent и children. не помогают, т.к. не предоставляют полного контроля.
Доступ к резюме доступен только по пакетному доступу HR менеджерам зарегистрированных компаний. Узнать о вариантах корпоративных пакетов можно по ссылке.
Paul_Winex
Поясню - жмакаю кнопу, открывается диалог, там жмакаю папку и потом ОК, открывается скриптовый диалог с полными путями находящихся внутри указанной папки файлов. Либо просто сразу записывается в текстдок. но мне нужен совет по функции получаения адресов в директории
ASK'R
(
dirArr = GetDirectories (dir + "\\*"😉
for d in dirArr do
(
join dirArr (getDirectories (d + "\\*"😉)
)
append dirArr (dir + "\\"😉 -- Need to include the original top level directory
for f in dirArr do
(
join fileListing (getFiles (f + pattern))
)
)
пример вызова: walkDir (CheckPath.text as string) "*.max"
я сбор инфы с этим делал, примерно 750м (да да, за 3 года то накопилось сцен..) файле макс валится - мелкие утечки памяти видимо его добивают
где-то поглядет можно будет?
Castello
нужно для Listbox
igorznag
Listbox
Castello
под ним создал кнопку для добавления объектов в мой listbox
добавляю объекты:
работает, но как реализовать само добавление объектов в listbox, т.е. в массив obj ?
если массив пуст (если ничего не выбрано) то при btn2 pressed, все правильно добавляется в массив obj и отображается в listbox, НО если сразу после этого добавить еще объектов, то массив тупо заменяется именами новых объектов, и при этом никакого добавления не происходит.
igorznag
Castello
как избежать повторного добавления объектов?
и причем не просто с одинаковыми именами, а реально разных, чтобы выбирая два разных объекта с одинаковыми именами они добавлялись в массив (а от туда в listbox), а объект который уже был добавлен, не добавлялся
igorznag
Castello
вроде работает)
Castello
создал утилиту и вывел её на панель Utilities
как мне теперь добавить в мою утилиту свиток?
утилита сама посебе представляет собой свиток на панели Utilities, так вот надо в этот свиток добавить еще один.
Castello
Castello
неработает(
помогите
Sphinx Black (Black Sphinx)
Klask
Хотел спросить по поводу Rotation Script Controller.
При настройке Rotation script мы управляем через Quat 0 [X,Y,Z] Но он как-то некорректно работает) С искажениями. Как будто это я вращаю объект по каким-то остаточным погрешностям, а не по абсолютным значениям.
И еще я ищу скрипт эмулирующий работу Link Tool
igorznag
Вы имеете в виду инструмент Select and Link?
Klask
C_RY = $Camera001.rotation.controller.'Y Rotation'
C_RZ = $Camera001.rotation.controller.'Z Rotation'
X = C_RX
Y = C_RY
Z = C_RZ
quat 1 X Y Z
Входные значения:
C_RX = 90
C_RY = 0
C_RZ = 0
Выходные значения:
quat 1 90 0 360
Сам объект повернулся только на 45 градусов.
Да
igorznag
2. Используйте свойства объектов parent и children.
Klask
Я сейчас пытаюсь описать работу привязки объекта к камере с особыми условиями. Объект должен находиться во всей области захвата камеры и перемещаться вместе с ней, но при изменении дистанции между камерой и объектом он должен изменять свой размер не меняя своей позиции. Иными словами он должен находиться всегда в 0й точке координат. Движение камеры прописано таким образом, что 0я точка координат будет все время в поле ее зрения.
Klask
C_RX = $Camera001.rotation.controller.'X Rotation'
C_RY = $Camera001.rotation.controller.'Y Rotation'
C_RZ = $Camera001.rotation.controller.'Z Rotation'
X = sin(C_RZ)*cos(C_RX)
Y = cos(C_RX)*cos(C_RZ)
Z = sin(C_RX)
[ X, Y, Z ]
Есть ли возможность изменить систему координат? Или может кто-нибудь дописать скрипт на 3ю ось?
P.S. Parent и children. не помогают, т.к. не предоставляют полного контроля.
Klask