此宏演示了 2 种查找与装配体坐标系相关的组件重心 (COG, Center Of Gravity) 的方法。
宏将计算所选组件的COG。
方法一、变换坐标
IModelDocExtension::GetMassProperties2方法允许计算模型中的质量属性数据。
在组件的模型级别上计算时,需要使用变换将坐标转换为装配体空间,以实现所需的结果。
Dim swApp As SldWorks.SldWorks
Sub main()
Set swApp = Application.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swSelMgr As SldWorks.SelectionMgr
Set swModel = swApp.ActiveDoc
Set swSelMgr = swModel.SelectionManager
Dim swComp As SldWorks.Component2
'获取装配体中的选定零部件。
Set swComp = swSelMgr.GetSelectedObjectsComponent3(1, -1)
Dim swCompModel As SldWorks.ModelDoc2
'获取此组件的模型文档(ModelDoc2类型)。
Set swCompModel = swComp.GetModelDoc2
Const ACCURACY_DEFAULT As Integer = 1
Dim status As swMassPropertiesStatus_e
Dim vMassPrps As Variant
'GetMassProperties2返回值为一个12位的数组
vMassPrps = swCompModel.Extension.GetMassProperties2(ACCURACY_DEFAULT, status, False)
'[ CenterOfMassX, CenterOfMassY, CenterOfMassZ, Volume, SurfaceArea, Mass, MomXX, MomYY, MomZZ, MomXY, MomZX, MomYZ ]
'[ 质心X, 质心Y, 质心Z, 体积, 表面积, 质量, 惯性矩XX, 惯性矩YY, 惯性矩ZZ, 惯性矩XY, 惯性矩ZX, 惯性矩YZ ]
Dim dCog(2) As Double
dCog(0) = vMassPrps(0): dCog(1) = vMassPrps(1): dCog(2) = vMassPrps(2)
Dim swMathUtils As SldWorks.MathUtility
Set swMathUtils = swApp.GetMathUtility
Dim swMathPt As SldWorks.MathPoint
'使用重心的坐标创建一个数学点
Set swMathPt = swMathUtils.CreatePoint(dCog)
'将数学点乘以数学变换;点被旋转、缩放,然后被平移到装配体空间。
Set swMathPt = swMathPt.MultiplyTransform(swComp.Transform2)
Dim vCog As Variant
'获取描述此数学点的 x,y,z 坐标数组。
vCog = swMathPt.ArrayData
Debug.Print "COG: " & vCog(0) & "; " & vCog(1) & "; " & vCog(2)
End Sub
方法二、使用IMassProperty接口
IMassProperty 接口模拟 SOLIDWORKS 中“质量属性”功能的功能。
质量属性弹窗
与界面中等效项(Center of mass)类似,可以为计算范围分配主体(包括组件主体)。
与以前的方法相比,这种方法的主要优点之一是可以计算轻化(lightweight)部件的COG。
Dim swApp As SldWorks.SldWorks
Sub main()
Set swApp = Application.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swSelMgr As SldWorks.SelectionMgr
Set swModel = swApp.ActiveDoc
Set swSelMgr = swModel.SelectionManager
Dim swComp As SldWorks.Component2
'获取装配体中的选定零部件。
Set swComp = swSelMgr.GetSelectedObjectsComponent3(1, -1)
Dim swMassPrps As SldWorks.MassProperty
'创建质量属性对象。
Set swMassPrps = swModel.Extension.CreateMassProperty()
Dim vCompBodies As Variant
'获取此组件中的实体。
vCompBodies = swComp.GetBodies3(swBodyType_e.swSolidBody, Empty)
'在计算此模型的质量属性时,仅使用指定的实体。
If False <> swMassPrps.AddBodies(vCompBodies) Then
Dim vCog As Variant
vCog = swMassPrps.CenterOfMass
Debug.Print "COG: " & vCog(0) & "; " & vCog(1) & "; " & vCog(2)
Else
Err.Raise vbError, "", "指定用于计算质量属性的实体失败,Failed to add bodies for calculation"
End If
End Sub
文章翻译自https://www.codestack.net/
仅供学习使用。