找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3390|回复: 3

[AutoCAD] 通过dde实现vb对autocad绘图的控制 

[复制链接]

23

主题

22

回帖

383

积分

机械村良民

UID
878
威望
0
机械币
74
活力
-10
发表于 2015-3-8 11:08:58 | 显示全部楼层 |阅读模式
通过dde实现vb对autocad绘图的控制  
 
吴春红  
 
做cad开发的软件工作者都知道,利用autolisp语言基本能实现各种自动绘图的功能,但autolisp在界面处理及数据库的连接方面功能不强。  
而visualbasic(简称vb)编程在这方面却有很大的优势。丰富的控件(control)和大量的函数使vb能通过简单的语言实现强大的功能。特别是对数据库的查询、修改上,在vb中更是方便。并且vb能直接调用多种数据库如foxpro,access,orcale等。同时,vb可以调用s的api函数,也可以与c语言编
写的程序相互调用。  
autocad支持动态数据交换dde()。通过dde,可以将图形的数据从autocad送到
其他windows应用软件中,也可以从其他windows应用软件中得到数据用以修改图表。autocadr12.0forwindows在windwos环境上运行,能与用vb编写的软件交互进行dde动态数据交换。在开发autocad软件时,可通过dde实现vb对autocad绘图的控制,使用vb编程使软件界面更友善,功能更强大。  
 
下面是一个例子,通过vb对数据库的数据进行输入、输出、修改处理,同时将相关的内容在autocad工程图纸上自动生成和修改相应的图表。  
这里谈谈如何实现vb和autocad的动态数据交换dde及其遇到的一些问题。    
一、在运行vb应用程序前,必须先加载(load)与dde有关的函数。(如:本例中后面用到的ads-putsym()函数、ads-getsym()函数等),以便vb调用这些函数进行数据传送,这些函数通过运行ddelsp.exe、ddebas.exe来加载(用(load"dde")、(xload"ddebas”)命令实现)。另外,用于用户编辑图形编写的自定义函数在被vb调用前,应先被定义和加载。在此例中,可以把它们编写在def.lsp文件中,通过(load"def”)将其加载,以备vb调用。  
在autocad中实现的方法如下:  
首先,在acad.lsp文件中加入以下两句:  
(load″dde″);ddelisp.exewillbexloadedby  
  dde.lsp  
(load″def″);loaddef.lsp  
用户进入autocad时,自动执行acad.lsp中的命令。第一句加载dde.lsp使其执行ddelisp.exe,autocad可接受与其它软件进行动态数据交换。

23

主题

22

回帖

383

积分

机械村良民

UID
878
威望
0
机械币
74
活力
-10
 楼主| 发表于 2015-3-8 11:09:51 | 显示全部楼层
第二句加载def.lsp程序。def.lsp文件是为编辑图形而专门编写的程序,在后面vb调用autocad的自定义的函数,均在def.lsp程序中被定义和加载。例如,在文件def.lsp中定义了函数c:edit-head(),用于编辑修改图纸目录表表头的文字  
定义了lisp函数后,vb直接通过发送命令c:edit-head(n)到autocad(利用linkexecute方法实现命令发送),就能修改表头中第n个填空的文字。文字的内容由“text-line”变量送到函数中(通过ads-putsym()函数实现)。  
下面是def.lsp程序的部分编码:  
  (defunc:edit-head(index-number)  
  ;定义编辑修改表头的文字的函数  
  ;index-number是函数的参数,为数字变量,代表  
  ;填写的位置。由此得到文字写入的坐标position。  
  (princ″ιn程序正在运行,请等待……)  
  ………  
  (command″text″″c″positionsize″0″text-line)  
  ;把“text-line”的内容写入    ……  
  (princ-ιn程序结束ιn-)  
  );endofdefunofedit-head    

二、在vb编写程序时的实现方法是:  
在acadwinιvbιasvu目录下,将文件global.bas,.bas,adsfuncs.frm拷贝过来,并加入到当前用vb编写程序的项目(project)中。这三个文件是autodesk公司提供的,含有vb与autocad接口的vb函数和变量定义。  
  form-load()程序中加入以下一段程序,用以连通动态数据交换通道:  
  subform-load()

23

主题

22

回帖

383

积分

机械村良民

UID
878
威望
0
机械币
74
活力
-10
 楼主| 发表于 2015-3-8 11:10:04 | 显示全部楼层
iffindacad()Κ0then′检查是否已运行acad.exe  
  magbox″autocad未运行,请先运行autocadforwin!″    else  
  linkappacadtext,″autocad.ddel″,″system″  
  ′使控件acadtext与autocad连接  
  com$Κ″(xload″+chr(34)+″ddebas″+chr(34)+″)″  
  ′将命令行内容赋值给字符串com$  
  acatext.linkexecutecom$′通过linkexecute方法,向autocad发送命令行加载ddebas的函数  
  dde-timeoutΚ-1  
  opendde    ……  
  endif  
  endsub  
  前面首先用findacad()函数检查是否已运行,然后利用adsfuncs.frm中的acadtext文本框
构件对autocad进行连接。执行opendde后,动态数据交换通道已连通。 
 
  下面是在vb中,通过动态数据交换与autocad通讯的一些例子:  
  ′下面程序将文字传送到autocad的“ext-line”参数变量中  
  astruct.aptypeΚrtstr  
  ′说明astruct的类型是字符串(rtstr)  
  astruct.apstringΚtext1(index).text+chr$(0)  
  ′字符串的内容为控件text1(index)中的文字  
  ret%Κapndllnode(bufsend,astruct)  
  tet%Κads-putsyrn(″text-line″,bufsend)

23

主题

22

回帖

383

积分

机械村良民

UID
878
威望
0
机械币
74
活力
-10
 楼主| 发表于 2015-3-8 11:10:15 | 显示全部楼层
′通过内存缓冲区将字符串发送到autocad赋值给  
  ″text-line″变量  
  下面程序通过发送命令调用自定义函数c:edit-head(),对表头文字进行修改  
  com$Κ″(c:editμhead″+str%(index)+″)″  
  acadtext.linkexecutecom$  
  ′在autocad执行完命令后,vb提取返回的变量″page″的值  
  ret%Κads-getsym(″page″,value)  
  ret%Κads-relrb(bufsend)  
  值得一提的是,在这里笔者没有把文字字符串作为函数的参数通过发送命令直接传送到autocad中,而是通过ads-putsym将其作为autocad参数先传送。这是因为由于autocadr12.0forwindows是西文版本,字符串作为函数的参数通过发送命令直接传送到autocad时会出现丢失中文字符的现象。    
三、在运行时所必须的支持文件及其所在的目录:  
  除了所编写的vb应用程序及lisp程序放在当前的工作目录外,acadvb.dll、vbrun300.dll两个动态连接库文件必须放在windows目录下,ddebas.exe文件放在acadwin路径下。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|机械村 ( 渝ICP备17010994号-1|渝公网安备50022702001048号 )

GMT+8, 2024-11-23 10:13 , Processed in 0.019354 second(s), 5 queries , Gzip On, Redis On.

Powered by 机械村

Copyright © 2012- Jixiecun.com

快速回复 返回顶部 返回列表