AutoCAD計(jì)算截面對(duì)任意軸的靜距和慣性矩的程序設(shè)計(jì)
2013-08-09 by:廣州cad教學(xué)中心 來(lái)源:仿真在線
AutoCAD計(jì)算截面對(duì)任意軸的靜距和慣性矩的程序設(shè)計(jì)
一、引言
Autodesk公司開(kāi)發(fā)的AutoCAD工程繪圖軟件是當(dāng)前應(yīng)用廣泛的二維CAD軟件,功能強(qiáng)大,在機(jī)械設(shè)計(jì)領(lǐng)域廣泛應(yīng)用。開(kāi)放式體系結(jié)構(gòu)也允許第三方開(kāi)發(fā)者為它編寫應(yīng)用程序,顯著增加了繪圖工作效率。
VBA是VisualBasicforApplications的英文縮寫,是由Microsoft公司創(chuàng)建的,它是一個(gè)功能強(qiáng)大的定制程序開(kāi)發(fā)工具,用來(lái)自動(dòng)執(zhí)行任務(wù)的一個(gè)編程環(huán)境。VBA為AutoCAD的二次開(kāi)發(fā)提供類似VisualBasic(VB)語(yǔ)言所擁有的功能,引入了對(duì)象的程序設(shè)計(jì)環(huán)境,為開(kāi)發(fā)者提供了用來(lái)創(chuàng)建圖形用戶界面(GUI)的可拖拉工具和用來(lái)與AutoCAD對(duì)象交互的編程語(yǔ)言。
AutoCAD具有強(qiáng)大的繪圖功能,可以直接求得截面對(duì)當(dāng)前坐標(biāo)系x軸和y軸的慣性距,但不能求得對(duì)任意軸的靜距和慣性矩。需要用戶通過(guò)創(chuàng)建面域、變換坐標(biāo)系等一系列操作進(jìn)行求解。靜距和慣性矩分別是計(jì)算回轉(zhuǎn)體質(zhì)量、校核受力零部件強(qiáng)度的重要的截面幾何性質(zhì)。筆者使用VBA在AutoCAD平臺(tái)上進(jìn)行二次開(kāi)發(fā),根據(jù)靜距和慣性距的平行移軸公式和轉(zhuǎn)軸公式定制應(yīng)用程序,幫助工程設(shè)計(jì)人員自動(dòng)高效率地完成截面對(duì)任意軸的靜距和慣性矩求解。
二、數(shù)學(xué)模型求解
根據(jù)平面圖形的平行移軸公式、轉(zhuǎn)軸公式,可推導(dǎo)出平面圖形對(duì)于任意軸的靜距和慣性矩。已知截面在XOY坐標(biāo)系下的面積A、質(zhì)心(xc,yc)、慣性距Ix、慣性距Iy和慣性距Ixy,求解截面對(duì)X3軸的靜距Sx3、慣性距Ix3。
步驟1:截面對(duì)x、y軸的靜距:Sx=ycA,Sy=xcA;
步驟2:通過(guò)平行移軸到形心(xc,yc)后,截面中任意一點(diǎn)在X1O1Y1坐標(biāo)系下的坐標(biāo)為:
x1=x-xc
y1=y-yc
求解對(duì)x1、y1軸的靜距、慣性距和慣性積。
因?yàn)樾涡脑?span>X1O1Y1坐標(biāo)系的原點(diǎn),所以Sx1=0,Sy1=0。
步驟3:圍繞形心(xc,yc)逆時(shí)針旋轉(zhuǎn)θ,圖形中任意一點(diǎn)在X2O2Y2坐標(biāo)系下的坐標(biāo)為:
x2=x1cosθ+y1sinθ
y2=-x1sinθ+y1cosθ
求解對(duì)x2、y2軸的靜距、慣性距和慣性積。因?yàn)樾涡脑赬202Y2坐標(biāo)系的原點(diǎn),所以Sx2=0,Sy2=0。
步驟4:通過(guò)沿y3方向平行移軸到x3軸后,圖形中任意一點(diǎn)在X3O3Y3坐標(biāo)系下的坐標(biāo)為:
x3=x2
y3=y2-D
求解對(duì)x3軸的靜距、慣性距:
通過(guò)平行移軸和轉(zhuǎn)軸很容易求解平面圖形對(duì)于任意軸的幾何性質(zhì),推導(dǎo)過(guò)程中所需要的已知數(shù)據(jù),可以采用VBA程序在AutoCAD的模型空間獲得。
三、VBA設(shè)計(jì)思路
本文通過(guò)為指定區(qū)域創(chuàng)建面域Region對(duì)象,可以獲得Region對(duì)象的Area、Centroid、MomentOfInertia和ProductOfInertia屬性。在VBA中通過(guò)程序代碼實(shí)現(xiàn)數(shù)學(xué)模型求解過(guò)程,從而實(shí)現(xiàn)截面對(duì)任意軸的靜距和慣性矩求解。
四、VBA程序編寫
1.生成面域
首先介紹生成面域并處理的方法,在AutoCAD模型空間中所求區(qū)域指定一點(diǎn),為所選區(qū)域生成面域,并使此面域處于繪圖順序的最頂層。此面域?yàn)槟P涂臻g中最新的實(shí)體對(duì)象,因此可以根據(jù)模型空間的實(shí)體數(shù)量,將此面域賦值給AcadRegion類型變量RegionTemp,再將Region和RegionTemp指定的兩個(gè)面域合并,其次變更Region的顏色以便突出顯示對(duì)象。此過(guò)程采用循環(huán)語(yǔ)句讓用戶可以選取多個(gè)區(qū)域并生成一個(gè)Region。為了便于調(diào)用代碼,創(chuàng)建自定義函數(shù)如下:
FunctionAddRegion(ByRefRegionAsAcadRegion,ColorAsACAD_COLOR)
DimP0AsVariant
DimRegionTempAsAcadRegion
DimOSIntAsInteger
on ErrorResumeNext
OSInt=ThisDrawing.GetVariable(“OSMODE”)
‘獲取對(duì)象捕捉數(shù)值
ThisDrawing.SendCommand“OSMODE31743“
‘取消對(duì)象捕捉loopstart:DoWhile1
P0=ThisDrawing.Utility.GetPoint(,vbCrLf&“請(qǐng)?jiān)谳喞€內(nèi)點(diǎn)取一點(diǎn):”)
IfErr<>0Then
Err.Clear
GoToErrorHandler
EndIf
PStr=P0(0)&“,”&P0(1)
lngnum=ThisDrawing.ModelSpace.Count
‘創(chuàng)建面域
ThisDrawing.SendCommand“-boundaryAORin
“&““&““&PStr&““&““
Iflngnum=ThisDrawing.ModelSpace.CountThen
GoToloopstart
EndIf
IfThisDrawing.ModelSpace.Item(lngnum).EntityName
=“AcDbRegion”Then
SetRegionTemp=ThisDrawing.ModelSpace.Item(lngnum)
EndIf
‘面域求和
Region.BooleanacUnion,RegionTemp
IfErr<>0Then
Err.Clear
SetRegion=RegionTemp
54www.idnovo.com.cn
欄目主持:黎艷
投稿信箱:liy@idnovo.com.cn
EndIf
Region.Color=ColorRegion.UpdateRegion.HighlightTrueLoop
ErrorHandler:
ThisDrawing.SendCommand“OSMODE“&OSInt&““‘回復(fù)對(duì)象捕捉EndFunction
2.獲得面域?qū)傩?/span>
面域生成之后,我們可以獲得面域?qū)ο蟮膶傩?從而得到面域?qū)?span>x、y軸的幾何性質(zhì)。具體的自定義函數(shù)代碼如下:
FunctionGetRegionAtt(ByRefRegionobjAs
AcadRegion,_
ByRefA,ByRefCx,ByRefCy,_
ByRefSx,ByRefSy,ByRefIx,ByRefIy,ByRefIxy)on ErrorResumeNext
A=Regionobj.Area’面積
Cx=Regionobj.Centroid(0)’質(zhì)心Cy=Regionobj.Centroid(1)
Sx=Cy*A’計(jì)算靜距Sy=Cx*A
Ix=Regionobj.MomentOfInertia(0)’慣性距Iy=Regionobj.MomentOfInertia(1)
Ixy=Regionobj.ProductOfInertia’慣性積EndFunction
3.程序求解
根據(jù)數(shù)學(xué)模型求解中的公式,我們可以采用VBA編寫代碼求解。公式推導(dǎo)時(shí)所用到的參數(shù)任意軸對(duì)x軸的角度θ、面域質(zhì)心到任意軸的距離D,需要通過(guò)VBA程序求解。在AutoCAD中可以使用“ThisDrawing.Utility.AngleFromXAxis”方法獲得指定兩點(diǎn)所形成的直線對(duì)x軸的弧度值。在VBA中計(jì)算三角函數(shù)時(shí)采用的參數(shù)為弧度,所以編寫代碼時(shí)可以直接用Radian變量代替角度θ。具體按公式求解的自定義函數(shù)代碼如下:
FunctionCalculate(ByRefRegionobjAsAcadRegion,ByRefA,ByRefCx,ByRefCy,_
ByRefSx,ByRefSy,ByRefIx,ByRefIy,ByRefIxy,_ByRefSx1,ByRefSy1,ByRefIx1,ByRefIy1,ByRef
Ix1y1,_
ByRefSx2,ByRefSy2,ByRefIx2,ByRefIy2,ByRef
Ix2y2,_
ByRefSx3,ByRefSy3,ByRefIx3,ByRefIy3,ByRef
Ix3y3)
on ErrorResumeNext
‘指定慣性軸兩點(diǎn)
P1=ThisDrawing.Utility.GetPoint(,vbCrLf&“請(qǐng)選取慣性軸第一點(diǎn):”)
P2=ThisDrawing.Utility.GetPoint(P1,vbCrLf&“請(qǐng)選取慣性第二點(diǎn):”)
Radian1=ThisDrawing.Utility.AngleFromXAxis(P1,P2)
IfStr(P1(0))=Str(Cx)AndStr(P1(1))=Str(Cy)Then
Radian2=0
Else
Radian2=ThisDrawing.Utility.AngleFromXAxis(P1,CP)
EndIf
DimCP(0To2)AsDouble
CP(0)=Cx
CP(1)=Cy
DisPP=Sqr((Cx-P1(0))^2+(Cy-P1(1))^2)‘質(zhì)心到P1點(diǎn)的距離
Radian=Radian2-Radian1慣性軸對(duì)于x軸弧度
DisPL=Abs(DisPP*Sin(Radian))‘質(zhì)心到慣性軸的距離
‘移軸至質(zhì)心
Sx1=Sx-Cy*ASy1=Sy-Cx*A
Ix1=Ix-2*Cy*Sx+Cy^2*AIy1=Iy-2*Cx*Sy+Cx^2*A
Ix1y1=Ixy-Cy*Sy-Cx*Sx+Cx*Cy*A‘轉(zhuǎn)軸
Sx2=Sx1*Cos(Radian1)-Sy1*Sin(Radian1)Sy2=Sy1*Cos(Radian1)+Sx1*Sin(Radian1)
Ix2=Ix1*Cos(Radian1)^2+Iy1*Sin(Radian1)^2-
2*Ix1y1*Sin(Radian1)*Cos(Radian1)
Iy2=Iy1*Cos(Radian1)^2+Ix1*Sin(Radian1)^2+
2*Ix1y1*Sin(Radian1)*Cos(Radian1)
Ix2y2=0.5*(Ix1-Iy1)*Sin(2*Radian1)+Ix1y1*Cos(2*Radian1)‘二次平行移軸
Sx3=Sx2+DisPL*A’所求靜距
Ix3=Ix2+DisPL^2*A’所求慣性矩EndFunction
相關(guān)標(biāo)簽搜索:AutoCAD計(jì)算截面對(duì)任意軸的靜距和慣性矩的程序設(shè)計(jì) AutoCAD計(jì)算截面對(duì)任意軸的靜距和慣性矩的程序設(shè)計(jì) AutoCAD培訓(xùn) AutoCAD培訓(xùn)課程 AutoCAD圖紙?jiān)O(shè)計(jì) AutoCAD在線視頻 AutoCAD技術(shù)學(xué)習(xí)教程 AutoCAD軟件教程 AutoCAD資料下載 Fluent、CFX流體分析 HFSS電磁分析 Ansys培訓(xùn) Abaqus培訓(xùn)