C#ATIA

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

RefreshDisplay

「マクロで面を作成し、確認を求める為メッセージボックスをさせた際
 画面上に面が表示されない」
との質問を頂きました。(言葉ではわかりにくいのですが)

実はこの現象、最初は再現できなかったです。
まず、マクロ側の手間を省きたかった為、形状セットを作成し
XY平面上にスケッチを作成しました。
f:id:kandennti:20160609141318p:plain

続いて先程のスケッチを利用して "押し出し" を作る操作を記録。
そのコードにMsgBoxを表示させ、必要であれば反転するような
コードを追加しました。

'vba
Sub CATMain()

    Dim partDocument1 As PartDocument
    Set partDocument1 = CATIA.ActiveDocument
    
    Dim part1 As Part
    Set part1 = partDocument1.Part
    
    Dim hybridShapeFactory1 As HybridShapeFactory
    Set hybridShapeFactory1 = part1.HybridShapeFactory
    
    Dim hybridShapeDirection1 As HybridShapeDirection
    Set hybridShapeDirection1 = hybridShapeFactory1.AddNewDirectionByCoord(0#, 0#, 0#)
    
    Dim hybridBodies1 As HybridBodies
    Set hybridBodies1 = part1.HybridBodies
    
    Dim hybridBody1 As HybridBody
    Set hybridBody1 = hybridBodies1.Item("形状セット.1")
    
    Dim sketches1 As Sketches
    Set sketches1 = hybridBody1.HybridSketches
    
    Dim sketch1 As Sketch
    Set sketch1 = sketches1.Item("スケッチ.1")
    
    Dim reference1 As Reference
    Set reference1 = part1.CreateReferenceFromObject(sketch1)
    
    Dim hybridShapeExtrude1 As HybridShapeExtrude
    Set hybridShapeExtrude1 = hybridShapeFactory1.AddNewExtrude(reference1, 20#, 0#, hybridShapeDirection1)
    
    hybridShapeExtrude1.SymmetricalExtension = 0
    
    hybridBody1.AppendHybridShape hybridShapeExtrude1
    
    part1.InWorkObject = hybridShapeExtrude1
    
    part1.Update

    '以下追加
    Do
        If MsgBox("反転しますか?", vbYesNo) = vbYes Then
            Call SwapLng(hybridShapeExtrude1)
            part1.Update
        Else
            Exit Do
        End If
    Loop
End Sub

'反転する関数が見つからない為、数値の入れ替え
Private Sub SwapLng(ByRef Extrude As HybridShapeExtrude)
    With Extrude
        Dim Lng#: Lng = .BeginOffset.Value
        .BeginOffset.Value = .EndOffset.Value
        .EndOffset.Value = Lng
    End With
End Sub

試しながら作っていた為、実行はVBAエディタから行いました。
その際の画像がこちら
f:id:kandennti:20160609141327p:plain
Tree上には "押し出し" は作成されていないのですが、画面上には
しっかりと押し出された面が表示されてしまいます。
(質問者さんの現象の再現が出来ていない)


同じコードをツールバーに登録し実行すると、
f:id:kandennti:20160609141337p:plain
再現できました。

これは、インプロセスとアウトプロセスの違いによるものだろうと思われます。
僕が把握しているのはこんな感じです。
○インプロセス
・ツールバー登録で実行
・Alt + F8 で表示されるマクロのメニューからの実行
○アウトプロセス
VBAエディタからの実行
・ExcelVBA等の他アプリのマクロからの実行
C#等の開発言語で作成された実行ファイルからの実行


で、本題です。
最初のコードに一行だけ追加しました。

    'vba
    ・・・
    
    part1.Update

    '以下追加
    Do
        CATIA.RefreshDisplay = True '←これを追加
        If MsgBox("反転しますか?", vbYesNo) = vbYes Then
            Call SwapLng(hybridShapeExtrude1)
            part1.Update
        Else
            Exit Do
        End If
    Loop
    
    ・・・

RefreshDisplayプロパティをTrueにしたタイミングでも、一度画面を更新する
ような感じがします。(画面が更新されるだけで、各オブジェクト(面や点等)
が更新待ちの場合は、やはりPart.Updateが必要です。)

逆に、画面表示を止め処理速度を上げる方法として
こちらでも紹介されています。

画面の更新を停止 | PLM Tips Magazine


本題より現象の再現の方が、時間かかりました・・・。