Соберем все это вместе:

if ( size ('filterExpand -sin 32 ') > 0) // проверяем размер массива с именами ребер print "Опа, выделены ребрышки!";

else

print "He выделено ни одного ребра."; Этот простой паттерн просто скажет нам, выделены ли в данный момент ребра. Способом описанным в предыдущем параграфе, узнаем имя команды для убийства ребер:

"polyDelEdge -cv true;".

Соберем вместе:

if ( size (‘filterExpand -sm 32’) > 0)    //    проверяем    выделены ли ребра

polyDelEdge -cv true;    //    удаляем их не щядя вершины

Обратите внимание на обратные кавычки и скобки - таким образом мы заставляем size пройтись по списку, который возвратит нам filterExpand -sm 32. Если список пуст, size вернет 0 - условие if а, а не выполняется - соответственно мы не делаем ничего. Если же в выделении присутствовали ребра, удалим их процедурой polyDelEdge -cv true; Получаем отредактированную версию doDelete:

global proc doDelete()

{

string $sel[] = 'ls -sl -dag'; skinClusterPreDelete($sel);

->if ( size <'filterExpand -sm 32') > 0) polyDelEdge -cv true;

delete;

}

Таким образом, если выделены ребра - удаляем их нодой, затем скрипт выполнит стандартную процедуру delete и удалит все остальное (если что-то еще было выделено).

Сохраняем новую версию скрипта doDelete и перезапускаем майку. Быстренько создаем кубик, хватаем ребра и жмем delete. Вуаля! Работает, как хотели, и все, что требовалось - это добавить две строчки простейшего кода.

Вспомним о недостатках, оговоренных ранее. Теоретически наша модификация должна работать на нескольких выделенных объектах и ребрах. Скажем, если выделить кубик и ребро и нажать delete, майя нас удивит и выругается. Ошибка в том, что команда “polyDelEdge -cv true;” оперирует над ребрами. Мы вызываем ее без каких-либо параметров (перед “;” нет ни имени, ни списка с именами объектов); таким образом, команда вынуждена использовать текущее выделение. Но, так как в нем присутствует несколько выделенных объектов, код не работает. Использование команды для удаления ребер на целом объекте оператор применяет ко всем ребрам объекта, но отказывается работать при нескольких выделенных объектах.

Мы же не хотим удалять все ребра выделенных объектов. Можно заставить polyDelEdge оперировать только на выделенных ребрах, передав ему список их имен как параметр.

Например, так:

polyDelEdge -cv true ('filterExpand -sm 32') ;    //    заставляем polyDelEdge

// работать только на ребрах

Правим процедуру, проверяем. Проверять работу скрипта можно несколькими способами. Можно каждый раз изменять скриптовый файл, а потом перезагружать его, набрав “source doDelete;” (doDelete в нашем случае - это имя скриптового файла, над которым мы работаем). Я предпочитаю тестировать скрипт в скрипт эдиторе, или копировать его на шелф и тестировать там.

Теперь займемся вторым недостатком. Что, если нам таки захочется применить “старенький” delete к ребрам? То есть удалить только ребра, оставив вершины. Можно использовать наш сетап и потом просто изменить опции ноды - убрать опцию.


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