本文论述了南方摩托审批流管理中所必须解决的PB和ACAD数据交换技术和引入的响应控制技术。/响应控制技术在审批流管理上的应用/1、响应器技术概述/2、工程图审批流使用情况介绍/3、监控实现过程/4、结论/参考文献/ 1、响应器技术概述 当AutoCAD系统内产生一个事件时,特定的对象会调用通知程序自动传递事件到其它对象。例如当用户复制、删除或修改对象或者用户发出RODO或UNDO命令时,对每个事件会自动触发相应的通知。 对象接收事件称为响应。一个响应在它能从通知程序接收事件之前必须先明确增加到通知程序响应列表中。当事件发生时,通知程序对响应列表中的每个响应自动调用相应的通知函数。所有响应器函数都是虚函数,所以其不能直接调用,必须从相应的响应器类中派生后才能调用。此时可以在相应的函数中添加代码,以实现用户所需功能。 响应器主要分为临时响应器和{yj}响应器。 临时响应器主要用于接收事件通知,使用临时响应器可以监控数据库对象的事件,同时也可以在应用程序运行时监控数据库事件、用户交互及其它系统事件。如将响应器添加到目标图层上以监视该图层的修改状况,若目标图层被非法解锁,将会触发该响应器中的objectClosed()事件中的重新锁层方法。 临时响应器的构造方法主要是在应用程序加载时搜索或创建目录对象,然后将目录对象指针加载到响应器的响应列表中,一旦目录对象指针内容发生改变,则会触发响应器的相关事件,然后在响应器事件中调用用户所定义的方法。临时响应器可以使用addReactor()函数来添加。 {yj}响应器主要用于接收和发送通知,一旦{yj}响应器被添加,便作为数据库对象的一部分,并保存在DWG和DXF文件中,当图形文件被装载时会被重新建立。 {yj}响应器的构造方法主要是在数据库增加对象响应,并使用目标对象的ID号获取其指针以与其建立约束。{yj}响应器被添加到通知对象的响应器列表中时刻跟踪目标对象,一旦目标对象被更改,将会响应用户所规定的事件。{yj}响应器可以使用addPersistentReactor()函数来添加。{yj}响应器是数据库的一部分,因此,在复制对象时,附加在其上的{yj}响应器也会被复制,而临时响应器则不会被复制。 2、工程图审批流使用情况介绍 2.1 工程图操作环境及其生命周期状态描述 南摩研发部涉及设计图纸的管理,该系统要求对工程图的操作是在的基础上进行的,该系统要求只有通过PDM授权后才能进入工程图的相关操作。 产品数据管理是一种面向对象的信息系统,它将所有与产品相关的信息和过程定义为对象,如文档、工程图、关系和过程等。对象在其生命周期中要发生许多变化,如版本、所有权、访问权等。在生命周期的不同阶段,对这些变化有不同的控制要求。工程图对象的生命周期状态如图1所示。 2.1 审批流系统实现模型图 在传统的手工管理工作流程中,对工程图生命周期各状态相应功能的执行是通过图纸的传递来进行。而在NM-PDM审批流管理系统中,对工程图生命周期状态的确立是根据识别提供给操作者权限状态代码来实现对工程图的处理。全部过程在控制下进行。DM审批流系统的管理模型如图2所示。 2.3 审批流管理模型功能分析 从审批流管理模型图可看到,系统分为三部分:权限认证、通讯和监控响应。 (1) 权限认证过程 权限认证过程也就是给操作者授权的过程,通过建立员工表存储用户登录身份认证数据、建立工作组表存储不同用户的不同权限认证数据和建立项目组表存储用户在不同项目中所担任的不同角色认证数据来进行。用户操作时通过读取这些信息来动态地约束用户操作。这部分的工作在该项目的另一部分——权限认证来单独研究。 (2) 通讯 用户选取项目成员后会有进一步的操作行为,如新增项目成员、修改等操作。如果要启动AutoCAD进行相应操作,就必然要与AutoCAD进行通讯。启动AutoCAD,新建AutoCAD文件,传送数据到AutoCAD文件,如图形加锁参数、零件属性参数等。进入AutoCAD后,对零件属性参数的修改,必须使用我们在AutoCAD中开发的应用程序才可修改,这样就可保证所修改的零件属性参数通过合法的途径传送回到数据库。 通过权限认证后,要通过AutoCAD打开的文件,只有七种可能的状态:、校对、审核、标检、批准、打印发布、浏览。系统通讯就是要将这七种可能的信息分别传送到AutoCAD,以实现其功能。本系统传递这些信息是采用PowerBuilder的OLE技术开启AutoCAD服务器、利用AutoCAD嵌入式开发工具 VBA来完成的。 (3) 监控 监控机制是为了保证工程图文件在不同的状态下顺利工作。由于系统整个工作流程的完成必须在AutoCAD中进行,因此,监控过程就加载在AutoCAD中。 工程图工作状态及过程监控,主要研究在AutoCAD中进行审批流程管理的保障问题。要在AutoCAD中有效地进行工程图的不同工作状态的工作,就需要有比较完善的监控机制,以监督用户的不同操作行为,使设计者不能手工更改工程图的标题栏信息、明细栏信息;圈阅者圈阅时,不能修改设计信息等。 通讯和监控是工程图审批过程牵涉的主要问题,也是本篇文章讨论的主要部分。 对于面向设计的文档管理来说,关心的是基础数据是否正确、图形文档中基本信息和数据库中的数据是否一致。本系统在使用过程中,许多产品数据是从数据库中提取,然后再添加到图形数据库中,为使产品数据库与图形数据库中的内容一致,就要求用户不能在AutoCAD中修改在图形数据库中与产品数据库必须一致的内容。而要达到这一目的,是不能靠用户的个人行为来做到的。在对AutoCAD进行操作时,由于操作者的失误,或者AutoCAD本身的不完善,很容易使一些不能修改的数据被修改和删除掉。为了防止各种错误的发生,系统要求采用设计者和其他校审用户在同一张图纸上完成设计和审校工作,同时要求设计者不能修改校审图层上的信息、校审用户不能修改设计层上的信息;对于标题栏的信息,任何操作者都不能在AutoCAD情况下对它进行修改。明细栏的信息和指引线的信息,只能通过菜单中的操作项进行操作,其他的操作都是非法。 因此,我们必须在程序中建立这种约束机制。在本系统中,我们将设计用线条信息、标题栏信息、明细栏信息、指引线和校审信息分别存入到不同的图层中,并对它们进行加锁,通过对图层加锁并禁止解锁的方法来约束用户。在这种情况下,响应器的应用就显得十分重要。 3、监控实现过程 3.1 数据交换方式简述 (1)DDE(动态数据交换,Dynanic Data Exchange) DDE主要是一个发送消息和接收消息的机制,DDE能使两个Windows应用程序通过发送或接收命令和数据进行相互之间的通信,它使应用程序之间能够实现共享数据,在远端执行命令以及检查错误状态等功能[3]。PowerBuildier 为实现DDE技术提供了相关的事件和函数,利用这些事件和函数,PowerBuildier应用程序可以向另一个支持DDE的应用程序发送消息,也可响应其他DDE应用的请求。 (2)OLE(Object Linking and Embedding, 对象链接与嵌入) OLE技术提供了一种使Windows应用程序之间共享数据和程序的机制,利用OLE技术,不同的应用可以在一个统一的界面下协调工作。Powerbuilder以OLE控件作为容器(Containter)从中调用OLE服务器应用程序来显示及操纵OLE对象[3]。Powerbuilder中OLE控件是OLE对象的容器,用户可xxOLE控件,并使用由OLE服务器应用程序提供的功能编辑其中的OLE对象。也可以通过编程xxOLE对象,并向OLE服务应用程序发送命令使OLE交互自动化。PowerScript自动化可以使用于窗口中的可视OLE控件上,也可使用于引用存储在OLEObject变量中的不可视OLE对象上,利用OLEbject数据类型,可以创建一个OLE对象,而不必为它在窗口中提供可视OLE容器。 3.2 AutoCAD 2000二次开发工具ARX接口方法简介 利用Visual C++开发AutoCAD应用程序,其接口函数使用了三个关键函数,即:InitApp()、UnloadApp()、和acrxEntryPoint()。 通过对Object ARX应用开发工具的研究知道,Object ARX与AutoCAD 2000是通过专门的接口程序来实现的,因此,通过Object ARX开发工具不能直接与PowerBuilder进行通讯。但是,可以通过在其应用程序中增加参数接收机制,通过调用ARX应用程序时向它传送参数,以实现想要的功能。如: const char *must_locklayer; //必须要加锁的图层 void NMYFWatchLayerReactor() //修改后的用户函数,可接收外部参数 { char* hline1; acedGetString(0,"\n",hline1); if(hline1!=NULL) { must_locklayer=&hline1[0]; }else return;…… } 本系统就是在PowerBuilder中调用该函数,并通过该函数接收权限代码参数的。 3.3 系统接口及数据交换技术在审批流中的具体应用 系统要求在Powerbuilder中的命令和数据能在AutoCAD 中执行和接收,并能有效传递参数。由于在Powerbuilder窗口中并非要求一定要显示AutoCAD 文件,而Powerbuilder窗口中又必须能成功地通过按扭实现打开AutoCAD文件、传递 Powerbuilder参数的功能,因此,对Powerbuilder与AutoCAD服务应用程序接口方法,系统采用非可视OLE对象方法来定制打开AutoCAD文件的行为,并控制打开文件的方法。OLEObject是一个动态的对象类型,编译程序可以接受OLEObject对象类型的任何属性名、函数名及参数列表。 使用OLEObject变量包括以下步骤 (1). 声明一个OLEObject 变量并初始化,为OLE变量分配内存空间 (2). 与服务器应用程序连接 (3). 根据需要使用服务器应用程序的属性和函数操纵该对象 OLEObject对象与AutoCAD2000服务器连接及通讯时,可利用VBA嵌入AutoCAD应用程序之中的特性,调用Active AutoMantion VBA所提供的函数为其服务。本系统采用两种方式打开文档,一种方式是用ConnectToObject函数,该函数以读写方式打开指明具体路径的文档,一般是用户以设计、校审方式打开文档,这是因为用户需要对文档进行改写操作,当系统使用该命令打开文件时,会直接调用AutCAD应用服务器,并以写方式打开文件;另一种方式是,首先启动OLE服务器然后手工确定AutCAD服务器的显示状态,然后按指定方式打开目标文件。 (4).关闭OLE对象的连接并销毁这个变量 当服务器应用程序运行结束时,就当关闭OLE对象与服务器应用程序的连接,并释放OLE对象所占用的内存空间。 (5).重要命令“SendCommand”的使用 “SendCommand”是一个非常重要的AuotoCAD服务器应用程序命令,通过这个命令可以操纵AutCAD的任何命令。在使用SendComand命令时,应特别注意,如果使用ConnectToObject命令连接服务器应用程序,直接用: ole.Sendcommand() 但如果用ConnectToNewobject()命令直接打开某一文件,则要使用: ole.ActiveDocument.SendCommand() 这是因为,使用ConnectToObject命令连接服务器应用程序时,AutoCAD已打开了一文档并自动将其xx;而用ConnectToNewobject()命令连接服务器应用程序时,其只是首先连接上了服务器应用程序,而未将相关文档xx,因此必须加上“ActiveDocument”以xx目标文档。 但是用SendCommand 直接调用AutoCAD命令时,要注意到这是一条典型的VBA命令,但Powerbuilder中却未发现该命令,在Powerbuilder中调用该命令时,其语法格式要作调整。 在VBA中SendCommand命令格式的原型是: object.SendCommand(Command) 在Powerbuilder中,该命令的格式却是: object.SendCommand(“Command”) 并且在调用时要做一些改动。 在VB应用程序中用SendCommand发送画圆命令至AutoCAD命令行用法如下: ThisDrawing.SendCommand "_Circle" & vbCr & "2,2,0" & vbCr & "4" & vbCr 用vbCr表示在命令行中敲入了一个回车键。 由于VBA是直接嵌入到AutoCAD中的,它调用AutoCAD 时,只要按照语法规则加入合适的控制码就可实现想要的语法功能。 Powerbuilder中直接调用AutoCAD 命令不一样,它直接采用如下语法格式来调用AutoCAD命令: OLE控件.ActireDocument.SendCommand(“命令及参数列表”) 例如:画一个圆: OLE1. ActiveDocument SendCommand(“-Cirde 0,2,3 4 ”) 我们可以对比一下VBA的情况: ThisDrawing.SendCommand “-Cirde2,2,3,4空格” 可以发现这两种语法不同之处:在Powerbuilder中调用须增加一对括号。 使用时为了可靠调用,语句中须增加ActiveDocument。 3.4 Powerbuilder加载AutoCAD应用程序的过程 在Powerbuilder中加载AutoCDA应用程序,却不能用以上语法来加载即: OLE ActiveDocament SendCommand(“arx l D:\Myarx\Myarx,arx ”) 这是因为当输入{zh1}一个参数时,空格不能认为是回车键。但是,可以利用在AutoCAD中用的“Command”指令一次性输完命令和参数的方法来加载应用程序: OLE ActiveDocament SendCommand (‘(command "arx" "l" & "D:\\LAYERCONTRL\\layermena\\Debug\\LOCKLAYER.arx") ’) 可以看出,这一段语法命令及参数列表可以理解为: String tempref Tempref=‘(command "arx" "l" & "D:\\LAYERCONTRL\\layermena\\Debug\\LOCKLAYER.arx") ’ ole.SendCommand(tempref) 经过测试,如果参数"D:\\LAYERCONTRL\\layermena\\Debug\\LOCKLAYER.arx" 写成 "D:\LAYERCONTRL\layermena\Debug\LOCKLAYER.arx" 则在AutoCAD命令行参数输入栏会显示为: "D:LAYERCONTRLlayermenaDebugLOCKLAYER.arx" 系统找不到文件。这是因为在VB中反斜杠“\”是控制符,只有成对出现才会表示为文件路径中的“\”。 这样,通过在PowerBuilder中动态加载AutoCAD的ARX程序就可全程监控用户所有操作行为。 正确加载应用程序后就可实现要进行的操作。如执行自行开发的应用程序中的创建新图层、指定颜色、线宽: contact_ltr.ActiveDocument.SendCommand("createnewlayer 校对层 5 1 ") 3.5 审批流中响应器的运用及要注意的方面 本系统利用图层加载响应器实现对参数、设计信息、校对信息、标检信息、审查信息、审定信息、工艺审查信息的隔离保护。将所要保护的信息放在相应图层,并加载图层禁锁响应器,使用户不能在AutoCAD下手工解锁图层。通过程序控制,系统可将产品数据库中的信息传送到AutoCAD图纸中的相应图层,然后再加锁。 AutoCAD要知道在什么样的情况下才能对相应的图层进行加锁,并怎样才能正确锁定目标图层。这就要通过从PowerBuilder应用程序中传递过来的参数信息,以对相应目标图层加锁。ARX应用程序通过接收这一参数,并通知图层状态监视器,监视目标图层状态。 在arx程序中,需要设置一些参数,当系统检索到的图层与用户要求加锁的图层相一致时,就将其加锁,当用户打开了图层,不管其是否对图层进行了修改,创建新层操作系统都会进行一次检索,并将规定图层加锁。 执行以下语句就可将明细栏、审定层、校对层、审查层、标准化层加锁: //加载图层响应器应用程序 contact_ltr.ActiveDocument.SendCommand(‘(command "arx" "l" & "D:\\LAYERCONTRL\\layermena\\Debug\\LOCKLAYER.arx") ’) 其中“LOCKLAYER”为用ARX开发的加载图层响应器应用程序,“addlocklayerReactor”为图层加锁响应器程序。 将所有图层解锁的语法为: contact_ltr.ActiveDocument.SendCommand("addlocklayerReactor ") 将校对层解锁的语法为: contact_ltr.ActiveDocument.SendCommand("addlocklayerReactor& 审定层+明细栏层+审查层+标准化层 ") 在AutoCAD新建或打开一张设计图时,无论该设计图有无设计对象,对该图形对象来说,它都有一个永远不能被删除、也不能被改名的图层——“0”层,本系统就是在“0”层加载图层响应器,以监视目标图层是否已被非法修改。 当用户想将锁定图层解锁时,他必须打开图层表进行操作,由于在“0”层上加载了图层响应器,该响应器就会监视“0”层的工作状态。一旦“0”层被打开,就会触发OpenForModify函数;或者“0 |