(
global PosRoll_testRoll
if PosRoll_testRoll==undefined do PosRoll_testRoll=[830,240]
try DestroyDialog test_roll catch()
rollout test_roll "test_roll" width:50 height:30
(
button OK_btn "ok" width:30 hight:22 align: #center
on test_roll moved pos do PosRoll_testRoll=pos
on OK_btn pressed do
(
DestroyDialog test_roll
)
)
CreateDialog test_roll pos:PosRoll_testRoll
)
_______________________________________________________________
Нормализованные XYZ векторы камеры въюпорта
Их можно использовать для рассчёта положений, трансформаций и перемещений относительно камеры въюпорта
VectViewX=(inverse(getViewTM())).row1
VectViewY=(inverse(getViewTM())).row2
VectViewZ=(inverse(getViewTM())).row3
point wirecolor:red size: 1 pos: VectViewX
point wirecolor:green size: 1 pos: VectViewY
point wirecolor:blue size: 1 pos: VectViewZ
_______________________________________________________________
Функция проверки пуста ли папка
CurFolder="c: \\ test"
makeDir CurFolder all:on -- Создать каталог, all:on - все суб-директории уровней, указанных в пути будут созданы, если они не существуют
fn Folder_isEmpty_fn folder=(
inFolder=((dotnetclass "System.IO.Directory").GetFiles folder)
inFolder.count>0
)
Folder_isEmpty_fn CurFolder
Источник: http://www.scriptspot.com/forums/3ds-max/general-scripting/isfolderempty-function
|
|
_______________________________________________________________
Русский (кириллица) в редакторе MaxScript
Если редакторе MaxScript, кириллица отображается некорректно, то в файле <maxroot>/MXS_Editor.properties
(Например C:\Program Files\Autodesk\3ds Max 2012\MXS_Editor.properties)
необходимо заменить значение code.page на 0 (вместо -1) и перезапустить 3ds Max
Источник: http://vraydoc.narod.ru/tutors/msx-rotation/index.html
_______________________________________________________________
Фильтр по классу SplineShape, LinearShape, line
fn filterShapes obj = isKindOf obj Shape AND findItem shape.classes (classOf obj) < 4
isKindOf obj Shape -- проверка принадлежности к классу Shape
shape.classes -- массив всех классов сплайнов, первыми среди которых перечислены SplineShape, LinearShape, line
findItem shape.classes (classOf obj) -- найти позицию элемента (класса текущего объекта), в массиве shape.classes
< 4 -- значит, что захвачены будут как раз первые 3 элемента, кроме остальных
_______________________________________________________________
Применение структур.
Универсальные методы работы Edit_Poly и Editable_Poly
Суть в том, что организованы 2 структуры, содержащие одинаковые методы работы с объектами классов Edit_Poly и Editable_Poly, после проверки класса объекта, универсальный метод universal получает свою структуру, после чего синтаксис обращения к объекту получается одинаков и к объектам различных классов можно применять одинаковые строки кода. Это очень полезно с точки зрения организации UI скриптов, где необходимо единообразно увязать все методы в одном элементе.
obj
universal
edgeSel = #{}
struct polyFns -- структура для объекта класса Editable_Poly
(
getVertPos = polyOp.getVert,
getEdgeVerts = polyOp.getEdgeVerts,
getEdgeSel = polyOp.getEdgeSelection,
|
|
setEdgeSel = polyOp.setEdgeSelection,
getVertsByEdges = polyOp.getVertsUsingEdge,
getEdgesByVerts = polyOp.getEdgesUsingVert
)
struct polyModFns -- структура для модификатора Edit_Poly
(
fn getListData list = case (classOf list) of (BitArray: list; Integer: #{list}; default: #{});,
fn getVertPos obj vert = obj.getVertex vert,
fn getEdgeVerts obj edge = #(obj.getEdgeVertex edge 1, obj.getEdgeVertex edge 2),
fn getEdgeSel obj = obj.getSelection #Edge,
fn setEdgeSel obj edgeList =
(
obj.setEPolySelLevel #Edge
obj.setSelection #Edge #{}
obj.select #Edge edgeList
),
fn getVertsByEdges obj edgeList vertList:#{} =
(
edgeList = getListData edgeList
obj.getVertsUsingEdge &vertList &edgeList
vertList
),
fn getEdgesByVerts obj vertList edgeList:#{} =
(
vertList = getListData vertList
obj.getEdgesUsingVert &edgeList &vertList
edgeList
)
)
fn tryInit =
(
if subObjectLevel == undefined then max modify mode
obj = Filters.GetModOrObj()
case (classOf obj) of
(
Editable_Poly: (universal = polyFns(); true)
Edit_Poly: (universal = polyModFns(); true)
default: (messageBox "This script only works with Edit/Editable_Poly objects."; false)
)
)
tryInit() -- вызов функции проверки
universal.getEdgeSel obj
universal.getEdgesByVerts obj
universal.getVertsByEdges obj
universal.setEdgeSel obj
universal.getEdgeSel obj
universal.getEdgeVerts obj
universal.getVertPos obj
Источник: http://www.scriptspot.com/3ds-max/scripts/heuristic-edge-select
_______________________________________________________________
Тестовый пример для понимания работы со структурами
struct Counter (
num=0,
fn up_fn = (num+=1
num),
fn down_fn = (num-=1
num)
)
test=Counter()
test.up_fn()
test.down_fn()
test2=Counter()
test2.up_fn()
test2.down_fn()
getPropNames test
getProperty test #num
getProperty test #down_fn
Источник: http://forums.cgsociety.org/archive/index.php?t-272425.html
_______________________________________________________________
Структурой создана зависимость работы одного диалога от состояния другого
struct MyStructure|
(
chB_state = true, ChBoxState_Dialog, Btn_Dialog,
fn ChBoxState_fn =
(
try(destroydialog ChBoxState_rol)catch()
rollout ChBoxState_rol " Properties"
(
checkbox cbox1 "try me" width:200 checked:chB_state
on cbox1 changed state do (cbox1.checked = ui.chB_state = state)
)
ChBoxState_rol
)
fn Btn_fn=
(
try(destroydialog Btn_rol)catch()
rollout Btn_rol ""
(
button btn1 "test"
on btn1 pressed do (print ui.chB_state)
)
Btn_rol
),
fn rollcreator_fn=
(
Btn_Dialog = Btn_fn()
Createdialog Btn_Dialog
ChBoxState_Dialog = ChBoxState_fn()
Createdialog ChBoxState_Dialog
),
fn dummy_fn = dummy()
)
global ui = MyStructure()
ui.rollcreator_fn()
ui.dummy_fn()
Источник: http://www.scriptspot.com/forums/3ds-max/general-scripting/struct-initialize-inside-a-variable
_______________________________________________________________
Value > MAXWrapper > Node
getPointPos $ <index vert> -- возвращает point3 позиции вертекса
isPointSelected $ <index vert> -- если вертекс выделен, то true else false
$.numfaces -- количество полигонов
$.numverts -- количество вершин
$.edges -- количество рёбер
getVertSelection $.mesh -- возвращает битовый массив выделенных вершин объекта класса geometry
$.selectedVerts.count -- количество выделенных вершин
getEdgeSelection $.mesh -- выделенных рёбер-- Источник из MaxscriptHelp
polyop.getFaceDeg $ <int Face> -- количество вершин полигона
Выделить объекты группы. Доступ к объектам группы осуществляется путём обращения к свойству.children контейнера группы.
|
|
_______________________________________________________________