如何用VC6进行PCDMIS二次开发低级.docx
《如何用VC6进行PCDMIS二次开发低级.docx》由会员分享,可在线阅读,更多相关《如何用VC6进行PCDMIS二次开发低级.docx(63页珍藏版)》请在冰豆网上搜索。
如何用VC6进行PCDMIS二次开发低级
如何用VC6进行PC-DMIS二次开发(低级)
第1章.序
第2章.PC-DMIS的优势
第3章.一个简单的范例
第4章.了解PC-DMIS的对象结构
第5章.与PC-DMIS对象交流
第6章.范例1:
从PC-DMIS 测量程序中获取数据
第7章.范例2:
向PC-DMIS测量程序中写入数据
第8章.范例3:
听听PC-DMIS在干什么?
第9章.跋文
第1章.序
1)开始阅读之前
2)要能够较好地理解本文的内容,您必须至少熟悉一种开发语言,至少会使用一种开发环境进行简单对话框程序的开发,对坐标测量和PC-DMIS有一定的了解,能够看懂PC-DMIS程式代码。
3)若您希望使用C++和MFC进行二次开发,您必需熟悉C++语法,并熟练利用VC和MFC进行开发。
4)
5)若您参照本文的范例为执行开发,请了解:
A.PC-DMIS联机运行时,若操作错误,可能产生各类伤害风险。
请注意安全
B.本文中的例子仅用于说明实现指定功能的方式,并未在效率优化、避免操作者操作错误等方面进行特别的防范,在开发进程中您需要自己把好关
C.笔者能力有限,许多程式中利用的方式可能并非是最合理的,也并非保证您参考后能够取得理想的结果,开发程式发布前请您作好代码检查和效果验证/测试工作
6)阅读本文将取得的收获
本文将通过量个案例,慢慢带您进入PC-DMIS二次开发的世界,使您掌握用VisualC++和MFC编写PC-DMIS二次开程序的方式。
学习完本文后,参照文中的案例,相信您必然能编写出实用的PC-DMIS二次开发程序。
7)本文的开发环境:
8)WindowsXPSP2
9)VisualC++
10)PC-DMISCADMR2
11)
12)说明:
尽管本文中范例所用的开发工具和PC-DMIS版本较低,但大部分例子(第七章中用到Active控件的除外)都能在各种版本的PC-DMIS上使用,并能在WIN7下运行。
13)一旦您掌握了开发的方法,开发工具和PC-DMIS的版本并不会对您的开发工作造成影响。
14)
15)笔者使用VisualC++开发的原因有两个,一是只会利用C++作为开发工具,二是C++能够开发出功能加倍壮大的功能,尤其是MFC,能够超级方便地实现“文档/视图”架构,便于数据的管理。
16)
17)若您习惯使用VisualBasic或其它语言进行开发,那么本文中的案例您不能直接引用到正在开发的工程中,但您能从方法和思路上获得一些启发。
18)
19)关于本文中的范例
20)本文中的范例都放在与本文同目录中的DSWs目录中。
这些范例都是从第一个范例复制升级的。
21)在复制进程中,笔者仅修改了工程(Project)的目录名称,所以每一个范例中的头文件和实现文件名称都与第1个范例相同。
无论利用哪个范例,链接后产生的可执行文件都是“”。
22)
23)二次开发是什么
在阅读本文之前,或许您需要了解一下何为“二次开发”?
若是您已了解此概念,或已是个中高手,请略过此节。
工业革命以来,重复单调的工作大部份由机械代替人手来完成。
机械化的进展,使生产效率不断提高,慢慢实现了大规模生产。
由于生产效率不断提高,许多商品的价钱大幅下降,从而让许多普通家庭也用上了在手工时期较为昂贵的商品。
1946年运算机发明,并在不久后投入生产进程控制,进一步提高了生产的自动化程度。
运算机软件,这种人类智慧的结晶,在专门大程度上代替人的试探,并愈来愈多地代替人的决策,让人类不仅解放了双手,更协助人类延伸了试探的能力。
人工智能的应用就是最好的证明。
优秀的软件通常拥有友好的界面和壮大的功能,令人容易掌握,并用简单的操作完成复杂的工作。
那么,是不是有了运算机软件,工作绩效已经最佳化了呢?
人的操作是不是已经最简便了,没有提升的空间了呢?
非也。
同一个软件,不同的用户常常利用到的功能是不一样的。
有的人利用面狭小,有的利用面普遍。
就象一部智能电话,有的人仅用它来打电话发短信,有的人却喜欢将所有能用的功能都尝试一下,或安装上很多软件。
对于通用的软件而言,为了控制学习和操作的复杂性(维持通用性),不可能将每一个用户的工作重心都考虑到,设计得让每一个用户都感觉到象是专门为自己设计的软件一样(若是是如此固然是最好的,如此软件就可以以最适合的方式进行利用,从而取得最高的工作效率)。
为了兼顾通用性并知足客户特定需求,优秀的软件采用了三种方式来实现“可订制”特性,就象订做皮鞋和西装一样。
这三种方式是:
购买/安装模块可选,操作界面可订制,提供开发接口。
实现模块可选择性有两个目的,一是让客户能够只购买自己需要的功能,如此能够节省客户的本钱,对软件的销售也有帮忙;二是节省运算机的(安装时的)磁盘空间和(运行时的)内存空间。
可订制的界面,指软件的操作界面是可订制的,客户能够按照自己利用各功能的频率,从头安排菜单/工具栏/客户区的位置和大小,从而打造出最适合自己的界面。
开发接口用于提供给客户扩展软件功能的能力。
通常情形下,当用户操作软件时,用户每输入一个指令,软件就执行一个动作。
一项复杂的工作,往往需要超级多的步骤来完成。
在这种情形下,用户就需要与软件进行超级多的交互,从而花费许多人力。
过量的操作会降低工作效率,并增加犯错的可能性。
大部份情形下,人的操作其犯错概率远高过软件本身犯错的概率,效率却远低于软件作业。
若是大部份工作内容是相同的,人就会由重复的手工劳作,陷入重复的运算机操作中。
为了改善这一状况,许多软件提供了“开发接口”。
通过开发接口,用户除通过鼠标和键盘来输入操作命令之外,还可经由已经编好的指令序列来向软件发出操作命令。
看到这里您是不是感觉奇怪?
软件本身就是指令序列组成的,咱们又用指令序列来操作它?
没错,这就是二次开发。
二次开发就是在已开发的软件的基础上(姑且称之为一次开发),通过编写(开发)指令序列来向软件发出操作指令,从而用软件来操作软件,进一步提高工作效率和品质的作业方式。
24)为了加深您的印象,下面举个简单的例子来示范如何用指令序列来操作EXCEL。
如下图的EXCEL文档,此刻需要将5个单元格中的内容移到A列中最前面的5行中。
若是采用手动操作,咱们需要执行以下动作(手工进行):
a).将“a1=”移动到A1单元格
b).将“a2=”移动到A2单元格
c).将“a3=”移动到A3单元格
d).将“a4=”移动到A4单元格
e).将“a5=”移动到A5单元格
完成以上的5个步骤,一个熟练的工作人员可能需要15S的时刻。
咱们再看看如何用指令序列来完成这一工作。
在EXCEL中,存在两种“二次开发”,最简单的开发是“宏”程序(若是您愿意承认这也是一种开发的话)。
EXCEL能够让咱们把自己的操作记录下来,就象录音一样。
录制完以后,咱们能够播放它。
这种录制的作品就是“宏”。
宏是一种VB脚本,每次播放时,宏都执行一样的操作。
为了让大家先有个直观的印象,咱们先来录制一个宏,然后运行宏来完成上面的移动单元格的工作,看看需要多久(不计宏的录制时刻。
因为在大量重复操作的情形下,宏的录制时刻相对是能够忽略不计的,即咱们假设开发软件的时刻相对利用软件来工作节省的时刻是能够忽略不计的,不然软件就没有开发的价值了)。
a).先把“Book1”中的内容复制到新建的“Book2”工作簿中(以便未来在Book2中演示宏的执行效果)。
复制完后,切换回“Book1”工作簿,然后选择菜单“宏/录制新宏”
b).EXCEL弹出“录制新宏”对话框。
如下图。
在“快捷键”栏位中输入小写字母“q”并按肯定。
(指定了CTRL+q的快捷键,当宏录制好以后,每次咱们按CTRL+q操作时,宏就会被执行)
c).EXCEL进入录制宏的状态,并显示出“停止录制”的工具栏,如下图。
d).把移动单元格的操作手动执行一遍。
此刻“Book1”中的内容如下图
e).点击“停止录制”工具栏中的蓝色正方形按钮,宏就被EXCEL记录下来,成为能够重复执行的指令序列
f).切换到“Book2”工作簿,按下“CTRL+q”,看看发生了什么?
移动单元格的操作在一刹时被自动完成了!
咱们再来看看那个操作是如何实现的,宏里面到底记录了些什么?
a).选择菜单“工具/宏/VisualBasic编辑器(V)”
b).VisualBasic编辑器窗口打开。
展开窗口左侧“工程资源管理器”中的“模块”文件夹,双击其中的“模块1”,适才录制的宏的内容在代码窗口中显示出来。
代码窗口中,蓝色字体的是关键字,黑色字体的是代码,绿色字体的是注释
c).为了便于理解,我在每句代码后面加入了注释,并从头将窗口画面贴在下方。
您此刻能够了解每句代码所执行的操作了。
通过上面的例子,您是不是对“二次开发”有了更直观的熟悉?
第2章.PC-DMIS的优势
通过对多家测量软件的了解,作者发此刻各类测量软件中,PC-DMIS有以下的优势:
1)免费的接口:
PC-DMIS的开发接口是天生集成在软件中的。
只要您购买PC-DMIS软件,就默许拥有了其二次开发接口,不必额外付费
2)丰硕的接口:
PC-DMIS提供了一套覆盖从应用程序操作到点数据类型概念的有序组织的对象接口,提供给开发者灵活而壮大的操控能力
3)层次对象结构:
在第四章中您将看到,PC-DMIS的二次开发接口依照测量程序的对象模型有序地组织在一路,超级易于理解和掌握
4)提供ActiveX控件:
通过这些控件,您能够监听到PC-DMIS运作时发出的消息,从而实时了解到量测程序执行的进度和状态,为下一步的操作提供依据
5)接口的通用性:
通过类型库,您能够用多种语言来进行开发
第3章.一个简单的范例
为了让大家对PC-DMIS二次开发有更直观的印象,本章咱们通过一个例子(名字就叫作Introduction吧)来示范如何通过开发程序与PC-DMIS交互。
完整的工程内容放在与本文同一目录中的“DSWs\Introduction”目录中。
此工程已在中编译通过。
本章末尾有运行的画面。
您能够在VC6中打开此工程查看具体的代码,并在此基础上作进一步的开发。
在本章中会用到较多的VisualC++和MFC的操作。
若是您不熟悉,请先进行了解。
不过笔者会以简单直观的描述辅以较多的图片,尽可能让您能够看懂。
从Introduction中并非能看到二次开发所带来的效率提升。
它只是示范了如何通过二次开发来操控测量软件。
在实际的二次开发工作中,您能够将一系列依次执行的操作安排在一个模块中,从而让操作者用一个简单的操作来挪用它们,现在效率的提升才显现出来。
Introduction将完成以下功能:
取得PC-DMIS中打开的量测程序名称及路径,提供一个按钮让操作者启动量测程序执行,您能够通过它打开量测程序,也能够将当前量测程序另存。
其主界面如下:
咱们来看看Introduction的开发进程。
概览如下:
1.在VC中成立一个名称为“Introduction”的对话框工程
2.在工程中加入用于与操作者交互的控件
3.加入控件响应函数(当操作者操作控件,比如点击“启动程式运行”时,Introduction将挪用这些函数来实现控件代表的操作)
4.加入与PC-DMIS交互的类库,并将类库的头文件包括到要利用它的文件中(这些类库是PC-DMIS与Introduction之间通信的接口。
Introduction通过这些类库中声明的类来建构对象,并通过这些对象与PC-DMIS交互)
5.加入控件响应函数将要挪用的功能函数(将所有的操作代码都写在控件响应函数中是不好的适应。
若是如此做的话,相同的代码可能会在几个控件响应函数中重复出现。
在这里咱们将它们声明为函数,从而实现代码重用。
在实际的开发工程中这是超级重要的)
6.加入与PC-DMIS交互的对象的变量的声明
7.填充函数代码
8.编译和链接
9.测试
通过以上步骤,咱们就能开发出能够操控PC-DMIS的程序,是不是很简单呢?
下面咱们来一步一步地介绍开发进程。
为了让不熟悉VC的朋友看得比较明白,下面的步骤写得比较细,从而也比较冗长。
若是有些步骤对您来讲很熟悉,请略过它们。
1.在VC中成立一个名称为“Introduction”的对话框工程
1.打开VC,并选择菜单“File/New”,或按快捷键“CTRL+N”,VC弹出新建对话框。
2.在对话框当选择“Projects”选项页,在左下方的列表当选择“MFCAppWizard(exe)”,即MFC应用程序向导,在“Projectname”栏中输入工程名称为“Introduction”,然后点击“OK”按钮
3.
4.应用程序向导进入STEP1。
在该页当选择“Dialogbased”(对话框应用程序),再点击NEXT按钮
5.
6.应用程序向导进入STEP2。
在该页当选上“Automation”,再点击NEXT按钮
7.
8.应用程序向导进入STEP3。
在该页当选择“HowwouldyouliketousetheMFClibrary?
”选项为“Asastaticallylinkedlibrary”,然后点击NEXT按钮
9.
10.应用程序向导进入STEP4。
该页报告了应用程序向导将要自动生成的类和其头文件和实现文件名称。
不用修改,点击“Finish”按钮即可
11.
12.VC弹出对话框,报告它给咱们干了些什么情形,和咱们选择的设置。
点击OK按钮即可
13.
14.通过一番动作,VC出现以下界面。
笔者假定读者对VC的开发界面已经比较熟悉,这里就不介绍了。
画面中央就是VC为咱们生成的初始对话框。
15.
2.在工程中加入用于与操作者交互的控件
1.先删除“TODO:
在这里设置对话控制”控件。
2.加入实现以下4个功能需要的控件1)取得打开的量测程序名称及路径,2)启动量测程序执行,3)打开量测程序,4)将当前量测程序另存。
完成后的界面如下:
3.(编辑框控件的ID为“IDC_EDIT_PRG_FOR_OPEN”。
记住那个ID,未来取得要打开的量测程式路径时需要用到。
)
4.(对话框中的“确定”、“取消”按钮是MFC自动生成的。
在本程序中,它们都只有一个作用,就是退出对话框,所以您能够删除掉一个。
)
5.
3.加入控件响应函数
1.双击“取得程式名称和路径”按钮,VC弹出对话框让咱们确认它预备帮咱们添加到工程中的响应函数名称。
在此对话框中点击“OK”按钮,同意默许的名称即可。
2.
3.当咱们点击“OK”按钮后,VC自动在主对话框的实现文件“”末尾,为咱们添加了一个函数。
如下图。
4.现在“OnButtonGetPrgPathName”函数是一个空壳,可是当用户点击“取得程式名称和路径”按钮时,该函数会被当即挪用。
5.只要我们将取得程式名称和路径的操作代码写在此函数中,即可实现当用户点击“取得程式名称和路径”按钮时,程式就执行“取得程式名称和路径”的操作。
6.(为了让用户在点击“取得程式名称和路径”按钮时激发此函数的挪用,MFC还做了大量的工作,此处再也不详述)
VoidCIntroductionDlg:
:
OnButtonGetPrgPathName()
{
7.
(从类型库中新增)
8.
9.VC弹出“ImportfromTypeLibrary”对话框。
在该对话框中定位到PC-DMIS的安装目录,并选择“”文件,再点击“打开”按钮。
该文件中保留着PC-DMIS的二次开发接口
10.
11.VC弹出“ConfirmClasses”对话框,要求确认要导入的类。
为简便起见,咱们导入类型库中包括的所有的类。
在列表框当选中所有的类,并点击“OK”按钮。
12.
13.退出“MFCClassWizard”
14.看看工程中,是不是多了一个名为“”的头文件和一个名为“”的实现文件?
15.
16.将“”包括到主对话框的实现文件中:
双击左侧文件列表中的“”,切换到此文件,在头部添加一句“#include""”
17.
4.加入控件响应函数将要挪用的功能函数
1.先来分析一下咱们需要的函数。
咱们的程序预备实现4个功能:
取得PC-DMIS中打开的量测程序名称及路径,启动量测程序执行,打开量测程序,将当前量测程序另存。
2.于是咱们需要以下6个函数:
3.连接PC-DMIS:
BOOLConnectPcdmis()
4.
5.
6.
7.
8.
9.
10.
11.
12.
RG",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"
PC-DMIS测量程序(*.PRG)|*.PRG",NULL);
"请指定测量程序另存路径";
if()==IDOK)
{
csPRGPathName=();
}
else
1.
1.
LB文件)导入VC中,属性和方式的界限模糊了,有许多属性也被转换成了成员函数,而另一些属性则转换成了成员变量。
方式则一般转换成函数。
比如,Command对象被转换成ICommandWrapper类,其DimensionCommand属性被变换成成员函数,其声明形式为:
LPDISPATCHGetDimensionCommand();
1.要从Command对象获取其DimensionCommand成员,利用GetDimensionCommand()函数属性即可:
IDimensionCmdWrapperdim;
dim=();
arent”属性即可。
类库导入VC时,Command对象的Parent属性被变换为成员函数。
其声明形式为:
LPDISPATCHGetParent();
2.如何取得顶层对象(Application)?
绝大部份PC-DMIS对象都是Application对象的成员(或成员的成员)。
要从某个对象取得Application对象(Application是顶层对象),利用“”属性即可。
类库导入VC时,对象的“Application”属性被转换为成员函数。
其声明形式为:
LPDISPATCHGetApplication();
一.通过已连接的对象向PC-DMIS发出命令
通过对象的方式,PC-DMIS提供了很多操作。
比如,通过Application对象能够退出PC-DMIS、最大化/最小化窗口;通过PartPrograms对象能够打开、关闭测量程序;通过PartProgram对象能够启动运行、清除标记、关闭它自己,等等。
例,要通过PartPrograms对象将D:
\打开,并关闭其它测量程序,操作进程如下:
();
PutPoint(FPOINT_CENTROID,FDATA_THEO,,,);
f",x);
csFeatData[iFeatCount][1]=chBuf;
f",y);
csFeatData[iFeatCount][2]=chBuf;
f",z);
csFeatData[iFeatCount][3]=chBuf;
iFeatCount++;
在PC-DMIS编辑窗口中点击右键,在弹出的菜单中选择“ChangePop-upDisplay/DataTypeInformation”
2.将光标放在特征名称上,停留片刻,PC-DMIS弹出TIP框,在其中显示了数据类型信息
第4章.范例2:
向PC-DMIS测量程序中写入数据
本章咱们编写一个二次开发程序,将测量程序中所有特征的理论坐标沿其矢量方向偏移。
比如,若A特征坐标及矢量为,,,,,,则处置后的坐标及矢量为,,,,,;
若B特征坐标及矢量为,,,,,,则处置后的坐标及矢量为,,,,,。
为简单起见,本章的开发范例仍在第一章的“Introduction”基础上添加功能,并从头命名为“SetDataIntroduction”
完整的工程内容放在与本文同一目录中的“DSWs\SetDataIntroduction”目录中。
此工程已在中编译通过。
在开始开发工作之间,先计划一下:
一.声明所需的常量和变量
二.在界面中添加处置特征数据的按钮
三.为该按钮添加响应函数
四.编写函数代码。
在按钮响应函数中,操作按如下步骤进行:
1.连接PC-DMIS
2.连接上Commands(命令集合)控件,取得集合中的命令个数
3.遍历所有的命令(从第1个遍历到最后1个):
检查每一个命令是不是是特征命令。
若是是:
A.取得理论坐标
B.取得理论矢量
C.计算偏置后的理论坐标
D.将偏置后的理论坐标写入特征
4.释放Commands
5.释放PC-DMIS
下面按照计划来执行开发。
双击工程目录中的“”,打开GetDataIntroduction工程。
一.声明所需的常量和变量。
A.分析:
本工程中不需要长期保留特征数据,故特征数据贮存在函数作用域的局部变量中即可。
取得特征理论坐标、理论矢量,写入偏置后的理论坐标时,需要列举量。
B.按照以上分析,咱们需要FPOINT_CENTROID=0、FDATA_THEO=2、FVECTOR_VECTOR=1三个列举常量概念。
C.在工程中加入常量概念。
为简单起见,笔者直接将其概念为文件作用域的全局变量,添加在“”文件头部。
D.
二.在界面中添加处置特征数据的按钮:
给主对话框添加一个按钮,给予其ID为“IDC_BUTTON_OFFSET_0_1”,按钮名称为“偏移mm”
三.
四.为该按钮添加响应函数:
双击刚添加的“偏移mm”按钮,VC为咱们添加一个“OnButtonOffset_0_1”函数
五.编写函数代码。
在该函数(用于取得特征数据)中,操作按如下步骤进行:
1.连接PC-DMIS
2.连接上Commands(命令集合)控件,取得集合中的命令个数
3.遍历所有的命令(从第1个遍历到最后1个):
检查每一个命令是不是是特征命令。
若是是:
A.取得理论坐标
B.取得理论矢量
C.计算偏置后的理论坐标
D.将偏置后的理论坐标写入特征
4.释放Commands
5.释放PC-DMIS
完整的函数代码如下:
voidCIntroductionDlg:
:
OnButtonOffset_0_1()
{
//函数作用域的变量定义
CStringmsg;//消息字串
DOUBLEx,y,z,i,j,k;//XYZ坐标及矢量
LONGlCmdNumber;//测量程序中的命令个数
LONGl;//循环变量
ICommandWrappercmd_pcdlrn;//命令
IFeatCmdWrapperfeatCmd_pcdlrn;//特征命令
if(!
ConnectPcdmis())return;//连接PC-DMIS。
若失败则退出
//检查是否有打开的测量程式。
如果没有,则报错退出
if()<1)
{
AfxMessageBox("您至少需要打开一个量测程式,才能执行此操作