C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

色の変更や取得

今回は、こちらで2点と記載した残りの1点です。
異なるCATPart間での要素のコピペ - C#ATIA

以前、こちらで
レイヤーの扱いを考える1 - C#ATIA
"何故、VisPropertiesをAnyObject辺りで実装してくれなかったのだろうか?"
を書きましたが、このVisProperties(VisPropertySet)についてです。

何でも良いのですが、例としてこんな感じの形状セット内にある
サーフェス全ての色を緑に変えてみます。
f:id:kandennti:20150605162206p:plain
自分の認識では、こんなソースコードです。

'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

で、結果はこちら
f:id:kandennti:20150605161841p:plain
結果には特に意味は無く、単に "複数の色が混ざってますよ" と言う
ことです。

これを先程と同様に変更します。

'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

結果はこちら。
f:id:kandennti:20150605161855p:plain
試しに、最初のサーフェスの色を変更して再度実行した結果がこちら
f:id:kandennti:20150605161904p:plain
最初にSelectionに取り込まれた色が帰って来るようです。
まぁ確かにそうです。 まとめて処理できるのはSet~メソッドだけ
でしょう。


結論としては、

"VisPropertiesは、AnyObject辺りで実装して欲しかった"