読者です 読者をやめる 読者になる 読者になる

C#ATIA

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

異なるCATPart間での要素のコピペ

先日、海外にあったマクロのソースコードを見ていた時、
2点ほど自分の認識と異なる部分がありました。
その1つが、異なるCATPart間での要素のコピペです。


通常、単体のPartファイル(例としてHoge.CATPart)内で要素の
コピペを行う場合、Selectionクラスを使う事になります。
f:id:kandennti:20150605141024p:plain

以前、"Unofficial CATIA User Forum" で
"異なるCATPart間での要素のコピペは、どのようにやるのか?"
と言う内容の質問が出てきました。 何故なら、Selectionクラスは
Documentクラスのプロパティとしての提供となるため、異なるからです。
(ペースト先をPiyo.CATPartとします)
f:id:kandennti:20150605141031p:plain

そこで、
"一時的にCATProductを作成しCATPartをぶら下げ、CATProductの
Selectionを使用してコピペしては?"
と無責任な発言をした所、この方法で出来たようでした。
(自分は試しませんでした・・・)
f:id:kandennti:20150605141038p:plain

この方法でも出来たようですが、やる事の割には結構手間のかかる
処理になるだろうと思うのですが、自分もこの方法しか無いと思って
いました。 先日見たマクロには、もっと単純な方法で行われていました。

Documentクラスのプロパティとしての提供されているSelectionクラスは、
インスタンスではなく、恐らく起動したCATIA自身が持つSelectionクラスへの
窓口みたいなものなのだろうと思います。
要は、Hoge.CATPartのSelectionでコピーし、Piyo.CATPartのSelectionで
ペーストするだけでよかったんです。
f:id:kandennti:20150605141046p:plain


では、サンプルです。 Partファイルを2個作成します。
Hoge.CATPartには、形状セットと点や線やサーフェス(スケッチ類はNG)を作成し
Piyo.CATPartは何も無い状態でOKです。
f:id:kandennti:20150605141122p:plain
ソースコードはこちら
(大文字小文字がおかしくなっていますが、動くはずです)

'VBA
Sub CatMain()
    'ドキュメント取得
    Dim HogeDoc As partDocument
    Dim PiyoDoc As partDocument
    
    Set HogeDoc = CATIA.Documents.item("Hoge.CATPart")
    Set PiyoDoc = CATIA.Documents.item("Piyo.CATPart")
    
    'セレクション取得
    Dim HogeSel As selection
    Dim PiyoSel As selection

    Set HogeSel = HogeDoc.selection
    Set PiyoSel = PiyoDoc.selection
    
    'hoge側の最初の形状セットの最初の要素をコピー
    HogeSel.Clear
    HogeSel.add HogeDoc.Part.HybridBodies.item(1).HybridShapes.item(1)
    HogeSel.Copy
    
    'piyo側にペースト
    PiyoSel.add PiyoDoc.Part
    PiyoSel.PasteSpecial ("CATPrtResultWithOutLink") '結果として
End Sub

申し訳ない事したなぁ。 単純で、恐らくこちらの方が速度も早い気がします。