资产库MEL API:

MG-资产库提供的Mel的应用程序接口。你可以用这些mel全局函数，通过自己编写脚本来新建，管理及使用资产库。

一个比较大的用途是用它来批量加入资产项，及自动生成ma档等。

前提条件:

当前运行的Maya有安装MGTools Pro3或以上版本。

接口全局函数说明: （后面有附示例代码）

global proc int MGAssetLib_initAPI ( );

描述：初始化资产库MEL API. 这是为了确保下面这些全局MEL函数有被source，这样才可用。

返回值：如果初始化过程出错，则返回0，否则返回1。

global proc int MGAssetLib_doesProjectExist ( string $projectName );

描述：在本地端的资产库里查找这个工程。即是在我的文档/Maya/MGTools_GlobalData/MG_AssetLib这个目录下，查找是否有名字为$projectName的库工程。

注意：如果$projectName参数含有英文字母，数字，下划线之外的字符，这些字符将自动转换成下划线。

返回值：如果找到则返回1，没有找到则返回0。

global proc string MGAssetLib_getLocalProjectFile ( string $projectName );

注意：如果$projectName参数含有英文字母，数字，下划线之外的字符，这些字符将自动转换成下划线。

返回值：返回$projectName所对应的本地库的整个路径，即我的文档/Maya/MGTools_GlobalData/MG_AssetLib/$projectName/$projectName.assetproj。

即使工程实际上不存在，也返回一样的结果。

global proc string MGAssetLib_createProject ( string $projectName,

string $ProjectAnnoatation,

string $globalPath,

string $statePresets [] );

描述：创建一个本地资产库工程。

参数：$projectName为名称，$ProjectAnnoatation为库工程的描述文字， $globalPath为全局资产库指向的路径。

$statePresets是库工程的状态预置，它是一个数组，这个数组的每个元素由下面格式的字符组成( 用空格分开 )：状态名称 状态颜色R 状态颜色G 状态颜色B

状态颜色的RGB数值是在0-1范围内的小数。比如: Approved 0.2 0.6 0.2

注意：如果$projectName参数含有英文字母，数字，下划线之外的字符，这些字符将自动转换成下划线。

如果当前有打开资产库工具，则会自动在工具里打开这个新建的工程。

返回值：将返回新建的.assetproj文件 的完整路径；如果失败则返回空字符窜。

global proc int MGAssetLib_doesCategoryExist ( string $projectName ,

string $category );

描述：测试在$projectName的库工程目录里，是否存在一个叫$category 的类别。

注意：如果$projectName 参数含有英文字母，数字，下划线之外的字符，这些字符将自动转换成下划线。

返回值：存在则返回1，否则为0。

global proc string MGAssetLib_getLocalCategoryFile ( string $projectName,

string $category );

描述：一个类别事实是存储在本地库工程目录里的相应 .asset文件。

注意：如果$projectName参数含有英文字母，数字，下划线之外的字符，这些字符将自动转换成下划线。

返回值：返回以$category为名称，并且属于$projectName的库工程里的.asset文件的完整路径。

即使工程或类别实际上不存在，也返回一样的结果。

global proc int MGAssetLib_addCategory ( string $projectName,

string $category );

描述：在库工程里添加一个类别，并在本地相应的库工程目录里新增一个.asset文件。如果已存在则警告并返回0。

注意：如果$projectName参数含有英文字母，数字，下划线之外的字符，这些字符将自动转换成下划线。

如果当前有打开资产库工具，则会自动打开这个新添加的类别。

返回值：添加成功则返回1，否则为0。

global proc int MGAssetLib_clearCategory ( string $projectName,

string $category );

描述：清空一个类别，事实上是清空本地库工程目录里相应的.asset文件里的内容。

注意：如果$projectName参数含有英文字母，数字，下划线之外的字符，这些字符将自动转换成下划线。

返回值：清空成功则返回1，否则为0。

global proc int MGAssetLib_addStates ( string $projectName,

string $stateList [] );

描述：添加库工程的状态预置。

$stateList 是要添加进库工程的状态预置，它是一个数组，这个数组的每个元素由下面格式的字符组成( 用空格分开 )：状态名称 状态颜色R 状态颜色G 状态颜色B

状态颜色的RGB数值是在0-1范围内的小数。比如: Approved 0.2 0.6 0.2

注意：如果$projectName 参数含有英文字母，数字，下划线之外的字符，这些字符将自动转换成下划线。

返回值：添加成功则返回1，否则为0。

global proc string[] MGAssetLib_getProjectStates ( string $projectName );

描述：获取库工程的即有状态预置。

注意：如果$projectName参数含有英文字母，数字，下划线之外的字符，这些字符将自动转换成下划线。

