今回は、Inventor 2022でのAPIの変更点について、主な点をご案内をしたいと思います。
Inventor 2022 SDKと日本語版Help
まず、Inventor 2022で、アドインモジュール等の開発に必要となるSDKについては、以下の記事にてご案内をしておりますので、こちらをご一読ください。
また、日本語版のAPI Helpについては、以下の記事にてご案内をしておりますので、ダウロードして取得をしていただければと思います。
API Helpの「Inventor APIの新機能」では、Inventor 2022でのAPIの更新内容について記載されておりますので、是非一度ご確認ください。
ご参照いただくとわかりますが更新内容は非常に多岐にわたり、全ての内容をご説明することは難しいため、この記事では、Inventor 2022の主なトピックスである「モデル状態」について解説をしたいと思います。
モデル状態への対応
それでは、Inventor 2022で最も大きな変更となる、モデル状態についてAPIでの対応を解説したいと思います。
新しいModelState APIは、アセンブリとパートドキュメントでモデル状態オブジェクトの作成/編集/削除およびモデル状態に関連する機能をサポートしています。
例えば、以下のようなコードで、定義済みのモデル状態(モデル状態名:"モデル状態1")にアクセスし、現在アクティブなモデル状態を変更することが出来ます。
Public Sub ChangeCurrentModelState()
Dim oPartDoc As PartDocument
Dim oPartCompDef As PartComponentDefinition
Dim oModelStates As ModelStates
Set oPartDoc = ThisApplication.ActiveDocument
Set oPartCompDef = oPartDoc.ComponentDefinition
Set oModelStates = oPartCompDef.ModelStates
Dim oModelState As ModelState
Set oModelState = oModelStates.Item("モデル状態1")
oModelState.Activate
End Sub
さて、以前のこちらの記事で、モデル状態機能を用いて、パラメーター値、フィーチャ、コンポーネント、部品表、iProperty、パラメーター、部品表、材料/色、といった内容をモデル状態毎に設定をすることが可能であるとご案内をいたしました。
それでは、APIでこれらの設定にアクセスした場合どのようになるのか?について、iPropertyを例にしてどのようになるかを見ていきたいと思います。
以下の様に、3つのモデル状態(マスター、モデル状態1、モデル状態2)を持ち、それぞれのモデル状態でiPropertyの「部品番号」と「ストック番号」に異なる値を設定したパートファイルを用意しました。
このパートファイルで、”マスター”モデル状態をアクティブ化して、以下のようなコードで部品番号を取得した場合、スクリーンショットのように”マスター”モデル状態での設定値が取得されます。
Public Sub ShowPartNumberProperty()
Dim oPartDoc As PartDocument
Dim oPartCompDef As PartComponentDefinition
Set oPartDoc = ThisApplication.ActiveDocument
' Get the design tracking property set.
Dim invDesignInfo As PropertySet
Set invDesignInfo = oPartDoc.PropertySets.Item("Design Tracking Properties")
' Get the part number property.
Dim invPartNumberProperty As Property
Set invPartNumberProperty = invDesignInfo.Item("Part Number")
MsgBox "Part Number: " & invPartNumberProperty.Value
End Sub
次に、アクティブなモデル状態を”モデル状態1”に変更してから、部品番号にアクセスすると、以下の様に”モデル状態1”での値が取得されます。
このように、2021以前からのAPIを用いて、モデル状態に依存して値が変わる内容にアクセスした場合は、”現在アクティブ”なモデル状態の値が取得されることが分かるかと思います。
それでは、”現在アクティブ”なモデル状態を変更せずに、各モデル状態での内容にアクセスしたい場合はどのようにすればよいのでしょうか?
Inventorの内部的には、各モデル状態での内容は、次の図のようなModelStateTableという表形式で、それぞれのモデル状態での設定値を保持しています。
表の列に対応するModelStateTableColumnは、モデル状態毎に内容が異なる設定(例えば、iPropertyの部品番号)を表し、行に対応するModelStateTableRowは、モデル状態を表します。そして表の各セルに対応するModelStateTableCellは、その行(モデル状態)の、列(設定項目)に対応する、設定内容に対応します。
例えば、以下の様なコードにより、現在アクティブなモデル状態にかかわらず、全モデル状態の部品番号を取得することができます。
Public Sub ShowModelStatePartNumberProperty()
Dim oPartDoc As PartDocument
Dim oPartCompDef As PartComponentDefinition
Dim oModelStates As ModelStates
Set oPartDoc = ThisApplication.ActiveDocument
Set oPartCompDef = oPartDoc.ComponentDefinition
Set oModelStates = oPartCompDef.ModelStates
Dim oModelStateTable As ModelStateTable
Set oModelStateTable = oModelStates.ModelStateTable
Dim oModelStataTableRow As ModelStateTableRows
Dim oModelStateTableColumn As ModelStateTableColumn
For Each oModelStateTableColumn In oModelStateTable.TableColumns
If oModelStateTableColumn.DisplayHeading = "部品番号" Then
Dim i As Integer
For i = 1 To oModelStateTableColumn.Count
Debug.Print "Index=" & i & " Value= " & oModelStateTableColumn.Item(i).Value
Next
End If
Next
End Sub
なお、ModelStateTableには、各モデル状態で”個別に設定をした”内容のみが格納されております。
このため、全モデル状態で、共通の設定内容を持つ場合、その内容はModelStateTableには表れないこととなります。
また、編集操作で各モデル状態で差異がある内容が追加された場合は、その設定がModelStateTableのModelStateTableColumnとして追加されます。
また、新しいモデル状態自体が追加された場合はModelStateTableRowに行が追加されることとなります。
さて、ここまでモデル状態で差異のある内容の取得について確認をしてきましたが、「2021以前の、既存APIを用いた編集操作についての注意点」について触れておきたいと思います。
例えばですが、以下のようなコードを用いて、iPropertyの部品番号の値を更新した場合、部品番号の変更は、”現在アクティブなモデル状態”になるでしょうか?それとも”すべてのモデル状態”になるでしょうか?
Public Sub UpdatePartNumberProperty()
Dim oPartDoc As PartDocument
Dim oPartCompDef As PartComponentDefinition
Dim oModelStates As ModelStates
Set oPartDoc = ThisApplication.ActiveDocument
' Get the design tracking property set.
Dim invDesignInfo As PropertySet
Set invDesignInfo = oPartDoc.PropertySets.Item("Design Tracking Properties")
' Get the part number property.
Dim invPartNumberProperty As Property
Set invPartNumberProperty = invDesignInfo.Item("Part Number")
invPartNumberProperty.Value = " Part1 Updated from API"
End Sub
多くの方は、”現在アクティブなモデル状態”に反映されることを期待されているかと思いますが、実はこの編集の結果がどのモデル状態に反映されるかは、ModelStates.MemberEditScopeプロパティの設定値に依存します。
ModelStates.MemberEditScopeプロパティの設定値がkEditActiveMemberの場合、編集の結果は”現在アクティブなモデル状態”にのみ反映されます。
一方で、ModelStates.MemberEditScopeプロパティの設定値がkEditAllMembersの場合、編集の操作はすべてのモデル状態に対して反映されます。
これはちょうど、InventorのGUI上で モデル状態の編集範囲を設定することに相当します。
このため、モデル状態毎に違う値を持つ内容を、kEditAllMembersの状態で変更すると、その変更はすべてのモデル状態に対して行われ、すべてのモデル状態で同じ状態を持つようになります。
実際、各モデル状態で差異が無い状態となるため、ModelStateTableから、その内容に対応するModelStateTableColumnが削除されます。
このため、各モデル状態で異なる内容を設定していたにもかかわらず、APIでの編集の結果、意図せずに全モデル状態を同じ値にしてしまうといったことが無いようにご留意ください。
なお、今回ご紹介した、モデル状態、VBSコードを含むパートファイルは、こちらのリンクから取得 Part1をダウンロードいただけますので、必要に応じてご利用ください。
レジストリ登録アドインのリタイア
さて、ここまでモデル状態について解説をしてきましたがもう一つ、Inventor 2022での注意が必要な変更についてご案内をしたいと思います。
Inventor 2010で、レジストリ登録が不要なアドインが導入されて以降、ご案内をしておりましたがInventor のアドインを作成には、レジストリ登録が不要なRegfree形式で作成することを推奨しておりました。
今回、Inventor 2022からは、レジストリ登録を行う形式で作成されたアドインは、Inventorの Add-Insマネージャ ダイアログに表示されなくなります。
レジストリ登録を行うアドインから、レジストリ登録が不要なアドインへの変換方法については以下のURLにてご案内をしております。
Inventor 2022で レジストリ登録を行う形式で作成されたアドインを引き続き使用する場合は、レジストリ キーの値を作成して有効にする必要があります。
キーの場所: [HKEY_CURRENT_USER\SOFTWARE\Autodesk\Inventor\RegistryVersion26.0\System\Preferences]
キー値の名前: LoadRegisterBasedAddins
キー値データ: dword:00000001
なお、レジストリ登録が必要なアドインは、将来のリリースでサポートされなくなる可能性がありますので、レジストリ登録が不要なRegfree形式への変換を行うことを強く推奨します。
By Takehiro Kato
コメント