午夜亚洲国产日本电影一区二区三区,九九久久99综合一区二区,国产一级毛片视频,草莓视频在线观看精品最新

加急見刊

CAD技術在水利水電工程中的應用

耿振云

摘要:AutoCAD是廣大工程設計人員普遍使用的通用繪圖軟件,結合專業特點,通過對AutoCAD系統的二次開發可以開發出滿足各種用途的專業軟件,即使對于普通設計人員也可以通過AutoCAD內嵌的VisualLisp語言方便地增加CAD命令,擴充完善適合本專業的新功能,從而極大地提高工作效率,本文通過幾個應用實例對AutoCAD在水工設計上的應用進行了探討。

關鍵詞:CAD技術 應用 水利水電工程 AutoCAD VisualLisp語言

美國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或其他文件中的坐標表利用拷貝、粘貼功能加入腳本文件中。

Pline

345.66,238.65

213.45,124.56

128.44,235.66

文件保存后,執行AutoCAD中“工具”下的“運行腳本”,在顯示的窗口中查找并選中EX1.SCR,屏幕上會立即顯示所繪線條。

(2)利用LSP程序

建立坐標表文件EX2.DAT,后綴任意,可以依次輸入多段曲線,中間用曲線名稱分開,程序自動繪制多條曲線并可標注坐標表。

“曲線1”

213.45,124.56

128.44,235.66

345.66,231.78

“曲線2”

433.34,567.23

434.12,464.12

利用AutoCAD中“工具”菜單下的“VisulLisp編輯器”建立DRLINE.LSP文件如下

(defun C:drline()

(if fn

(setq fn (getfiled "坐標點文件名" fn "" 2))

(setq fn (getfiled "坐標點文件名" "" "" 2))

)

(setq f (open fn "r"))

(setq p0 (getpoint "\n畫線起點:"))

(setq bz 0 mm 1)

(command "pline")

(while (/= bz 1)

(setq md (read-line f))

(if (/= md nil)

(setq zbb (read md))

(setq bz 1)

)

(setq dx (car zbb) dy (cadr zbb))

(setq p1 (list (+ dx (car p0))

(+ dy (cadr p0)))

)

(command p1)

(setq mm (1+ mm))

)

(command "")

(close f)

)

文件存盤后,加載運行,相當于新增加了坐標畫線命令DRLINE,按提示選中存放坐標表的文件即可實現自動繪制曲線。

2 .2 地形切剖面

水電工程設計中經常遇到在地形圖上切剖面的問題,借助Visual Lisp可以實現快速切剖面。

(1) 初始地形圖處理

把帶z坐標的地形平面圖進行變換,變換后z坐標值成為層名,為加快切剖面運行速度,把“LWPOLYLINE”和”SPLINE”均轉化為”LINE“線,程序如下

(defun c:pltol()

;LWPOLYLINE轉化為LINE

(setq n 0)

(setq e (ssget"X" (list (cons 0 "LWPOLYLINE"))))

(setq sh (sslength e))

(if e

(while (< n sh)

(setq e1 (ssname e n))

(command "pedit" e1 "d" "")

(setq x (entget e1))

(setq ngc (atof (setq la (fld 8 x))))

(command "explode" e1)

(setq n (+ n 1))

) ) )

(defun fld (num lst)

(cdr (assoc num lst))

)

(defun c:spltol ()

;SPLINE轉化為LINE

(setq n 0)

(setq e (ssget "X" (list (cons 0 "SPLINE"))))

(setq sh (sslength e))

(if e

(while (< n sh)

(setq x (entget (setq e1 (ssname e n))))

(setq nla (itoa (fix (caddr (fld 10 x)))))

(if (= (fld 0 x) "SPLINE")

(progn

(command "layer" "n" nla "c"

"6" nla "s" nla "")

(command"line")

(setqnm (length x)

dzs (fld 73 x) dzs1 (fld 74 x))

(while (> nm 5)

(if(= (car (nth nm x)) 10)

(progn

(setq b1 (nth nm x))

(setq x1 (cadr b1))

(setq y1 (caddr b1))

(setq z1 (cadddr b1))

(setq glb (list x1 y1))

(command glb)

) )

(setq nm (- nm 1))

)))

(command "")

(setq n (+ n 1))

)))

