今回は、こちらで2点と記載した残りの1点です。
異なるCATPart間での要素のコピペ - C#ATIA
以前、こちらで
レイヤーの扱いを考える1 - C#ATIA
"何故、VisPropertiesをAnyObject辺りで実装してくれなかったのだろうか?"
を書きましたが、このVisProperties(VisPropertySet)についてです。
何でも良いのですが、例としてこんな感じの形状セット内にある
サーフェス全ての色を緑に変えてみます。
自分の認識では、こんなソースコードです。
'vba 1つ1つ色変更 Dim HBSFactory As HybridShapeFactory Sub CatMain() 'ドキュメント取得 Dim Doc As partDocument Set Doc = CATIA.ActiveDocument '最初の形状セット内のGSD要素取得 Dim HBShapes As HybridShapes Set HBShapes = Doc.Part.HybridBodies.item(1).HybridShapes 'セレクション取得 Dim Sel As selection Set Sel = Doc.selection 'HybridShapeFactory取得 Set HBSFactory = Doc.Part.HybridShapeFactory 'HBShapes内のサーフェスの色を変更 Dim Shape As hybridShape Sel.Clear For Each Shape In HBShapes'① If IsSurface(Shape) Then Sel.add Shape Sel.VisProperties.SetRealColor 0, 255, 0, 1 Sel.Clear End If Next End Sub 'サーフェスチェック Private Function IsSurface(Shape As hybridShape) As Boolean Dim oRef As Reference Set oRef = Shape '強引 IsSurface = IIf(HBSFactory.GetGeometricalFeatureType(oRef) = 5, True, False) End Function
認識違いは①のループ内です。ループ内では "サーフェスのみ" と言う条件を
満たすものをSelectionに取り込みVisPropertiesで色を変更しています。
要は1個ずつ色を変更しています。
ところが、以下のような方法でも可能でした。 上記のCatMain部分のみを
変更します。
'vba まとめて色変更 Sub CatMain() 'ドキュメント取得 Dim Doc As partDocument Set Doc = CATIA.ActiveDocument '最初の形状セット内のGSD要素取得 Dim HBShapes As HybridShapes Set HBShapes = Doc.Part.HybridBodies.item(1).HybridShapes 'セレクション取得 Dim Sel As selection Set Sel = Doc.selection 'HybridShapeFactory取得 Set HBSFactory = Doc.Part.HybridShapeFactory 'HBShapes内のサーフェス取得 Dim Shape As hybridShape Sel.Clear For Each Shape In HBShapes If IsSurface(Shape) Then Sel.add Shape End If Next '選択要素の色変更 Sel.VisProperties.SetRealColor 0, 255, 0, 1'② Sel.Clear'② End Sub
変更すると言っても②の2行をループの外に追い出しただけです。
ループでは条件を満たすもの(サーフェス)だけをSelectionに取り込み、
選択状態を保ったまま、VisPropertiesプロパティで色を変更させています。
イメージとしては手動で、ShiftやCtrlを併用しながら要素を複数選択し
コンテキストメニューでプロパティを開いて色を変更する感じでしょうか?
確かに"VisPropertiesプロパティ"は、"VisProperty"では無く、複数形
何ですよね・・・。
そこで大きな疑問が。 Set~メソッドではまとめて設定できるので
都合が良いが、Get~メソッドの場合はどうなるのか? では、実験です。
最初の物をちょっと変更し、RGBをイミデイトウィンドウに出力します。
'vba 1つ1つ色取得 Sub CatMain() 'ドキュメント取得 Dim Doc As partDocument Set Doc = CATIA.ActiveDocument '最初の形状セット内のGSD要素取得 Dim HBShapes As HybridShapes Set HBShapes = Doc.Part.HybridBodies.item(1).HybridShapes 'セレクション取得 Dim Sel As selection Set Sel = Doc.selection 'HybridShapeFactory取得 Set HBSFactory = Doc.Part.HybridShapeFactory 'HBShapes内のサーフェスの色を取得 Dim Shape As hybridShape Dim r As Long, g As Long, b As Long Sel.Clear For Each Shape In HBShapes If IsSurface(Shape) Then Sel.add Shape Sel.VisProperties.GetRealColor r, g, b Debug.Print CStr(r) + ":" + CStr(g) + ":" + CStr(b) Sel.Clear End If Next Debug.Print "- END -" End Sub
で、結果はこちら
結果には特に意味は無く、単に "複数の色が混ざってますよ" と言う
ことです。
これを先程と同様に変更します。
'vba まとめて色取得 Sub CatMain() 'ドキュメント取得 Dim Doc As partDocument Set Doc = CATIA.ActiveDocument '最初の形状セット内のGSD要素取得 Dim HBShapes As HybridShapes Set HBShapes = Doc.Part.HybridBodies.item(1).HybridShapes 'セレクション取得 Dim Sel As selection Set Sel = Doc.selection 'HybridShapeFactory取得 Set HBSFactory = Doc.Part.HybridShapeFactory 'HBShapes内のサーフェス取得 Dim Shape As hybridShape Dim r As Long, g As Long, b As Long Sel.Clear For Each Shape In HBShapes If IsSurface(Shape) Then Sel.add Shape End If Next '選択要素の色取得 Sel.VisProperties.GetRealColor r, g, b Debug.Print CStr(r) + ":" + CStr(g) + ":" + CStr(b) Sel.Clear Debug.Print "- END -" End Sub
結果はこちら。
試しに、最初のサーフェスの色を変更して再度実行した結果がこちら
最初にSelectionに取り込まれた色が帰って来るようです。
まぁ確かにそうです。 まとめて処理できるのはSet~メソッドだけ
でしょう。
結論としては、