C#ATIA

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

配置スケッチを判断する

こちらでコメントを頂きました。
Drawのスプラインを描く3 - C#ATIA

結論として、配置スケッチ(positioned sketch)はマクロでは
パワーコピー以外では作れないと思っています。


それに取り組んでいた際、気が付いた事がスケッチのタイプの判断方法です。
f:id:kandennti:20191007141737p:plain
いつか書こうと思っていたのですが、良い機会なので記載しておきます。


SketchオブジェクトのGetAbsoluteAxisDataメソッドを利用すると
スケッチサポート平面の数値的な情報が得られます。
r1 Sketch (Object)

又、SetAbsoluteAxisDataメソッドを利用するとスケッチサポート平面を数値的な
意味で変更可能です。但し、配置スケッチに関しては変更出来ません。
が、逆にとらえると配置スケッチであることは判断可能です。

'vba 配置スケッチの判断

Option Explicit

Sub CATMain()

    Dim doc As PartDocument
    Set doc = CATIA.ActiveDocument
    
    Dim sel As selection
    Set sel = doc.selection
    
    Dim pt As part
    Set pt = doc.part
    
    '全スケッチ取得
    Dim skts As Collection
    Set skts = New Collection
    
    sel.Clear
    sel.Search "CATPrtSearch.Sketch,all"
    Dim i As Long
    For i = 1 To sel.Count2
        skts.Add sel.Item2(i).Value
    Next
    sel.Clear
    
    '一時作業用形状セット
    Dim hbdy As HybridBody
    Set hbdy = doc.part.HybridBodies.Add()
    
    'スケッチタイプ判断
    Dim msg As String
    
    CATIA.HSOSynchronized = False
    
    Dim skt As Sketch
    Dim skt_tmp As Sketch
    For Each skt In skts
        'コピペ
        With sel
            .Clear
            .Add skt
            .Copy
            .Clear
            .Add hbdy
            .Paste
            Set skt_tmp = .Item2(1).Value
            .Copy
        End With
        
        msg = msg & skt.Name & " : "
        If IsPositioned(skt_tmp, sel) Then
            msg = msg & "Positioned" & vbCrLf
        Else
            msg = msg & "Sliding or Isolated" & vbCrLf
        End If
    Next
    
    '一時要素削除
    sel.Add hbdy
    sel.Delete
    pt.Update
    
    CATIA.HSOSynchronized = True
    
    MsgBox msg
    
End Sub

Private Function IsPositioned( _
    ByVal skt As Variant, _
    ByVal sel As selection _
    ) As Boolean
    
    sel.Clear
    sel.Add skt
    
    '変更前スケッチサポート情報
    Dim ax(8) As Variant
    skt.GetAbsoluteAxisData ax
    
    '変更前原点x
    Dim x As Double
    x = ax(0)
    
    '変更 x+1
    ax(0) = ax(0) + 1
    skt.SetAbsoluteAxisData ax
    
    '変更後スケッチサポート情報
    skt.GetAbsoluteAxisData ax
    
    '移動しているか?で判断
    IsPositioned = IIf(x = ax(0), True, False)
    
End Function

こちらのデータで試します。
f:id:kandennti:20191007141923p:plain
上から
スケッチ1:スライダ(通常のもの)
スケッチ2:配置
スケッチ3:分離

結果はこちら
f:id:kandennti:20191007142147p:plain
スケッチ2が配置スケッチだと判断出来ています。
・・・が、コピペの「リンクの結果として」で作成されたスケッチも
配置スケッチと判断されちゃいますので、不完全です。


これが価値あるものかどうか? と考えた際、そのまま止めて
しまいました。