Академический Документы
Профессиональный Документы
Культура Документы
MAXScript – встроенный в 3ds max язык написания скриптов. Скрипт – это текстовый
файл, обычно с расширением .ms.
При помощи скриптов можно:
1. Программировать множество действий пользователя, таких как моделирование,
анимация, наложение материалов, визуализация (rendering) и др.
2. Интерактивно контролировать программу из командной строки окна Listener.
3. Создавать для скриптов стандартный пользовательский интерфейс, размещая его
элементы в свитках панели Utility, или в управляющих окнах.
4. Создавать из скриптов макрокоманды и вставлять их в качестве кнопок на панели
инструментов 3ds max.
5. Расширять или изменять пользовательский интерфейс для объектов (objects),
модификаторов (modifiers), материалов (materials), текстур (textures), эффектов
визуализации (render effects) и атмосферных эффектов (atmosperic effects).
6. Создавать дополнения для собственных объектов-сеток (mesh objects),
модификаторов и эффектов визуализации.
7. Создавать свои собственные инструменты импорта/экспорта с помощью
встроенного средства ввода/вывода файлов (file I/O).
8. Писать процедурные контроллеры и с их помощью управлять состоянием всей
сцены.
9. Создавать инструменты групповых вычислений, например, скрипты для
последовательной визуализации множества сцен.
10. Управлять внешними приложениями через механизм OLE Automation.
11. Записывать свои действия в 3ds max, как команды MAXScript.
12. Хранить в файлах сцен скрипты, которые будут запускаться при каждом из
определенных событий, например, до и после открытия файла сцены, созданием
нового файла, после и перед визуализацией, изменением выбранных объектов и т.п.
Доступ к MAXScript: Command Panel > Utility > MAXScript
MAXScript – падающее меню
Инструмент Описание
Open Listener отображает окно MAXScript Listener. Это окно также можно открыть,
нажав кнопку F11.
New Script отображает окно MAXScript Editor для записи нового скрипта.
Open Script открывает диалоговое окно File Open. Выбранный скрипт
отображается в новом окне MAXScript Editor.
Run Script открывает диалоговое окно File Open. Выбранный скрипт
прочитывается и выполняется. Все выходные данные печатаются в
окне Listener.
Utilities отображает список доступных программ-скриптов (утилит). Имя
утилиты не появится в окне до тех пор, пока MAXScript ее не
запустит.
Close Закрывает свиток MAXScript и все свитки утилит.
Синтаксис
Если строка длинная, ее можно разбить. Исходная строка: a + b * c / d – e + f * g / h
Можно разбить только после любого оператора. MAXScript будет искать продолжение на
следующей строке.
Так работает: a+b*c/d–e+ А так не работает: a+b*c/d–e
f*g/h +f*g/h
Можно разбить, добавив символ “\”: a+b*c/d–e\
+f*g/h
Несколько выражений можно записать в одной строке, разделив их символом “;”:
print “End of input data reached” to: f; close f; f = undefined
Комментарий первого типа в MAXScript начинается с символов “--” и распространяется до
конца строки: a = 5 -- В переменную а записано число 5
/* Комментарий второго типа
может располагаться
на нескольких строках*/
Переменные
variable_name = variable_value -- присвоение переменной значения
variable_name = “Текст” -- строковая переменная
local y = 2, x -- объявление локальных переменных (действуют в текущем блоке)
global bzzz -- объявление глобальных переменных (действуют всю сессию 3ds max)
Имя переменной должно начинаться с буквы или символа “_”. Ее значение – любое число,
строка или выражение.
Массивы
В массиве может содержаться любое количество элементов, каждый любого типа.
a = #( ) -- пустой массив
a = #(5, “four”, pi, 11.17) -- массив с элементами
a[int] -- элемент массива, int - номер элемента (целое число, нумерация с 1)
Например: a[2] возвращает “four”
Со строками
a = “MAXScript”; b = “ FOREVER”
a + b -- возвращает “ MAXScript FOREVER”
“3” as float -- возвращает 3.0
“3.56” as integer -- возвращает 3
Приращения
<переменная> += <выражение> добавляет <выражение> к переменной
<переменная> -= <выражение> вычитает <выражение> из переменной
<переменная> *= <выражение> умножает переменную на <выражение>
<переменная> /= <выражение> делит переменную на <выражение>
Поэтому запись x = x + 1 равносильна записи x += 1
Операторы сравнения
<compare_operand> == <compare_operand> оба операнда равны
<compare_operand> != <compare_operand> оба операнда не равны
<compare_operand> < <compare_operand> левый операнд меньше правого
<compare_operand> <= <compare_operand> левый меньше или равен правому
<compare_operand> > <compare_operand> левый операнд больше правого
<compare_operand> >= <compare_operand> левый больше или равен правому
Логические операторы
<logical_operand> and <logical_operand> истина, если истинны оба
<logical_operand> or <logical_operand> истина, если истинен хотя бы один
not <logical_operand> истина, если операнд ложен
Управляющие конструкции
if <if_expr> then <expr> [else <expr>]
if <if_expr> do <expr>
Результат выполнения выражения <if_expr> должен быть либо истиной (true), либо ложью
(false).
Пример 1:
if a > b and a < c do (print d; print e)
if a == b then c = 0
a = (if d == 0 then 0 else a / d)
Пример 2:
if a > b then
(
print c
x = sqrt (c)
)
else (print d; x = sin (e))
Выражения, находящиеся внутри круглых скобок, образуют блок. Значение
последнего выражения в блоке является значением всего блока. Поэтому можно писать,
например, так: if a > (y = sin b; sqrt (y*z)) then print c
case [ <case_expr> ] of ( <cases> )
Выражение <case_expr> сравнивается с метками выражений <cases>:
<factor>: <expr>
default: <expr>
Пример:
new_width = case obj.width of
(
2: copy $Box01
3: instance $Box01
default: reference $Box01
)
Выражение после ключевого слова default будет выполнено, если не выполнятся
остальные условия. Если default не задано и другие условия не выполнились, выражение
case возвращает значение undefined.
Если выражение <case_expr> не задано, метки должны быть булевыми (Boolean)
величинами или выражениями, и первая метка, дающая истину, определяет выполняемое
выражение <expr>. Пример:
case of
(
(a > b): print “a is big”
(b < c): print “b is little”
(c <= d*3): ...
default: ...
)
Циклы
do <expr> while <test_expr> -- форма do
while <test_expr> do <expr> -- форма while
Циклы while и do повторяют выполнение выражения <expr> до тех пор, пока
тестовое выражение <test_expr> не возвратит ложь, т.е. пока оно истинно, они работают.
Форма do выполняется минимум один раз, вычисляя тестовое выражение в конце каждого
прохода. Форма while вычисляет тестовое выражение в начале каждого прохода и может
не выполниться ни разу. Обе формы в качестве своего значения возвращают результат
выражения <expr> после последнего удачного прохода. Форма while возвратит значение
undefined, если тестовое выражение ложно изначально и ни одного прохода не
выполнится.
Пример 1: Пример 2:
x = -10 do
while x < 0 do (
( print x exchanged = false
x += 1 for i=1 to imax do
) (
j=i+gap
if (compare array[j] array[i]) do
(swap array[j] array[i];exchanged=true)
)
)
while exchanged
Часть 2
Функции
[mapped] (function | fn) <name> { <parameter> } = <expr> , где <name> – имя функции,
<expr> – тело функции, <parameter> – ее параметры (их может не быть вообще или быть
несколько), которые записываются так: <parameter name>, либо так: <parameter name>:
[<operand>] – необязательное значение по умолчанию, если не его задать, возвращается
значение unsupplied. Префих mapped означает, что функция будет автоматически
повторно вызываться на каждом элементе коллекции, если колЧасть задана в качестве
первого аргумента функции.
Примеры:
function add a b = a + b
fn factorial n = if n<=0 then 1 else n * factorial(n-1) -- рекурсивная функция
mapped function rand_color x =
x.wireColor = random (color 0 0 0) color (255 255 255)
Определения
Properties (Свойства): Доступные параметры объектов класса. Например, ширина, длина,
высота для ящиков и радиус для сфер.
Methods (Методы): Определения всех функций, которые можно вызывать для объектов
класса. Примеры: перемещение или поворот объекта, применение модификатора и
получение координат вершин объекта. Термины method (метод) и function (функция) в
MAXScript синонимы.
Operators (Операторы): Определения всех математических и других символьных
операторов, которые работают с величинами класса. Пример: оператор ”-”, который
производит математическую операцию вычитания над числами, цветами, векторами и
матрицами, но произведет булево вычитание, когда будет использован совместно с
объектами 3ds max.
Constructors (Конструкторы): Различные способы, которыми можно создавать объекты
класса. Например: Point3 0 0 0 и <color> as Point3 – конструкторы для класса Point3.
Выполнение любого из них создает новый объект Point3.
Literals (Символы): Любая символьная форма объектов класса. Примеры: [0, 0, 0] –
символьная форма класса Point3, слово “Hello world” – символьная форма класса String.
Операции со строками
Операция Описание
<value> as string Конвертирует значение <value> в строку
<string>.count Число знаков в строке (Целое число - только чтение)
<string> + <string> Сложение строк
Метод Описание
copy <string> Создает независимую копию строки и возвращает ее.
Пример: newstr = copy oldstr
execute <string> Выполняет содержимое строки, как выражение
MAXScript и возвращает результат вычисления.
Примеры: execute “2+2” – возвращает 4
execute “select $Box01” – выделяет объект Box01.
findString <string> <search_string> Возвращает номер первого символа найденной
строки или undefined, если строка не найдена.
Пример: findString “Я обожаю MAXScript” “M” –
возвращает 10.
filterSting <string> <token_string> Разбивает строку на части и возвращает массив
строк. Разбиение происходит на основе символов,
заданных в строке < token_string >
Пример: filterString “MAX Script, это-супер” “, -” –
возвращает #(“MAX”, ”Script”, ”это”, ”супер”)
Операции с массивами
Операция Описание
<collection> as array Конвертирует коллекцию в массив
<array>.count Число элементов в массиве (Целое, можно изменять)
<array>[integer] Возвращает элемент массива. Номера начинаются с 1.
<array>[integer] = <value> Заносит значение в элемент массива, увеличивая число
элементов по необходимости
<array> + <collection> Создает новый массив из первого и второго аргументов
Примеры: a=#(1,2,3,4); join a #(5,6,7,8)
(cameras as array) + lights
Метод Описание
append <array> <value> Добавляет величину к массиву, при необходимости
увеличивая его размер
copy <array> [#noMap] Создает копию всех элементов массива. Возвращает значение
ОК. Если задан параметр #noMap, создается только копия
переменной массива, которая ссылается на элементы
исходного массива.
deleteItem <array><number> Стирает элемент массива, уменьшая его размер на 1
join <array> <collection> Присоединяет все элементы второго аргумента к первому
sort <array> Сортирует элементы массива по возрастанию. (Все элементы
должны быть одного типа)
findItem <array> <value> Ищет элемент массива, равный заданной величине и
возвращает номер, первого такого элемента или ноль (zero),
если элемент не найден.
insertItem <value> <array> <integer> – Вставляет значение в элемент с указанным
номером, при необходимости увеличивая размер массива
qsort <array> <function> [start: integer] [end: integer] [args] – Сортирует массив, используя
заданную пользователем функцию для сравнения двух элементов. У этой функции
необходимо определить два аргумента на входе, а возвращать она должна целое число
меньше нуля, если первый аргумент меньше второго, больше нуля, если наоборот и 0, если
они равны. Если не задан начальный и конечный номер, массив сортируется целиком.
Часть 3
Создание свитков
Один из видов интерфейсов, создаваемых в MAXScript – свитки (rollouts) на панели
Utility. В свитках содержатся элементы интерфейса: кнопки, текстовые поля, выпадающие
списки и т.д. Любой свиток можно и нужно редактировать при помощи средства Visual
MAXScript, которое вызывается кнопкой F2 из окна Editor, когда курсор находится внутри
тела свитка. Основной свиток, с которого необходимо начинать, создается при помощи
конструкции utility:
utility <var_name><description_string>[rolledUp:<boolean>][silentErrors:<boolean>]
(<utility_body>), где:
<var_name> – имя глобальной переменной, в которой хранится данный свиток.
<description_string> – название утилиты в списке Utilities свитка MAXScript.
rolledUp: – необязательный параметр, определяющий, будет ли изначально развернут
свиток утилиты. Значения: true – свернут, false – развернут (значение по умолчанию).
silentErrors: – необязательный параметр, определяющий, будут ли появляться сообщения
об ошибках в окне Listener и в диалоговых окнах во время работы утилиты, в этом случае
выполнение утилиты прекращается (все это происходит, если для параметра установлено
значение false – оно же по умолчанию). Если установлено значение true, то никаких
сообщений об ошибках не выводится, и работа утилиты не прерывается.
<utility_body> – тело утилиты, в котором описывается весь интерфейс, функции и
события, происходящие при взаимодействии пользователя с элементами интерфейса
(нажатие на кнопку, прокрутка спиннера и т.д.)
Следующий пример создает утилиту, которая перемещает выделенные объекты по прямой
от центра выделения до позиции каждого объекта, учитывая оси координат.
utility spread "Spread objects" -- определяем имя и название утилиты
( local last_amt = 0 -- определяем и задаем значение локальной переменной
checkbox x "Распространить по x" -- создаем три флажка
checkbox y "Распространить по y"
checkbox z "Распространить по z"
spinner spread "Величина:" range:[-1000,1000,0] -- создаем спиннер
on spread changed amt do -- когда изменяется значение в поле спиннера...
(
delta = amt - last_amt -- разница между текущим и предыдущим значением
for obj in selection do -- значения для каждого выделенного объекта
(
-- вычисление новых координат на основе текущего положения и центра выделения
-- функция normalize создает вектор того же направления, но единичной длины
p = obj.pos + normalize (obj.pos - selection.center) * delta
if x.checked then obj.pos.x = p.x -- если включен флажок х, изменять положение по X
if y.checked then obj.pos.y = p.y
if z.checked then obj.pos.z = p.z )
last_amt = amt -- сохранить значение спиннера, как предыдущую величину
) -- конец события изменения величины спиннера
) -- конец определения утилиты
События
Вызов события (event) происходит, когда пользователь взаимодействует с элементом
интерфейса, для которого данное событие определено:
on <item_name> <event_name> [<argument>] do <expr>, где:
<item_name> – название элемента интерфейса, который вызывает событие.
<event_name> – тип события (зависит от типа элемента)
<argument> – дополнительная переменная, в которую заносится значение элемента.
Элементы интерфейса
Кнопка
button <name> [<caption>] [toolTip:<string>]
где <caption> – надпись на кнопке, toolTip: – всплывающая подсказка.
События: on <button> pressed do <expr>
Флажок
checkbox <name> [<caption>] [checked:<boolean>]
где checked – начальное состояние флажка (по умолчанию false – сброшен)
Свойства: <checkbox>.checked или <checkbox>.state (оба выдают одно и то же)
События: on <checkbox> changed <arg> do <expr>, в аргументе <arg> содержится новое
состояние флажка – true или false.
Выпадающий список
dropdownlist<name> [<caption>] [items:<array_of_strings>]
[selection:<number>] [height:<number>]
где items: – массив строковых величин (пунктов списка)
selection: – номер выделенного пункта, начиная с 1 (значение по умолчанию)
height: – общая высота списка по числу пунктов (10 по умолчанию). Если нужно,
чтобы список состоял ровно из N пунктов, высота должна быть N+2.
Свойства:
<dropdownlist>.items – массив пунктов списка.
<dropdownlist>.selection – номер выбранного пункта (0, если массив пустой).
<dropdownlist>.selected – текст выбранного пункта, через это свойство его можно
поменять без обновления всего массива. Если массив пустой, равняется undefined.
Пример: dropdownlist scale_dd “Scale” items:#(“1/2”,”1/4”,”1/8”,”1/16”)
on scale_dd selected i do format “Вы выбрали %\n!” scale_dd.items[i]
Текстовое поле
edittext <name> [<caption>] [text:<string>]
[fieldWidth:<integer>] [height:<integer>] [bold:<boolean>]
где text: – текст в поле. Чтобы задать несколько строк, нужно писать между ними сразу
два символа: возврат каретки (\r) и новая строка (\n).
Пример: “First Line \r\nSecond Line”
fieldWidth: – ширина текстового поля в пикселях (по умолчанию равна расстоянию
от конца заголовка до правой границы свитка).
height: – высота поля в пикселях. Если это число больше высоты одной строки,
поле превращается в текстовую область, куда можно вводить сразу несколько строк
текста.
bold: – если параметр равен true, текст в поле будет полужирным,
если false – обычным (значение по умолчанию).
Свойства: <edittext>.text, <edittext>.caption, <edittext>.bold
События:
on <edittext> changed <arg> do <expr>, вызывается каждый раз, когда пользователь меняет
текст в поле. В аргумент <arg> записывается новый текст.
on <edittext> entered <arg> do <expr>, вызывается, когда пользователь вводит текст, а
потом нажимает кнопку ENTER или TAB, чтобы убрать курсор из поля. В аргумент <arg>
записывается новый текст.
Радиокнопки
radiobuttons <name> [<caption>] labels:<array_of_strings>
[default:<number>] [columns:<number>]
где labels: – массив строк, определяющий число радиокнопок и текст напротив каждой
из них.
default: – номер радиокнопки, активной в данный момент. По умолчанию 1, если 0 –
ни одна кнопка не выбрана.
columns: – число столбиков, которые будут заполняться радиокнопками. Ширина
всех столбиков одинаковая и равна самой длинной метке напротив радиокнопки.
По умолчанию, MAXScript располагает радиокнопки друг за другом в одной
строке, а если не убираются – в один столбик.
Свойства: <radiobuttons>.state – номер выбранной радиокнопки, согласно массиву, если ни
одна не выбрана – 0.
События: on <radiobuttons> changed <arg> do <expr>, вызывается, когда пользователь
выбирает радикнопку из данного набора, в <arg> заносится номер новой радикнопки.
Спиннер
spinner <name> [<caption>] [range:[min, max, val]]
[type:<name>] [scale:<float>]
[fieldWidth:<integer>] [indeterminate:<boolean>]
[controller:(<controller>)] [setKeyBrackets:<boolean>]
где range: – величина Point3, содержащая минимальное, максимальное и начальное
значение спиннера. По умолчанию [0,100,0]
type: – тип спиннера: #float, #integer или #worldunits. По умолчанию #float. Если
установлен в #worldunits, значение спиннера показывается в текущих единицах
отображения (display units) 3ds max, но измеряется все равно в системных
единицах.
scale: – масштаб спиннера определяет величину минимального приращения. По
умолчанию: 0.1 – для вещественных (float), 1 – для целых (integer) чисел.
fieldWidth: – ширина текстового поля спиннера в пикселях. По умолчанию, спиннер
располагается так, что его левый край находится по центру свитка, а правый – по
правой границе, исходя из этого определяется ширина.
indeterminate: – когда true, поле спиннера становится пустым, спиннер не работает,
но его старое значение все равно доступно. Установка нового значения сбрасывает
параметр в false.
controller: – связывает спиннер с определенным контроллером. Изменение значения
спиннера влияет на контроллер и наоборот.
setKeyBrackets: – включает (true) или выключает (false) красные границы спиннера,
показывающие наличие ключевых кадров в анимации.
Свойства: <spinner>.range – диапазон и начальное значение (аналогично
соответствующему параметру), <spinner>.value – значение спиннера,
<spinner>.setKeyBrackets, <spinner>.indeterminate.
События:
on <spinner> changed <arg> do <expr>, вызывается, когда пользователь прокручивает
спиннер или вводит в его поле новое значение, а потом нажимает ENTER или TAB, чтобы
выйти из поля спиннера. Аргумент <arg> содержит новое значение спиннера.
on <spinner> entered do <expr>, вызывается, когда пользователь вводит в поле новое
значение, а потом нажимает ENTER или TAB, чтобы выйти из поля спиннера. Событие on
<spinner> changed также вызывается в этот момент, если оно определено и свойство
<spinner>.value обновляется.
Часть 4
Сплайны
Сплайн – это объект, представляющий собой одну или несколько линий в
пространстве или на плоскости. Все сплайны, а также NURBS-кривые относятся к
категории Shapes (формы). Команда showclass “*:shape” выводит в окно Listener все
существующие классы сплайнов. Некоторые свойства этих классов повторяются, как
общие свойства всех сплайнов. Описывать все классы нет необходимости, рассмотрим
класс Arc (дуга):
Свойство Описание
<Arc>.radius Радиус дуги (тип значения – float, по умолчанию 25.0)
<Arc>.from Положение начальной точки, как угол, отмеряемый от
положительного направления локальной оси X. (float, 45.0)
<Arc>.to Положение конечной точки, как угол, отмеряемый от
положительного направления локальной оси X. (float, 135.0)
<Arc>.pie Достраивает дугу до замкнутого сплайна, соединяя концы с центром
прямыми сегментами. (Boolean, false)
<Arc>.reverse Инвертирует сплайн дуги, т.е. меняет порядок вершин на
противоположный. (Boolean, false)
<Arc>.steps Число разбиений сегмента между вершинами. (Integer, 6)
<Arc>.optimize Удаляет разбиение прямых сегментов сплайна. (Boolean, true)
<Arc>.adaptive Автоматически определяет и устанавливает разбиение для сплайнов.
У прямых сегментов всегда 0. (Boolean, false)
<Arc>.angle Угол поворота сечения визуализируемого сплайна. (float, 0.0)
<Arc>.thickness Диаметр (толщина) визуализируемого сплайна. (float, 1.0)
<Arc>.sides Число сторон в сетке визуализируемого сплайна. Например, значение
4 дает квадратное сечение. (Integer, 12)
<Arc>.renderable Включает показ сплайна при визуализации. (Boolean, false)
<Arc>.mapCoords Включает проекционные координаты. (Boolean, false)
Пример: duga = arc radius: 100 from: 0 to: 180 pos: [0, 0, 0]
Класс SplineShape
Методы этого класса работают с любыми сплайнами и позволяют всячески их
редактировать. Чтобы конвертировать сплайны стандартных классов в класс SplineShape,
необходимо использовать функцию convertToSplineShape <node>, где <node> – любой
объект-сплайн. Если в качестве <node> задать объект, который нельзя конвертировать,
функция возвратит значение undefined.
Часть 5
Простейшие диалоговые окна
messageBox <message_string> [title: <window_title_string>] [beep: <boolean>]
Отображает диалоговое окно с текстом сообщения и кнопкой ОК. Параметр title
определяет заголовок окна, параметр beep – звуковой сигнал (true по умолчанию).
queryBox <message_string> [title: <window_title_string>] [beep: <boolean>]
Отображает диалоговое окно с текстом сообщения и кнопками Yes и No. Эта функция
возвращает true, если пользователь нажимает Yes и false – если No.
yesNoCancelBox <message_string> [title: <window_title_string>] [beep: <boolean>]
Отображает диалоговое окно с текстом сообщения и кнопками Yes и No и Cancel. Функция
возвращает #yes, #no или #cancel, в зависимости от нажатой кнопки.
Примеры: messageBox “Этого делать не нужно”
if queryBox “Хотите продолжить?” beep:false then ...
Системы координат
Любые изменения геометрии объектов происходят в текущей системе координат.
Соответственно, в разных системах координат, они будут работать неодинаково.
Текущая система координат определяется при помощи ключевого слова coordsys:
[in] coordsys world мировая система координат (МСК).
[in] coordsys local локальная система координат объекта.
[in] coordsys parent система координат объекта-предка данного объекта.
[in] coordsys grid система координат активной в данный момент сетки.
[in] coordsys screen система координат активного окна проекции.
[in] coordsys <node> система координат определенного объекта.
[in] coordsys <matrix3> система координат, определяемая заданной матрицей.
Пример: in coordsys local selection.pos=random [-20,20,20] [20,20,20]
Координатные сетки
Можно создать свою собственную координатную сетку, сделать активной и
работать в ее системе координат. Сетка создается при помощи конструктора grid и
обладает следующими свойствами:
<grid>.length длина сетки (float, 50.0 – по умолчанию)
<grid>.width ширина сетки (float, 50.0 – по умолчанию)
<grid>.grid размер ячейки (float, 10.0 – по умолчанию)
Пример:
setka=grid position: [0,0,0] -- создаем координатную сетку
rotate setka 90 [1,0,0] -- поворачиваем на 90 градусов относительно оси Х
activeGrid=$Grid01 -- активируем сетку по имени
in coordsys grid -- в системе координат сетки рисуем сплайн
(
item = splineShape ()
item.name = "Фигура"
item.steps = 0
item.optimize = true
addNewSpline item
addKnot item 1 #corner #line [0,0,0]
addKnot item 1 #corner #line [200,0,0]
addKnot item 1 #corner #line [200, 100,0]
addKnot item 1 #corner #line [0, 100, 0]
close item 1
item.pivot = [50, 0, 0]
updateShape item
in coordsys world setKnotPoint item 1 3 [200, 0, 300] -- в МСК перемещаем точку
addModifier item (Extrude amount: 10) -- применяем модификатор
)
activeGrid=homeGrid -- активируем стандартную сетку
delete setka -- стираем старую сетку
clearlistener() -- очищаем Listener