穴軸とパイプ面作成マクロ[Type A]|CATIAマクロの作成方法

今回の記事は「お問い合わせ」よりいただいた内容です。
送って頂いた内容は以下のようなマクロです。

●プロダクトファイル開いた状態で
 ツリーにぶら下がっているパートをアクティブにしてマクロを実行させたいです。
 
①穴軸とパイプ面作成 タイプA
  選択          
   円のエッジ選択 (円はボディ&サーフェスエッジ) 
    ↓
  結果
   点 と 円の軸線作成 と 作成された軸線に対してスイープ(中心と半径) 
 
 ・ A、Bの軸線及び面直線は点から両端で作成 (例 始点-10mmm,終点10mm)
 ・ 線片側長さとスイープ直径はダイアログで数値を入力 
      (線片側長さは10と入力すれば始点-10mmm,終点10mm 全長は20mm, 
   スイープは入力時には直径の数値を入れたいです。)
 ・ 作成された線やスイープは作成後に履歴により寸法変更もしたいです。

複数のマクロ案を頂いたので、それぞれ別ページでまとめていきます。
(上記お問い合わせ内容に番号やタイプがついているのは複数案頂いたためです)

今回のマクロはユーザーが選択したオブジェクトを使って形状を作成するだけなので、作り方さえわかれば他の形状作成系マクロもすぐに使いこなせるようになります。

またCATProduct上で実行することを想定していますが、これにはちょっとしたテクニックが必要になるのでぜひここで押さえておきましょう。

※本ページの内容は穴軸とパイプ面作成マクロ[Type B]とほとんど同じです。
 コピペ部分もあるのでTypeAを理解している方は、流し読みでも理解できると思います。

 

マクロの機能

今回作成したマクロは
『ユーザーが選択した円エッジに対して軸線とパイプ面を作成するマクロ』です。

具体的な機能は以下のとおりです。

  マクロの機能まとめ ・選択したエッジ(円)に対して軸線とパイプ面を作成する
・軸線の長さとパイプ面の半径は作成前にインプットボックスで指定が可能
・作成した形状は全てツリー第1階層に作成する新規形状セットにまとめる

 

サンプルコード

マクロのサンプルコードは以下のとおりです。

 

コード解説

形状作成部分のコードは基本的に以下の①〜③を繰り返すだけなのでここでは割愛します。
① 形状の取得
② 取得した形状のReferenceを作成
③ ReferenceとHybridShapeFactoryを使って形状作成

以下では形状作成を行うまでのドキュメントの定義方法、ユーザー選択オブジェクトの確認などの形状作成部分以外のコードを解説していきます。
 

ドキュメントの定義

まずはドキュメントの定義を行います。
通常は「Set DOC = CATIA.ActiveDocument」のように1行で済ませることのできる「ドキュメントの定義」ですが、お問い合わせの内容によると「プロダクトファイル開いた状態でツリーにぶら下がっているパートをアクティブにしてマクロを実行させたいです。」とのことです。この場合、アクティブドキュメントはCATPartではなくCATProductになってしまうので、単純に「Set DOC = CATIA.ActiveDocument」と書いてしまうと以降の処理でCATPartの処理を行うことができません。

というわけでここでは少し違う方法を使ってドキュメント(CATPart)を定義していきます。

まずはドキュメントの定義はせず、ユーザーに「SelectElement2」を使ってエッジを選択させます。

次にこのエッジの親オブジェクトを順々に見ていき、PartDocumentオブジェクトになった時に、そのオブジェクトをドキュメントとして定義します。(コードでいうと「Do〜Loop」の部分)

エッジを選択し親オブジェクトを見ていくと
選択したEdge < HybridShapeSurfaceExplicit < Parameters < Part < PartDocument
といった具合に、必ず「PartDocument」が見つかります。

つまり「Until TypeName(tmp_Obj) = “PartDocument”」と条件をつければ、いつかはPartDocumentオブジェクトを取得できるというわけです。
実際に下のツリー構造で見てもCATPartを扱うPartDocumentオブジェクトは最上位のオブジェクトなので、親を順々に見ていけば必ず見つけることができるということがわかります。

 

ユーザー選択の円を確認

次にユーザーが選択した円が”正円なのか”を確認していきます。
というのも前項で「SelectElement2」を使ってエッジを取得させましたが、その選択フィルターは”Edge”、つまりはエッジで円でなくても選択できるようになってしまっています。

しかし、以降の形状作成の処理では、ユーザーが選択したエッジは正円である必要があります。
([点]コマンドの[円/球/楕円の中心]を使って作成するため)

上記のコードでは「Measurableオブジェクト」の「GetCenterメソッド」を使って、ユーザーが選択したエッジの中心点の座標を取得しています。

ここでユーザーが選択したエッジが正円でない場合は、中心座標の取得ができないため「GetCenterメソッド」の行でエラーが発生します。つまり言い換えればここでエラーが発生した場合、ユーザーの選択したエッジは正円でないことがわかります。

ここではエラーが出た場合に「On Error GoTo ErrLabel」を使って「ErrLabel:」に処理を飛ばすようにします。これにより、ユーザーに正円エッジを選択するよう促すことが可能になります。

あとは「ErrLabel:」から前項の「label1:」に処理を飛ばすことで、正円が選択されるまではユーザーの選択フェーズが永遠と続くような仕様になっています。(もちろん[Esc]キーでマクロの中断もできます)

ユーザー選択のエッジが正円と確認できれば以降で形状作成の処理を行います。
この部分は初めにもいった通り、同じような処理の繰り返しなので割愛します。
(コードのコメント文を見れば何をやっているかある程度理解できると思います)

 

まとめ

今回は「ユーザーが選択した円エッジに対して軸線とパイプ面を作成するマクロ」についての内容でした。

CATProduct上でCATPartの処理を行うには、今回やったようなテクニックが必要になります。
やっていること自体はかなり単純なものなので、他の場面にもすぐに応用できるようになると思います。

また、ユーザーが選択したエッジが正円かを確認する方法も、あえてエラーを発生させることで判断しています。
少し無理矢理感も否めませんが、他にも「選択されたエッジの両端に点を作成し、その距離を測る」という方法もあります。こちらの場合は、距離が「0」であれば円、「0」以外は円でないということがわかります。ただ円は円でも正円とは確定できないので今回の方法で行いました。

自身の知っているコードだけでもうまく使えば、今回のようにちょっとした「どうしよう」に対応することができます。ぜひ様々なサンプルコードを見て、盗める部分だけ盗んで自分のものにして書き換えていきましょう。
 

目次へ戻る
 

icon-book CATIAマクロを本気で勉強するなら

 

2020年9月12日CATIA, CATIAマクロ, VBA

Posted by Lic