返回值：库工程的状态预置数组。这个数组的每个元素由下面格式的字符组成( 用空格分开 )：状态名称 状态颜色R 状态颜色G 状态颜色B

状态颜色的RGB数值是在0-1范围内的小数。比如: Approved 0.2 0.6 0.2

global proc string[] MGAssetLib_getProjectCategories ( string $projectName );

描述：获取库工程的所有类别。

注意：如果$projectName参数含有英文字母，数字，下划线之外的字符，这些字符将自动转换成下划线。

返回值：库工程的类别数组。

global proc int MGAssetLib_compareTwoFileDates ( string $file1, string $file2 );

描述：辅助性函数，用来比较两个文件的修改日期。

返回值：如果俩文件都不存在，则返回0， 如果file1存在而file2不存在，则返回1，如果file1不存在而file2存在，则返回-1；

都存在的情况下，如果file1比file2旧，则返回-1，如果两者一样，则返回0， 如果file1比file2新，则返回1；

global proc string[] MGAssetLib_searchPreviewImagesFromDirectory ( string $searchDirectory,

string $imageExtensionList [],

int $searchDepth );

描述：辅助性函数，搜索一个目录，来获得具有特定扩展名的文件的完整路径数组。

参数：$searchDirectory 为要搜索的目标路径，必须已存在。

$imageExtensionList 是要搜索的文件类型扩展名的数组，如 {"*.jpg", "*.bmp"}

$searchDepth 是路径搜索的深度，如果不想搜索子目录，则直接将其设为1。设为0或负数则视为无限制深度。

注意：$imageExtensionList 数组里的元素，如果不是以 "*." 开头的，则自动会加上 "*." 。

返回值：将返回搜索到的符合条件的文件的完整路径数组。

global proc string[] MGAssetLib_searchMayaFilesFromDirectory ( string $searchDirectory,

int $searchMA,

int $searchMB,

int $searchDepth );

描述：辅助性函数，搜索一个目录，来获得MB或MA文件的完整路径数组。

参数：$searchDirectory 为要搜索的目标路径，

$searchMA 决定是否要搜索MA文件，1为搜索，0为不搜索。

$searchMB 决定是否要搜索MB文件，1为搜索，0为不搜索。如果$searchMA 和$searchMB都为0，则直接返回空数组。

$searchDepth 是路径搜索的深度，如果不想搜索子目录，则直接将其设为1。设为0或负数则视为无限制深度。

返回值：将返回搜索到的MB,MA文件的完整路径数组。

global proc int MGAssetLib_addAssetRecords ( string $projectName,

string $category,

string $mayaFiles[],

string $namespaces[],

string $states[],

string $previewImageStrList[],

string $notes[] );

描述：往资产库里一次性添加多个资产项。

参数：$projectName 为要添加到的库工程名称，

$category 为要添加到的库工程里的特定类别，

$mayaFiles 为要添加的资产文件路径数组。

$namespaces为要添加的资产名称数组，资产名称将来在叫资产进来时可以用做reference的命名空间。

$states 为该资产项的状态数组。这个状态数组的每个元素直接是状态名称，不需要加颜色信息。

$previewImageStrList 为该资产项的预览图文件数组。每一个元素对应一个资产项，单个元素内可以包括多个图片路径，但要以分号 ";" 分开。

$notes 为该资产项的注释数组。每个元素对应一个资产项的注释，元素的字符窜没有限制，你可以使用任意字符。

注意：上面的数组参数全部要一一对应否则乱套，程序是以$mayaFiles这个数组的个数为要添加的个数。

其它的数组如果没有对应的元素，则为空字符窜，除了$namespace这个数组，如果它没有对应于$mayaFiles的元素，则元素自动取值为maya文件的文件名。

返回值：成功添加没有出错则返回1，否则返回0。

global proc int MGAssetLib_deleteAssetRecords ( string $projectName,

string $category,

string $mayaFiles [] );

描述：往资产库里一次性删除多个资产项。删除的依据是资产项的maya档案路径。

参数：$projectName 为要删除资产项的库工程，

$category 为要删除资产项的类别，

$mayaFiles 为要删除的资产路径数组。

返回值：成功删除没有出错则返回1，否则返回0。

global proc int MGAssetLib_makeMayaAsciiFile ( int $overrideIfExist,

string $MAFile,

string $referenceFiles [],

string $namespaceList [],

int $deferList [] );

描述：生成一个MA档案。

参数：$overrideIfExist 决定如果目标MA档已存在时是否覆盖，

$MAFile 为要生成的MA档的目标文件路径，

$referenceFiles 为要在MA档里reference的资产文件数组，

$namespaceList 为要在MA档里reference的命名空间数组，

$deferList 为MA档里reference是否要延迟加载的数组。

返回值：成功生成没有出错则返回1，否则返回0。

