Если наша кнопка Save отработала без ошибок, то есть выдала список файлов, в котором вы указали файл для записи и нажали Open, можете открыть указанный вами файл и обнаружить, что MAYA напечатала туда все значения атрибутов друг за другом, в одну строку, как в общем-то и следовало ожидать.
3942-6450.9
Осталось напечатать после каждого значения «перевод каретки», то есть перейти на следующую строку в файле. Это можно сделать, напечатав специальный невидимый символ, обозначаемый как «\п», который просто переводит курсор на следующую строку (когда работаете с командой print, представляйте, что печатаете на клавиатуре, и когда нужно нажать Enter, используете выражение print «\п»). Чтобы не добавлять дополнительную команду frpint «\п», просто прибавим этот спецсимвол к печатаемому значению атрибута. В результате получится строка, состоящая из цифр и спецсимвола, которая будет печататься в файл.
global proc saveAll()
{
string SfileName = fileDialog -dm “c:/temp/” '; int SfileNumber = fopen SfileName “w” float $value;
Svalue = 'getAttr “pushField.magnitude” fprint SfileNumber ($value+”\n”);
Svalue = 'getAttr “pushField.attenuation” fprint SfileNumber ($value+”\n”);
Svalue = 'getAttr “pushField.maxDistance” '; fprint SfileNumber ($value+”\n”);
Svalue = 'getAttr “pullField.magnitude” fprint SfileNumber ($value+”\n”);
Svalue = getAttr “pullField.attenuation” '; fprint SfileNumber ($value+”\n”);
Svalue = 'getAttr “pullField.maxDistance” '; fprint SfileNumber ($value+”\n”);
Svalue = 'getAttr “dropShape.conserve” '; fprint SfileNumber ($value+”\n”); fclose SfileNumber; Если теперь вы откроете файл с сохраненными атрибутами, например, в редакторе Word-Pad, то увидите, что все в порядке и все значения располагаются в отдельных строках.
Однако если вы надумаете открыть его в NotePad или MS Word, то увидите странные значки вместо окончаний строк.
Объяснение сути этой проблемы, честно говоря, совершенно не касаемо MAYA, а относится к операционной системе Windows (и DOS). Приведу лишь решение проблемы. При записи в файл для перевода строки надо добавлять два спецсимвола «\г\п», то есть вот так:
$value = ‘getAttr “pushField.magnitude” fprint SfileNumber ($value+”\r\n”); Любители компактного кода быстро сообразят, что можно выкинуть одно присвоение и запихнуть команду getAttr прямо внутрь команды fprint.
global proc saveAll()
{
string SfileName = 'fileDialog -dm “c:/temp/” int $fileNumber = 'fopen $fileName “w” fprint SfileNumber ( getAttr “pushField.magnitude” +”\r\n”); fprint SfileNumber ( getAttr “pushField.attenuation” '+”\r\n”); fprint SfileNumber ( getAttr “pushField.maxDistance” '+”\r\n”); fprint SfileNumber ('getAttr “pullField.magnitude” '+”\r\n”); fprint SfileNumber ( getAttr “pullField.attenuation” '+”\r\n”); fprint SfileNumber ( getAttr “pullField.maxDistance” '+”\r\n”); fprint SfileNumber ( getAttr “dropShape.conserve” '+”\r\n”); fclose SfileNumber;
}
Прежде чем перейти к программированию кнопки Load и написания процедуры чтения значений атрибутов из файла на диске, сделаю два отступления, первое про спецсимволы, а второе для взрослых, о том, как преодолеть ограничение команды fileDialog, связанное с невозможностью открытия несуществующего файла.