摘要:autocad是广大工程设计人员普遍使用的通用绘图软件,结合专业特点,通过对autocad系统的二次开发可以开发出满足各种用途的专业软件,即使对于普通设计人员也可以通过autocad内嵌的visuallisp语言方便地增加cad命令,扩充完善适合本专业的新功能,从而极大地提高工作效率,本文通过几个应用实例对autocad在水工设计上的应用进行了探讨。
关键词:cad技术应用水利水电工程autocadvisuallisp语言
1概述
美国autodesk公司开发的autocad系统自1982年推出以来,以其使用方便、功能强大和系统开放性一直独领风骚。成为各工程领域首选的cad系统。水利水电工程领域利用autocad平台进行二次开发也取得了一系列成果,如90年代以来陆续开发的水电站地面厂房cad系统、重力坝cad系统、隧洞cad系统、水机油汽水cad系统、地质柱状图cad等均取得了较好的应用效果。但水电工程设计的复杂性决定了任何现成的cad软件都有其局限性,设计过程中许多问题还只能用原始的方法解决。本文通过几个实例对autocad二次开发常用的lisp语言在水电工程设计中的应用进行了初步探讨,希望能够起到抛砖引玉的作用。visuallisp语言是autocadr14版本以后提供的全新的开发环境,是嵌于autocad内部,将lisp语言与autocad相结合的产物,是一种智能型语言。利用autolisp可以灵活方便地增加autocad新命令,几乎无限地扩展autocad新功能,2应用实例2.1坐标画线利用已知坐标点画线是设计工作中经常遇到的问题,如河道、堤防等实测断面、水位流量关系曲线、堰面曲线等数据的处理,均可归结为坐标画线问题。对于堰面曲线等有函数方程的曲线可以利用excel按照期望的步长自动生成一系列坐标点。对于测量常用的起点距-高程形式的数据,也可以利用excel转化成坐标点形式。(1)利用脚本文件(.scr)利用任何文本编辑器如note、uedit、word、excel等建立纯文本文件ex1.scr,注意文本文件后缀必须为.scr,坐标之间用半角逗号分开,文件中不允许出现空格,文件最后一行必须为空回车。文件建立时,可以直接把excel或其他文件中的坐标表利用拷贝、粘贴功能加入脚本文件中。pline345.66,238.65213.45,124.56128.44,235.66文件保存后,执行autocad中“工具”下的“运行脚本”,在显示的窗口中查找并选中ex1.scr,屏幕上会立即显示所绘线条。(2)利用lsp程序建立坐标表文件ex2.dat,后缀任意,可以依次输入多段曲线,中间用曲线名称分开,程序自动绘制多条曲线并可标注坐标表。
“曲线1”213.45,124.56128.44,235.66345.66,231.78“曲线2”433.34,567.23434.12,464.12利用autocad中“工具”菜单下的“visullisp编辑器”建立drline.lsp文件如下(defunc:drline()(iffn(setqfn(getfiled"坐标点文件名"fn""2))(setqfn(getfiled"坐标点文件名"""""2)))(setqf(openfn"r"))(setqp0(getpoint"画线起点:"))(setqbz0mm1)(command"pline")(while(/=bz1)(setqmd(read-linef))(if(/=mdnil)(setqzbb(readmd))(setqbz1))(setqdx(carzbb)dy(cadrzbb))(setqp1(list( dx(carp0))( dy(cadrp0))))(commandp1)(setqmm(1 mm)))(command"")(closef))文件存盘后,加载运行,相当于新增加了坐标画线命令drline,按提示选中存放坐标表的文件即可实现自动绘制曲线。2.2地形切剖面水电工程设计中经常遇到在地形图上切剖面的问题,借助visuallisp可以实现快速切剖面。(1)初始地形图处理把带z坐标的地形平面图进行变换,变换后z坐标值成为层名,为加快切剖面运行速度,把“lwpolyline”和”spline”均转化为”line“线,程序如下(defunc:pltol();lwpolyline转化为line(setqn0)(setqe(ssget"x"(list(cons0"lwpolyline"))))(setqsh(sslengthe))(ife(while(<nsh)(setqe1(ssnameen))(command"pedit"e1"d""")(setqx(entgete1))(setqngc(atof(setqla(fld8x))))(command"explode"e1)(setqn( n1)))))(defunfld(numlst)(cdr(assocnumlst)))(defunc:spltol();spline转化为line(setqn0)(setqe(ssget"x"(list(cons0"spline"))))(setqsh(sslengthe))(ife(while(<nsh)(setqx(entget(setqe1(ssnameen))))(setqnla(itoa(fix(caddr(fld10x)))))(if(=(fld0x)"spline")(progn(command"layer""n"nla"c""6"nla"s"nla"")(command"line")(setqnm(lengthx)dzs(fld73x)dzs1(fld74x))(while(>nm5)(if(=(car(nthnmx))10)(progn(setqb1(nthnmx))(setqx1(cadrb1))(setqy1(caddrb1))(setqz1(cadddrb1))(setqglb(listx1y1))(commandglb)))(setqnm(-nm1)))))(command"")(setqn( n1)))))(2)切剖面输入剖面编号,在平面地形图上指定两点确定剖面剖切线位置,指定剖面图起点,利用autocad的inters函数搜索剖切线与地形图的全部交点,自动计算交点坐标,计算交点与剖面位置起点的距离,按各交点高程和与起点的距离形成剖面图各点坐标,即可用本文实例1坐标画线生成地形图的剖面。(defundxtent1()(setqn0xdzbnil)(setqxds0)(setqsh(sslengthe1))(while(<nsh)(setqx(entget(ssnamee1n)))(if(=(fld0x)"line")(progn(setqdxtgcgc(fld8x))(setqdxtgcgc(atoidxtgcgc))(if(>dxtgcgc10)(progn(setqpst(fld10x))(setqpet(fld11x))(setqzb(listgc(list(carpst)(cadrpst))(list(carpet)(cadrpet))))(setqxdzb(conszbxdzb))(setqxds( xds1))))))(setqn( n1))))(defunc:dxtsec()(setqpmh( pmh1))(setqpmh(getstring"剖面号"))(setqpt1(getpoint"剖切位置起点:"))(setqpt2(getpointpt1"剖切位置终点:"))(setqpt3(getpoint"剖面图布置:"))(setqp01pt3)(setqe1(ssget"f"(listpt1pt2)));利用autocad的目标选择“f”方式选取与剖切线相交的地形线。(dxtent);获取与剖切线相交地形线的坐标(setqmxgc-100)(setqmngc10000)(setqm0pmpnil)(setqnxdsi0)(while(<in)(setqcrosp(interspt1pt2(nth1(nthixdzb))(nth2(nthixdzb))1));求剖切线与地形线的交点(if(/=crospnil)(progn(setqdxtgcgc(nth0(nthixdzb)))(setqmxgc(maxmxgcdxtgcgc))(setqmngc(minmngcdxtgcgc))(setqdst(distancept1crosp));剖切线起点与交点的距离(setqdst(*(/blczdxthtbl)dst))(setqpmp(cons(listmdstdxtgcgc)pmp))(setqm( m1))))(setqi( i1))))2.3沿曲线标注在设计中会遇到沿给定曲线进行标注问题,如平面布置图中的开挖线符号沿开挖轮廓的标注,剖面图中岩石符号沿轮廓线标注、点筋标注、沿任意曲线进行汉字标注等。此类问题主要应用autocad的measure或divide命令来解决。两个命令的主要差别是前者按指定的长度在曲线上标注,后者按给定的分段数等分曲线并在等分点处进行标注。要标注的轮廓曲线最好用pline线,要标注的符号预先做成图块,图块采用单位块,执行measure或divide命令,选取要标注的曲线,指定标注符号,分段长度或分段数即可完成标注,当发现标注的符号太密或太疏时,可以执行erase命令选择p进行删除,比例不合适或符号方向不正确,可以利用特性编辑器,选中所有标注符号,对标注符号的比例和旋转角度进行调整,直到满意为止。对于更高级的应用,可以编制lsp程序,实现符号和文字沿任意曲线标注。2.4表格生成autocad本身没有表格处理功能,设计图纸中工程量表、钢筋表等涉及到表格生成的问题可以采用以下方法处理:(1)直接把word或excel文件中的表格直接粘贴到cad图形中,修改时只要双击图中的表格即可进入word或excel中进行编辑修改,修改完成后退出即可返回到autocad中继续进行设计,该法优点是方便,快捷,易于掌握,可以充分利用excel的强大计算功能。缺点是表格在autocad中并不是一个普通图元,无法利用cad功能对表格的字高、颜色和线宽进行编辑。(2)编制lsp程序,依次输入表格标题、表格行数、表格列数、表格行高和列宽以及表格插入点等参数,可以自动生成表格,表格中已经按仿excel形式填入了文字,可以用字处理软件对表格中文字进行编辑修改。(defunc:mtab()(setqtb1niltb2niltb3nil)(setqrows(getint"表格行数"))(setqcols(getint"表格列数"))(setqrowh(getreal"行高"))(setqcolw(getreal"列宽"))(setqp1(getpoint"表格左上角点位置:"))(command"pline"p1"w""0.5""0.5"(setqp2(list( (carp1)(*colscolw))(cadrp1)))(setqp4(list(carp2)(-(cadrp2)(*rowsrowh))))(setqp3(list(carp1)(-(cadrp2)(*rowsrowh))))"c")(setqn1)(while(<nrows);绘水平线表格(command"pline"(list(carp1)(-(cadrp1)(*nrowh)))"w""0""0"(list(carp2)(-(cadrp2)(*rowhn)))"")(setqn( n1)))(setqn1)(while(<ncols);绘垂直表格线(command"pline"(list( (carp1)(*ncolw))(cadrp1))"w""0""0"(list( (carp1)(*ncolw))(cadrp3))"")(setqn( n1)))(command"text""m"(list( (carp1)(*0.5colscolw))( (cadrp1)5))"3""0""title")(setqn0)(while(<nrows)(setqm0)(while(<mcols)(cond((<m26)(setqbzstr(chr( 65m))))((>=m26)(setqbzstr(strcat(chr( 64(/m26)))(chr( 65(-m(*26(/m26)))))))))(command"text""m"(list( (carp1)(*0.5colw)(*mcolw));表格内容标注(-(cadrp1)(*0.5rowh)(*nrowh)))(getvar"textsize")"0"(strcatbzstr(itoa( n1))))(setqm( m1)))(setqn( n1))))(3)生成钢筋表钢筋表和材料表生成是施工图设计中比较繁琐的一项工作,很容易出错,此处介绍利用程序进行钢筋表和材料表自动生成的方法。利用造字程序增加i、ii级钢筋的直径标注符号和,以后在其它电脑上只要把eudc.tte和e见下表,增加3个命令:生成钢筋表、钢筋表添加和自动生成材料表。生成钢筋表时按指定表格位置生成钢筋表表头,根据提示输入钢筋编号(可以不连续)、钢筋等级和直径如20、16,交互绘制钢筋简图和标注长度(标注长度可以输入多种形式如50~200表示长度等差变化;30,40,50表示一个编号多个钢筋长度,),钢筋根数,构件组数,程序自动完成表格其余各项(总长度、重量,对于i级钢筋长度中自动计入弯钩长度)的填写,备注栏中自动填入等差变化钢筋的等差值。采集钢筋表中直径、等级和总长信息,经过自动分类汇总,生成钢筋表的材料表。2.6高程小数位数处理尺寸标注小数位数很容易调整,但诸如高程、表格中数字要调整则很困难,借助lsp程序的调整很方便,只要选取需要调整的数字,根据提示输入需要保留的小数位数,则程序自动对所有选种数字进行修改。(defunentsgc()(setqn0)(setqsh(sslengthe1))(while(<nsh)(setqx(entget(ssnamee1n)))(if(=(fld0x)"text")(progn(setqagc(fld1x))(setqc(substragc11))(if(or(=c" ")(=c"-")(and(>=c"0")(<=c"9")))(progn(if(or(=c" ")(=c"-"))(setqbgc(substragc2))(setqbgcagc))(setqcgc(atofbgc))(setqzh(rtoscgc2gcws))(if(or(=c" ")(=c"-"))(setqzh(strcatczh)))(setqx(subst(cons1zh)(assoc1x)x))(entmodx))))))(setqn( n1))))(defunc:yxws()(setqe1(ssget))(setvar"dimzin"0)(setqgcws(getint"保留小数位数:"))(ife1(entsgc)(print"notfound"))(setqxnil)