摘要:在本篇关于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频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号