C#ATIA

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

形状セット内のサーフェスと線類を別の色にする

サーフェスと線類が混在し選択された状態で別々の色を付けたい と
昨年末辺りでご相談頂いていたのですが、遅くなりました。

CATIAの場合は色を変更する為には一度選択状態にする必要がありますが、
一辺にサーフェスと線類を別々に色付けする事は出来ません。

その為、サーフェスのみ 線類のみ の選択状態にする必要があります。

'catvba
Option Explicit

Sub CATMain()

    '準備
    Dim doc As PartDocument
    Set doc = CATIA.ActiveDocument
    
    Dim sel As Selection
    Set sel = doc.Selection
    sel.Clear
    
    Dim pt As Part
    Set pt = doc.Part
    
    '一個目の形状セット
    Dim hyBdy As HybridBody
    Set hyBdy = pt.HybridBodies.Item(1)

    '選択処理を軽くするための魔法
    'http://catiadoc.free.fr/online/interfaces/interface_Application.htm#HSOSynchronized
    CATIA.HSOSynchronized = False
    
    '意図的に形状セット内の全GSD要素を選択
    Dim entity As AnyObject
    For Each entity In hyBdy.HybridShapes
        sel.Add entity
    Next
    
    
    '---本題はここから---
    
    'HybridShapeFactory取得
    'http://catiadoc.free.fr/online/interfaces/interface_HybridShapeFactory.htm#GetGeometricalFeatureType
    Dim hyFact As HybridShapeFactory
    Set hyFact = pt.HybridShapeFactory

    '選択要素からHybridShapeFactoryでジオメトリのタイプを
    '判断し選択から外す
    'For文は逆順に行わないとインデックスがズレます
    'Surfaceは5です
    Dim idx As Long
    Dim geoType As Long
    For idx = sel.Count2 To 1 Step -1
    
        'idx番目のジオメトリのタイプを取得
        geoType = hyFact.GetGeometricalFeatureType(sel.Item(idx).Reference)
        
        'サーフェス以外は選択を解除する
        If Not geoType = 5 Then
            Call sel.Remove(idx)
        End If
    Next

    'この時点でサーフェスのみが選択状態になっている
    
    '色を変更する為のVisPropertySetを取得
    'http://catiadoc.free.fr/online/interfaces/interface_VisPropertySet.htm
    Dim vis As VisPropertySet
    Set vis = sel.VisProperties

    'SetRealColorの引数はR,G,Bで
    '4番目は良く分かってません(以前教わったような気はしてます)
    '赤色に変更してます
    Call vis.SetRealColor(255, 0, 0, 1)
    sel.Clear



    '無駄ですが、もう一度形状セット内の全GSD要素を選択
    For Each entity In hyBdy.HybridShapes
        sel.Add entity
    Next

    '選択要素からHybridShapeFactoryでジオメトリのタイプを
    '判断し選択から外す
    'Curveは2 Lineは3 Circleは4です
    For idx = sel.Count2 To 1 Step -1
    
        'idx番目のジオメトリのタイプを取得
        geoType = hyFact.GetGeometricalFeatureType(sel.Item(idx).Reference)
        
        'サーフェス以外は選択を解除する
        Select Case geoType
            Case 2, 3, 4
                '何もしない
            Case Else
                Call sel.Remove(idx)
        End Select
    Next

    'この時点で線のみが選択状態になっている
    
    '緑色に変更してます
    Call vis.SetRealColor(0, 255, 0, 1)
    sel.Clear

End Sub

形状セット内にはサーフェスと線が1個づつですが、全ての色を変更します。
実行前は左で実行後は右です。
f:id:kandennti:20210125190650p:plain

上記にSetRealColorで4番目の引数について

    'SetRealColorの引数はR,G,Bで
    '4番目は良く分かってません(以前教わったような気はしてます)

と記載していますが、こちらのサイトではより詳しく記載されています。
VisPropertySetオブジェクト|CATIAマクロの作成方法 | LiCLOG
助かります。