Этот ответ полностью на Python, поэтому вы можете преобразовать его в MEL, если вы настаиваете на его использовании.
Задания сценария могут запускаться различными способами при возникновении события. Это могут быть такие вещи, как, когда время изменилось, пользователь отменяет действие, или в вашем случае, когда выбор изменился.
Вы можете получить полный список названий этих событий, выполнив следующее:
cmds.scriptJob(listEvents=True)
То, что вы ищете, это "SelectionChanged"
.
Чтобы это сработало, вам нужно определить функцию, которая будет вызываться при запуске задания скрипта (при изменении выбора). Вот простой пример этого.
import maya.cmds as cmds
# Create a function that will be called from the script job whenever there's a change to the selection.
def func():
print "The selection has changed!"
# Create a new script job and save the result to a variable. The result is the script job's id number.
script_job_id = cmds.scriptJob(event=["SelectionChanged", func])
# When it's no longer needed, pass the script job's id with the kill parameter to remove it.
#cmds.scriptJob(kill=script_job_id)
Таким образом, в вашем случае, когда вы запускаете функцию, она может проверить, выбран ли объект, и в зависимости от того, есть он или нет, вы можете заставить его закрасить кнопку.
Когда ваш инструмент закрывается, вы можете удалить задание сценария, используя его параметр kill
, чтобы он больше не работал, когда он вам не нужен.
И в качестве примечания, что вы написали Хагги, если у вас нет веских причин, я бы просто придерживался Python вместо MEL. Синтаксис намного проще, он имеет безумное количество библиотек, и он просто более силен для выполнения простых вещей, таких как манипулирование строками. Плюс Python используется во многих других программах, MEL - нет. Это правда, что есть некоторые команды, которые могут быть выполнены только в MEL, но вы можете легко оценить строку MEL с помощью Python.
MSI может сделать это, но вам нужно ИЛИ в некоторых дополнительных значениях для аргумента messageType.
Например,
Record record = new Record();
record.FormatString = string.Format("Something has gone wrong!");
session.Message(
InstallMessage.Error | (InstallMessage) ( MessageBoxIcon.Error ) |
(InstallMessage) MessageBoxButtons.OK,
record );
См. этот поток из wix-. список рассылки пользователей для более подробной информации.
Если Вы хотите, чтобы диалоговое окно обнаружилось, который содержит сообщение, необходимо сделать это сами.
Вот некоторый код, который я использую, чтобы сделать обработку ошибок в управляемых пользовательских действиях, которые выполняют SQL. Это показывает messagebox, если установка работает с полным UI. Это находится в c#, но надо надеяться Вы получите идею.
private void _handleSqlException(SqlException ex)
{
StringBuilder errorMessage = new StringBuilder();
errorMessage.Append("A SQL error has occurred.");
for (int i = 0; i < ex.Errors.Count; i++)
{
errorMessage.Append("Index #" + i + "\n" +
"Message: " + ex.Errors[i].Message + "\n" +
"LineNumber: " + ex.Errors[i].LineNumber + "\n" +
"Source: " + ex.Errors[i].Source + "\n" +
"Procedure: " + ex.Errors[i].Procedure + "\n");
}
session.Log(errorMessage);
if (session["UILevel"] == "5")
{
MessageBox.Show(errorMessage);
}
}