Illustrator SDK插件开发(插件开发框架注释)
来源:互联网 发布:试客联盟淘宝会查吗 编辑:程序博客网 时间:2024/05/16 00:53
在本篇文章,我将分析一下Illustrator SDK包中为开发人员提供的一个插件开发框架。
在SDK文件夹下可以找到samplecode文件夹,里面包含了插件开发的例子,同时common文件夹中提供了一个通用的插件开发框架。许多例子也是使用这个框架开发的。其中重要的是Main.cpp、Plugin.cpp和Suites.cpp。
Main.cpp中包含了PluginMain函数,也就是上篇文章介绍的Illustartor与插件进行交互的入口。我将Illustrator的Suite的概念理解为一个功能集,提供某一方面的功能API,在Main.cpp里,定义了SPBasicSuite对象,它提供了Illustrator的一些基本功能:请求和释放其他Suite、内存管理。以下是这个函数的详细代码。
extern "C" ASAPI ASErr PluginMain(char* caller, char* selector, void* message){ ASErr error = kNoErr; SPMessageData *msgData = (SPMessageData *)message; Plugin *plugin = (Plugin *)msgData->globals; sSPBasic = msgData->basic; //这里记录下了SPBasicSuite对象 if (strcmp(caller, kSPInterfaceCaller) == 0) { if (strcmp( selector, kSPInterfaceStartupSelector) == 0) //插件启动 { plugin = AllocatePlugin(msgData->self); if (plugin) { msgData->globals = (void *)plugin; error = plugin->StartupPlugin((SPInterfaceMessage *)message); //具体工作 if (error != kNoErr) { // Make sure to delete in case startup failed delete plugin; plugin = nil; msgData->globals = nil; } } else { error = kOutOfMemoryErr; } } else if (strcmp(selector, kSPInterfaceShutdownSelector) == 0) //插件关闭 { if (plugin) { error = plugin->ShutdownPlugin((SPInterfaceMessage *)message); //具体工作 delete plugin; plugin = nil; msgData->globals = nil; } } } if (plugin) { if (Plugin::IsReloadMsg(caller, selector)) //从Illustrator中还原插件 { // Call this before calling any virtual functions (like Message) FixupReload(plugin); error = plugin->ReloadPlugin((SPInterfaceMessage *)message); } else //消息处理 { // If a load or reload failed because the suites could not be acquired, we released // any partially acquired suites and returned an error. However, SuitePea still might // call us, so protect against this situation. if (plugin->SuitesAcquired()) error = plugin->Message(caller, selector, message); else error = kNoErr; } if (error == kUnhandledMsgErr) { error = kNoErr;#ifndef NDEBUG#ifdef MAC_ENV fprintf(stderr, "Warning: Unhandled plugin message: caller \"%s\" selector \"%s\"\n", caller, selector);#else char buf[1024]; sprintf(buf+1, "Warning: Unhandled plugin message: caller \"%s\" selector \"%s\"\n", caller, selector); OutputDebugStringA(buf+1);#endif#endif } } if (error) //错误处理 { if (plugin) plugin->ReportError(error, caller, selector, message); else Plugin::DefaultError(msgData->self, error); } return error;}
框架与插件的交互逻辑在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 SDK插件开发(插件开发框架注释)
- Adobe Illustrator CC插件开发
- Adobe Illustrator CS4地图插件开发
- Illustrator插件开发之ADM列表
- Adobe Illustrator CS4插件开发模板配置
- Illustrator插件开发 使用Adobe Text Engine
- Adobe Illustrator CC下的插件开发之UI
- Android插件开发框架
- winfrom插件开发框架
- Android插件化开发框架
- Eclipse SDK中一些插件的安装(web开发插件)
- Eclipse SDK中一些插件的安装(web开发插件)
- 三、Eclipse SDK中一些插件的安装(web开发插件)
- Eclipse SDK中一些插件的安装(web开发插件)
- Eclipse SDK中一些插件的安装(web开发插件)
- JQuery插件开发 + 插件
- 插件开发
- 插件开发
- B - Brave Game(hdu1846,巴什博弈基础)
- AspNetDB数据库安装与配置
- 带旋转的图文展示 附源码
- 墨菲定律的内涵可以告诉我们的道理
- 2010-08-10 11:32 Spring在ssh框架运用中的事务部分详解(1)
- Illustrator SDK插件开发(插件开发框架注释)
- 用TCP实现tftp的下载上传功能
- 取石子游戏(hdu1527,威左夫博弈基础)
- POJ2068 Nim
- 服务器类型
- 通俗易懂 Socket I/O模型全接触【转载内容】
- UIImageView实现图片的移动和缩放 【转】
- ACM暑假集训标准程序_Day5_1001
- Sum(poj1844,简单枚举)