1、使用 LISP 语言实现在平面图中自动画出桥梁的墩柱标识摘 要:以往在平面图中画墩柱标识是一件费时费力,生产力低下的工作,本文讨论了如何使用 LISP 语言实现该项工作,以极大的节省时间,提高共效率。 关键词: LISP 桥梁墩柱 中图分类号:TU997 文献标识码: A 1.以前工作状况 在平面图中画桥梁墩柱的标识是一件大量的繁琐的重复性的工作,以往的做法是: 依据路基宽度确定墩柱的间距和位置,依据桥梁的斜交角度确定是双柱墩还是三柱墩,然后把每一种角度的墩柱标识各做成一个块(如图一) ,再分别一个一个的粘贴进平面图,再旋转该块而成(如图二) 。非常繁琐而且需要大量的时间。 (当然以上方法仅适
2、用于普通桥梁的标准墩柱标识,对于特殊要求的墩柱型式还是以桥梁组提供的为准。以下 LISP语言实现的也仅是画出标准墩柱标识。 ) 图一 图二 2.LISP 语言及编程方法 LISP 语言的先天特性就是可以处理 AutoCAD 中大量重复性的工作,以节省时间和提高效率,下面我们就来看看该怎么实现这个自动画墩柱的程序呢? 我一直认为编程最好的方法就是分解法,把要实现的目标分解成若干个模块,然后一步一步的去实现。这有利于减少整个工作的难度,有利于增加或者减少程序功能,有利于出现问题时的溯源以便于查错纠错,而且可以提高不少工作效率。 这个程序也是这样,首先我依据需求和平时做这项工作的特性,理出大致的程序
3、结构,分别为: 主程序:负责调用记录系统变量和恢复系统变量,调用功能实现子模块; 判断程序:判断各变量状态; 功能实现子程序:使用判断程序和画出墩柱程序,依据各种状态按要求实现程序功能; 画出墩柱程序。 3.自动画桥墩的具体实现 3.1 主程序: 这里记录了各个系统变量状态,由于本程序需要使用 visual 函数,所以需要预先加载 visual 函数接口,调用了所需的 AutoCAD 线型,调用了功能实现子程序,且程序运行结束后需恢复各系统变量。程序实现如下: (defun c:qd() (setvar “cmdecho“ 0) (command “undo“ “be“) (setq osmo
4、de (getvar “osmode“) (setvar “osmode“ 0) (vl-load-com) (if(not(tblsearch “ltype“ “dashed“)(command “-linetype“load“ “dashed“ “ “) (setq f (ssget (0 . “LWPOLYLINE“) (get_length f) (command “_copy“ f “ (0 0 ) (0 0) (command “_erase“ f “) (command “_ucs“ “w“) (setvar “osmode“ osmode) (command “undo“ “e
5、“) (princ) ) 3.2 画出墩柱程序: 使用功能实现子程序所确定的位置画出墩柱。 (defun DrawC(yuanx / ) (entmake (list (cons 0“CIRCLE“) (cons 100 “AcDbEntity“) (cons 100 “AcDbCircle“) (cons 8 “桥墩“) (cons 6 “DASHED“) (cons 48 0.01) (list 10 (car yuanx) (cadr yuanx) 0.0) (cons 40 0.8) (cons 62 5) ) (entmake (list (cons 0“CIRCLE“) (cons
6、 100 “AcDbEntity“) (cons 100 “AcDbCircle“) (cons 8 “桥墩“) (cons 6 “DASHED“) (cons 48 0.01) (list 10 (car yuanx) (cadr yuanx) 0.0) (cons 40 0.85) (cons 62 5) ) ) 3.3 判断程序和功能实现子程序: 由于本程序属于比较单一和简单的功能实现集,所以在后来的调试完成时,我把判断程序和功能实现子程序合并成了一个模块。 在该模块中,使用主程序所确定的选择集,首先需要用户输入路基的宽度,以确定可使用半幅桥梁墩柱的总宽度。 依据索引值取出选择集中的图元
7、,然后再把图元转对象,取得该对象的长度、起始坐标值、终止坐标值以及该对象的宽度。对象宽度用以判断该多义线是否为桥梁边线。再依据 FlagK 值确定该对象是否需要在下面的转字符串语句中剔除。 把经过以上步骤取出的对象坐标按格式转字符串并连接起来,形成所有符合条件的对象的坐标记录字符串。 然后进入判断并画出墩柱部分,在这里,我们需要判断所取得对象是否是处在桥台位置,若是,则使用空的(progn)语句忽略该对象,若不是,则需判断该对象与主线交叉角度是否大于等于 30,若大于等于30则使用三柱墩的型式并计算出每个墩柱的坐标位置,若不是则使用双柱墩的型式并计算出每个墩柱的坐标位置,在这里,还需进一步判断
8、该对象是整幅桥梁还是左右幅形式的桥梁,以决定在该对象上所需画出总的墩柱个数。然后调用画出墩柱程序生成墩柱。 整个功能模块的代码简略如下: (defun get_length(dyx / ls ls1 ls2 NC FlagK ljkd shum JISHU NXS obj ent nqd nzd ncd njd YX1 YX2 YX3 YX4 YX5 YX6) (setq ljkd (getreal “n 请输入路基宽度:“) ) 4.具体使用和总结 使用本程序只需用户在 AutoCAD 中预先加载本程序,输入 qd 命令,框选所有的已生成的桥梁多义线,根据提示输入路基宽度即可自动画出所需的所有的墩柱标识。使得原本需要一天甚至更长时间才能完成的工作,在几分钟甚至一分钟之内完成,极大的节省了劳动时间,提高了劳动效率。 以上,程序若有错漏,敬请指正。 参考文献: 1、 AutoLISP 语言程序设计郭秀娟,于全通,范小鸥;化学工业出版社;2008 年 8 月; 2、 AutoCAD LISP/VLISP 函数库查询辞典二代龙震工作室;中国铁道出版社;2003 年 6 月; 3、AutoCAD 标准帮助文档: AutoCAD 群码表。