-----------------------
macroScript ScenePolyCounter
category:"MAX Script Tools"
internalcategory:"MAX Script Tools"
buttontext:"ScenePolyCounter"
toolTip:"ScenePolyCounter"
(
local ScenePolyCounterOn = false
on ischecked return ScenePolyCounterOn
on execute do
(
ScenePolyCounterOn = not ScenePolyCounterOn
completeredraw ()
updateToolbarButtons()
)
)
-----------------------
мы добавили:
-обработчик нажатия кнопки ischecked, возвращающий значение переменной ScenePolyCounterOn , в которой хранится состояние нашего макроса - активирована или не активирована. По умолчанию, естественно, неактивна (false).
- обработчик события execute - исполнение, то есть собственно последовательность выпоняемых действий. Первым делом мы в нем меняем значение активности макроса на противоположное, поскольку с каждым вызавом макроса он последовательно активируется и дезактивируется. Для описания этого мы воспользовались оператором NOT, меняющим значение булевской переменной (тип ДА НЕТ) на противоположное. Оставшиеся две строки - перерисовка рабочего экрана и кнопки вызова скрипта.
Нажимаем комбинацию клавиш CTRL+E - так называемое событие Evaluate - аналог компиляции програмного кода. не закрывая окна с телом скрипта пробуем нажать на нашу кнопку. Как мы видим, она изменяет свое состояние, но больше ничего не происходит. Ну что ж, "продолжаем разговор" (С)... Введем следующий код:
-----------------------------
macroScript ScenePolyCounter
category:"MAX Script Tools"
internalcategory:"MAX Script Tools"
buttontext:"ScenePolyCounter"
toolTip:"ScenePolyCounter"
(
local ScenePolyCounterOn = false
local TextFaceObj, TextVertexObj, TextFaceAll
local lastViewport
fn printtext =
(
TextFaceObj = "SelObjFace : "
TextVertexObj = "SelObjVertex :"
TextFaceAll = "SceneFace : "
gw.wtext [5, 40, 0] TextFaceObj color:(color 255 234 0)
gw.wtext [5, 60, 0] TextVertexObj color:(color 255 234 0)
gw.wtext [5, 80, 0] TextFaceAll color:(color 255 234 0)
gw.enlargeUpdateRect #whole
gw.updateScreen()
if viewport.activeViewport != lastViewport then
(
completeredraw()
lastViewport = viewport.activeViewport
)
)
on ischecked return ScenePolyCounterOn
on execute do
(
if ScenePolyCounterOn then
unregisterRedrawViewsCallback printtext
else
(
registerRedrawViewsCallback printtext
)
ScenePolyCounterOn = not ScenePolyCounterOn
completeredraw ()
updateToolbarButtons()
)
)
---------------------------
нажимаем комбинацию CTRL+E (компилируем код) и нажимаем на кнопку нашего макроса. В активном видовом окне появились три надписи, соответствующие установленным нами. Убеждаемся, что при переключении окон проекции надписи следуют за переключением, а по выключении макроса - исчезают, и идем дальше. Давайте разберемся, что же мы написали.
Во-первых, мы добавили переменную lastViewport, в которой хранится значение текущего окна проекции, и добавили действие - при смене окна проекции перерисовать все видовые окна - completeredraw().
if viewport.activeViewport != lastViewport then
(
completeredraw()
lastViewport = viewport.activeViewport
)
В качестве условия мы поставили выражение viewport.activeViewport != lastViewport . Таким образом, в случае если хранящееся в переменной lastViewport значение текущего окна проекции не совпадает с реальным, получаемым с помощью вызова viewport.activeViewport, мы перерисовываем все окна проекций и меняем значение переменной lastViewport на актуальное. Закомментируйте или удалите строки с данным условием, и попробуйте попереключать окна проекций при активном макросе, чтобы стала понятна необходимость данного условия...
Так же мы добавили вывод наших надписей на экран:
gw.wtext [5, 40, 0] TextFaceObj color:(color 255 234 0)
gw.wtext [5, 60, 0] TextVertexObj color:(color 255 234 0)
gw.wtext [5, 80, 0] TextFaceAll color:(color 255 234 0)
gw.enlargeUpdateRect #whole
gw.updateScreen()
первые три строки - собственно вывод, то есть команда gw.wtext - написать текст, далее координаты вывода в текущем окне, далее - что, собственно писать, ну и в последнем разделе - цвет надписей.
последние две строки -
gw.enlargeUpdateRect #whole - задаем прямоугольник, впределах которого необходимо произвести перерисовку экрана (в данном случае - весь экран)
gw.updateScreen() - собственно перерисовка, то есть вывод на экран заданных значений.
Начинаем собирать кусочки мозаики, то есть создавать конечный код. Дописываем следующее:
-------------------------------
macroScript ScenePolyCounter
category:"MAX Script Tools"
internalcategory:"MAX Script Tools"
buttontext:"ScenePolyCounter"
toolTip:"ScenePolyCounter"
(
local ScenePolyCounterOn = false
local TextFaceObj, TextVertexObj, TextFaceAll
local lastViewport
fn printtext =
(
TextFaceObj = "SelObjFace : "
TextVertexObj = "SelObjVertex :"
TextFaceAll = "SceneFace : "
if selection.count == 1 do
(
if ($selection[1].category == #shape) or ($selection[1].category == #Splines) then
(
TextFaceObj= "SelObjFace :0"
)
else
(
TextFaceObj= "SelObjFace : " + (getPolygoncount $)[1] as string
)
if ($selection[1].category == #shape) or ($selection[1].category == #Splines) then
(
TextVertexObj = "SelObjVertex :0"
)
else
(
TextVertexObj = "SelObjVertex :" + (getPolygoncount $)[2] as string
)
)
gw.wtext [5, 40, 0] TextFaceObj color:(color 255 234 0)
gw.wtext [5, 60, 0] TextVertexObj color:(color 255 234 0)
gw.wtext [5, 80, 0] TextFaceAll color:(color 255 234 0)
gw.enlargeUpdateRect #whole
gw.updateScreen()
if viewport.activeViewport != lastViewport then
(
completeredraw()
lastViewport = viewport.activeViewport
)
)
on ischecked return ScenePolyCounterOn
on execute do
(
if ScenePolyCounterOn then
unregisterRedrawViewsCallback printtext
else
(
registerRedrawViewsCallback printtext
)
ScenePolyCounterOn = not ScenePolyCounterOn
completeredraw ()
updateToolbarButtons()
)
)
-------------------------
Что мы добавили? Во-первых, мы определили выделение:
if selection.count == 1 do ,
то есть в случае, если у нас выделен один объект, то мы в соответствии с алгоритмом, выработанным в начале урока, проверяем - является ли он плоской формой, и если не является, то фиксируем количество принадлежащих ему фейсов и вершин.
Так же несколько изменилась строка