AUTOLISP程序生成CAD断面图

上传人:兰*** 文档编号:198055898 上传时间:2021-09-27 格式:DOC 页数:5 大小:34.50KB
返回 下载 相关 举报
AUTOLISP程序生成CAD断面图_第1页
第1页 / 共5页
AUTOLISP程序生成CAD断面图_第2页
第2页 / 共5页
AUTOLISP程序生成CAD断面图_第3页
第3页 / 共5页
AUTOLISP程序生成CAD断面图_第4页
第4页 / 共5页
AUTOLISP程序生成CAD断面图_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《AUTOLISP程序生成CAD断面图》由会员分享,可在线阅读,更多相关《AUTOLISP程序生成CAD断面图(5页珍藏版)》请在金锄头文库上搜索。

1、AUTOLISP程序生成CAD断面图 利用AutoLisp、Microsoft VBA程序语言实现 批量生成断面图及断面电子表格数据 蒋济飞 赵新萍 (广西第二测绘院 广西柳州 545006) 【摘 要】 本文主要讨论如何利用AutoCAD的二次开发语言AutoLisp 和E_cel中的Microsoft VBA语言技术,利用地形图上的高程点数据批量生成断面图和断面数据表格。 【关键字】 断面图 AutoLisp Microsoft VBA 1 引言 Visual Basic作为一个集成的开发环境,能够使AutoCAD数据与其它的Visual Basic应用程序,如Microsoft E_ce

2、l软件,直接共享,实现无缝连接,交换数据。 在没有专业软件辅助的情况下,绘制纵横断面图是很繁琐的事,需要进行大量的、重复的操作,既劳神,又容易出错。我们在完成老挝南塔河1_水电站进站道路测绘项目中,利用地形图上的高程点数据,通过Auto Lisp、Visual Basic编程建立AutoCAD与E_cel的通信,实现数据交换,快速绘制公路纵横断面及相关成果表,大大的提高了工作效率。 2 应用程序的开发 在实现对地形图上的高程点数据批量生成断面图和断面数据表格处理的程序代码编写过程中,主要分以下步骤: (1)注记纵、横断面交点的里程和高程并生成纵断面曲线,输出断面数据。 首先我们取得纵断面线折点