(2)切剖面

輸入剖面編號,在平面地形圖上指定兩點確定剖面剖切線位置,指定剖面圖起點,利用AutoCAD的inters函數搜索剖切線與地形圖的全部交點,自動計算交點坐標,計算交點與剖面位置起點的距離,按各交點高程和與起點的距離形成剖面圖各點坐標,即可用本文實例1坐標畫線生成地形圖的剖面。

(defun dxtent1 ()

(setq n 0 xdzb nil)

(setq xds 0)

(setq sh (sslength e1))

(while (< n sh)

(setq x (entget (ssname e1 n)))

(if (= (fld 0 x) "LINE")

(progn

(setq dxtgcgc (fld 8 x))

(setq dxtgcgc (atoi dxtgcgc))

(if (> dxtgcgc 10)

(progn

(setq pst (fld 10 x))

(setq pet (fld 11 x))

(setq zb (list gc

(list (car pst) (cadr pst))

(list (car pet) (cadr pet))

))

(setq xdzb (cons zb xdzb))

(setq xds (+ xds 1))

))))

(setq n (+ n 1))

))

(defun c:dxtsec ()

(setq pmh (+ pmh 1))

(setq pmh (getstring "\n 剖面號" ))

(setq pt1 (getpoint "\n 剖切位置起點:"))

(setq pt2 (getpoint pt1 "\n 剖切位置終點:"))

(setq pt3 (getpoint "\n 剖面圖布置:"))

(setq p01 pt3)

(setq e1 (ssget "F" (list pt1 pt2)));利用AutoCAD的目標選擇“F”方式選取與剖切線相交的地形線。

(dxtent);獲取與剖切線相交地形線的坐標

(setq mxgc -100)

(setq mngc 10000)

(setq m 0 pmp nil)

(setq n xds i 0)

(while (< i n)

(setq crosp

(inters pt1 pt2 (nth 1 (nth i xdzb)) (nth 2 (nth i xdzb)) 1)

);求剖切線與地形線的交點

(if (/= crosp nil)

(progn

(setq dxtgcgc (nth 0 (nth i xdzb)))

(setq mxgc (max mxgc dxtgcgc))

(setq mngc (min mngc dxtgcgc))

(setq dst (distance pt1 crosp));剖切線起點與交點的距離

(setq dst (* (/ blcz dxthtbl) dst))

(setq pmp (cons (list m dst dxtgcgc) pmp))

(setq m (+ m 1))

))

(setq i (+ i 1))

))

2 .3 沿曲線標注

在設計中會遇到沿給定曲線進行標注問題,如平面布置圖中的開挖線符號沿開挖輪廓的標注,剖面圖中巖石符號沿輪廓線標注、點筋標注、沿任意曲線進行漢字標注等。此類問題主要應用AutoCAD的Measure或pide命令來解決。兩個命令的主要差別是前者按指定的長度在曲線上標注,后者按給定的分段數等分曲線并在等分點處進行標注。要標注的輪廓曲線最好用pline線,要標注的符號預先做成圖塊,圖塊采用單位塊,執行measure或pide命令,選取要標注的曲線,指定標注符號,分段長度或分段數即可完成標注,當發現標注的符號太密或太疏時,可以執行erase命令選擇P進行刪除,比例不合適或符號方向不正確,可以利用特性編輯器,選中所有標注符號,對標注符號的比例和旋轉角度進行調整,直到滿意為止。對于更高級的應用,可以編制LSP程序,實現符號和文字沿任意曲線標注。

2 .4 表格生成

AutoCAD本身沒有表格處理功能,設計圖紙中工程量表、鋼筋表等涉及到表格生成的問題可以采用以下方法處理:

(1)直接把Word或Excel文件中的表格直接粘貼到CAD圖形中,修改時只要雙擊圖中的表格即可進入Word或Excel中進行編輯修改,修改完成后退出即可返回到AutoCAD中繼續進行設計,該法優點是方便,快捷,易于掌握,可以充分利用Excel的強大計算功能。缺點是表格在AutoCAD中并不是一個普通圖元,無法利用CAD功能對表格的字高、顏色和線寬進行編輯。

(2)編制LSP程序,依次輸入表格標題、表格行數、表格列數、表格行高和列寬以及表格插入點等參數,可以自動生成表格,表格中已經按仿Excel形式填入了文字,可以用字處理軟件對表格中文字進行編輯修改。

