C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

指定ボディを子ボディにしつつ、リネーム

明日には出口にたどり着けそう。長かった・・・。

少し前に行った作業で、類似した作業を何度もやることになった為
急遽作ったマクロです。


指定したボディをアセンブルで子供にするだけのマクロです。
えぇ大した事無いです。 具体的に示すとこんな事です。
f:id:kandennti:20160802185124p:plain
このボディー.2を
f:id:kandennti:20160802185131p:plain
ボディー.3にこんな感じでぶら下げるだけです。
循環更新を避けたり、ワンクッション入れたかったする為です。
もちろん、これだけであればマクロを作らずに手動でやってしまいます。
マクロの起動時間も考えれば、その方が速いです。


実際の作業で行っていたのは、
f:id:kandennti:20160802185139p:plain
このfugaを
f:id:kandennti:20160802185145p:plain
子ボディにしつつ、ボディの名前を子ボディに関係するようにしていました。
手動でやる場合、Alt+Enterでプロパティを表示させ、タブを切り替え・・・
が、面倒だったんです。

で、作ったコードがこちら

'vba using-'KCL'
Private Const Header = "piyo_"
Private Const Footer = "_hoge"

Sub CATMain()
    Dim Msg$: Msg = "Bodyを選択して下さい : ESCキー 終了"
    Dim SelElem As SelectedElement
    Do
        Set SelElem = KCL.SelectElement(Msg, Array("Body"))
        If KCL.IsNothing(SelElem) Then Exit Do
        Dim BodyOj As Body: Set BodyOj = SelElem.Value
        Dim Pt As Part: Set Pt = KCL.GetParent_Of_T(BodyOj, "Part")
        
        'パーツボディチェック
        If IsMainBody(BodyOj, Pt) Then
            MsgBox "パーツボディは出来ません"
            GoTo Continue
        End If
        
        '子ボディチェック
        If BodyOj.InBooleanOperation = 1 Then 'Boolean型だけどTrueじゃNG
            MsgBox "既に子ボディの為出来ません"
            GoTo Continue
        End If
        
        Call InitNewBody(BodyOj, Pt)
        Pt.Update
Continue:
    Loop
End Sub
    
Private Sub InitNewBody(ByVal Bdy As Body, ByVal Pt As Part)
    Dim BdyName$: BdyName = Bdy.Name
    Dim Fact As ShapeFactory: Set Fact = Pt.ShapeFactory
    
    Dim NewBdy As Body: Set NewBdy = Pt.Bodies.Add()
    NewBdy.Name = Header + BdyName + Footer
    
    Dim Assem As Assemble: Set Assem = Fact.AddNewAssemble(Bdy)
    Call Pt.UpdateObject(Assem)
End Sub

Private Function IsMainBody(ByVal Bdy As Body, ByVal Pt As Part) As Boolean
    IsMainBody = IIf(KCL.GetInternalName(Pt.MainBody) = KCL.GetInternalName(Bdy), _
                 True, False)
End Function

定数は 'Header' 'Footer' は実際に利用する文字にしておく必要があります。
又、マクロ実行中にPart・Productファイルを切り替えるとエラーになります。

'アセンブル' じゃなくて '和' が良いよ って方は、InitNewBody関数内を
ちょこっと修正すればOKです。