C#ATIA

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

2D構成要素を配置する直前まで2

こちらの続きです。
2D構成要素を配置する直前まで - C#ATIA


"他のCATDrawingファイルのディテールシートから、特定の2D構成要素を
配置する直前までをマクロで実行したい"
と言う事だったので、再度挑戦してみました。

仮にコピー元(ディテールシートの有る)のCATDrawingファイルは、
"C:\temp\ComponentLibrary.CATDrawing"
に有る物とし、中身としてはTreeの一番上にあるシートとします。
f:id:kandennti:20151126194603p:plain
中には"hoge" "piyo" "foo" の3つの2D構成要素があり、
"piyo"をインスタンス化し配置直前までをやってみます。

コードはこちら

'vba
'コピー元のCATDrawingパス
Private Const LibraryPath = "C:\temp\ComponentLibrary.CATDrawing"

'ターゲットとなる2D構成要素名
Private Const TargetComponentName = "piyo"

'2D構成要素インスタンス化コマンド名
Private Const CommandName = "2D構成要素をインスタンス化" '日本語
'Private Const CommandName = "Instantiate 2D Component" '英語


Sub CATMain()
    '作業ドキュメント取得
    Dim WorkDoc As DrawingDocument
    Set WorkDoc = CATIA.ActiveDocument
    
    '現在のSheet取得
    Dim WorkSheet As DrawingSheet
    Set WorkSheet = WorkDoc.Sheets.ActiveSheet
    
    'ライブラリ開く
    Dim LibraryDoc As DrawingDocument
    'Set LibraryDoc = CATIA.Documents.Read(LibraryPath) 'ReadはNG
    Set LibraryDoc = CATIA.Documents.Open(LibraryPath)
    
    'ライブラリセレクション取得
    Dim LibrarySel As Selection
    Set LibrarySel = LibraryDoc.Selection
    
    '開いたライブラリの1番目のシート(ディテールシート)をコピー
    '複数あるシートから選び出す必要がある場合は、何か仕掛けが必要
    With LibrarySel
        .Clear
        .Add LibraryDoc.Sheets.Item(1) '選択はシート
        .Copy
    End With
    
    '作業ドキュメントアクティブにする
    WorkDoc.Activate
    
    '作業セレクション取得
    Dim WorkSel As Selection
    Set WorkSel = WorkDoc.Selection
    
    'ペースト
    With WorkSel
        .Add WorkDoc.DrawingRoot
        .Paste
    End With
    
    'ライブラリ閉じる
    CATIA.Documents.Item(LibraryDoc.Name).Close
    Set LibraryDoc = Nothing
    Set LibrarySel = Nothing
    
    'ターゲットの2D構成要素探す
    Dim TargetComponent As DrawingView
    Dim Comp As DrawingView
    For Each Comp In WorkDoc.Sheets.Item(WorkDoc.Sheets.count).Views
        If InStr(Comp.Name, TargetComponentName) > 0 Then
            Set TargetComponent = Comp
            Exit For
        End If
    Next
    
    'ターゲットの有無確認
    If TargetComponent Is Nothing Then
        MsgBox "目的の2D構成要素がありませんでした"
        '不要なので削除
        WorkSel.Add WorkDoc.Sheets.Item(WorkDoc.Sheets.count)
        WorkSel.Delete
        Exit Sub
    End If
    
    '作業Sheetアクティブにする
    WorkSheet.Activate
    
    '2D構成要素の選択
    WorkSel.Clear
    WorkSel.Add TargetComponent

    'インスタンス化
    CATIA.StartCommand CommandName
End Sub

本当は、幾つかの関数に分けるべきなのですが "わかりにくい"
との事なので、"Sub CATMain" 1つでやっています。
又、定数3つを使用していますが、"Sub CATMain" 内で変数に
しても同じです。

"ターゲットの2D構成要素探す" の処理は最初このような感じにしてました。

'vba
・・・
    'ターゲットの2D構成要素探す
    WorkSel.Clear
    Dim TargetComponent As DrawingView
    Dim Comp As DrawingView
    For Each Comp In WorkDoc.Sheets.Item(WorkDoc.Sheets.count).Views
        If InStr(Comp.Name, TargetComponentName) > 0 Then
            WorkSel.Add Comp
            Exit For
        End If
    Next

    '選択できたか確認
    If WorkSel.Count2 < 1 Then
	・・・
    End If
・・・
End Sub

後に選択する必要があるため、目的の2D構成要素を見つけたら
選択した状態にし、選択された要素数で確認していました。
ところが、コマンドを実行する為に最初のSheetをアクティブにする
以下の処理を行うと、選択状態が外れてしまいました。

'vba
・・・
    '作業Sheetアクティブにする
    WorkSheet.Activate
・・・
End Sub

この処理をもっと前に入れ替えたりしたのですが、やはり
選択状態が外れてしまいましたので、仕方なく

    Dim TargetComponent As DrawingView

の変数を用意し、コマンド直前に選択するようなコードにしました。
ひょっとしたら、上手く行かない部分はこの現象かも知れません。