許婧 劉飛鵬 李繼國



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