C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA

指定した要素の周囲要素を取得する1

"指定した要素の周囲の要素を取得したい" とご質問を頂きました。

すんなり行う機能がCATIAには無いような気がするので、"リフレーム オン" と "検索"
を利用します。

'vba sample_Get_Outskirt_Items  using-'KCL'
'指定した要素(GSD)の周囲要素を取得
Option Explicit

Sub CATMain()
    '言語別 "リフレーム オン" コマンド文字取得
    Dim ReframeOnCommand$
    ReframeOnCommand = GetReframeOnString()
    If ReframeOnCommand = vbNullString Then Exit Sub
    
    '選択
    Dim Msg$: Msg = "GSD要素を選択して下さい : ESCキー 終了"
    Dim HShape As HybridShape
    Set HShape = KCL.SelectItem(Msg, Array("HybridShape"))
    If KCL.IsNothing(HShape) Then Exit Sub
    
    '無駄なんですが、一度選択をクリアし再度選択
    'そうしないと "リフレーム オン" が機能しない
    Dim Doc As Document: Set Doc = CATIA.ActiveDocument
    Dim Sel As Selection: Set Sel = Doc.Selection
    Call Sel.Clear 'これは要らないかも
    Call Sel.Add(HShape)
    Call CATIA.StartCommand(ReframeOnCommand)
    
    'リフレーム オンし終わるまでの時間稼ぎ
    'ひょっとしたらカメラオブジェクトを利用したら要らないかも
    If MsgBox("これの周辺要素を取得しますか?", vbYesNo) = vbNo Then Exit Sub
    
    '検索の "画面上の表示" で取得
    CATIA.HSOSynchronized = False
    Sel.Search "Type=*,scr"
    CATIA.HSOSynchronized = True
    
    MsgBox CStr(Sel.Count2) + "個選択しました"
End Sub

Private Function GetReframeOnString()
    Select Case KCL.GetLanguage()
        Case "ja"
            GetReframeOnString = "リフレーム オン"
        Case "en"
            GetReframeOnString = "Reframe On"
        Case Else
            '日本語でメッセージ出して意味が有るのか?
            MsgBox "言語設定が、日本語か英語のみしか対応していません"
    End Select
End Function

このマクロを利用する際は、非常に個人的なCATVBA用ライブラリ "KCL" が必要です。
こちらのコードをコピーし、同一プロジェクト内の標準モジュールにペーストしてご利用下さい。
(ちょっと不具合が有ったので、今日更新しました)
非常に個人的なCATVBA用ライブラリ - C#ATIA


マクロ実行後、GSDな要素(点・線・面等)を指定すると、リフレームオンし
"これの周辺要素を取得しますか?"
とダイアログが出てきますので、十分リフレームオンしたら "はい" を押して下さい。
最後は周辺要素を選択した状態になります。


StartCommandを利用した "リフレーム オン" は昔から打率が悪いと言われて
いましたが、昔作ったコードを探しまくってこの方法を思い出しました。

自分でも忘れてしまいそうなので、改めて書いておきます。
最初に要素を指定しているので、選択状態になっているはずなのですが、
そのまま "リフレーム オン" しても反応しませんでした。
その為、下記のコードの様に再度要素をAddします。(Clearは保険です)

    Call Sel.Clear 'これは要らないかも
    Call Sel.Add(HShape)
    Call CATIA.StartCommand(ReframeOnCommand)

何故かはよくわからないのですが、これなら機能しました。


実はこのマクロ、実行した時の画面の向き(カメラオブジェクトの向き)で、
得られる結果が異なるんです。 但し、現状知っているのはこの方法のみです。

sirenのBnd_Boxクラスや、Fusion360スプリクトのboundingBoxプロパティの
ようなものが有れば、もっと違う方法で可能なのかも知れませんが・・・。