您的位置:网站首页 > CAD新闻

CAD二次开发及其在矿山测绘工程中的应用

时间:2011-02-25 10:06:25 来源:

  l 前言

  随着科学技术的发展,计算机技术已不仅仅应用于科学计算,已逐渐发展成为和许多科学技术部门建立各不相同的计算机辅助系统(Computer Aided Design,简称CAD)。目前,CAD技术的应用大致可以分为两大应用领域:一类是产品设计,如飞机、汽车、船舶、机械、电子产品;另一类是工程设计,如土木、建筑、水利、矿山、铁路、石油、化工等各种类型的工程。CAD技术在产品设计领域的发展尤为迅速,已经证明在采矿设计中引进CAD技术无论计算、绘图,质量还是速度都使设计工作上一个台阶。

  但是,目前各设计部门大多只能应用AutoCAD软件包,工程设计人员大部分时间花费在繁琐的计算、绘图中,大部分设计人员尚不能对AutoCAD进行开发,对引进的CAD软件进行修改,编制出一些实用的小软件。笔者以开发“测量绘图系统”软件为例,简单介绍了AutoLISP在开发测绘工程CAD方面的应用,供工程设计人员在AutoCAD二次开发中作为参考。

  2 AutoLISP语言简介

  LISP语言是List Processing language的缩写,它产生于20世纪50年代后期,是一种资格最老的程序设计语言之一。AutoLISP是嵌入在AutoCAD内部的LISP语言,该语言可以给AutoCAD系统增添以高级语言编写程序的能力,而且非常适合于图形的应用。

  2.1 源程序编辑

  AutoLISP程序文件代码实际上是以ASCII文本文件的格式存储的,其文件名的扩展名是木.LSP或幸.MNL,因此,AutoLISP的程序文件可以采用任何一种文本编辑软件来编写,如:EDIT、wPS、WORD等。

  2.2 语法结构

  AutoLISP语言书写指令所用的语法结构与普通的口语化语言相比要简单得多,但限制却相当严格,几乎不能有丝毫的疏忽。

  2.3 程序加载

  尽管AutoLISP代码可以使用键盘录入到命令行上,但通常这只是调试程序的一种辅助手段。对于实用的AutoLISP程序,就需要将它编排成一个文本文件,然后从AutoCAD编辑器环境把它加载到内存,进行测试和排错,最后形成一个可重复使用的AutoLISP程序。可以使用LOAD函数在命令行加载,也可在ACAD.LSP文件中定义,以使每次启动AutoCAD时自动加载。

  2.4 程序运行

  如果程序文件中定义了一个形如C:XXX的函数,那么就能在COMMAND:提示符下通过键入该函数全名来运行该函数,就像执行标准的内建式AutoCAD命令一样。

  过去的AutoCAD版使用的AutoLISP至多只能使用45K内存,因此,在使用上常常会遇到结点空间不够的情况,而且运行速度很慢,影响处理工作。AutoCAD从R9版起提供了扩充AutoLISP功能,可使用计算机的全部扩充内存,最多可达14M。

  拥有比原先大得多的工作空间运行AutoLISP大程序,并将腾出45K空间分给AutoCAD作为1/O分页存取作业之用,使内存与硬盘的交换次数减少而加快处理速度。

  3 AutoLISP语言在开发矿山测绘工程CAD方面的应用

  AutoLISP语言提供了各种数据类型、预定义函数、特殊功能,可自动生成SCR接口文件,利用输入输出功能,读写函数实现与高级语言的数据交换。在AutoLISP语言编辑中,增加了AutoCAD绘图命令,是设计和绘图溶为一体,将求值器、运算程序直接装入源程序,实现对当前数据库的直接访问和修改,对屏幕图形的适时修改,实现交互设计,为在绘图领域中应用人工智能提供了方便。

  AutoCAD从R12版开始,引入了可编程对话框(Programmable Dialog Box,简称PDB),改进了图形用户接口(Graphics Users Interface,简称GUI),使用户能够更加容易、直观地进行操作。通过一些简单的手段,用户便可以创建自己的对话框,从而为操作提供了一个友好的图形界面。

  创建一个对话框至少要两种不同的语言来编写两个程序段。一个是对话框控制语言(Dialog Cont101Language,简称DCL)编制的对话框定义程序;另一个是用AutoLISP语言或ADS编写的对话框驱动程序,文中采用的是AutoLISP语言。DCL文件是一个ASCII文本文件,用来定义对话框中的各种元素及其排列方式,如果用户不指定元素的大小,AutoCAD会根据各平台的现状为元素设置一个缺省的值。对话框驱动程序能够为对话框提供一个操作主控制函数,用于启动对话框并控制流程的运行。以“测量绘图系统”软件开发的部分源程序为例,对AutoLISP语言在开发中的应用以及DCL文件的结构和语法进行简单陈述。

  3.1 对话框定义程序

  //;;;一一一一一一一一一一一一

  //;;;文件名:CLCAD.DCL

  //;;;功能:定义测绘工程CAD主菜单的各种控

  件及排列

  //;;;时间:2005年12月

  //;;;一一一一一一一一一一一一

  clcadss//对话框名

  :dialog//对话框开始

  fixed—width=true;//指定控件的宽度保持固定

  width=45;//指定控件的宽度为45个字符

  alignment=centered;//本簇中控件中心对齐

  //对话框的标题

  label=”测量绘图系统(开敞式)V1.0”

  :boxed.IOW{//定义一个加框行

  children.alignment=centered;//所有子控件中心对齐

  initial.focus=qx"//光标初始定位为“LX”控件

  :retirment.butto^a{//定义一个按钮

  key="Ix”;//该控件标识号为“Lx”

  label=”展点”;//该控件的文本标题

  }//一个控件定义结束

  }//加框行定义结束

  :column{//定义一个空白列

  fixed.width=true;//指定控件的宽度保持固定

  fixed.height=true;//指定控件的高度保持固定

  height=13;//指定控件的高度为45个字符

  }//空白列定义结束

  :text{//定义一个控件

  key="textl”;//该控件标识号为“textl”

  label=”此处显示出错信息!W该控件的文本标题

  }//控件定义结束

  ok.cancel.help;//选用标准“OK-取消一帮助”控件

  }//对话框定义结束

  3.2 对话框驱动程序

  ;;;一一一一一一一一一一一一

  ;;;文件名:coordin.LSP

  ;;;功能:调用测量绘图系统主菜单

  ;;;时间:2005年12月

  ;;;一一一一一一一一一一一一

  ;;;定义一个函数,函数名为C:clcad

  (defun c:clcad()

  ;;;JJo载DCL文件

  (if;︱if1︳;(and(not dcl-id)(<(setq dcl·id(10addialog”

  C:/acadwin/clcad.dcl”))O))(exit));endifl

  ;;;激活出对话框

  (if;︱if2︳;(not new—dialog”clcadss”dcl—id))(exit);endif2

  (setq what—next 4)

  (while(<2 what—next);设置循环

  (action—tile“lx”(C:lx)”);接受在lx按钮上的操作

  (action—tile“jkd(C:jkd)”);接受在jkd按钮上的操作

  (action-tile”zhsh””(e:zhsh)”);接受在zhsh按钮上的操作

  (action-tile”ckd””(C:ckd)”);接受在ckd按钮上的

  操作

  (action-tile”fd”~(c:fd)”);接受在fd按钮上的操作

  (action-tile“output”(c:output)”);接受在output按钮上的操作

  (action·tile”accept””(done—dialog 1)”);接受在OK按钮上的操作

  (action—tile”help””(done-dialog 3)”);接受在HELP按钮上的操作

  (setq what next(start-dialog));启动对话框

  (cond

  ((=what-next 1)

  (c:jkdlIshr) 。

  (setq what—next 4)

  (if(not(new-dialog1"clcadss"dcl—id))(exit)))

  ((=what.next 3)

  (C:help)

  (setq what-next 4)

  (if(not(new—dialog“clcadss”dcl—id))(exit)))

  );cond

  );while

  (unload·dialog dcl—id);卸载DCL文件

  (princ)

  );defun;函数结束

  ;;;一一一一一一一

  4 结语

  上述源程序仅是“测量绘图系统”软件的主菜单调用情况,内部功能函数的实现尚有许多内容,在此不一一赘述了。以上为笔者在开发过程中的点滴体会,仅供工程设计人员参考,希望能起到抛砖引玉的作用。