問題:主要測量一個裝配體中的各個部件的重心到指定基准面的垂直距離,並根據各個零件的質量,計算每個基准面上的M*R和M*R^2,也就是配重和轉動慣量相關數據
初次接觸CATIA,走了好多彎路,由於會使用VB,所以上來就寫代碼,然后發現方向不對,又回過頭來看catia的特性結構和相關實例。
這里建議catia二次開發的初學者們參考 catia V5 的文檔和CATIA二次開發技術基礎這本書。
接下來介紹一下,結構圖如下(從自帶的文檔中截取的):
首先獲得Application
Set CATIA = GetObject(, "CATIA.Application")
或者創建一個
Set CATIA = CreateObject("CATIA.Appliaction")
然后就可以由Application獲取document了
'判斷是不是零件文檔 Function IsPartDocument(ByVal pDoc As Document) As Boolean If (UCase(TypeName(pDoc)) = "PARTDOCUMENT") Then IsPartDocument = True Else IsPartDocument = False End If End Function
'判斷是不是產品文檔 Function IsProductDocument(ByVal pDoc As Document) As Boolean If (UCase(TypeName(pDoc)) = "PRODUCTDOCUMENT") Then IsProductDocument = True Else IsProductDocument = False End If End Function
獲取某一個product的原點的旋轉矩陣和偏移向量
dim base(11)
product1.Position.GetComponents (base)
這里說一下,base(0)-base(8)是該產品在當前工作台中的旋轉矩陣,base(9)-base(11)是該產品的坐標原點的偏移向量。
在catia的裝配體中,是以第一個零件的坐標系作為裝配體的坐標系的,我把它理解為世界坐標系。
獲取點的偏移向量
dim ps(2)
Set mMeasurable = rootWorkBench.GetMeasurable(ref1)
mMeasurable.GetPoint (ps)
這里ps獲得偏移向量是相對於世界坐標系的偏移向量。
於是有下圖:
世界坐標系原點為O,基准坐標系原點為B,所計算的零件重心點坐標為P
根據向量關系有:BP=OP-OB
獲得MP向量后,根據基准面相對於世界坐標系的旋轉矩陣,進行投影,也就是與矩陣進行相乘即可。
Function CalcMatrix(ByRef base() As Double, ByRef part() As Double, ByRef pt() As Double) As Double() Dim ret(2) As Double Dim p(2) As Double Dim i As Integer '世界坐標下的向量bp(基准坐標原點到重心點的向量) p(0) = pt(0) - base(9) p(1) = pt(1) - base(10) p(2) = pt(2) - base(11) '根據旋轉矩陣,將向量進行投影轉換 For i = 0 To 2 ret(0 + i) = p(0) * base(0 + 3 * i) + p(1) * base(1 + 3 * i) + p(2) * base(2 + 3 * i) Next Debug.Print (ret(0) & " " & ret(1) & " " & ret(2)) CalcMatrix = ret End Function
到此,就獲得了各個零件的重心點到各個基准面的距離了,且帶有正負方向。