CAD技术在水利水电工程中的应用作者:不祥上传:不祥来源:水工网2006-01-1300:371概述美国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坐标点文件名fn2))(setqfn(getfiled坐标点文件名2)))(setqf(openfnr))(setqp0(getpointn画线起点:))(setqbz0mm1)(commandpline)(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(ssgetX(list(cons0LWPOLYLINE))))(setqsh(sslengthe))(ife(while(nsh)(setqe1(ssnameen))(commandpedite1d)(setqx(entgete1))(setqngc(atof(setqla(fld8x))))(commandexplodee1)(setqn(+n1)))))(defunfld(numlst)(cdr(assocnumlst)))(defunc:spltol();SPLINE转化为LINE(setqn0)(setqe(ssgetX(list(cons0SPLINE))))(setqsh(sslengthe))(ife(while(nsh)(setqx(entget(setqe1(ssnameen))))(setqnla(itoa(fix(caddr(fld10x)))))(if(=(fld0x)SPLINE)(progn(commandlayernnlac6nlasnla)(commandline)(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(getstringn剖面号))(setqpt1(getpointn剖切位置起点:))(setqpt2(getpointpt1n剖切位置终点:))(setqpt3(getpointn剖面图布置:))(setqp01pt3)(setqe1(ssgetF(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(getpointn表格左上角点位置:))(commandplinep1w0.50.5(setqp2(list(+(carp1)(*colscolw))(cadrp1)))(setqp4(list(carp2)(-(cadrp2)(*rowsrowh))))(setqp3(list(carp1)(-(cadrp2)(*rowsrowh))))C)(setqn1)(while(nrows);绘水平线表格(commandpline(list(carp1)(-(cadrp1)(*nrowh)))w00(list(carp2)(-(cadrp2)(*rowhn))))(setqn(+n1)))(setqn1)(while(ncols);绘垂直表格线(commandpline(list(+(carp1)(*ncolw))(cadrp1))w00(list(+(carp1)(*ncolw))(cadrp3)))(setqn(+n1)))(commandtextm(list(+(carp1)(*0.5colscolw))(+(cadrp1)5))30TITLE)(setqn0)(while(nrows)(setqm0)(while(mcols)(cond((m26)(setqbzstr(chr(+65m))))((=m26)(setqbzstr(strcat(chr(+64(/m26)))(chr(+65(-m(*26(/m26)))))))))(commandtextm(list(+(carp1)(*0.5colw)(*mcolw));表格内容标注(-(cadrp1)(*0.5rowh)(*nrowh)))(getvarTEXTSI