(defun C:mtab()

(setq tb1 nil tb2 nil tb3 nil)

(setq rows (getint "表格行數"))

(setq cols (getint "表格列數"))

(setq rowh (getreal "行高"))

(setq colw (getreal "列寬"))

(setq p1 (getpoint "\n表格左上角點位置:"))

(command "pline" p1 "w" "0.5" "0.5"

(setq p2 (list (+ (car p1) (* cols colw)) (cadr p1)))

(setq p4 (list (car p2) (- (cadr p2) (* rows rowh))))

(setq p3 (list (car p1) (- (cadr p2) (* rows rowh))))

"C" )

(setq n 1)

(while (< n rows);繪水平線表格

(command "pline" (list (car p1) (- (cadr p1) (* n rowh))) "w" "0" "0"

(list (car p2) (- (cadr p2) (* rowh n))) "")

(setq n (+ n 1))

)

(setq n 1)

(while (< n cols) ;繪垂直表格線

(command "pline" (list (+ (car p1) (* n colw)) (cadr p1)) "w" "0" "0" (list (+ (car p1) (* n colw)) (cadr p3))

"")

(setq n (+ n 1))

)

(command "text" "m" (list (+ (car p1) (* 0.5 cols colw))

(+ (cadr p1) 5)) "3" "0" "TITLE" )

(setq n 0)

(while (< n rows)

(setq m 0)

(while (< m cols)

(cond

((< m 26) (setq bzstr (chr (+ 65 m))))

((>= m 26) (setq bzstr (strcat (chr (+ 64 (/ m 26))) (chr (+ 65 (- m (* 26 (/ m 26))))))))

)

(command "text" "m" (list (+ (car p1) (* 0.5 colw) (* m colw));表格內容標注

(- (cadr p1) (* 0.5 rowh) (* n rowh)))

(getvar"TEXTSIZE") "0" (strcat bzstr (itoa (+ n 1))))

(setq m (+ m 1))

)

(setq n (+ n 1))

))

(3)生成鋼筋表

鋼筋表和材料表生成是施工圖設計中比較繁瑣的一項工作,很容易出錯,此處介紹利用程序進行鋼筋表和材料表自動生成的方法。利用造字程序增加I、II級鋼筋的直徑標注符號和,以后在其它電腦上只要把EUDC.TTE和E

見下表,增加3個命令:生成鋼筋表、鋼筋表添加和自動生成材料表。

生成鋼筋表時按指定表格位置生成鋼筋表表頭,根據提示輸入鋼筋編號(可以不連續)、鋼筋等級和直徑如20、16,交互繪制鋼筋簡圖和標注長度(標注長度可以輸入多種形式如50~200表示長度等差變化;30,40,50表示一個編號多個鋼筋長度,),鋼筋根數,構件組數,程序自動完成表格其余各項(總長度、重量,對于I級鋼筋長度中自動計入彎鉤長度)的填寫,備注欄中自動填入等差變化鋼筋的等差值。

采集鋼筋表中直徑、等級和總長信息,經過自動分類匯總,生成鋼筋表的材料表。

2 .6 高程小數位數處理

尺寸標注小數位數很容易調整,但諸如高程、表格中數字要調整則很困難,借助LSP程序的調整很方便,只要選取需要調整的數字,根據提示輸入需要保留的小數位數,則程序自動對所有選種數字進行修改。

(defun entsgc()

(setq n 0)

(setq sh (sslength e1))

(while (< n sh) (setq x (entget (ssname e1 n)))

(if (= (fld 0 x) "TEXT")

(progn

(setq agc (fld 1 x))

(setq c (substr agc 1 1))

(if (or (= c "+") (= c "-") (and (>= c "0") (<= c "9")))

(progn

(if (or (= c "+") (= c "-"))

(setq bgc (substr agc 2))

(setq bgc agc)

)

(setq cgc (atof bgc))

(setq zh (rtos cgc 2 gcws))

(if (or (= c "+") (= c "-"))

(setq zh (strcat c zh)))

(setq x (subst (cons 1 zh) (assoc 1 x) x))

(entmod x)

)

))

))

(setq n (+ n 1)))

)