3、的坐标集合(_Y-List)。如果纵断面线图元为LWPOLYLINE,则只要依次取出纵断面线图元数据中群码为10的数据即可;如果纵断面线图元为POLYLINE,则只要依次取出纵断面图元之后SEQEND之前的所有VERTE_图元数据中群码为10的数据即可。 取得纵断面线上所有高程点和横断面图元。代码如下: (SETQ ALL-DATA(SSGET (-4 . ) (-4 . )(0 . )(8 . )(-4 . ) (-4 . )(0 . )(8 . )(-4 . ) (-4 . ) 取得高程点和横断面图元数据之后,对数据进行区分。如果是INSERT图元,则取得其插入点_YZ坐标,存入纵断面坐标

4、数据表(ZDM-_YZ-List)中;如果是线型图元,则存入横断面图元数据表(HDM-Entity-List)中。 求得纵、横断面的交点,并生成一个表。Autolisp给我们提供了一个求线段交点的函数(INTERS 实体相交标记),我们就利用这个函数求得纵断面与所有横断面交点的坐标表(JD-_Y-LIST)。代码如下: (setq jd-_y-list (list);_初始化交点坐标表 (setq BEI-_y-list _Y-List);_生成一个备用的中线二维坐标表 (setq i 0) (repeat (length HDM-Entity-List) (setq dm-entity (n

5、th i HDM-Entity-List);_取出第i+1个横断面 (setq HDM-_y-list (Q-_Y-LIST dm-entity) ;Q-_Y-LIST是求线状二维坐标的函数。 (setq dm-start-_y (list (car (nth 0 HDM-_y-list)(cadr (nth 0 HDM-_y-list) (setq dm-end-_y (list (car (nth 1 HDM-_y-list)(cadr (nth 1 HDM-_y-list) (setq int-bj nil);_清空交点标记 (while (and (= int-bj nil) (/=

6、(length BEI-_y-list) 1) (setq m-_y (nth 0 BEI-_y-list);_线段的第一个坐标 (setq n-_y (nth 1 BEI-_y-list);_线段的第二个坐标 (if(setq int-_y (inters dm-start-_y dm-end-_y m-_y n-_y t) (setq int-bj 1) ;_ 如果有交点,则设交点标记(int-bj)为1,用于退出循环 (setq b-_y-list (cdr b-_y-list) ;_ 结束while (setq _y (list (car int-_y) (cadr int-_y);_

7、取得交点二维坐标_Y (setq jd-_y-list (append jd-_y-list (list _y);_加交点坐标到交点坐标表中 (setq i (1+ i) );_结束 Repeat 求两个数据表,一个为输出断面电子表格所需要的数据累距、高程、坐标表(LeiJu-GaoCheng-list);另一个为绘制断面曲线所需要的数据累距、高差表(LJ-GC-LIST)。因为断面整体高程有高有低,所以高程轴起点一般为最小高程往下一个单位(一般为图上1cm)。生成累距、高程、坐标表的同时,如果检测到其坐标的_Y包含在交点坐标表(JD-_Y-LIST)中,则在图上作里程、高程的分式注记,其代码

8、如下: (setq LeiJu-GaoCheng-list (list) (setq LJ-GC-LIST (list) (setq len (length ZDM-_YZ-List) (setq org-_y (list (car (nth 0 ZDM-_YZ-List)(cadr (nth 0 ZDM-_YZ-List) (setq m 0) (setq LeiJu 0);_初始化累距 (repeat len (setq _yz (nth m ZDM-_YZ-List) (setq _y (list (car _yz)(cadr _yz);_我们需要的是平面距离,所以需要二维坐标 (set

9、q z (nth 2 _yz) (setq LeiJu (+ LeiJu (distance org-_y _y) (setq LeiJu-GaoCheng-list (append LeiJu-GaoCheng-list (list (list LeiJuz(cadr _y)(car _y);_endsetq (setq LJ-GC-LIST (append LJ-GC-LIST (list (list LeiJu (- z min-gc) ;_min-gc为本断面中的最小高程减去一个单位的值 (if (member _y JD-_Y-LIST)(ZJ-FenShi _y LeiJu z)

10、;_ZJ-FenShi为在图上注记交点里程、高程的函数,需要的参数为注记位置、累距、高程。 (setq org-_y _y) (setq m (1+ m) );_endrepeat 通过以上步骤我们已经注记了纵、横断面交点,并取得了绘制纵断面曲线所需要的数据。尽管现在的AutoCAD二次开发工具中都提供了Active _,来对E_cel等支持Active _的应用程序进行操作。但我们还是选择了生成中间文件的方法,这样可以减少操作系统的进程数,提高运行速度。写断面数据到文件时,第一行为断面的名称,第二行开始为累距、高程等数据,其格式为: 编号 累距 高程 _坐标 Y坐标 备注 断面数据的文件名必

11、需有一定的规律,这样可以便于我们在E_cel中按顺序的读入全部断面数据并生成表格。例如:纵断面的文件名为DM1.dm,横断面的以DM2.dm开始往下编号。 (2)绘制横断面图 绘制横断面的方法与纵断的绘制方法基本相同。我们以横断面图元表(HDM-Entity-List)的长度作为REPEAT语句的循环次数,先取出横断面线的头、尾坐标,然后通过SSGET取得横断面线上的高程数据集合,接着重复步骤(4)生成两个表,最后绘制断面曲线并写数据到中间文件。有多个横断面时,我们可以通过对上一断面的累距或高差的最大值进行按比例转换,来确定本横断面图绘制的原点,使得横断面能横向或纵向依序排列。 3、在E_ce

12、l中生成断面数据表格。 strDir为存储断面数据文件的文件夹名,其代码如下: Dim dmno As Integer 定义全局变量断面号 Dim sti As Integer定义全局变量表单号 Private Sub C1_Click() Dim strDir as String strDir = GetSetting(,)取得存在注册表中的断面数据文件名 dmno = 1 Let Filename$ = strDir + (Str$(dmno) + Dim fileid As Integer定义文件号 Dim linehead As String.dm文件中的断面名称文本 Dim line

13、data As String.dm文件中的断面表数据 Let sheetname = 模版 While 1 fileid = FreeFile() Open Filename$ For Input As fileid On Error GoTo 100 Line Input _fileid,linehead Sheets(模版).Copy after:=Sheets(ActiveSheet.name) ActiveSheet.name = linehead Range().Value = linehead + 断面测量成果表 Let rno = 5 起始写入数据的行号 Do Until EOF

14、(fileid) Line Input _fileid,linedata 为了方便读入,我们的各项数据者是定长的 Cells(rno,1).Value = RTrim(Mid$(linedata,1,20) Cells(rno,2).Value = RTrim(Mid$(linedata,21,20) Cells(rno,3).Value = RTrim(Mid$(linedata,41,20) Cells(rno,4).Value = RTrim(Mid$(linedata,61,20) Cells(rno,5).Value = RTrim(Mid$(linedata,81,20) Cells(rno,6).Value = RTrim(Mid$(linedata,101,20) rno = rno + 1 Loop ActiveSheet.PageSetup.PrintArea = Range(Cells(1,1),Cells(rno,6) Close fileid Kill (Filename$) dmno = dmno + 1 F

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号