スイープの角度をパラメータとリンクさせる方法|CATIAマクロの作成方法
今回の記事はマクロ案募集でいただいた内容です。
今回頂いた質問の内容は以下のとおりです。
ワークベンチ: GSD
マクロ案:
マクロ案:複数ある抜き勾配面を一括で作成し、その角度をパラメーターで管理する (例)複数あるCRVからSWEEPのWith Draft Directionで抜き勾配の面を作成します。
あとで一括で角度を変えられるようにパラメータで角度を管理しま す。 SelectElement2とループ文の組み合わせで複数作成は定義できる
のですが、パラメータの追従ができません。With Draft DirectionのAngleがコードでどのように定義すれば良いかわかりません。 球なら hybridShapeSphere1.Radius
OFFSETなら hybridShapeOffset1.OffsetValue
のような定義があれば作成できるのですが。。。。
※「With Draft Direction」(英語環境) =「ドラフト方向を指定」(日本語環境)
送っていただいた内容の後半に書かれている通り、Sweepの角度パラメータは他のオブジクトとは違いわかりやすいプロパティとしては用意されていません。
ただよく見れば、Sweepオブジェクト(正確にいうとHybridShapeSweepLineオブジェクト)には「GetAngle」という角度を取得するためのメソッドが用意されています。今回はこのメソッドを使ってSweepの角度とパラメータをリンクさせるサンプルマクロを紹介していきます。
式の作成方法などの詳しい説明は目次より「コード解説」の項を参照下さい。
作成するマクロの内容
今回作成するマクロの内容は、以下のような処理を行うマクロです。
① ドラフト方向を選択(直線もしくは平面)
② ガイド曲線の入った形状セットを選択
③ 基準となる角度パラメータを作成(作成時は0deg)
④ ドラフト方向指定(With Draft Direction)でスイープを作成
⑤ ④で作成したスイープの角度を③のパラメータと紐づける
最終的には以下のようになります。
スイープの角度とパラメータ「Sweep_Angle」を紐づいているため、パラメータの数字を変更すればスイープの角度も追従して変更されます。
サンプルコード
上記のマクロのコードは以下のとおりです。
※細かいエラー処理は行っていないため、場合によってはエラーが発生します。
(ガイド曲線の入った形状セット内に曲線以外のオブジェクトが入ってる場合など)
Sub CATMain()
Dim DOC As PartDocument
Set DOC = CATIA.ActiveDocument
Dim SEL 'As Selection
Set SEL = DOC.Selection
Dim PT As Part
Set PT = DOC.Part
Dim HSF As HybridShapeFactory
Set HSF = PT.HybridShapeFactory
'ユーザー選択***************************
Dim Filter
Filter = Array("Line", "Plane")
Dim Filter2
Filter2 = Array("HybridBody")
'ドラフト方向取得 ****
Dim Msg As String
Msg = "ドラフト方向を選択してください。(Line/Plane)"
Dim Status As String
Status = SEL.SelectElement2(Filter, Msg, False)
If Status <> "Normal" Then
MsgBox "キャンセルしました。"
Exit Sub
End If
Dim DraftElm As AnyObject
Set DraftElm = SEL.Item(1).Value
'ガイド曲線取得 ******
Msg = "ガイド曲線の入った形状セットを選択してください。"
Status = SEL.SelectElement2(Filter2, Msg, False)
If Status <> "Normal" Then
MsgBox "キャンセルしました。"
Exit Sub
End If
Dim GuideHB As HybridBody
Set GuideHB = SEL.Item(1).Value
'事前準備 ***************************************************
'Output用形状セット作成
Dim HB As HybridBody
Set HB = PT.HybridBodies.Add
'パラメータ.1作成
Dim Angle1 As Parameter
Set Angle1 = PT.Parameters.CreateDimension("Sweep_Angle", "Angle", 0#)
'ループ前にドラフト方向をReference取得
Dim RefDraftDir As Reference
Set RefDraftDir = PT.CreateReferenceFromObject(DraftElm)
Dim DraftDir As HybridShapeDirection
Set DraftDir = HSF.AddNewDirection(RefDraftDir)
'スイープ作成 ************************************************
Dim i As Integer
For i = 1 To GuideHB.HybridShapes.Count
Dim GuideCRV As AnyObject
Set GuideCRV = GuideHB.HybridShapes.Item(i)
Dim Ref1 As Reference
Set Ref1 = PT.CreateReferenceFromObject(GuideCRV)
Dim DraftSweep As HybridShapeSweepLine
Set DraftSweep = HSF.AddNewSweepLine(Ref1)
DraftSweep.Mode = 6
DraftSweep.SetFirstLengthLaw 5#, 0#, 0
DraftSweep.SetSecondLengthLaw 5#, 0#, 0
DraftSweep.SetAngle 1, 0# 'ここでは適当な角度を指定(0deg)
DraftSweep.SolutionNo = 0
DraftSweep.SmoothActivity = False
DraftSweep.GuideDeviationActivity = False
DraftSweep.DraftComputationMode = 0
DraftSweep.DraftDirection = DraftDir
DraftSweep.SetFirstLengthDefinitionType 0, Nothing
DraftSweep.SetSecondLengthDefinitionType 0, Nothing
DraftSweep.SetbackValue = 0.02
DraftSweep.FillTwistedAreas = 1
DraftSweep.C0VerticesMode = True
HB.AppendHybridShape DraftSweep
PT.Update
'式の作成 **************
Dim SweepAngle As Angle
Set SweepAngle = DraftSweep.GetAngle(1) 'Sweepの角度取得
Dim ParmName As String
ParmName = Right(Angle1.Name, InStr(StrReverse(Angle1.Name), "\") - 1) ' " ←※1
Dim formula1 As Formula
Set formula1 = PT.Relations.CreateFormula("", "", SweepAngle, "`" & ParmName & "`")
PT.Update
Next i
MsgBox "完了"
End Sub
※1 サイトでの表示の関係上「’ “」を書いておかないと色がおかしくなるので書いています。
コードとは無関係なので実際のコードでは113行目の「’ “ ←※1」は消してください。
コード解説
今回のマクロでの一番の肝は「スイープの角度取得」と「式の作成」です。
そのためここではパラメータと紐づける式の作成方法をメインに解説していきます。
ここで解説する内容のコードで以下のような式を作成することができます。
基準パラメータの作成
まずは基準となるパラメータを作成します。
ここで作成したパラメータの値をスイープの角度に紐づけます。
これによりこのパラメータの値を変更すると、全てのスイープの角度も変更させることができます。
角度パラメータの作成は下記のコードを使います。
(初期値は「#0」つまりは「0deg」となっています。任意で書き換えて下さい。)
Dim Angle1 As Parameter
Set Angle1
= PT.Parameters.CreateDimension(“Sweep_Angle", “Angle", 0#)
※ CreateDimension(パラメータ名, パラメータ種類, 値)
スイープの角度を取得
スイープの角度は「HybridShapeSweepLineオブジェクト」の「GetAngleメソッド」を使うことで取得することができます。使い方は以下のとおりです。
Dim SweepAngle As Angle
Set SweepAngle = DraftSweep.GetAngle(1)
上記コードによりDraftSweepの角度を取得することができました。
ここで気を付けないといけないのは、「取得した角度」というのは「角度の値(25deg,90degなど)」ではなく、「角度パラメータ」という点です。
数値として角度の値がほしい場合は「.Value」を使います。
上記のコードの場合は「SweepAngle.Value」とすることで角度の値を取得することができます。
※本マクロでは角度の値ではなく、取得した角度パラメータをそのまま利用します。
ちなみに「GetAngle(1)」の(1)は角度インデックスです。
角度が複数ある場合、この値を変えることで取得する角度パラメータを変更することができます。
今回の「ドラフト方向を指定(With Draft Direction)」の場合は上画像の通り、角度パラメータが1つしかないため「(1)」としておけば問題ありません。
式の作成
次に上記で作成、取得したパラメータを使い「式の作成」をしていきます。
式の作成はCATIAのコマンドでいえば「式を編集(Edit Formula)」で、複数のパラメータの数値を計算式で表すことのできる機能です。
VBAで式を作成するには以下のように書きます。
Dim formula1 As Formula '「formula1」という名前の変数を宣言
Set formula1 = _
PT.Relations.CreateFormula(iName, iComment, iOutputParameter, iFormulaBody)
iName → 作成する式の名前を入力
iComment → 作成する式のコメントを入力(プロパティ内のコメント)
iOutputParameter → 作成する式の結果をアウトプットするパラメータの入力
iFormulaBody → 作成する式(文字列)を入力
※PT ⇒ CATIA.ActiveDocument.Part
上記の構文を今回のマクロで使うと以下のようになります。
Dim formula1 As Formula '「formula1」という名前の変数を宣言
Set formula1 = _
PT.Relations.CreateFormula(“", “", SweepAngle, “‘" & ParmName & “‘")
数値がイコール関係の場合は式の部分には、式の部分に要素名を書きます。
つまり式の部分には「角度.1」というようなパラメータの名称を入れるということです。
(半角アポストロフィー[`]で要素名を挟むのを忘れずに)
というわけで今回はRight関数というものを使ってパラメータ名を取得しています。
Right関数はExcelマクロでよく使用されます。
そのため検索すれば多くの情報が出てくるため、詳しくはそれらを参照ください。
Dim ParmName As String
ParmName = Right(Angle1.Name, InStr(StrReverse(Angle1.Name), “\") – 1)
上記のコードでは、簡単にいうと「取得した名前の一番右側の\マークより右側にある文字列を取得」という処理を行っています。つまりは「Part1\角度.1」という文字列の場合は「角度.1」だけを取得することができます。
あとは、ここで取得した「ParmName」を「式の作成構文」に入れることで「SweepAngle = Angle1の値」という式を作成することができます。(「“‘" & ParmName & “‘"」部)
まとめ
今回はスイープの角度とパラメータを紐づける方法について解説しました。
質問頂いた内容の答えとしては「コード解説」の「スイープの角度を取得」の項がすべてです。
コード前後の繋がりをイメージしてもらうため、簡単なサンプルマクロとして紹介しました。
スイープには「プロファイルのタイプ」と「サブプロファイル」があります。
(今回でいうとプロファイルのタイプ:「直線」/サブプロファイル:「ドラフト方向を使用」)
VBAのオブジェクトとしては「プロファイルのタイプ」分のオブジェクトしか用意されていません。
その分、各オブジェクトにそれぞれのサブプロファイル用のプロパティ/メソッドが集約されています。
他のオブジェクトに比べ少し扱いづらいですが、スイープで使用するほとんどの要素(長さ/角度パラメータ等)は取得できるはずなのでいろいろ試してみて下さい。
CATIAマクロを本気で勉強するなら










