}
Обратите внимание, что в команде fileBrowserDialog задается в виде строки имя процедуры saveAttr, которая будет вызываться при нажатии кнопки Save_Attr в окне файлового диалога.
Пытливейшие из умов сообразят, что команду fileBrowserDialog можно «повесить» прямо на кнопку Save в нашем основном окне и избежать, тем самым, написания лишней процедуры saveAll.
button -I “Save” -w 94
-с “fileBrowserDialog -m 1 -fc \”saveAttr\” -an \”Save_Attr\” -ft \”text\”;”; Чтение данных из файла После написания процедуры сохранения данных на диск не составит никакого труда скопировать и переделать ее для чтения значений атрибутов из файла.
Не забудьте дописать вызов команды loadAll для кнопки Load:
button -I "Load” -w 94 -с “loadAU”; А внизу создайте новую процедуру, скопировав и переименовав старую процедуру
saveAll:
global proc loadAll()
{
string $fileName = 'fileDialog -dm “c:/temp/” int SfileNumber = 'fopen SfileName “r” ';
fclose SfileNumber; Обратите внимание, что в аргументах команды fopen необходимо указать параметр “г”, определяющий, что файл открывается только на чтение и что его содержимое изменяться не будет.
Чтение из файла осуществляется обычно построчно. Поэтому алгоритм будет следующий: прочесть строку из файла, преобразовать ее в число и присвоить это число атрибуту командой setAttr.
global proc loadAll ()
{
string SfileName = 'fileDialog -dm ‘'c:/temp/” '; int SfileNumber = 'fopen SfileName “r" '; float Svalue;
Svalue = ' fgetline SfileNumber' ; setAttr “pushField.magnitude” Svalue ;
Svalue = ' fgetline SfileNumber' ; setAttr “pushField.attenuation” Svalue ;
Svalue = ' fgetline SfileNumber’ ; setAttr “pushField.maxDistance” Svalue ;
Svalue = ' fgetline SfileNumber' ; setAttr “pullField.magnitude” Svalue ;
Svalue = ' fgetline SfileNumber' ; setAttr “pullField.attenuation” Svalue ;
Svalue = ' fgetline SfileNumber' ; setAttr “pullField.maxDistance” Svalue ;
Svalue = ' fgetline SfileNumber' ; setAttr “dropShape.conserve” Svalue ;
fclose SfileNumber;
J
Обратите внимание, что в строке типа Svalue = ' fgetline SfileNumber' ; в правой части происходит чтение строки из файла, которая преобразуется в число оператором присваивания «=», так как слева от него стоит переменная типа float.
Команда fgetline читает строку из файла, номер которого указан в качестве аргумента, и переводит курсор на следующую строку, так что следующий вызов fgetline будет читать новую строку.
Для взрослых. Проверить достижение конца файла можно командой eof , а возвратиться к его началу командой rewind.
Любители запихать все в одну строку могут скомпрессировать наш код в следующую процедуру:
global proc loadAUO {
string SfileName = 'fileDialog -dm “c:/temp/” '; int SfileNumber = 'fopen SfileName “r”
setAttr “pushField.magnitude” (floatf fgetline SfileNumber')); setAttr “pushField.attenuation’’ (floatf fgetline SfileNumber')) ; setAttr “pushField.maxDistance” (floatf fgetline SfileNumber')) ; setAttr “pullField.magnitude” (floatf fgetline SfileNumber')) ; setAttr “pullField.attenuation" (floatf fgetline SfileNumber')) ; setAttr “pullField.maxDistance” (floatf'fgetline SfileNumber')) ; setAttr “dropShape.conserve” (floatf fgetline SfileNumber')) ; fclose SfileNumber;