Render.ru

Два простых вопроса по maxscript.

oO Loki Oo

Знаток
Рейтинг
36
#1
1.) Как остановить работающий скрипт? (как советовали - ESC, не помогает).
2.) Как автоматически закрывать окно рендера, после каждого кадра? (если у меня в цикле до N, рендерятся картинки, то все их мышкой напряжно закрывать, после окончания работы скрипта).
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#2
1) Чтобы автоматически прервать скрипт по Esc, нужно установить глобальную переменную escapeEnable = true
Действует на скрипты scripted utility, script controller, или запущенные в MAXScript Listener.
Но лучше в циклах поставить свою проверку на нажатие keyboard.escPressed и организовать корректное завершение.
2) Лучше просто отключить фрейм буффер ключем vfb:eek:ff, если нужно просмотреть полученный битмап то команнды:

display <bitmap>
Opens a virtual frame buffer (VFB) displaying the image. Changes to the bitmap are not automatically displayed to the VFB. To update the VFB, you need to call this function again. Setting the frame property does cause the VFB to update. Each bitmap has its own VFB, i.e., if you display two different bitmaps, two VFBs will be displayed.

unDisplay <bitmap>
Close the VFB associated with the bitmap if open.


 

oO Loki Oo

Знаток
Рейтинг
36
#3
Отлично! Всё, то что нужно и хорошо расписано. Большое спасибо, Денис!

Ещё один маленький вопросик - Можно ли каким-то хоткем запускать скрипт?
А то немного бесит сначала делать - "Open Script", редактировать его и потом - "Run Script" и выберать его же для запуска.
 

Chebu

Знаток
Рейтинг
59
#4
если вы про исполнение кода, то ctrl+e. Если в принципе нужно запускать скрипт по хоткею, оформляете его как макроскрипт, и назначаете хоткей
 

nevestktovich

Пользователь сайта
Рейтинг
2
#6
Здравствуйте, уважаемые знатоки языка Maxscript!

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

Как организовать последовательное выполнение группы скриптов запуском одного скрипта или, если хотите, нажатием одной кнопки?
Алгоритмы всех скриптов организованы одинаково, но они работают с различными наборами данных.

Пока у меня получилось сделать вот что:

Вариант 1.

Пишем скрипт Runscript.ms, в котором используем последовательность команд:

fileIn "filename1.ms"
fileIn "filename2.ms"
-----------------------
и т.д., перечисляем все скриптовые файлы, которые необходимо выполнить. Копируя все скрипты в папку Scripts 3DMAXа, а также стартовый скрипт Runscript.ms, затем запускаем его в работу и получаем последовательное выполнение всех скриптов. Однако такой
способ меня не совсем устраивает, так как всякий раз нужно формировать список выполняемых скриптов, что займет много времени.
Было бы хорошо, если бы стартовый скрипт просто последовательно запускал на выполнение все скрипты, находящиеся вместе с ним в одной папке (либо в заранее указанной папке). Для этого я попытался составить стартовый скрипт Runscript1.ms с таким содержанием:

Вариант 2

files = getFiles "c:\3DSMAX2.5\Scripts\*.ms"
for f in files do (fileIn f)

После его запуска все скрипты последовательно выполняются, но потом эта работа "зацикливается" на выполнении первого скрипта из списка. В этом случае приходится закрывать 3DMAX в аварийном режиме.

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

igorznag

Мастер
Рейтинг
103
#7
Было бы хорошо, если бы стартовый скрипт просто последовательно запускал на выполнение все скрипты, находящиеся вместе с ним в одной папке (либо в заранее указанной папке).
Если файл Runscript.ms находится в одной папке со всеми скриптами, тогда произойдет рекурсивное выполнения скриптов. То есть файл Runscript.ms не должен находится в одной папке со всеми скриптами, но если это необходимо, тогда нужно фильтровать его название, когда выполняются скрипты в цикле.
Пример. Файл Runscript.ms и другие скриптовые файлы находятся в папке f:\scripts\.
Код:
files = getFiles "f:\\scripts\\*.ms"
for f in files do
if((stricmp (filenameFromPath f) "Runscript.ms")!=0)then fileIn f
 

nevestktovich

Пользователь сайта
Рейтинг
2
#8
Цитирую:
Было бы хорошо, если бы стартовый скрипт просто последовательно запускал на выполнение все скрипты, находящиеся вместе с ним в одной папке (либо в заранее указанной папке).

Если файл Runscript.ms находится в одной папке со всеми скриптами, тогда произойдет рекурсивное выполнения скриптов. То есть файл Runscript.ms не должен находится в одной папке со всеми скриптами, но если это необходимо, тогда нужно фильтровать его название, когда выполняются скрипты в цикле.
Пример. Файл Runscript.ms и другие скриптовые файлы находятся в папке f:\scripts\.
files = getFiles "f:\\scripts\\*.ms"
for f in files do
if((stricmp (filenameFromPath f) "Runscript.ms")!=0)then fileIn f

Большое спасибо!

Практически, помог совет о нахождении скрипта запуска и исполняемых скриптов в разных папках. Правда, я и сам пытался это делать, но я размещал скрипт запуска в другой папке (не в папке ...\3DSMAX\Scripts). Видимо, это связано с параметрами MAXScript, выставленными по умолчанию. Все заработало, когда скрипт запуска Runscript.ms оставил в папке ...\3DSMAX\Scripts, а исполняемые
скрипты перенес в другую папку, прописав к ним путь в параметрах функции getFiles.
 
Сверху