JMP二次开发方法研究

JMP二次开发方法研究

摘  要:JMP是一款非常优秀的数据统计发现软件,并可以根据用户的个性化需求,用户可以对其进行二次开发,本文介绍了JMP二次开发的三种方法,并与一个实验设计为实例,给出了开发思路和关键方法,对开发人员有很好的参考借鉴作用。
关键词:JMP 二次开发;
中图分类号:TP341            文献标识码: A
  Research On The Secondary Development Methods Of JMP
【Abstract】JMP is a very good statistical discovery software,  and it can be according to personalized needs of users, we can make secondary development, the paper describes three methods JMP secondary development, and with an experimental design as an example, to out of the development of ideas and critical approach,the Developers have a good reference.
【Key words】JMP  Secondary Development
 
0.引言
 SAS是全球最大的统计学软件公司,它推出了一种交互式可视化统计发现软件系列,JMP是其中的系列产品之一,被誉为“卓越绩效的统计发现引擎”,其主要有三个特点,一是具有操作简便、交互性强、可视化效果好的特点,适合非统计专业背景的数据分析人员使用,二是JMP还有强大的实验设计功能,几乎涵盖了所有主流的实验设计工具,可用用于生产过程控制和质量管理。三是提供强大的二次开发功能,JMP可以作为一个服务器引擎,提供调用接口,实现用户个性化需求,为用户节省大量复杂设计和计算。当前市面类似的软件很多,但是同时具备这三大功能特点的当属JMP。本文的重点是对JMP的二次开发方法进行研究,为相关的科研人员和开发人员提供开发思路和实例参考。
1.主要方法
对JMP进行二次开发主要有三种方法,一是采用OLE(Object Linking embedding,对象链接与嵌入)技术,类似于微软office的二次开发;二是直接使用JMP的自定义JSL(JMP Script Language)语言;三是两种方法的混合使用,因为JMP并没有全部实现所有的功能的OLE接口,需要两种方法配合使用。
1.1 基于OLE的实现方法
在JMP的默认安装目录..\JMP\10\Samples\Automation下有3个工程实例分别是VC++ 、VB和C#的,其中VC++中有jmp.h和jmp.cpp,这就是JMP的头文件和实现文件,把这两个文件导入到用户的工程目录下,并添加到到工程中,在需要的类文件加上引用,就可以使用JMP了,重要的几个接口IJMPAutoApp,该接口继承与COleDispatchDriver类,可以用该接口对JMP进行实例化,实现如打开JMP,链接、执行JSL命令等功能。在C#的实例中,只要把Interop.JMP.dll文件加载到工程中,就可以直接使用对应的方法了。用这种方法的参考资料很少,在其官方资料主要有jmp_jsl_guide.pdf的OLE  Automation部分和automation_reference.pdf开发指南,比较详细列举和介绍了各种实现方法。
1.2 构造JSL实现方法
JSL语言是一种解释性脚本语言,官方提供了比较详实的JSl参考资料,jmp_jsl_guide.pdf当属最权威一本,JMP界面软件还提供了自动生成脚本的功能,在对应的操作界面点击右键,可以找到查看和编辑脚本的选项,直接使用脚本生成的JSL,再进行修改和保存,就可以实现用户的特定功能,从而可以大大减少工作量。

如果用户需要进行高级编程,可以通过JSL构造自定义对话框和控件,并能对控件进行赋值、选择等操作,从而获取客户端的值;还可以调用JMP界面软件的对话框,并能对对话框中控件和按钮进行操作。对话框的实例名称就是对话框功能名称,按钮的名称在JMP的界面中可以读取,在对话框的左上角有一个小三角,点击:右键->编辑->显示树状图(如图1,JMP10中文版),然后出来显示树状结构窗口(如图2),从这张图中,我们就可以清楚看到该界面所有的按钮和控件的分布和编号,在写JSL时可以参考该图。

JMP二次开发方法研究


  

图 1                     

JMP二次开发方法研究

          图 2

