广东电力设计院(510600) 黎罡辉
目前,计算机已广泛应用于工程设计,所以工程图纸的复用及图档的计算机管理越来越受到广大用户重视。工程图档管理系统对工程图纸管理现代化起着重大作用,为广大工程设计人员提供了检索、查询和调用的方便。图纸的图形文件预览显示是图档管理系统的重要功能之一,那么如何在Foxpro for Win中显示工程图纸如DWG、TIF等格式的图形文件呢?下面就这方面谈谈笔者的一些做法。
在Windows环境下,许多应用程序之间都可以通过剪切板(Clipboard)、动态链接库(DLL)、动态数据交换(DDE)这三种方式进行数据通信。其中,动态数据交换(DDE)是Windows下应用程序之间进行通信的一种方式,由于DDE具有实时地进行通信的特点,因而已成为Windows下应用程序间相互进行通信时常用的技术手段。以下是笔者在用Foxprow编写的工程图档管理系统的程序中,利用DDE技术直接控制CAD Overlay ESP工作,以预览显示工程图纸的图形的实际应用。
在实际应用中笔者选用了CAD Overlay ESP软件来显示图形文件。众所周知,Foxprow和AutoCAD在数据库管理和CAD应用方面作用非常大。而CAD Overlay ESP是1987年Image Systems公司第一个将扫描的光栅图形集成在AutoCAD中的应用软件,而后,Autodesk公司将CAD Overlay ESP选为AutoCAD中解决扫描图形处理的方案,Image Systems成为AutoCAD解决扫描图形处理问题的唯一策略性开发者。
CADOverlay ESP(以下简称ESP)为显示光栅图形、矢量化光栅、修改和擦除光栅、矢量和光栅混合输出提供了很强的功能,由于ESP是基于AutoCAD的应用软件,所以AutoCAD命令在ESP中完全有效。扫描产生的光栅图形在ESP中经过修改(包括光栅编辑、部分矢量化等)后,可以单独保存栅图形或者矢量图形,也可以两者混合保存。ESP大大提高了扫描旧图的利用率。由此,利用ESP,我们可以直接显示工程设计中出现的AutoCAD的矢量图形DWG格式和ESP产生的TIF、DWG的叠加复合图形文件以及扫描仪产生的光栅图形TIF格式等多种格式的图形文件。而DDE技术为我们将Foxprow与ESP两者的集成应用提供了有效的实现途径。
本例仅涉及以下三个有关DDE函数和利用Autolisp语言写成的调用函数。
1)DDEinitiate():程序中iChannel=DDEInitiate("autocad.dde","System")一行是以AutoCAD ,DDE为应用(这是AutoCAD中标准的DDE应用标志,也是CAD Overlay ESP的DDE应用标志)并以system为主题,初始化一条与CAD Overlay ESP的对话链,iChannel为返回的通道号;
2)DDEexecute():程序中的DDEexecute()各行完成发送AutoCAD及ESP命令或是AUTOLISP编写的命令语句,其作用如同用户在CAD Overlay ESP命令提示下通过键盘输入或鼠标选择一样;
3)DDEterminate()函数用于关闭通道。
下面是Foxprow中利用DDE的程序片段,例中定义了两个功能按钮,分别是显示图形和退出。
PARAMETERS uswjm0,cadesp &&传送查询结果的图形文件名,ESP执行程序的路径。
#REGION 1
private iChannel &&定义通道号参数
ichannel=-1 &&通道号赋值,-1表示没有建立连接
…
#REGION 0
REGIONAL m.currarea,m.talkstat,m.compstat
IF SET("TALK")="ON"
SET TALK OFF
m.tallstat="ON"
ELSE
m.talkstat="OFF"
ENDIF
m.compstat=SET("COMPATIBLE")
SET COMPATIBLE FOXPLUS
m.rborder=SET("READBORDER")
SET READBORDER ON
m.currarea=SELECT()
IF NOT WEXIST("_rktowkicm")
DEFINE WINDOW_rkt0wkicm;
AT3.944,0.625;
SIZE 18.882,77.000;
TITLE"查询结果图形显示";
FONT"宋体",11;
NOFLOAT;
NOCLOSE;
NOMINIMIZE;
DOUBLE;
COLOR RGB(,,,0,128,128)
ENDIF
#REGION 1
IF WVISIBLE("_rkt0wkicm")
ACTIVATE WINDOWS _rkt0whicm SAME
ELSE
ACTIVATE WINDOWS _rkt0whicm NOSHOW
ENDIF
@14.118,6.375 to 17.647,75.625
PATTERN 1;
PEN 1,8;
COLOR RGB(255,255,255,0,128,128)
@14.176,6.055 to 17.764,75.750;
PEN 1,8
@14.941,18.125 GET m.xstz;
PICTURE "@HN\<X-显示图纸";
SIZE 1.938,9.714,0.571;
DEFAULT 1;
FONT"MS Sans Serif",10;
VALID-rkt0wkiic()
@15.059,49.250 GET M.EXIT;
PICTURE"@*HN\!\<E-退出";
SIZE 2.154,11.167,0.500;
DEFAULT 1;
FONT"Fixedsys",8;
VALID_rkt0wkijc()
IF NOT WVISIBLE("_rkt0wkicm")
ACTIVATE WINDOW_rkt0wkicm
ENDIF
READ CYCLE
RELEASE WINDOWS_rkt0wkicm
SELECT(m.curratea)
#REGION 0
SET READBOROER &rborder
IF m.talkstat="ON"
SET TALK ON
ENDIF
IF m.compstat="ON"
SET COMPATIBLE ON
ENDIF
#REGION 1
procedure iDone &&利用DDE技术控制ESP显示图形文件程序段
parameter uswjm0,cadesp &&传递图形文件名,ESP执行程序名
if file('&cadesp') &&建立Foxprow与CAD Overlay ESP的连接关系
if ichannel=-1 &&通道号为-1时表示没有建立连接
run/n1 &cadesp &&必须首先确保ESP在运行
iChannel=DDEInitiate("autocad.dde","System"&&得到DDE数据传输通道号
endif
else
wait wind‘请在系统设置中指出ESP的正确路径!"timeout 2
retu.f.
endif
if ichannel<>-1 &&通道号为正数时表示连接已被建立,可传输数据
=DDEExecute(iChannel,'[(load"chk_tx")]' &&调用chk_cx函数
=DDEExecute(iChannel,'[(chk_tx"&uswjm0")]' ) &&利用chk_cx函数打开图形文件
=DDEExecute(iChannel,'[(load"inittk")]' &&inittk函数,用以屏蔽ESP中的一些存盘、修改编辑功能,使图形仅作查询预览。
endif
retu.t.
FUNCTION_rtk0wkiic
&&显示图形#REGION 1
do iDone with uswjm0,cadesp&&执行显示图形文件的程序段retu.t.
FUNCTION_rkt0wkijc
&&退出#REGION 1
if ichannel<>-1
=DDEExecute(iChannel,'[._quit]') &&关闭通道前,先退出ESP
=DDETerminate(iChannel) &&DDETerminate关闭通道,终止连接endif
CLEA READ
RETUR
例中使用了用AUTOLISP语言编写的函数chk_cx,用以调阅不同格式的图形文件(DWG,TIF,DWG与TIF的复合叠加图):AUTOLISP函数inittk用以屏蔽ESP中的一些编辑图形文件的命令,如存盘、删除等,使图形仅供浏览,不可编辑,以增加档案管理的保密性和安全性。这里将函数编码给出,供读者参考。
chk_cx函数编码如下:
(defun chk_tx(name); s1 s2 i chg)
(setq i(strlen name))
(setq s1(substr name 1(-i 4)))
(setq s2(substr name(-1 2))
(setq s2(strcase S2))
(if(null(findfile(strcat s1".dwk"))) &&判断文件是否已被别的用户打开
(progn
(setq chg(getvar"dbmod"))
(cond
((or(=s2"DWG")(=s2 "TIF"))
(progn
(if(=chg 0)
(command"open"s1) &&打开DWG及混合格式图形文件
(command"open""y"s1) &&打开TIF格式图形文件
) ) ) (T(progn
(alert(strcat"文件"name"不能被CAD Overlay ESP所打开!"))
(setq ans 0))
DDE实现Foxpro W图形文件的显示
) ) ) (alert(strcat"文件"name"被其他用户锁定!"))
)
(princ)
)
chk_cx函数主要是从Foxprow程序查询结果中获取图形文件的文件名,判断文件的格式并 打开该图形文件,或提示该图形文件的格式不能被ESP所打开。同时,也判断文件是否已被别的用户打开,这是考虑到网络数据共享时可能发生的问题,在实际应用中笔者采取将服务器中共享的图形文件拷贝到用户本地工作站上之后再调用该函数,从而避免了文件共享时产生冲突的问题,关闭该文件后再从工作站上删除掉即可。
inittk函数编码如下:
(command"UNDEFINE""END"
"UNDEFINE""QUIT"
"UNDEFINE""SAVE"
"UNDEFINE""SAVEAS"
"UNDEFINE""_QSAVE"
"UNDEFINE""MENU"
)
(defun quit()(command"point"'(0 0 0))(command".quit""y"))
(defun c:save()(quit))
(defun c:end()(quit))
(defun c:quit()(quit))
(defun c:_qsave()(quit))
(dcommand"zoom""e")
inittk函数屏蔽对图形文件有编辑存盘的功能,对档案文件的安全起到一定的保护作用 ,并将文件的全部图形显示在对话框中。
1.图形文件的文件名由查询结果获取,这里采用参数传递。图形文件若是矢量和光栅
复合叠加图,需给出DWG后缀的文件名。
2.这里运行ESP需指明路径,如ESP为网络版本,路径统一,便可直接给出;若ESP为单
机版本,则需随机而定,可增加一ESP路径的设置程序,通过参数传递来执行ESP程序。笔者的应用属后一种情况。
3.关闭DDE通道可以放在该调阅屏幕退出时,这样可以在通道未断开前,不断进行数据
传输,多次打开图形文件。
4.本例中的程序在Foxpro 2.x for Windows中运行通过。