0crash0 | Экспорт объектов MEL и снова QT designer(myOBJsExporter)

Мой блог о том как я постигаю 3D, видео, моушн графику, композитинг.
RSS-лента

Экспорт объектов MEL и снова QT designer(myOBJsExporter)

Суббота 3 мая 2014 | Последнее изменение: Воскресенье 4 мая 2014 19:08

Всем привет, снова я столкнулся с проблемой и создал пусть и не самый изящный но все таки рабочий путь ее разрешения.
Проблема в том что мне необходимо было экспортировать отдельные объекты в отдельные файлы без материалов(*.mtl) и пр. что-бы делать их UV-развертку или рисовать текстуры для отдельных объектов.

Download “myOBJsExporter” myOBJsExporter.rar – Downloaded 28 times –


Выход напрашивается сам собой, раз Maya стандартно при экспорте не позволяет сохранять несколько выделенных объектов в различные файлы, значит просто его допишем.

И снова для создания интерфейса используем QT Designer который входит в комплект вместе с Autodesk Maya и расположен в папке с исполняемым файлом maya.


Добавим возможность выбирать папку для сохранения:
global proc gt_FldSv(string $dirpath,string $type) {
	$SvFld = $dirpath;                    // первым параметром файлбраузер передает путь с типом "Text" 
	textField -edit -tx $SvFld FldtSav;   // редактируем содержимое поля FldtSav придавая ему значение = имя папки
}
global proc FldBrs(){
	fileBrowser( "gt_FldSv", "Text", "", 4 );  // этой функцией открываем диалоговое окно файлбраузера и говорим ему отправить данные в функцию gt_FldSv с типом "Text"
}

FldtSav — имя строки в которой будет храниться полный путь до папки (QLineEdit)
Для кнопки добавляем динамическое свойство типа текст -c и вписываем ему команду FldBrs.
«-с» позволяет добавить выполнение команды при нажатии на кнопку.

создаем список объектов а рядом с ним список имен файлов для каждого объекта

global proc msObjs_updSlLst(){
	string $ssel[] = `ls -sl`;
	$exs=0;
	string $tokTmp[];
	int $count=0;
	for($sl in $ssel){
		$lstSlobjs = `textScrollList -q -ai selOBJsEx`;
		$exsOb=0;
		for($lstSl in $lstSlobjs){  // проверяем есть ли выделенный объект уже в списке
			if ($lstSl == $sl){
			$exsOb=1;
			}
		}
		if ($exsOb==0){                                  // если объекта нет в списке
			textScrollList -edit -append $sl selOBJsEx;  // добавляем в список объектов
			// обрезаем название объекта удаляя из него подгруппы и пр. оставляя только имя объекта
			$count = `tokenize $sl "|" $tokTmp`;
			$sl = $tokTmp[$count - 1];
			textScrollList -edit -append $sl OBJsFlNms; // добавляем это имя в список файлов
		}
	}
}

дальше при выборе имени файлов из второго списка нужно чтобы имя помещалоась в поле cFlNm для редактирования
нужно создать для OBJsFlNms диниамическое свойство типа текст «-sc» и пишем ему значение updsCurFlNm
это свойство говарит Maya что при выделении любого элемента этого списка выполняеться функция

global proc updsCurFlNm(){
	$curFlnM = `textScrollList -q -selectItem OBJsFlNms`; // берем значение выбранного элемента списка
	textField -edit -text $curFlnM cFlNm;  // и помещаем его в поле для редактирования
}

дальше создаем кнопку чтобы сохранить измененное имя файла и добавляем ей динамическое свойство «-c» с параметром replObjFns что говарит maya о выполнении данной команды

global proc replObjFns(){
	$curFlnM = `textScrollList -q -selectItem OBJsFlNms`;             // получаем значение выбранного элемента из списка имен фалов
	$curFlnMnum = `textScrollList -q -selectIndexedItem OBJsFlNms`;   // получаем его порядковый номер
	$chT=`textField -q -text cFlNm`;                                  // получаем имя которым будет заменено исходное
	textScrollList -edit -removeIndexedItem $curFlnMnum[0] OBJsFlNms; // удаляем исходный элемент из списка по его номеру
	textScrollList -edit -appendPosition $curFlnMnum[0] $chT OBJsFlNms;  // и ставим на его место новое имя
	
}

