Открытие роллаута на позиции прошлого закрытия

(
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 контейнера группы.

_______________________________________________________________





































Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: