站在巨人的肩上——PDMS二次开发之借鸡下蛋(转载)
技术讨论,难免有贻笑大方之处,仅供参考,谢绝转载,如有引用,请注明出处。
与Microsoft相比,AVEVA公司要大方的多,PDMS已经做到了半开源,虽然PDMS本身的程序源代码仍不可见,但是它的功能实现部分已经开源,用户可以方便的在安装目录下的pmllib下查看相关窗体、函数和对象的PML源代码。
这一点对用户来说,好处有二:
(1)更深入、更贴近实用的学习PML。PDMS Manual所提供的教程只是PML最基础的东西,其作用只是PML扫盲和入门。要想学到二次开发真本事,阅读那些开源代码很有帮助。
(2)直接使用或抽取开源代码,为我所用。用户在手动操作PDMS的过程中,可以使用$R6命令追踪命令执行过程。这样可以方便的观察到执行某一操作时,PDMS所执行的代码。而这些代码又可以在二次开发时直接引用,因此,通过调用这些代码,可以实现“模拟操作”,将复杂的操作过程,以命令流的方式快速执行,提高设计效率,这也是二次开发的一种方向。
使用上述方法进行二次开发时,有下面几个技巧可以使用:
(1)为控件赋值
通过代码追踪可以方便查取窗体的名称,在pmllib下找到并用文本编辑软件查看其代码,即可找到相应代码的名称,然后即可通过该控件的属性或方法为其赋值了。比如,为名称为cutpipe的窗体上的branchname文本框赋值,即可使用语句:
!!cutpipe.branchname.val=astring
来实现了。如果有为option 或者list控件选择一个值,则可以使用这些控件的select方法来实现了,比如:
!!componentCreation..componentList.select('Dtext','Bend')
这样即为componentList控件选择了Bend项。
(2)执行响应动作
需要注意,很多时候,通过代码为控件赋值并不能完全实现手动操作所实现的功能。这是因为,在手动操作时,除了为控件指定或选择值之外,还会执行该控件的callback所指定的动作。所以,要完全模拟手动操作还必须调用该控件的callback动作。比如:
!!componentCreation..componentList.select('Dtext','Bend')
!!componentCreation.setTask(|selectComponent|)
这样就既为空间赋了值,有执行了其相应动作,即完整了模拟了手动操作。至于控件的callback动作,大家可以方便的从其源代码中查取到。
读者可以测试下面代码并观察它所模拟的操作。
KILL !!componentCreation
show !!componentCreation
!!componentCreation.setBranch(!bran)
!!componentCreation.componentList.select('Dtext','Bend')
!!componentCreation.setTask(|selectComponent|)
!!componentCreation.bendRadiusOption.select('DText','Define')
!!componentCreation.selectRadius()
--!!componentCreation.bendRadius.val=0
!!componentCreation.setFlow(true)
!!componentCreation.create()
ANGLE 0
kill !!componentCreation
show !!componentCreation
!!ce=!curBran
!!componentCreation.setBranch(!bran)
!!componentCreation.componentList.select('Dtext','Bend')
!!componentCreation.setTask(|selectComponent|)
!!componentCreation.bendRadiusOption.select('DText','Define')
!!componentCreation.selectRadius()
!!componentCreation.setFlow(false)
!!componentCreation.create()
ANGLE 0
!!directComponent()
KILL !!componentCreation