(defun c:yxws()

(setq e1 (ssget))

(setvar "dimzin" 0)

(setq gcws (getint "保留小數位數:"))

(if e1 (entsgc) (print "\n not found"))

(setq x nil)

)

2 .7 應用軟件前、后處理

由于軟件升級滯后,一些常用軟件后處理功能很弱或沒有,可以利用LSP程序結合AutoCAD增加或簡化前后處理功能。下面結合平面滲流分析程序STSE軟件對其前、后處理功能的實現進行介紹:

(1)前處理

STSE為平面滲流有限元程序,單元劃分和單元、節點編號工作量最大,可以借助其它通用有限元軟件的前處理功能如Ansis、Algor、SAP84等進行初步處理,生成單元、節點編號和節點坐標,而后按照STSE數據文件的格式要求對數據文件進行編輯。

(2)后處理

后處理成果主要為:單元網格圖,浸潤線和等勢線。單元網格圖中有節點和單元編號,不同滲透系數的單元采用不同的顏色,以便根據網格圖直觀地判斷數據文件中幾何參數和材料特性的正誤;

首先分析STSE的輸出結果文件的格式,搜索并篩選其中主要參數如單元總數、節點總數和材料總數,把節點坐標和單元信息分別存儲,通過對單元循環生成單元網格圖。

(defun c:seepmesh()

(if fn

(setq fn (getfiled "滲流結果文件名" fn "" 2))

(setq fn (getfiled "滲流結果文件名" "" "" 2)))

(setq f (open fn "r"))

(setq md (read-line f))

(while (/= (substr md 25 8) "單元總數")

(setq md (read-line f))

);定位單元總數

(setq dyzs (atoi (substr md 58 5)));讀單元總數

(setq md (read-line f))

(setq jdzs (atoi (substr md 58 5)));讀節點總數

(setq md (read-line f))

(setq clh (atoi (substr md 58 5)));讀材料總數

(setq m 0)

(repeat clh

(setq m (+ 1 m))

(setq tcm (strcat "zclh" (itoa m)))

(command "layer" "m" tcm "c" (itoa m) tcm "")

);按材料種類生成圖層名稱

(setq m 0 n 0)

(repeat dyzs;對單元循環,dycfb中存放單元信息

(setq m (+ m 1))

(setq clh (nth 0 (nth m dycfb)))

(setq jdh1 (nth 1 (nth m dycfb)))

(setq jdh2 (nth 2 (nth m dycfb)))

(setq jdh3 (nth 3 (nth m dycfb)))

(setq jdh4 (nth 4 (nth m dycfb)))

(command "layer" "s" (strcat "zclh" (itoa clh)) "")

(command "pline";繪制單元網格

(nth jdh1 jdzbb)

(nth jdh2 jdzbb)

(nth jdh3 jdzbb)

(nth jdh4 jdzbb) "c")

(setq bzdzb (mapcar '+ (nth jdh1 jdzbb) (nth jdh2 jdzbb)

(nth jdh3 jdzbb) (nth jdh4 jdzbb)))

(setq bzdzb (list (/ (car bzdzb) 4.0) (/ (cadr bzdzb) 4.0)))

(command "text" "m" bzdzb "0.5" "0" (itoa m))

;標注單元號

(setq m 0)

(repeat jdzs

(setq m (+ m 1))

(setq bzdzb (nth m jdzbb))

(setq bzdzb (list (+ (car bzdzb) 0.0) (+ (cadr bzdzb) 0.0)))

(command "text" "m" bzdzb "0.5" "0" (itoa m))

));標注節點號

(close f)

)

限于篇幅,等勢線和浸潤線生成程序不再贅述。同樣,對工程設計中遇到的其它軟件如:STAB邊坡穩定分析、SAP84的輸出文件均可進行類似后處理工作。

3 結語

AutoCAD軟件應用已經在設計單位普及,VisualLisp的出現對于提高Lisp語言的編程效率和AutoCAD應用水平具有重要意義。本文涉及的幾個實例已經在實際工作中發揮很大作用,充分說明在工程設計當中結合本專業要求開發一些簡單實用的Lisp小程序可以有效減輕設計人員的勞動強度,使AutoCAD不僅僅是繪圖工具,而真正成為設計人員得心應手的高效設計平臺。

下載