Необъявленные переменные в Maya 2011 с использованием MEL

Поскольку у меня был опыт работы с Java/C#, сайт MEL стал для меня чем-то вроде разочарования, может быть, потому, что я не привык к нему, но не думал, что он так понятен, как некоторые сайты API.

Я пытаюсь написать команду MEL для автоматизации сохранения, переименования файла, цикла сохранения. Я знаю, что уже должен быть какой-то скрипт, который делает это, но я тоже хотел научиться

Первоначально я хочу, чтобы пользователь щелкнул пользовательскую кнопку с полки и получил диалоговое окно подсказки, предварительно загруженное с именем текущей сцены, с кнопкой «Сохранить как» и «Отмена». Переименование и сохранение - это нормально, это разделение на функции (есть ли разница между функциями и процедурами?), которое начало порождать ошибки.

string $sceneName_new;


// Initiates the scene saving, checking filename meets standards
proc saveSceneAs() {

    string $sceneName_old = `file -q -sceneName`;
    string $result = `promptDialog 
        -title "Save scene as"
        -message "Scene name:"
        -button "Save" -button "Cancel"
        -text $sceneName_old
        -defaultButton "Save" -cancelButton "Cancel"
        -dismissString "Cancel"`;

    if ($result == "Save") {
        $sceneName_new = `promptDialog -query -text`; // get result
        $sceneName_new = strip($sceneName_new); // clean whitespace (start/end)

        // check length of new name has at least one character
        if (size($sceneName_new) < 1) {
            print("Error: file name must contain at least one character. File not saved.\n");
        } else if ($sceneName_old == $sceneName_new) {
            confirmOverwriteOkay();
        } else {
            // good to save :D
            saveScene($sceneName_new);
        }
    } else {
        print("Cancelled. File not saved.\n");
    }   
}

// Asks user in case of unchanged filename, if okay to overwrite
proc confirmOverwriteOkay() {
    string $overwriteConfirm = `promptDialog 
                -title "Warning"
                -message "Are you sure you want to overwrite the current file?"
                -text $sceneName_new;
                -button "Yes, overwrite" -button "No, rename" -button "No, cancel"
                -defaultButton "No, rename" -cancelButton "No, cancel"
                -dismissString "No, cancel"`;

    if ($overwriteConfirm == "Yes, overwrite") {
        saveScene($sceneName_new);
    } else if ($overwriteConfirm == "No, rename") {
        // go back and try again
        saveSceneAs();
    } else {
        print("Cancelled. File not saved.\n");
    }
}


// Saves the scene with the given file name
proc saveScene(string $nameToSave) {
    // TODO: rename, save file
    print("File saved: " + $nameToSave);
}


saveSceneAs();    

И ошибки:

// Error: -text $sceneName_new; // 
// Error: "$sceneName_new" is an undeclared variable. // 
// Error: -button "Yes, overwrite" -button "No, rename" -button "No, cancel" // 
// Error: Syntax error // 
// Error: saveScene($sceneName_new); // 
// Error: "$sceneName_new" is an undeclared variable. // 

person ataulm    schedule 10.04.2011    source источник
comment
если я закомментирую код в функции overwriteConfirm(), он отлично работает (без функциональности: P)   -  person ataulm    schedule 11.04.2011


Ответы (2)


Я решил эту проблему, добавив ключевое слово global в переменную sceneName_new, а также заявив, что использую его в функции, в которой он был вызван — это заставит процедуру использовать эту глобальную переменную, а не создавать новую локальную переменную. один.

global string $sceneName_new;

// Asks user in case of unchanged filename, if okay to overwrite
proc confirmOverwriteOkay() {

global string $sceneName_new;       
string $overwriteConfirm = `promptDialog 
                -title "Warning"
                -message "Are you sure you want to overwrite the current file?"
                -text $sceneName_new;
                -button "Yes, overwrite" -button "No, rename" -button "No, cancel"
                -defaultButton "No, rename" -cancelButton "No, cancel"
                -dismissString "No, cancel"`;

    if ($overwriteConfirm == "Yes, overwrite") {
        saveScene($sceneName_new);
    } else if ($overwriteConfirm == "No, rename") {
        // go back and try again
        saveSceneAs();
    } else {
        print("Cancelled. File not saved.\n");
    }
}
person ataulm    schedule 11.04.2011

Вам нужно использовать глобальное ключевое слово в определении переменной $sceneName_new. Также вам нужно указать глобальную переменную в каждой процедуре, где вы ее используете.

global string $sceneName_new;

proc saveSceneAs() 
{
    global string $sceneName_new;
    //content
}

proc confirmOverwriteOkay() 
{
    global string $sceneName_new;
    //content
}
person emigue    schedule 12.04.2013