Операции, доступные над объектами (например Editable Poly), называются интерфейсами.
С точки зрения публикации функций интерфейс представляет собой ряд свойств, методов и связанными с интерфейсами действий, доступных для объекта. Это понятие не следует путать с пользовательским интерфейсом.
Чтобы узнать все интерфейсы любого типа объекта, можно вызвать команду showinterfaces $. (showinterfaces работает не только для Editable_Poly, но и для других типов объектов!) Если в этот момент будет выделен объект типа Editable Poly, то в листенере выскочить огромная куча интерфейсов, то - есть операций, которые можно совершить над объектом.
Interface: EditablePoly
Properties:
Methods:
<bool>Hide <enum>mnSelLevel flags:<DWORD>
mnSelLevel enums: {#Object|#Vertex|#Edge|#Face|#CurrentLevel}
flags default value: 1
<bool>unhideAll <enum>mnSelLevel
mnSelLevel enums: {#Object|#Vertex|#Edge|#Face|#CurrentLevel}
…
…
…
<void>SmGrpFloater()
<boolean>MatIDFloaterVisible()
<void>MatIDFloater()
Actions:
OK
Один из которых есть интерфейс buttonOp, его мы и рассмотрим.
Из официальной справки MaxScript Help:
<void><EditablePoly>.buttonOp <enum>buttonOpID
buttonOpID enums: {#GrowSelection | #ShrinkSelection | #SelectEdgeLoop | #SelectEdgeRing | #HideSelection | #HideUnselected | #UnhideAll | #NamedSelectionCopy | #NamedSelectionPaste | #Cap | #Delete | #Remove | #Detach | #AttachList | #SplitEdges | #BreakVertex | #Collapse | #ResetSlicePlane | #Slice | #WeldSelected | #CreateShape | #MakePlanar | #AlignGrid | #AlignView | #RemoveIsoVerts | #MeshSmooth | #Tessellate | #Update | #SelectByVertexColor | #Retriangulate | #FlipNormals | #SelectByMatID | #SelectBySmoothingGroups | #Autosmooth | #ClearSmoothingGroups|
#Extrude | #Bevel | #Inset | #Outline | #ExtrudeAlongSpline | #HingeFromEdge |
#ConnectEdges | #ConnectVertices | #Chamfer | #Cut | #RemoveIsoMapVerts |
#ToggleShadedFaces | #MakePlanarInX | #MakePlanarInY |#MakePlanarInZ }
Где
<void> -- ссылка на объект (как правило это $)
<EditablePoly> -- указатель объекта типа Editable_Poly
.buttonOp -– Очевидно это есть интерфейс, как свойство, принадлежащее Editable_Poly
<enum>buttonOpID –- enum идентификатор операции.
Таким образом, готовый код будет выглядеть например вот так:
$. EditablePoly.buttonOp #Tessellate –- операция тесселяции полигона.
Это не самый сложный интерфейс для понимания, поэтому в данном случае происходит простая подстановка под маску
<void><EditablePoly>.buttonOp <enum>buttonOpID
_______________________________________________________________
Меняем местами подэлементы двумерного массива
Задача: поменять в двумерном массиве числа A и B местами
Меняем трёхэтапным способом
Arr=#(#(13, 31, 59), #(13, 32, 60), #(13, 35, 58), #(13, 36, 68), #(13, 31, 58), #(13, 32, 59), #(13, 35, 68), #(13, 36, 60))
A=13
B=58
tmp=0
for i = 1 to Arr.count do -- Для каждого элемента, начиная с i=1 до i=количеству элементов массива (то-есть среди восьми скобок в главном массиве) делать
for j = 1 to Arr[i].count do -- Для каждого элемента, начиная с j=1 до j=количеству элементов подмассива массива (то-есть того массива содержащего по 3 числа) делать
if Arr[i][j]==A do Arr[i][j]=tmp -- Если каждый элемент подмассива Arr[i][j] есть число A (то-есть равное 13) то делать: Этот элемент Arr[i][j] сделать равным tmp (то-есть временно нулю)
Arr -- проверяем что получилось (но не обязательно)
-- Далее то же самое что и в первом блоке
for i = 1 to Arr.count do -- Для каждого элемента, начиная с i=1 до i=количеству элементов массива...
for j = 1 to Arr[i].count do -- Для каждого элемента, начиная с j=1 до j=количеству элементов подмассива...
if Arr[i][j]==B do Arr[i][j]=A -- Если каждый элемент подмассива Arr[i][j] есть число B (то-есть равное 58) то делать: Этот элемент Arr[i][j] сделать равным A (то-есть 13)
Arr -- проверяем что получилось (но не обязательно)
-- И меняем оставшееся временное значение tmp на нужное значение B
for i = 1 to Arr.count do
for j = 1 to Arr[i].count do
if Arr[i][j]==tmp do Arr[i][j]=B -- Если каждый элемент подмассива Arr[i][j] есть число tmp (то-есть равное 0) то делать: Этот элемент Arr[i][j] сделать равным B (то-есть 58)
Arr -- проверяем что получилось
Листенер вернёт:
#(#(58, 31, 59), #(58, 32, 60), #(58, 35, 13), #(58, 36, 68), #(58, 31, 13), #(58, 32, 59), #(58, 35, 68), #(58, 36, 60))
_______________________________________________________________
Немного логики и интересный способ присвоения значений переменным.
a=0 --эту переменную надо обязательно объявить, иначе код не будет работать
tmp = (-- переменная tmp не была объявлена, поэтому пока её значение undefined
a+=1 -- это то же самое что и a=a+1
1 -- /*просто любая цифра, которая вернётся в листенер и присвоится переменной tmp*/
)
tmp==1 -- проверяем, tmp есть 1?
-- Листенер вернет
true
А вот такой же пример, но с маленькими изменениями
a=0
tmp = (
a+=1
off -- булевое значение, тоже самое что и false ( on соответствует true)
)
tmp==false -- Проверяем, переменная имеет значение false?
-- Листенер вернёт
true
В общем на последнюю линию в блоке можно ставить всё что угодно, чему мы хотим, чтобы равнялась переменная, которой приравнивается блок
_______________________________________________________________
Работа с внешним текстовым файлом
Просьба дополнить по-возможности:
Как удалять строку (или узнать длину строки), как записывать текст на кириллице
Основные операции с файлом
--Создание текстового файла "test.txt" в корне диска "С"
f = createFile "C: \\ test.txt"
--Открытие текстового файла "test.txt" из корня диска "С"
f = createFile "C: \\ test.txt"
--Закрытие текстового файла "test.txt" используя переменную f
close f
--Запуск текстового файла "test.txt" из корня диска "С" сторонней программой, заданной по-умолчанию (Например: блокнот)
ShellLaunch "explorer.exe" "C: \\ test.txt"
Примечание: Файл обязательно нужно закрывать командой "close",
после открытия/создания и редактирования, иначе могут возникнуть проблемы
с редактированием и удалением файла (пока не будет закрыт 3ds Max)