收藏 分享(赏)

pdms二次开发介绍-基于.net(c#)平台.pptx

上传人:无敌 文档编号:315665 上传时间:2018-03-28 格式:PPTX 页数:23 大小:750.31KB
下载 相关 举报
pdms二次开发介绍-基于.net(c#)平台.pptx_第1页
第1页 / 共23页
pdms二次开发介绍-基于.net(c#)平台.pptx_第2页
第2页 / 共23页
pdms二次开发介绍-基于.net(c#)平台.pptx_第3页
第3页 / 共23页
pdms二次开发介绍-基于.net(c#)平台.pptx_第4页
第4页 / 共23页
pdms二次开发介绍-基于.net(c#)平台.pptx_第5页
第5页 / 共23页
点击查看更多>>
资源描述

1、PDMS二次开发简介,基于.Net(C#)平台,二次开发方式综述,AVEVA PDMS提供了三种二次开发的方式:DARs, PML和AVEVA .Net(C#)。DARs是Fortran的函数库,也可以用C/C+来开发,依赖的库少,但是只能用于控制台的程序,没有用户界面(GUI),所以对于提取PDMS数据,然后进行简单处理的小程序比较试用。PML:ProgrammableMacroLanguage 可编程宏语言,是一种解释型的脚本语言,其只能在PDMS软件中被解释执行。PDMS自带的很多程序就是用PML开发的。脚本语言的显著优势就是将常用的命令封装出来,这样在测试程序新功能时,不需要编译源码,

2、只需要编写脚本,提高软件开发效率;使用脚本时需要将功能暴露出来,这样会对接口的合理性做更多考虑,使软件架构更清晰等。缺点就是对于复杂算法,执行效率较低,相对.Net方式功能少。AVEVA .Net是AVEVA推出的一种更方便的开发方式。结合C#丰富的库及相对于PML而言更加高效,使用C#在AVEVA上可以快速地开发出应用程序。且PML.Net使得在PML中调用C#的库成为可能,使用C#对PDMS进行开发优势明显,但也有不足之处,那就是程序调试不方便,当C#的库DLL被PDMS加载后,不能卸载,不能对源码实时修改,开发效率有所影响。,PML开发方式- Hello World示意,1.编写hell

3、o.pmlfrm代码文件,放到该目录下:D:AVEVAPlantPDMS12.0.SP6PMLLIBdesignforms hello.pmlfrm2.D:AVEVAPlantPDMS12.0.SP6PMLLIBpml.index 文件中添加 hello.pmlfrm,即可自动加载该代码。3.进入PDMS后,命令行敲入调用命令显示对话框:show !hello,即可弹出对话框,如右图:,基于.Net(c#)方式开发,VS中通过引用PDMS提供的DLL,编译出DLL类库,在PDMS中以插件方式加载,实现PDMS二次开发。PDMS12.0 Sp6需要用.Net2.0版本.主要可实现的功能:程序框架

4、、设置相关,比如:添加工具条按钮及相应命令、数据库(工程)访问、元素(实体)获取参数、修改、删除等几何库、图形库等一些事件的响应处理,比如元素创建、修改、或选中时等,基于.Net(c#)方式开发,工程、数据库、元素概念,项目(Project),为数据根节点,对应实际工程项目的概念。一个项目包括多个数据库(MDB)。登陆时,可以选择进入不同模块(Module),设计模块(Design)还是轴测图、或元件库视图。每个数据库(MDB)下对应如下元素:树状数据库中每一个节点叫做一个元素,每个元素都有属性保存他的特征信息,不同类型的元素属性类型也不同当前元素可以是一个有元素,也可以是元素的结合。,Hel

5、loWord插件,可加载插件必须从这个接口类派生:Iaddin,有几个虚函数可以重写。启动PDMS加载时调用Start(),关闭PDMS时,调用Stop()。添加引用DLL,及命名空间。Pdms安装主目录中提供了各类需引用的dll。Aveva.ApplicationFramework.dllAveva.ApplicationFramework.Presentation.dllusing Aveva.ApplicationFramework;using Aveva.ApplicationFramework.Presentation;,HelloWord插件,编译出的DLL放到PDMS主目录中,支

6、持全路径,及环境变量。修改插件配置文件,添加我们的插件:启动后,就会加载插件,并调用入口函数。D:AVEVAPlantPDMS12.0.SP6DesignAddins.xml:,创建主命令,重写命令类,并在类构造函数中,设置命令ID,重写虚函数,用以点击命令后,需要做的工作 public virtual void Execute();,注册新写的命令类,Iaddin派生类入口函数中注册新写的命令类,public void Start(ServiceManager serviceManager) / 注册命令 CommandManager commandManager = (CommandMan

7、ager)serviceManager.GetService(typeof(CommandManager); ShowAttributeBrowserCommand showCommand = new ShowAttributeBrowserCommand(attributeListWindow); commandManager.Commands.Add(showCommand);,创建工具条按钮,调用新写的命令,通过代码与配置文件结合的方式,代码获取工具条管理类,加载相应的UIC文件。,CommandBarManager commandBarManager = (CommandBarMana

8、ger)serviceManager.GetService(typeof(CommandBarManager); commandBarManager.AddUICustomizationFile(AttributeBrowser.uic, AttributeBrowser);,配置文件中定义了按钮名字、命令ID,及停靠属性等。UIC文件没有指定目录,则默认在PDMS主目录中。除了支持工具条,菜单也可以在UIC文件里定义。,创建菜单、工具条示意,创建元素,DbElement dbCE = CurrentElement.Element; / 当前选择的元素 DbElementType dbType

9、 = dbCE.GetElementType(); try if (dbType = DbElementTypeInstance.WORLD) / 不同类型节点下,创建不同类型的元素 DbElement dbSite = dbCE.Create(0, DbElementTypeInstance.SITE); dbSite.SetAttribute(DbAttributeInstance.NAME, /NewSite); eslse if( SITE、ZONE、PIPE) else if( dbType = DbElementTypeInstance.BRANCH) DbElement dbEl

10、ement = dbCE.Create(0, DbElementTypeInstance.ELBOW); / 弯头 dbElement.SetAttribute(DbAttributeInstance.NAME, /NewElbow); dbElement = dbCE.Create(0, DbElementTypeInstance.PIPE); dbElement.SetAttribute(DbAttributeInstance.NAME, /NewPipe); dbElement.SetAttribute(DbAttributeInstance.DESC, /NewAdded Pipe);

11、 ,元素修改、删除,/ 元素属性修改DbElement dbCE = CurrentElement.Element;Position curGePos = dbCE.GetPosition(DbAttributeInstance.POS);double newPos = new double3 curGePos.X + 200, curGePos.Y, curGePos.Z;dbCE.SetAttribute(DbAttributeInstance.POS, newPos);dbCE.SetAttribute(DbAttributeInstance.DPFN, newDpfName);/ 移动

12、到其他节点下DbElement dbOtherPipe = GetOtherPipe() ;dbCE.InsertAfterLast(dbOtherPipe);,/ 删除dbCE.Delete();,撤销机制,/ 设置撤销标记UndoTransaction trans = UndoTransaction.GetUndoTransaction();trans.StartTransaction(My Transaction);/ 模拟修改String s1 = Example.Instance.mEqui.GetString(DbAttributeInstance.DESC);String s2

13、= String.Concat(s1, x);Example.Instance.mEqui.SetAttribute(DbAttributeInstance.DESC, s2);trans.EndTransaction();/ 撤销操作,回到原来值UndoTransaction.PerformUndo();,迭代元素,按树结构方式迭代,/ 先定义过滤器 TypeFilter filt = new TypeFilter(); filt.Add(DbElementTypeInstance.SITE); filt.Add(DbElementTypeInstance.PIPE); filt.Add(D

14、bElementTypeInstance.NOZZLE); filt.Add(DbElementTypeInstance.TEE); CompoundFilter filtComp = new CompoundFilter(); filtComp.AddShow(filt); / 通过树浏览器扫描节点下所有指定类型的元素 ElementTreeNavigator navi = new ElementTreeNavigator(DbElement.GetElement(/*), filtComp); DbElement tees = navi.MembersInScan(dbCE); strin

15、g outResult = “ElementTreeNavigator()方式迭代元素:n; foreach (DbElement db in tees) string subName = db.ToString(); string subType = db.GetElementType().ToString(); outResult += 名称: + subName + , 类型: + subType + newLine; System.Windows.Forms.MessageBox.Show(outResult);,迭代元素2,通过前后、从属关系迭代元素,/ 获取当前元素 DbEleme

16、nt dbCE = CurrentElement.Element; string curName = dbCE.ToString(); string curType = dbCE.GetElementType().ToString(); / 前面的元素 DbElement preDb = dbCE.Previous; if (!preDb.IsNull ,按范围查找元素,Position p1 = Position.Create(0.0, 0.0, 0.0);Position p2 = Position.Create(10000.0, 10000.0, 10000.0);LimitsBox l

17、imitsBox = LimitsBox.Create(p1, p2);DbElement eles = Spatial.Instance.ElementsInBox(limitsBox, false);,foreach (DbElement e in eles ) e. Do somethings ,事件机制(反应器),/ 先添加代理DbPostElementChange.AddPostCreateElement(DbElementTypeInstance.PIPE, new DbPostElementChange.PostCreateDelegate(PostCreateSubscribe

18、r);DbPostElementChange.AddPreDeleteElement(DbElementTypeInstance.ELBOW, new DbPostElementChange.PreDeleteDelegate(PreDeleteSubscriber);DbPostElementChange.AddPostMoveElement(DbElementTypeInstance.PIPE, new DbPostElementChange.PostMoveDelegate(PostMoveSubscriber);DbPostElementChange.AddPostAttributeC

19、hange(DbAttributeInstance.POS, new DbPostElementChange.PostAttributeChangeDelegate(PostSetAttSubscriber);,static private void PostCreateSubscriber(DbElement ele) System.Windows.Forms.MessageBox.Show(PostCreate); static private void PreDeleteSubscriber(DbElement ele) System.Windows.Forms.MessageBox.S

20、how(DbPostElementChange事件:PreDelete); static private void PostMoveSubscriber(DbElement ele, DbElement oldOwner, int oldpos) System.Windows.Forms.MessageBox.Show(DbPostElementChange事件:PostMove); ,事件机制2(反应器),/ 注册事件方式DatabaseService.Changes += new DbChangesEventHandler(DatabaseService_Changes);,static

21、void DatabaseService_Changes(object sender, DbChangesEventArgs e) try DbElement creations = e.ChangeList.GetCreations(); DbElement deletions = e.ChangeList.GetDeletions(); DbElement memberChanges = e.ChangeList.GetMemberChanges(); DbElement modifications = e.ChangeList.GetModified(); catch (Exceptio

22、n ex) ,工程、数据库操作(打开、关闭工程),/ 打开工程,传入参数:工程id、用户名、密码 Project.CurrentProject.Open(PrjCode, “UserName, “Password); / 设置打开的数据库,必须额外加一个反斜线,且区分大小写 MDBSetup setUp = MDBSetup.CreateMDBSetup(/MdbName); MDB.CurrentMDB.Open(setUp);,/ 保存、关闭工程 MDB.CurrentMDB.SaveWork(Save now);MDB.CurrentMDB.Close();Project.Current

23、Project.Close();,工程、数据库操作(工程参数获取),/ 当前工程Project.CurrentProject,/Project name string projName = Project.CurrentProject.Name; output += CurPrjName: + projName + n; /User name string userName = Project.CurrentProject.UserName; output += userName: + userName + n; /MDB name string MDBName = MDB.CurrentMDB.Name; output += MDBName: + MDBName + n; /First world DbElement el = MDB.CurrentMDB.GetFirstWorld(DbType.Design); string firstWorldName = el.GetString(DbAttributeInstance.NAME); output += firstWorldName: + firstWorldName + n; System.Windows.Forms.MessageBox.Show(output);,谢 谢!,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 学术论文 > 管理论文

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报