提示：如果要使用程序来上传下载您的资产库，可以使用MGTools提供的其它两个全局函数：( 这两个不需要初始化资产库MEL API即可使用 )

global proc int MG_CopyFolder ( string $targetFolder,

string $sourceFolder,

string $progressBarControl,

string $textControl,

int $returnAtFirstError,

int $autoHideProgressBarWhenIsDone );

描述：拷贝源文件夹下面的所有文件及子文件夹到目录文件夹里。

参数：$targetFolder 是要拷贝到的目标目录，可以不存在。

$sourceFolder 是要拷贝的源目录，必须存在且是目录，如果是文件，则取消拷贝。

$progressBarControl 指定一个 progressBar 控件的名称，如果有指定且控件存在，则在拷贝过程中会更新该进度条控件的进度。

如果您为这个参数指定了空字符窜，则该参数将被忽略。

$textControl 指定一个text 控件的名称，如果有指定且控件存在，则在拷贝过程中会更新该控件，显示当前拷贝哪个文件的信息。

如果您为这个参数指定了空字符窜，则该参数将被忽略。

$returnAtFirstError 决定是否一旦有出错，则取消后续操作返回。 1是返回，0是跳过错误并继续。

$autoHideProgressBarWhenIsDone 决定是否整个拷贝过程完成后，是否自动隐藏progressBar 控件。

返回值：成功拷贝则返回1，否则返回0。

global proc int MG_DeleteFolder ( string $deleteFolder,

string $progressBarControl,

string $textControl,

int $returnAtFirstError,

int $autoHideProgressBarWhenIsDone );

描述：删除文件夹。

参数：$deleteFolder 是要删除的目标目录，必须存在。

$progressBarControl 指定一个 progressBar 控件的名称，如果有指定且控件存在，则在删除过程中会更新该进度条控件的进度。

如果您为这个参数指定了空字符窜，则该参数将被忽略。

$textControl 指定一个text 控件的名称，如果有指定且控件存在，则在删除过程中会更新该控件，显示当前删除哪个文件的信息。

如果您为这个参数指定了空字符窜，则该参数将被忽略。

$returnAtFirstError 决定是否一旦有出错，则取消后续操作返回。 1是返回，0是跳过错误并继续。

$autoHideProgressBarWhenIsDone 决定是否整个删除过程完成后，是否自动隐藏progressBar 控件。

返回值：成功删除则返回1，否则返回0。

示例代码:

//在执行这些代码前，打开资产库工具，可以实时看到这些代码的执行结果。

//初始化api的全局函数：

MGAssetLib_initAPI;

//创建一个资产库工程：

MGAssetLib_createProject "Mel_API" "A asset project created by mel API" "Z:/TNT/temp/Miguel/test/Lib_MelAPI" {"Pending 1 0 0", "Working 0 0 1", "Approved 0 1 0"};

//创建一个叫Character的类别：

MGAssetLib_addCategory "Mel_API" "Character";

//测试刚刚这个类别有没有创建成功：

print ("The category \"Mel_API\" exists or not: " + `MGAssetLib_doesCategoryExist "Mel_API" "Character"` + "\n");

//清空类别，事实上没有必要，我们不是刚创建这个类别嘛。

MGAssetLib_clearCategory "Mel_API" "Character";

//为库工程添加状态预置：

MGAssetLib_addStates "Mel_API" {"Hi_Res 0.5 0.8 0.5", "Lo_Res 0.8 0.5 0.5"};

/测试刚刚的状态是否有添加进去。

print `MGAssetLib_getProjectStates "Mel_API"`;

//现在开始搜索MB,MA档。。。

string $mayaFiles[] = `MGAssetLib_searchMayaFilesFromDirectory "D:/temp" 1 0 0`;

print $mayaFiles;

string $images[] = `MGAssetLib_searchPreviewImagesFromDirectory "D:/temp" {"*.jpg","*.bmp"} 0`;

print $images;

//抓到这些文件后，我们再写一些mel代码，来进行匹配等工作。。

// ....

//这些信息抓齐了，现在我们来往类别里添加资产项！

MGAssetLib_addAssetRecords "Mel_API" "Character"

{"D:/temp/myAsset1.ma","D:/temp/myAsset2.ma","D:/temp/myAsset3.ma"}

{"namespace1","namespace2"}

{"Pending","Approved","Approved"}

{}

{"Note for fist item","note for sec item","third note"};

//试试删除其中的一条记录！

MGAssetLib_deleteAssetRecords "Mel_API" "Character" {"D:/temp/myAsset2.ma"};

//现在试试用代码生成MA档！

MGAssetLib_makeMayaAsciiFile (1, "D:/temp/test.ma", {"namespace1","namespace2"},

{"D:/temp/myAsset1.ma","D:/temp/myAsset2.ma","D:/temp/myAsset3.ma"},

{0,1,1} );