}

Обратите внимание, что в команде 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;


⇐ вернуться назад | | далее ⇒