Illustrator快速入门之Illustrator SDK插件开发
Vivian 2018-04-26 来源 : 阅读 5810 评论 0

摘要:在本篇关于Illustrator快速入门的文章中,我将分析一下Illustrator SDK包中为开发人员提供的一个插件开发框架。希望大家在今后学习和使用的时候能够更加熟练的运用它们,从而让自己获得更大的提升。接下来就让我们来学习与Illustrator快速入门有关的插件开发吧。

Illustrator快速入门之Illustrator SDK插件开发

 

在本篇关于Illustrator快速入门的文章中,我将分析一下Illustrator SDK包中为开发人员提供的一个插件开发框架。希望大家在今后学习和使用的时候能够更加熟练的运用它们,从而让自己获得更大的提升。接下来就让我们来学习与Illustrator快速入门有关的插件开发吧。

在SDK文件夹下可以找到samplecode文件夹,里面包含了插件开发的例子,同时common文件夹中提供了一个通用的插件开发框架。许多例子也是使用这个框架开发的。其中重要的是Main.cpp、Plugin.cpp和Suites.cpp。

Main.cpp中包含了PluginMain函数,也就是上篇文章介绍的Illustartor与插件进行交互的入口。我将Illustrator的Suite的概念理解为一个功能集,提供某一方面的功能API,在Main.cpp里,定义了SPBasicSuite对象,它提供了Illustrator的一些基本功能:请求和释放其他Suite、内存管理。以下是这个函数的详细代码。

[cpp] view plain copy
1. extern "C" ASAPI ASErr PluginMain(char* caller, char* selector, void* message)  
2. {  
3.  ASErr error = kNoErr;  
4.  SPMessageData *msgData = (SPMessageData *)message;  
5.    
6.  Plugin *plugin = (Plugin *)msgData->globals;  
7.    
8.  sSPBasic = msgData->basic; //这里记录下了SPBasicSuite对象  
9.    
10.  if (strcmp(caller, kSPInterfaceCaller) == 0)   
11.  {   
12.   if (strcmp( selector, kSPInterfaceStartupSelector) == 0)  //插件启动  
13.   {  
14.    plugin = AllocatePlugin(msgData->self);  
15.    if (plugin)  
16.    {  
17.     msgData->globals = (void *)plugin;  
18.     error = plugin->StartupPlugin((SPInterfaceMessage *)message); //具体工作  
19.   
20.     if (error != kNoErr)  
21.     {  
22.      // Make sure to delete in case startup failed  
23.      delete plugin;  
24.      plugin = nil;  
25.      msgData->globals = nil;  
26.     }  
27.    }  
28.    else  
29.    {  
30.     error = kOutOfMemoryErr;  
31.    }  
32.   }  
33.   else if (strcmp(selector, kSPInterfaceShutdownSelector) == 0) //插件关闭  
34.   {  
35.    if (plugin)  
36.    {  
37.     error = plugin->ShutdownPlugin((SPInterfaceMessage *)message);    //具体工作  
38.     delete plugin;  
39.     plugin = nil;  
40.     msgData->globals = nil;  
41.    }  
42.   }  
43.  }  
44.    
45.  if (plugin)  
46.  {  
47.   if (Plugin::IsReloadMsg(caller, selector))   //从Illustrator中还原插件  
48.   {  
49.    // Call this before calling any virtual functions (like Message)  
50.    FixupReload(plugin);  
51.    error = plugin->ReloadPlugin((SPInterfaceMessage *)message);  
52.   }  
53.   else //消息处理  
54.   {  
55.    // If a load or reload failed because the suites could not be acquired, we released  
56.    // any partially acquired suites and returned an error.  However, SuitePea still might  
57.    // call us, so protect against this situation.  
58.    if (plugin->SuitesAcquired())   
59.     error = plugin->Message(caller, selector, message);  
60.    else  
61.     error = kNoErr;  
62.   }  
63.   
64.   if (error == kUnhandledMsgErr)  
65.   {  
66.    error = kNoErr;  
67. #ifndef NDEBUG  
68. #ifdef MAC_ENV  
69.    fprintf(stderr, "Warning: Unhandled plugin message: caller \"%s\" selector \"%s\"\n", caller, selector);  
70. #else  
71.    char buf[1024];  
72.      
73.    sprintf(buf+1, "Warning: Unhandled plugin message: caller \"%s\" selector \"%s\"\n", caller, selector);  
74.    OutputDebugStringA(buf+1);  
75. #endif  
76. #endif  
77.   }  
78.  }   
79.   
80.  if (error) //错误处理  
81.  {  
82.   if (plugin)  
83.    plugin->ReportError(error, caller, selector, message);  
84.   else  
85.    Plugin::DefaultError(msgData->self, error);  
86.  }  
87.    
88.  return error;  
89. }

 

框架与插件的交互逻辑在PluginMain函数里可以得到清晰的展现,包括插件启动、插件关闭、插件还原、插件消息响应、错误处理。

其中声明了2个重要的函数:AllocatePlugin和FixupReload。前者用于创建插件对象实例,后者用于还原插件对象实例。对于Illustrator对插件内存的管理,以及对错误处理策略,本人理解还是显得晦涩,需要更多的了解Illustrator的开发思想和c++语言特性才能体会。

