C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA

UpdateとUpdateObject

"マクロで作成した面の色を変更したけど、上手く反映されない"
と言った内容の御質問を頂きました。

このような状態のデータで、オフセット面を作成する操作の
マクロを記録しました。

f:id:kandennti:20170612170332p:plain

'vba
Sub CATMain()
    Dim partDocument1 As PartDocument
    Set partDocument1 = CATIA.ActiveDocument
    
    Dim part1 As Part
    Set part1 = partDocument1.Part
    
    Dim parameters1 As Parameters
    Set parameters1 = part1.Parameters
    
    Dim hybridShapeSurfaceExplicit1 As HybridShapeSurfaceExplicit
    Set hybridShapeSurfaceExplicit1 = parameters1.Item("サーフェス.1")
    
    Dim reference1 As Reference
    Set reference1 = part1.CreateReferenceFromObject(hybridShapeSurfaceExplicit1)
    
    Dim hybridShapeFactory1 As HybridShapeFactory
    Set hybridShapeFactory1 = part1.HybridShapeFactory
    
    Dim hybridShapeOffset1 As HybridShapeOffset
    Set hybridShapeOffset1 = hybridShapeFactory1.AddNewOffset(reference1, 5#, True, 0.01)
    
    Dim hybridBodies1 As HybridBodies
    Set hybridBodies1 = part1.HybridBodies
    
    Dim hybridBody1 As HybridBody
    Set hybridBody1 = hybridBodies1.Item("形状セット.1")
    
    hybridBody1.AppendHybridShape hybridShapeOffset1
    
    part1.InWorkObject = hybridShapeOffset1
    
    part1.Update
End Sub

色を変更する為の(手抜き感たっぷりな)関数をこんな感じで作成しました。

'色設定
Private Sub SetColor(ByVal Surf As HybridShapeOffset)
    With CATIA.ActiveDocument.Selection
        .Clear
        .Add Surf
        .VisProperties.SetRealColor 0, 255, 0, 1
        .Clear
    End With
End Sub

引数に渡されたオフセットなオブジェクトを緑色に変更するだけです。

問題は、このSetColor関数をCatMainの何処に記載するか? です。


一番問題ないのが、一番最後の位置です。

	・・・
    hybridBody1.AppendHybridShape hybridShapeOffset1
    
    part1.InWorkObject = hybridShapeOffset1
    
    part1.Update
    
    Call SetColor(hybridShapeOffset1) '追加
End Sub

御質問頂いた方の場合は、こんな感じのコードでした。

	・・・
    hybridBody1.AppendHybridShape hybridShapeOffset1
    
    part1.InWorkObject = hybridShapeOffset1
    
    Call SetColor(hybridShapeOffset1) '追加
    
    part1.Update
End Sub

ご本人も "Updateの後に色の変更であれば可能" と言う認識は
されておりました。

そこでちょっと意地悪く、こんなコードにしてみます。

	・・・
    'hybridBody1.AppendHybridShape hybridShapeOffset1 'コメント化
    
    part1.InWorkObject = hybridShapeOffset1
    
    part1.Update
    
    Call SetColor(hybridShapeOffset1) '追加
    
    hybridBody1.AppendHybridShape hybridShapeOffset1 '追加
    
    part1.Update

アップデート後に色は変えるものの、形状セットに入れる(AppendHybridShape)
のは、後回しにします。 この場合、色は変更されませんでした。

この事から、
・色の変更は、アップデート後に行う。
・アップデートする前に、形状セットに入れておく必要がある。

と言うことになりそうです。


そこで、このようなコードを提案してみました。

	・・・
    Dim hybridShapeOffset1 As HybridShapeOffset
    Set hybridShapeOffset1 = hybridShapeFactory1.AddNewOffset(reference1, 5#, True, 0.01)
    
    Call part1.UpdateObject(hybridShapeOffset1) '追加
    Call SetColor(hybridShapeOffset1) '追加
    
    Dim hybridBodies1 As HybridBodies
    Set hybridBodies1 = part1.HybridBodies
	・・・

オフセット面を作成(AddNewOffset)し、形状セットに入れる前に
UpdateObjectメソッドでアップデートし、色を変更する手順です。

UpdateObjectメソッドであれば、Updateメソッドと異なり、
形状セットに入れておく必要がありません。 

実はこの方法を利用すると、一時的に必要な要素を形状セットに入れる
必要が無くなる為、処理が非常に速くなります。
(場合によっては遅くなります)