こちらの続きです。
2D構成要素を配置する直前まで - C#ATIA
"他のCATDrawingファイルのディテールシートから、特定の2D構成要素を
配置する直前までをマクロで実行したい"
と言う事だったので、再度挑戦してみました。
仮にコピー元(ディテールシートの有る)のCATDrawingファイルは、
"C:\temp\ComponentLibrary.CATDrawing"
に有る物とし、中身としてはTreeの一番上にあるシートとします。
中には"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
の変数を用意し、コマンド直前に選択するようなコードにしました。
ひょっとしたら、上手く行かない部分はこの現象かも知れません。