「マクロで面を作成し、確認を求める為メッセージボックスをさせた際
画面上に面が表示されない」
との質問を頂きました。(言葉ではわかりにくいのですが)
実はこの現象、最初は再現できなかったです。
まず、マクロ側の手間を省きたかった為、形状セットを作成し
XY平面上にスケッチを作成しました。
続いて先程のスケッチを利用して "押し出し" を作る操作を記録。
そのコードに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エディタから行いました。
その際の画像がこちら
Tree上には "押し出し" は作成されていないのですが、画面上には
しっかりと押し出された面が表示されてしまいます。
(質問者さんの現象の再現が出来ていない)
同じコードをツールバーに登録し実行すると、
再現できました。
これは、インプロセスとアウトプロセスの違いによるものだろうと思われます。
僕が把握しているのはこんな感じです。
○インプロセス
・ツールバー登録で実行
・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が必要です。)
逆に、画面表示を止め処理速度を上げる方法として
こちらでも紹介されています。
本題より現象の再現の方が、時間かかりました・・・。