<首页>
作者:梁晨
序言:为将LcSky星光飞扬发展成一个开放式的天文软件,也为了您可以加入中国人自己的天文软件的开发,我为LcSky星光飞扬设计了插件接口,使您可以不必像重做一个天文软件那样考虑很繁杂的函数、结构,您需要做的仅是做几个标准的函数,就可以制作一个新的星体,有了您的插件,LcSky也会更精彩!
什么是插件:插件(PlugIn)是一种专门为某一软件设计、用于功能扩充的“东西”,一般用.dll或.so(动态链接库)实现,您可以选择您需要的插件下载,使同一个软件在您手中变得与众不同、别具个性;同时,有了插件就不需加载您不用的功能,可节约系统开支,在一定程度上加快速度。
开发工具及需要的知识:为了开发PlugIn for LcSky,您需要有Dev-C++并且安装了Gtk-dev包(Windows环境)以及GCC和Make系统(Linux环境),并且熟悉c++语言,熟悉GNU工作环境,再看完本技术文档、下载了开发模板(压缩包包括头文件和已做好框架的.cpp文件)后就可以开发了。如果您不熟悉c++语言或GNU的开发系统,也不要紧,要学不是很难的
星体插件层结构:
从上图可以看到,星光飞扬的插件主要分为星体插件和工具插件,星体插件负责计算、显示各类星体;同时为了可以支持对所有星体共有操作的处理,我设计了工具插件接口,设为中心、时间-光度图表、显示轨迹等功能都可以做成工具插件形式。虽然我设计了两大类插件接口,但其调用实质是一样的。
调用机制:星光飞扬的插件基本上是基于类进行调用的,但是唯一的两个导出接口Init_Class和Delete_Class是基于纯函数机制的,也就是说插件是最普通的动态链接库,不使用任何COM接口,这也保证了星光飞扬的跨平台性。接口Init_Class负责new一个插件中定义的继承于LcSkyStarBase(或LcSkyToolBase)的类对象,并且将其指针传回,这样,主程序就掌握了插件的“灵魂”,通过该指针就可以调用插件的各个成员函数。
一个插件多绘制对象问题: 一个插件实现的是一类星体的计算、显示,就自然包括不止一个绘制对象(星体),在调用各插件取得具体星体的信息时就需要一个index来区分一个插件内的星体实例,因此,确定一个星体需要一个插件对象指针和一个index值。
对于星体类插件: 调用父插件星体方法时,需确定父星体的 index ,可以使用父插件的Get_Object_Index方法查找星体名称对应的index,也可以像月球插件一样直接以常量作为index(因为行星插件星体的index是固定不变的)
对于工具类插件: 有时,工具插件需要调用目标星体的方法(比如知道被锁定的星体的坐标),用 插件地址和index就可以定位唯一星体 ,我定义了star_object结构来表示一个唯一星体。该结构包含lsb和index两个成员,分别是对象指针和星体索引。但用star_object结构 仅能用于程序运行时 ,如果需要保存以供下次运行时使用(如退出时保存被锁定星体并在下次运行时恢复锁定)就不能保存star_object结构的成员,因为并不能保证每次运行时该插件都加载到同一地址,所以这种情况就应该保存插件名和星体名,如:struct star_object so;
GString *t_str;
so.lsb->gettext_set(); //使用目标插件的GetText空间
t_str=so.lsb->Get_Object_Name(so.index); //取得插件名
……(保存插件名)
g_string_free(t_str, TRUE); //释放字符串资源
t_str=so.lsb->Get_My_ClassName(); //取得星体名
……(保存星体名)
g_string_free(t_str, TRUE); //释放字符串资源恢复时可使用LcSkyFunctionClass的get_lsb_by_name(gchar*);来取得so.lsb; 并用so.lsb->Get_Object_Index(GString *)来取得so.index。如:
struct star_object so;
GString *t_str;
……(取得插件名)
so.lst=p_func.get_lsb_by_name(t_str->str);
so.lsb->gettext_set(); //使用目标插件的GetText空间
……(取得星体名)
so.index=lsb->Get_Object_Index(t_str);
(待续)
以上资料本人版权所有,转载请注明 来自星星宇宙http://lcsky.lamost.org/