前言
前面说到了AI插件是如何工作的,此篇介绍官方tutorial插件启动的时的初始化工作。在介绍插件如何在内存中构建时会顺带说明如何使用。
前言续
介绍下ai插件的构成,插件是由不同组件构成且这些组件分为sp组件和ai组件,sp组件AI插件架构管理组件,AI组件主要用于在操作AI中相关属性如在AI的画布中绘制图形。各类套件都需要在使用之前获取。获取方法为在SPInterfaceMessage结构体中的basic套件的函数AcquireSuite()。
error = message->d.basic->AcquireSuite( kAIMenuSuite, kAIMenuSuiteVersion, (const void **) &fAIMenu );
StarUpPlugin
{
error = Plugin::StartupPlugin(message);
if (!error) {
error = AddMenu(message);
}
if (!error) {
error = AddFilter(message);
}
if (!error) {
error = AddTool(message);
}
if (!error) {
error = AddAction(message);
}
if (!error) {
error = AddNotifiers(message);
}
return error;
}
此函数继承自plugin基类,在基类中完成一些数据的初始化和空间的开辟工作。
addmenu函数
此函数中主要函数为SDKAboutPluginsHelper::AddAboutPluginsMenuItem()它完成了对菜单套件的获取,以及在菜单中添加菜单项。AIPlatformAddMenuItemDataUS 结构体用于对菜单项信息的初始化工作。
AIErr SDKAboutPluginsHelper::AddAboutPluginsMenuItem(
SPInterfaceMessage* message,
const char* companyMenuGroupName,
const ai::UnicodeString& companyName,
AIMenuItemHandle* menuItemHandle)
{
AIErr error = kNoErr;
if (fAIMenu == nil) {
error = message->d.basic->AcquireSuite( kAIMenuSuite, kAIMenuSuiteVersion, (const void **) &fAIMenu );
}
if (!error && fAIMenu != nil) {
// Add an about plug-ins menu group for the given company under Illustrator's about group.
bool exists = false;
error = this->GroupExists(companyMenuGroupName, exists);
if (!error && !exists) {
AIPlatformAddMenuItemDataUS companyRootMenuData;
companyRootMenuData.groupName = kAboutMenuGroup;
companyRootMenuData.itemText = companyName;
AIMenuItemHandle companyRootMenuItemHandle = nil;
error = fAIMenu->AddMenuItem(message->d.self, NULL, &companyRootMenuData, kMenuItemNoOptions, &companyRootMenuItemHandle);
if (!error) {
AIMenuGroup companyRootMenuGroup = nil;
error = fAIMenu->AddMenuGroupAsSubMenu(companyMenuGroupName, kMenuGroupSortedAlphabeticallyOption, companyRootMenuItemHandle, &companyRootMenuGroup);
}
}
}
if (!error && fAIMenu != nil) {
// Add menu item for this plug-in under the company's about plug-ins menu group.
AIPlatformAddMenuItemDataUS aboutPluginMenuData;
aboutPluginMenuData.groupName = companyMenuGroupName;
aboutPluginMenuData.itemText = ai::UnicodeString(pluginName);
AIMenuItemHandle aboutPluginMenuItemHandle = nil;
error = fAIMenu->AddMenuItem(message->d.self, NULL, &aboutPluginMenuData, kMenuItemNoOptions, &aboutPluginMenuItemHandle);
if (!error) {
*menuItemHandle = aboutPluginMenuItemHandle;
}
}
if (fAIMenu != nil) {
message->d.basic->ReleaseSuite( kAIMenuSuite, kAIMenuSuiteVersion );
fAIMenu = nil;
}
return error;
}
AddFilter
此函数用于添加滤镜。主要用到了AIFilter套件,
首先构造滤镜菜单数据
{
PlatformAddFilterData filterData;
filterData.category = (unsigned char*)kSDKFilterString;
filterData.title = (unsigned char*)kTutorialFilterString;
}
使用滤镜套件安装套件
`sAIFilter->AddFilter( message->d.self, "Tutorial", &filterData,kToolWantsToTrackCursorOption, &fFilterHandle);`
GetFilterMenuItem(fFilterHandle, &menuItem);
获取item的实例用于后续跟新或使用