分享

晓东CAD家园网 - 浅谈AutoLISP在水工CAD方面的应用

 hxj 2008-05-12
文章总数: 2630 | 本类文章(含子类): 65
浅谈AutoLISP在水工CAD方面的应用
提交日期:2003-10-23   浏览: 538

  水利科技与经济

WATER CONSERVANCY SCIENCE AND TECHNOLOGY AND ECONOMY

1999年 第5期 第1卷 Vol.5 No.1 1999

--------------------------------------------------------------------------------

浅谈AutoLISP在水工CAD方面的应用

汪恩良 张菊蓉 任树坤

[摘 要] AutoLISP语言作为嵌入在AutoCAD内部的具有智能特点的编程语言,是开发应用AutoCAD不可缺少的工具。只是大部分设计人员尚不能对AutoCAD进行二次开发,对引进的CAD软件进行修改,编制出一些实用的小软件。本文以开发“寒区水闸计算机辅助设计支持系统”软件为例,简单介绍一下AutoLISP在开发水工CAD方面的应用,供工程设计人员在AutoCAD二次开发中作为参考。

[关键词] AutoLISP 水工 CAD DCL

1 前言

  随着科学技术的发展,微型计算机在各行各业推广和应用越来越普及,计算机技术已不仅仅应用于科学计算,而且逐渐发展成为和许多科学技术部门结合起来建立各不相同的计算机辅助系统,计算机辅助设计(Computer Aided Design,简称CAD)是其中的一个分支。目前,CAD技术的应用大致可以分为两大应用领域:一类是产品设计,如飞机、汽车、船舶、机械、电子产品;另一类是工程设计,如土木、建筑、水利、矿山、铁路、石油、化工等各种类型的工程。CAD技术在产品设计领域的发展尤为迅速,现已成为这些领域研究问题的唯一手段。已经证明在水工设计中引进CAD技术无论计算、绘图都使我们的设计工作上一个台阶,无论是质量还是速度,都是令人满意的。水利部已正式要求各设计部门在2000年达到所有图纸均由计算机绘出。但是,目前各设计部门大多只能应用Auto CAD软件包,一笔一笔地绘出图形。工程设计人员大部分时间花费在繁琐的计算、绘图中,设计工作有很大的重复性。只是大部分设计人员尚不能对AutoCAD进行二次开发,对引进的CAD软件进行修改,编制出一些实用的小软件。本文以开发“寒区水闸计算机辅助设计支持系统”软件为例,简单介绍一下Auto LISP在开发水工CAD方面的应用,供工程设计人员在AutoCAD二次开发中作为参考。

2 AutoLISP语言简介

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

2.1 源程序编辑

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

2.2 语法结构

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

  ①赋值语句:

  X=2.345 (setq X 2.34)

  STR=’This is a string!’ (setq STR “This is a string!”)

  ②求值运算语句:

  E=Q÷(4.43×M×B×HO-2) (setq E(/Q( 4.43 M B (sqrt HO))))

  ③判断语句:

  如果T小于0.75执行语句1(if(

  ④循环语句:

  求100! (while(<=i 100)

(setq sum (+sum i))

(setq i(+i 1)

  ⑤输入输出语句:

  把输入的点坐标赋值给Pt (setq Pt(getpoint “To input point:”))

  输出变量X的值 (princ X)

2.3 注释方法

  ①用“;”注释,从“;”开始作用至行尾;

  ②用“;|……|;”注释,注释文本可以延续成多行。

2.4 程序加载

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

  例:COMMAND:(load“[path]<文件名>(.LSP)”)

2.5 程序运行

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

  COMMAND:(C:CSCAD)

  过去的AutoCAD版使用的AutoLISP至多只能使用45K内存,因此,它在使用上常常会遇到结点空间不够的情况,而且运行速度很慢而影响处理工作。AutoCAD从R9版起提供了扩充AutoLISP功能,它可使用计算机的全部扩充内存,最多可达14M。这样它将拥有比原先大得多得工作空间而能运行AutoLISP大程序,并将腾出45K空间分给AutoCAD作为I/O分页存取作业之用,使内存与硬盘的交换次数减少而加快处理速度。

3 AutoLISP语言在开发水工CAD方面的应用

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

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

  创建一个对话框至少要两种不同的语言来编写两个程序段。一个是对话框控制语言(Dialog Control Language,简称DCL)编制的对话框定义程序;另一个是用AutoLISP语言或ADS编写的对话框驱动程序,本文采用的是AutoLISP语言。DCL文件是一个ASCII文本文件,用来定义对话框中的各种元素及其排列方式,如果用户不指定元素的大小,AutoCAD会根据各平台的现状为元素设置一个缺省的值。对话框驱动程序能够为对话框提供一个操作主控制函数,用于启动对话框并控制流程的运行。

  本文仅以“寒区水闸计算机辅助设计支持系统”软件开发的部分源程序为例,对AutoLISP语言在开发中的应用以及DCL文件的结构和语法进行简单陈述。

3.1 对话框定义程序

//;;;— — — — — — — — — — — —

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

//;;;功 能:定义寒区水闸CAD支持系统主菜单的各种控件及排列

//;;;开发者:汪恩良(东北农业大学96级硕士研究生)

//;;;时 间:1998年5月15日—1998年11月

//;;;— — — — — — — — — — — —

cscadss           //对话框名

:dialog //对话框开始

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

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

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

//对话框的标题

label=″ 寒区水闸计算机辅助设计支持系统(开敞式) V1.0″

:boxed-row{//定义一个加框行

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

initial-focus=″lx″//光标初始定位为“LX”控件

:retirment-button{//定义一个按钮

key=″lx″;//该控件标识号为“LX”

label=″开敞闸型″;//该控件的文本标题

}//一个控件定义结束

}//加框行定义结束

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

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

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

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

}//空白列定义结束

:text{//定义一个控件

key=″text1″;//该控件标识号为“text1”

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

}//控件定义结束

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

}//对话框定义结束

3.2 总体思路框图

图1 对话框驱动程序流程图

3.3 对话框驱动程序

;;;— — — — — — — — — — — —

;;;文件名:CSCAD.LSP

;;;功 能:调用寒区水闸CAD支持系统主菜单

;;;开发者:汪恩良(东北农业大学96级硕士研究生)

;;;时 间:1998年5月15日—1998年11月

;;;— — — — — — — — — — — —

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

(defun c:cscad()

;;;加载DCL文件

(if;|if1|;(and (not dcl-id)(<(setq dcl-id(load-dialog″c:/acadwin/cscad.dcl″))0))(exit));endif1

;;;激活出对话框

(if;|if2|;(not new-dialog ″cscadss″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″ ″(c: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:jkd11shr)

 (setq what-next 4)

 (if(not(new-dialog″cscadss″dcl-id))(exit)))

 ((=what-next 3)

 (c:help)

 (setq what-next 4)

 (if(not(new-dialog ″cscadss″dcl-id))(exit)))

);cond

);while

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

(princ)

);defun       ;函数结束

;;;— — — — — — —

3.4 运行结果

图2 运行结果(主菜单)(Result of Running)

4 结束语

  上述源程序仅是“寒区水闸计算机辅助设计支持系统”软件的主菜单调用情况,内部功能函数的实现尚有许多内容,在此不一一赘述了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多