許婧 劉飛鵬 李繼國(guó)
摘要:目前,CAD在設(shè)計(jì)工作中占有舉足輕重的地位,而Lisp程序語言是CAD技術(shù)的重要拓展;結(jié)構(gòu)設(shè)計(jì)、強(qiáng)度校核時(shí),需要計(jì)算構(gòu)件的截面慣性矩或截面模量等一系列的特性參數(shù),該文用lisp語言編程,并將編程結(jié)果應(yīng)用于U型渡槽截面特性的計(jì)算;結(jié)果表明,lisp語言能夠高效準(zhǔn)確的計(jì)算出截面的特性參數(shù),一定程度上能實(shí)現(xiàn)計(jì)算機(jī)的自動(dòng)設(shè)計(jì)、計(jì)算、制圖功能。
關(guān)鍵詞:lisp語言;結(jié)構(gòu)設(shè)計(jì); CAD二次開發(fā);U型渡槽截面設(shè)計(jì)
中圖分類號(hào):TP319? ? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2019)23-0275-02
開放科學(xué)(資源服務(wù))標(biāo)識(shí)碼(OSID):
在結(jié)構(gòu)設(shè)計(jì)、強(qiáng)度校核中常常需要計(jì)算構(gòu)件的截面慣性矩或截面模量。我們知道截面模量與慣性矩的關(guān)系為w=[IY],得出慣性矩就很容易求得截面模量[1]。對(duì)于不規(guī)則幾何形狀的截面需用慣性矩的定義,即積分Ix=?y2dx. Iy= ?x2dy來計(jì)算,計(jì)算相當(dāng)復(fù)雜。即使對(duì)于由型材或規(guī)則截面組成的組合截面也需要先求得每個(gè)截面對(duì)形心軸的慣性矩,然后用平行移軸公式Ix=Ix0+a2A、Iy= Iy0+b2A(其中Ix0、Iy0是截面對(duì)形心軸系的二次矩,A是截面面積,a、b分別是形心軸與所求軸系的距離)來計(jì)算,其涉及的計(jì)算相當(dāng)煩瑣。
LISP(List Processor)程序語言[1]是由Autodesk公司開發(fā)的。AutoCAD軟件中包含大多數(shù)用于產(chǎn)生圖形、處理圖形的命令,但仍有某些命令末被提供[2]。使用Auto LISP程序語言可以編制能夠在圖形文本對(duì)象內(nèi)編寫工具或作全局選擇性改變的程序。
結(jié)構(gòu)設(shè)計(jì)的計(jì)算占有很重要的比重,計(jì)算結(jié)果的準(zhǔn)確度直接決定了結(jié)構(gòu)設(shè)計(jì)的安全。計(jì)算機(jī)輔助設(shè)計(jì)(Computer Aid Desin簡(jiǎn)寫CAD,常稱AutCAD是20世紀(jì)80年代初發(fā)展起來的一門新興技術(shù)型應(yīng)用軟件,如今在各個(gè)領(lǐng)域均得到了普遍的應(yīng)用[3]。而基于AutoCAD用Auto lisp語言編制出的程序能夠?qū)崿F(xiàn)自動(dòng)設(shè)計(jì)計(jì)算,從而大大減少計(jì)算的工作量。以下通過編寫“截面特性計(jì)算”的LISP程序工具來說明程序在結(jié)構(gòu)設(shè)計(jì)中的應(yīng)用[4]。
1 Lisp程序
1.1程序語言
lisp程序編制過程中用到的主要計(jì)算程序語言具體如下:
(defun mas (obj / Area Area1 Area2 Perimeter Centroid Centroid1 Centroid2 MomentOfInertia MomentOfInertia1 PrincipalDirections PrincipalMoments minpt maxpt Sx Sy ProductOfInertia ProductOfInertia1 RadiiOfGyration Wx1 Wx2 Wy1 Wy2 obj1 obj2 recPt1 recPt2 reg1 reg2 CenX CenY)
(if (= "AcDbRegion" (vla-get-objectname obj)) ;如果是截面則計(jì)算
(progn(setq Area (vla-get-area obj);面積
Perimeter (vla-get-Perimeter obj);周長(zhǎng)
Centroid (V2L (vla-get-Centroid obj));質(zhì)心
MomentOfInertia (V2L (vla-get-MomentOfInertia obj));慣性矩
PrincipalDirections (V2L (vla-get-PrincipalDirections obj));主矩方向
PrincipalMoments (V2L (vla-get-PrincipalMoments obj));主力矩與質(zhì)心的X-Y方向
ProductOfInertia (vla-get-ProductOfInertia obj);慣性積) ;
setq (vla-move obj (vlax-3d-point Centroid) (vlax-3d-point '(0 0)));移動(dòng)質(zhì)心到原點(diǎn)
(setq MomentOfInertia1 (V2L (vla-get-MomentOfInertia obj));質(zhì)心的慣性矩
ProductOfInertia1 (vla-get-ProductOfInertia obj);質(zhì)心的慣性積
RadiiOfGyration (V2L (vla-get-RadiiOfGyration obj));回旋半徑
);setq (vla-getboundingbox obj 'minpt 'maxpt);邊界框
(setq minpt (vlax-safearray->list minpt);左下角點(diǎn)
maxpt (vlax-safearray->list maxpt);右上角點(diǎn)
Wx1 (/ (car MomentOfInertia1) (cadr minpt));抵抗矩
Wx2 (/ (car MomentOfInertia1) (cadr maxpt))
Wy1 (/ (cadr MomentOfInertia1) (car minpt))
Wy2 (/ (cadr MomentOfInertia1) (car maxpt)));
setq (vla-move obj (vlax-3d-point '(0 0)) (vlax-3d-point Centroid));移回原來位置
(setq obj1 (vla-copy obj);拷貝物體以用來算X面積矩
obj2 (vla-copy obj);拷貝物體以用來算Y面積矩
CenX (car Centroid)
CenY (cadr Centroid)
recPt1 (list (+ CenX (car minpt) -1) CenY;建立兩個(gè)矩形面域的點(diǎn)表
(+ CenX (car maxpt) +1) CenY
(+ CenX (car maxpt) +1) (+ CenY (cadr minpt) -1)
(+ CenX (car minpt) -1) (+ CenY (cadr minpt) -1))
recPt2 (list (+ CenX (car minpt) -1) (+ CenY (cadr minpt) -1)
(+ CenX (car minpt) -1) (+ CenY (cadr maxpt) +1)
CenX (+ CenY (cadr maxpt) +1)
CenX (+ CenY (cadr minpt) -1))
reg1 (draw-rectange recPt1);創(chuàng)建面域1
reg2 (draw-rectange recPt2);創(chuàng)建面域2)
(vla-boolean obj1 acSubtraction reg1);求obj1與面域1之差
(vla-boolean obj2 acSubtraction reg2);求obj2與面域2之差
(setq Area1 (vla-get-area obj1);求obj1的面積
Area2 (vla-get-area obj2);求obj2的面積
Centroid1 (V2L (vla-get-Centroid obj1)) ;求obj1的質(zhì)心
Centroid2 (V2L (vla-get-Centroid obj2));求obj2的質(zhì)心
Sx (* Area1 (- (cadr Centroid1) (cadr Centroid)));繞X軸面積矩(靜矩)
Sy (* Area2 (- (car? Centroid2) (car? Centroid)));繞Y軸面積矩(靜矩))
(vla-delete obj1);刪除面域1
(vla-delete obj2);刪除面域2
(list (cons "面積" Area);返回各種參數(shù)值
;(cons "周長(zhǎng)" Perimeter)
(cons "質(zhì)心" Centroid)
;(cons "X 軸主慣性矩" (car PrincipalMoments))
(cons "X 軸慣性矩? " (car MomentOfInertia1))
;(cons "Y 軸主慣性矩" (cadr PrincipalMoments))
(cons "Y 軸慣性矩? " (cadr MomentOfInertia1))
;(cons "XY慣性積? ? " ProductOfInertia1)
(cons "X 軸上抗彎距" Wx2)
(cons "X 軸下抗彎距" Wx1)
(cons "Y 軸左抗彎距" Wy1)
(cons "Y 軸右抗彎距" Wy2)
(cons "X 軸面積矩? " Sx )
(cons "Y 軸面積矩? " Sy )
(cons "回旋半徑ix? " (car RadiiOfGyration))
(cons "回旋半徑iy? " (cadr RadiiOfGyration))
;(cons "主矩方向1? ?" (list (car PrincipalDirections) (caddr PrincipalDirections)))
;(cons "主矩方向2? ?" (list (cadr PrincipalDirections) (cadddr PrincipalDirections)))
;(cons "距左邊距離? " (abs (car minpt)))
;(cons "距右邊距離? " (abs (car maxpt)))
;(cons "距上邊距離? " (abs (cadr maxpt)))
;(cons "距下邊距離? " (abs (cadr minpt)))))))
2程序運(yùn)用
現(xiàn)有一個(gè)U型渡槽斷面如圖1所示:在進(jìn)行結(jié)構(gòu)力學(xué)設(shè)計(jì)計(jì)算前,需要求出其截面特性,而對(duì)于U型渡槽斷面等不規(guī)則的形狀,若手工計(jì)算,則需要建立坐標(biāo)系用慣性矩的定義來計(jì)算,相當(dāng)復(fù)雜。本次在上述lisp二次編程的基礎(chǔ)上,在cad中加載lisp程序語言,利用快捷鍵來求解。具體計(jì)算步驟如下:
(1)打開CAD,在命令行中鍵入lisp語言,加載lisp程序。
(2)輸入快捷鍵txx,按命令要求選擇U型斷面最后成果如圖2所示。通過人工復(fù)核,該截面的計(jì)算結(jié)果準(zhǔn)確,符合工程設(shè)計(jì)的精度要求。
3總結(jié)
Auto CAD二次開發(fā)的中的LISP語言,是人工智能學(xué)科領(lǐng)域中廣泛采用的一種程序設(shè)計(jì)符號(hào)語言[5],這種語言在參數(shù)化設(shè)計(jì)和繪圖中有很大的靈活性,并且可以實(shí)現(xiàn)一定的人工智能[6]。LISP開發(fā)出的程序可以像運(yùn)行CAD普通命令一樣在命令行中直接鍵入自己定義的命令運(yùn)行,保持了用戶的繪圖習(xí)慣并簡(jiǎn)化了大量的計(jì)算。
水利工程U型渠道的設(shè)計(jì),由于其復(fù)雜截面的幾何性質(zhì),對(duì)其進(jìn)行結(jié)構(gòu)設(shè)計(jì)時(shí),人工計(jì)算費(fèi)工費(fèi)時(shí),且容易出錯(cuò)。本次基于lisp的二次開發(fā)程序計(jì)算U型渡槽的截面特性,省時(shí)省力且準(zhǔn)確度高,為結(jié)構(gòu)設(shè)計(jì)提供一種新的有效思路。
參考文獻(xiàn):
[1] 高建亮. AutoCAD計(jì)算截面幾何性質(zhì)的應(yīng)用[J].建設(shè)科技,2011(11).
[2] 劉志紅. 平面幾何性質(zhì)計(jì)算方法研究[J].安陽工學(xué)院學(xué)報(bào),2011(7).
[3] 王丙輝.一種利用Auto Cad計(jì)算構(gòu)件截面慣性矩/模量的簡(jiǎn)便方法[J].廣船科技,2011(12).
[4] 石琴,陳朝陽. 任意形狀薄壁截面的幾何特性參數(shù)的計(jì)算[J].機(jī)械工程學(xué)報(bào),2004,40(10):144-148.
[5] 宋金虎. 用AutoCAD求材料截面的幾何性質(zhì)[J].門窗,2012(10).
[6] 江明明. LISP編程語言在CAD繪圖中的應(yīng)用[J].北京測(cè)繪,2016(01):113-115.
【通聯(lián)編輯:朱寶貴】