Примечание: кириллица не записывается в файл. Все примеры ниже, использованы в целях лучшего понимания.
--Запись текста в конце строки
format "Какой-то текст" to:f
Результат повторного выполнения:
"Какой-то текстКакой-то текст"
--Переход на следующую строку
"\n" (Например: format "Какой-то текст\n" to:f)
Результат повторного выполнения:
"Какой-то текст
Какой-то текст"
--Пример кода полностью:
f = createFile "C: \\ test.txt"
format "The first line \n " to:f
format "The second line \n " to:f
for i = 3 to 6 do
(
format ("Line #" + i as string + " \n ") to:f
)
close f
ShellLaunch "explorer.exe" "C: \\ test.txt"
Результат:
“The first line
The second line
Line #3
Line #4
Line #5
Line #6”
3) Открытие файла:
f = openFile "C: \\ test.txt" mode:"r+"
Есть множество режимов открытия файла (mode:) Основные:
r - чтение
rt - чтение текста
rb - чтение как бинарный код
r+ - чтение и запись (с сохранением содержимого)
w - запись
wt - запись текста (все содержимое удаляется)
wb - запись бинарного кода (все содержимое удаляется)
w+ - чтение/запись текста (все содержимое удаляется)
|
|
Внимание! эти атрибуты добавляются с кавычками, как строковые значения!
--Количество символов в файле:
filepos f
--Переход к десятому символу в строке:
seek f 10
Примеры кода полностью.
--Замена символов текстом "999999" в третьей позиции:
--(Допустим, в файле есть всего одна строка "The first line")
f = openFile "C: \\ test.txt" mode:"r+"
seek f 3
format "999999" to:f
close f
ShellLaunch "explorer.exe" "C: \\ test.txt"
Результат: "The999999 line"
--Вставка текста"999999" в третью позицию, без замены:
--(Допустим, в файле есть всего одна строка "The first line")
f = openFile "C: \\ test.txt" mode:"r+"
seek f #eof; maxlen=filepos f; seek f 3
res = readChars f maxlen errorAtEOF: false
seek f 3; format "999999" to:f; format res to:f
close f
ShellLaunch "explorer.exe" "C: \\ test.txt"
Результат: "The999999 first line"
-- Если файла по указанному пути не существует, то создать его
fPath=”c:\\tmp.txt”
if not doesFileExist fPath do (
f = createFile fPath
close f
)
Если файл существует, и надо добавлять в него данные, то:
f = openFile fPath mode:"a" -- файл открывается и готов к изменению, об этом говорит параметр “а”
format (“tmp” + \n) to:f -- печатать в файле строку “tmp” и перейти на следующую строку.
close f
Пример работы с файлами, скрипт выполняет чтение из файла вершин и выделяет их в объекте сцены 3dsMax
(
Arr = #()
try (s = openFile "c: \\ Vertex_ID_selector.txt") catch()
if (selection.count==1 and s!= undefined) then
(
while not eof s do -- пока не есть eof (конец файла s) делать
(
a = readValue s
append Arr a
)
For i=1 to Arr.count do
Arr[i] += 1
try(PolyOp.SetVertSelection $ Arr) catch(messagebox("Some ID is not exist"))
if getCommandPanelTaskMode()!= #modify then (max modify mode)
subobjectlevel = 1
redrawViews()
close ssizeразмер
)
)
|
|
Единственно, что последняя строчка кода почему то не срабатывает и файл остаётся занят.
_______________________________________________________________
Если скрипт выполняет то что нужно, но в каких-то ситуациях выдаёт ошибки, то можно их скрыть вот таким параметром, задаваемым в шапке макроскрипта.
macroScript UserScriptName category:"NewTools" tooltip:"toolName" silentErrors: true
Ну или можно локально сам код организовать с помощью конструкции перехвата ошибокtry () Catch (), по русски это можно понять как
try - пробовать выполнить ()
Catch если возникнет ошибка, тогда выполнять ()
Если при ошибке делать ничего не нужно, то Catch() так и остаётся с пустыми скобками.
_______________________________________________________________
Выполнение следующего кода если не выполнился или выполнился код
И доступ к геометрии
Здесь рассмотрим такую проблему:
Как проверить изменения геометрии, если возвращаемый результат - есть бестолковое “OK”, причём в любом случае, хоть действия выполнились - хоть не выполнились. Ну и как заставить работать скрипт так, чтобы:
1) была выполнена команда или набор действий,
2) а затем в зависимости от результата выполнения этих действий, выполнялись бы другие задачи
Рассмотрим пример:
При написании скрипта для объекта под модификатором EditPoly была такая проблема, что я не мог получить доступ к геометрии средствами и методами этого самого модификатора EditPoly. Решением оказалось использование свойства.mesh выделенного объекта. Иначе говоря $.mesh даёт доступ к крайнему состоянию сетки после воздействия всех возможных модификаторов и с которым можно работать методами, предназначенными для <mesh> объекта
Код:
gco = modPanel.getCurrentObject()
(MeshCountF0 = getNumFaces $.mesh -- количество полигонов объекта первое состояние (засовываем это в переменную MeshCountF0)
gco.connectEdgeSegments = 1 -- какая то операция, ну в данном случае устанавливает количество рёбер коннекта между рёбрами.
gco.ButtonOp #ConnectEdges -- коннект
MeshCountF1 = getNumFaces $.mesh -- количество полигонов объекта второе состояние (засовываем это в переменную MeshCountF1)
MeshCountF0!= MeshCountF1 -- сравниваем значения переменных,
РЕЗУЛЬТАТ СРАВНЕНИЯ В ПОСЛЕДНЕЙ СТРОКЕ БЛОКА КОДА - ЕСТЬ ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ ИЛИ РЕЗУЛЬТАТ ВЫПОЛНЕНИЯ ЭТОГО БЛОКА КОДА
) == <bool> и завершаем условный оператор if, сравнивая полученное значение выполняемого блока кода с тем вариантом, который нам необходим для дальнейших действий.
_______________________________________________________________
Выделение вершин функцией в Edit_Poly
Для модификатора Edit_Poly работает функция
setVertSelection <node> [<modifier_or_index>] (<sel_bitarray> | <sel_array>) [name:<name>] [keep:<boolean>]
Пример
set_Vert=#{1..10}
gco = modPanel.getCurrentObject()
setVertSelection selection[1] gco set_Vert keep:on
)
Источник, как ни странно из методов Mesh Vertex Methods
http://docs.autodesk.com/3DSMAX/14/ENU/MAXScript%20Help%202012//index.html?url=files/GUID-90843EC5-AE3A-43EB-9406-A3631DAEADE-1092.htm,topicNumber=d28e386399,hash=WS3ED54CBA79FF2E3D-417FC02312B7835BF26-6B91
_______________________________________________________________