C#ATIA

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

コピペ "結果として" のボディを作る

タイトルが言葉足らず過ぎますが、久々にCATIAです。

マクロ実行後、ESCキーが押されるまで、クリックしたボディを
”結果として” でコピペし、そのボディが子になるようにアセンブルします。

言葉じゃ分かりにくいです。
f:id:kandennti:20220331181809p:plain
左の状態でボディ2をクリックしたら、右の状態のボディを作ります。

何がしたいのかと言うと、客先からの支給データが差し替えになった際、
古いデータと新しいデータを視覚的に比較したいので、古いデータを
一時的に残しておきたいんです!!

連日この作業を何度も行っていたのですが、さすがに嫌になりました。

'vba Part_AddBody_ver0.0.2  using-'KCL0.0.12'  by Kantoku

Private Const HEADER = ""
Private Const FOOTER = "_OLD"

Option Explicit

Sub CATMain()
    'ドキュメントのチェック
    If Not KCL.CanExecute("PartDocument") Then Exit Sub
    
    Dim msg$: msg = "クローンボディのヘッダ,フッダを入力して下さい"
    Dim NewName$: NewName = vbNullString
    NewName = InputBox(msg, , HEADER & "," & FOOTER)
    If NewName = vbNullString Then Exit Sub
    
    Dim NameAry As Variant: NameAry = Split(NewName, ",")
    If UBound(NameAry) < 1 Then Exit Sub
    
    msg = "クローンするBodyを選択して下さい : ESCキー 終了"
    Dim SelElem As SelectedElement
    Dim InBool As Boolean
    Dim clone As Body
    
    Do
        Set SelElem = KCL.SelectElement(msg, Array("Body"))
        If SelElem Is Nothing Then Exit Do
        Dim BodyOj As Body: Set BodyOj = SelElem.Value
        Dim pt As Part: Set pt = KCL.GetParent_Of_T(BodyOj, "Part")
        
        ' 結果として
        Set clone = cloneBody(BodyOj, pt)

        Call InitNewBody(clone, pt, NameAry(0), NameAry(1))
        pt.Update
continue:
    Loop
End Sub

Private Function cloneBody( _
    ByVal bdy As Body, _
    ByVal pt As Part)
    
    Dim sel As Selection
    Set sel = CATIA.ActiveDocument.Selection
    
    Dim clone As Body

    With sel
        .Clear
        .Add bdy
        .Copy
        .Add pt
        .PasteSpecial "CATPrtResultWithOutLink"
        Set clone = .Item2(1).Value
        
        'Call resetProp
        
        .Clear
    End With
    
    clone.name = bdy.name
    
    Set cloneBody = clone
    
End Function

Private Sub resetProp()
    
'    Dim shell As Object
'    Set shell = CreateObject("WScript.Shell")
'
'    Call CATIA.StartCommand("プロパティをリセット")
'
'    shell.SendKeys "{ENTER}"

    Dim sel As Selection
    Set sel = CATIA.ActiveDocument.Selection
    
    Dim vis As VisPropertySet
    Set vis = sel.VisProperties
    
    vis.SetRealColor 210, 210, 255, 1
    vis.SetRealOpacity 255, 1

End Sub

Private Sub InitNewBody( _
    ByVal bdy As Body, _
    ByVal pt As Part, _
    ByVal Head As String, _
    ByVal Foot As String)

    Dim BdyName$: BdyName = bdy.name
    Dim fact As ShapeFactory: Set fact = pt.ShapeFactory
    
    Dim NewBdy As Body: Set NewBdy = pt.Bodies.Add()
    NewBdy.name = Head + BdyName + Foot
    
    Dim Assem As Assemble: Set Assem = fact.AddNewAssemble(bdy)
    Call pt.UpdateObject(Assem)
End Sub

本当は色をリセットしたいので、”プロパティをリセット”を
”子に適応” まで入れて行いたいのですが、上手く行きません。

海外のサイトを調べても
・StartCommandで行う
・デフォルトの色を割り当てる
が見つかりましたが、望んだ結果とはならず、、、
諦めて手動で行う事にします。不便だな。