"マクロで作成した面の色を変更したけど、上手く反映されない"
と言った内容の御質問を頂きました。
このような状態のデータで、オフセット面を作成する操作の
マクロを記録しました。
'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メソッドと異なり、
形状セットに入れておく必要がありません。
実はこの方法を利用すると、一時的に必要な要素を形状セットに入れる
必要が無くなる為、処理が非常に速くなります。
(場合によっては遅くなります)