Suites.cpp包含了对插件基本Suites的定义。这些Suites会在插件启动时,由SPBasicSuite对象进行请求,在插件关闭时进行释放。具体过程如下:

插件启动》Plugin调用StartupPlugin》创建Suites》请求基本Suites

插件结束》Plugin调用ShutdownPlugin》删除Suites》释放基本Suites

当然在Plugin中可以根据需要,做更多的操作。Plugin作为插件开发的基类,提供了一套可扩展的体系。如下列virtual方法:

virtual void ReportError(ASErr error, char *caller, char *selector, void *message);

virtual ASErr LockPlugin(ASBoolean lock);

virtual ASErr StartupPlugin(SPInterfaceMessage *message);
 virtual ASErr PostStartupPlugin();
 virtual ASErr ShutdownPlugin(SPInterfaceMessage *message);
 virtual ASErr UnloadPlugin(SPInterfaceMessage *message);
 virtual ASErr ReloadPlugin(SPInterfaceMessage *message);
 virtual ASErr AcquireProperty(SPPropertiesMessage *message);
 virtual ASErr ReleaseProperty(SPPropertiesMessage *message);
 virtual void GetPluginName(char *name, unsigned int maxlen);
 virtual ASErr About(SPInterfaceMessage *message);

virtual ASBoolean Purge();
 virtual ASErr Message(char *caller, char *selector, void *message);
 virtual ASErr SetGlobal(Plugin *plugin);

 virtual ASErr AllocateSuiteTables();
 virtual ASErr FillSuiteTables();
 virtual ASErr EmptySuiteTables();

 virtual ASErr AcquireOptionalSuites();

 virtual ASErr Notify(AINotifierMessage *message);

 virtual ASErr GoAction(DoActionMessage *message);

 virtual ASErr GoMenuItem(AIMenuMessage *message);
 virtual ASErr UpdateMenuItem(AIMenuMessage *message);

 virtual ASErr GetFilterParameters(AIFilterMessage *message);
 virtual ASErr GoFilter(AIFilterMessage *message);

 virtual ASErr PluginGroupNotify(AIPluginGroupMessage *message);
 virtual ASErr PluginGroupUpdate(AIPluginGroupMessage *message);

 virtual ASErr GetFileFormatParameters(AIFileFormatMessage *message);
 virtual ASErr GoFileFormat(AIFileFormatMessage *message);
 virtual ASErr CheckFileFormat(AIFileFormatMessage *message);
 virtual ASErr FileFormatUpdate(AIUpdateFileFormatMessage *message);
 virtual ASErr SetFileFormatParameters(DoActionMessage *message);

 virtual ASErr EditTool(AIToolMessage *message);
 virtual ASErr TrackToolCursor(AIToolMessage *message);
 virtual ASErr ToolMouseDown(AIToolMessage *message);
 virtual ASErr ToolMouseDrag(AIToolMessage *message);
 virtual ASErr ToolMouseUp(AIToolMessage *message);
 virtual ASErr SelectTool(AIToolMessage *message);
 virtual ASErr DeselectTool(AIToolMessage *message);
 virtual ASErr ReselectTool(AIToolMessage *message);
 virtual ASErr DecreaseDiameter(AIToolMessage *message);
 virtual ASErr IncreaseDiameter(AIToolMessage *message);

 virtual ASErr EditLiveEffectParameters(AILiveEffectEditParamMessage * message);
 virtual ASErr GoLiveEffect(AILiveEffectGoMessage * message);
 virtual ASErr LiveEffectInterpolate(AILiveEffectInterpParamMessage * message);
 virtual ASErr LiveEffectGetInputType(AILiveEffectInputTypeMessage * message);
 virtual ASErr LiveEffectConvertColorSpace(AILiveEffectConvertColorMessage * message);
 virtual ASErr LiveEffectScaleParameters(AILiveEffectScaleParamMessage * message);
 virtual ASErr LiveEffectAdjustColors(AILiveEffectAdjustColorsMessage * message);
 virtual ASErr LiveEffectHandleMerge(AILiveEffectHandleMergeMessage * message);
 
 virtual ASErr GoTimer(AITimerMessage * message);

 virtual ASErr GoClipboard( AIClipboardMessage *message );
 virtual ASErr CanCopyClipboard( AIClipboardMessage *message );
 virtual ASErr CloneClipboard( AIClipboardMessage *message );
 virtual ASErr DisposeClipboard( AIClipboardMessage *message );

 virtual ASErr WorkspaceWrite( AIWorkspaceMessage *message );
 virtual ASErr WorkspaceRestore( AIWorkspaceMessage *message );
 virtual ASErr WorkspaceDefault( AIWorkspaceMessage *message );

 

重载这些方法提供插件的特性,熟悉面向对象方法的开发者来说是容易的。结合Main和Plugin以及Suites理解插件的体系结构,有利于了解插件的运作机制,是打基础的过程。此外common中还有些类,如SDKAboutPluginsHelper提供了关于对话框的功能、SDKErrors提供了错误格式化并进行对话框提示的功能。可以在具体开发过程中逐渐的查看并了解。

本文由职坐标整理并发布,欢迎大家继续关注!更多关于Illustrator的内容请关注职坐标常用软件Illustrator频道!

 


本文由 @Vivian 发布于职坐标。未经许可,禁止转载。
喜欢 | 3 不喜欢 | 1
看完这篇文章有何感觉?已经有4人表态,75%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程