также создаем что-то вроди консоли для скрипта, поле для статуса(такого типа которое может форматировать содержимое например получая html-код) и одно скрытое в которое будем передавать html-код т.к. Mel не позволяет работать не посредственно с форматируемым полем.
переходим в режим редактирования сигналов/слотов, тянем за наше скрытое поле до нашего форматируемого статуса… и выбираем справа textChanged и справа setText что позволяет передать значение из нашего скрытого поля в наше поле статуса.


в QT редакторе ставим значение для форматируемого поля со статусом
<html><head/><body><p align="center">Status</p></body></html>

также создаем чекбокс для проверки переписывать ли существующий файл
ну и самое главное кнопку для Экспорта

вот функция занимающаяся всеми последними действиями (записи в «командную строку» скрипта изменение статуса, экспорт, проверку на перезапись при экспорте):

global proc myExpObjs(){
	$SvFld=`textField -q -tx FldtSav`;                // получаем путь папки куда сохранять
	$curFlnM = `textScrollList -q -ai OBJsFlNms`;     // получаем список имен файлов для объектов
	$selObjs = `textScrollList -q -ai selOBJsEx`;     // получаем список обхектов
	int $i=0;
	int $exxt=0;
	$ovWrA = `checkBox -q -value ovWrFl`;             // получаем значение чекбокса на перепись файлов
	// далее пишем предустановки для статуса ... переписаны ли файлы или все сохранено
	$sttsEx = "<html><head/><body><p align=\"center\"><span style=\" font-size:16pt; font-weight:600; color:#ff0004;\">Existing files are not overwritten</span></p></body></html>";
	$sttsOk = "<html><head/><body><p align=\"center\"><span style=\" color:#00ff00;\">All objects saved!</span></p></body></html>";
	for($cFl in $curFlnM){      // проходимся циклом по всем именам файлов
		$cFfl=$SvFld+"/"+$cFl+".obj";   // добавляем расширение к имени файла и путь сохранения
		select -clear;                  // очищаем выделение в сцене
		select -add $selObjs[$i];       // выделяем текущий объект из списка это не обходимо для экспорта (все объекты по одному выделяются и сохраняются)
		$exst = `file -q -exists $cFfl`; // проверяем существует ли файл
		
		if($exst  && !$ovWrA){               // проверяем существует ли файл и что перезапись файла отключена и добавляем в нашу командную строку запись о существовании этого файла
			$stt=("Exist: "+$cFfl+"\n");
			$exxt=1;
			textScrollList -edit -append $stt stLst;
		}
		else{  // если файл не существует или существует но перезапись разрешена сохраняем/переписываем и добавляем пункт в командную строку что данный файл записан или переписан
			file -force -options "groups=0;ptgroups=0;materials=0;smoothing=1;normals=1" -typ "OBJexport" -pr -es $cFfl;
			$stt=("Exported: "+$cFfl+"\n");
			if($exst  && $ovWrA){
				$stt = ("Overwritten: "+$cFfl+"\n");
			}
			textScrollList -edit -append $stt stLst;
		}
		
		$i++;
	}
	select -clear;              // очищаем выдиление
	for($slOb in $selObjs){     // и выделяем все объкты из списка нашего скрипта
		select -add $slOb;
	}
	
	if($exxt && !$ovWrA){                    // меняем значение статусной строки 
		textField -edit -tx $sttsEx stTxt;   // некоторые файлы существуют и не переписаны
	}
	else{
		textField -edit -tx $sttsOk stTxt;   // все хорошо, все сохранено
	}
}

Ну и конечно же основная функция открытия диалога

global proc myOBJsExp_UI(){
	string $dialog;
	if (`window -exists $dialog`)deleteUI -window $dialog;
	string $d = `internalVar -usd`;
	$dialog = `loadUI -uiFile ($d+"myOBJsExp/myOBJsExp.ui")`; // импортируем ЮИ файл
	showWindow $dialog;                                       // отображаем диалог
	msObjs_updSlLst();                                        // вызываем обновление списка выделенных объектов
	$SvFld = `workspace -q -active`;                          // назначаем папку для сохранения основную папку проэкта
	textField -edit -tx $SvFld FldtSav;                       // изменяем поле в котором отображается папка для сохранения
}

Вот и все.

Больше сведений о :
кнопках
списках
чекбоксах
функция select
функция file
файлбраузер

также рекомендую посмотреть статью my lights MEL script and QT designer

 

Комментарии к данной записи закрыты.