1.3 两种方法的结合使用
两种方法各有利弊,采用OLE的方式,调用JMP的内部引擎,在系统后台实现用户的个性化需求,能对JMP进行数据交互,并把结果返回给用户,对于用户来说是透明的,但是不足之处是JMP提供的接口不全,而且需要开发者孰知各个接口功能,对于复杂的过程,后台代码难以编写。采用构造JSL语言的方式优点在于语法简单,JMP能自动生成JSL语言,直接可以复用,大大减少开发成本,JSL在和用户动态交互方面显得不足,而且必须调用JMP界面,显得不够友好。
所以采用两种结合方式,可以极大满足用户的需求。主要思路是在用户自己应用程序里面,动态构造JSL语言,然后使用上述的SetVisible(true)和RunCommand(LPCTSTR(jsl)) 等关键语句执行。
2.实验设计实例
JMP的实验设计功能很强大,下面以一个具体的实例,对上述的JMP二次开发方法进行具体演示。功能需求是:需要调用其空间填充设计中均匀设计功能,从用户的数据文件中读取数据,然后传到JMP中,经过处理后,存储到数据中,整个过程中是透明的,用户感知不到JMP的存在。开发平台是VS2008,SQL2008和JMP10.0;开发语言为VC++和JSL;主要步骤如下:
2.1建立JMP实例
IJMPAutoApp  m_ DispDriver;// 建立建立JMP实例
m_DispDriver.CreateDispatch("JMP.Application"); //链接JMP
m_DispDriver.CloseAllWindows();// 关闭已经打开的jmp窗口
m_DispDriver.SetVisible(False);// 设置JMP界面不可见
2.2数据传入到JMP
d=doe(space filling design); //打开实验设计空间填充界面
Report( d )["Factors"][ListBoxBox( 1 )] << set selected( 1 );
//Report(d),表示空间填充界面,"Factors"][ListBoxBox( 1 )表示得到因子的列表框的第一列<< 表示操作符号;set selected( 1 )表示选中第一行,因为空间填充界面默认有两个X1和X2输入因子,需要删除,否则会影响后面结果。
Report( d )[Button Box( 5 )] << Click( 1 );// Button Box( 5 )表示该界面的第5个按钮,其编号可以参考本文2.2的方法,Click( 1 )表示点击删除按钮。
d<<add factor(continuous,0,1200,"time")//表示增加一个连续性的,范围在在(0,1200)名称为time的实验因子。
Report( d )[Number Col Edit Box( 1 )]<<set values([18]);//给实验次数赋值。
Report( d )[Button Box(N )] << Click( 1 )//N就表示需要点击按钮的编号,比如编号为4 就表示球堆积按钮,点击制表按钮后,就把设计好的数据显示在当前表中。
2.3存储到数据库
把当前表存储到数据中,用到的方法是Save DataBase(”连接字符串”,”数据表名”),需要注意得是,需要先在JMP软件中建立连接实例,字符串的格式可以通过打开界面软件中的数据库打开选项打开后,获取运行脚本,如:JMP_con=“DSN=JMP_con;UID=sa;PWD=123456;APP=JMP;WSID=DADI-20130827MC”,JMP_con就是JMP连接实例,需要在JMP界面软件中先建立好,否则执行JSL无效。
(4)运行脚本
m_DispDriver.RunCommand(LPCTSTR(jsl));// 执行jsl语言可以单条执行,也可以可以批量执行,用分号分开,为了便于调试,尽量单句执行,并设置JMP实例为显式可见,m_DispDriver.SetVisible(False),每执行一句就可以看到效果,也可以把脚本拷贝到JMP的脚本调试器里,逐条语句执行,还可以看到执行过程中的变量变化情况。执行完之后,释放JMP实例,m_DispDriver.DetachDispatch();方便下次调用。
3.总结
JMP的强大之处在于无论是界面软件还是引擎都最大程度的为用户提供便利途径,实现用户具体需求,本文主要从二次开发的角度,阐述了三种实现方法,并以一个具体的需求作为实例,给出了关键的代码,为开发人员提供参考,可以根据本文提出的方法,进行更加复杂的个性化开发。
参考文献
[1] jmp_jsl_guide.pdf,JMP10.0官方教程.
[2]百度百科[OL].[2013.10.25]. http://baike.baidu.com/view/2239902.htm.