LoginSignup
0
0

More than 1 year has passed since last update.

Autodesk Inventor API Hacking (安全にDefinitionに到達する)

Posted at

0. はじめに

Freeradicalの中の人、yamarahです。
ツールを作ったものの、後日Occurrence.Definitionを参照する部分で例外が発生する、ということがあります。
想定していなかった条件に遭遇したからなのですが、毎度毎度この罠にハマるので、条件を整理してみます。

1. Occurrence.Definition

Occurrence.Definitionの取得で注意すべき条件です。

条件 Definition ReferencedDocumentDescriptor.ReferenceMissing Suppressed Enabled
省略 例外送出 ... true ...
リンク切れ 例外送出 true ... ...
仮想コンポーネント VirtualComponentDefinition ReferencedDocumentDescriptorがnull ... ...
[有効]がoff ... ... false

使っている事例を見たことが無いのですが、[有効]がoffの場合も調べました。これは無視して構わなさそうです。
やっかいなのは、省略とリンク切れで、これらの場合はDefinitionに触るだけで例外が送出されます。また、リンク切れの判断に使うReferencedDocumentDescriptor.ReferenceMissingは、仮想コンポーネントの場合にReferencedDocumentDescriptorがnullであるという罠があります。
これらの条件を加味して、判断のコードは以下になります。評価順序が大切です。

var occ = InventorApplication.ActiveDocument.SelectSet[1] as ComponentOccurrence;
string message;

if (occ is null)
{
    message = "occ is null.";
}
else if (occ.Suppressed)
{
    message = "occ is suppressed.";
}
else if (occ.ReferencedDocumentDescriptor?.ReferenceMissing == true)
{
    message = "occ's reference is missing.";
}
else if (occ.Definition is VirtualComponentDefinition)
{
    message = "occ is a virtual component occurrence.";
}
else
{
    message = "occ is a normal occurrence.";
}
Console.WriteLine(message);

2. BOMRow.ComponentDefinitions

Occurrenceを省略して、BOM数量が0になった場合は注意が必要です。BOMRowは数量0のまま残るのですが、BOMRow.ComponentDefinitionsはitem数0のCollectionを返します。
ですので、次のようなコードは、そのうちに例外を送出します。

foreach (BOMRow bomRow in bomRows)
{
    var definition = bomRow.ComponentDefinitions[1];    // ここで例外送出の可能性
    // 何か処理
}

99. 親の記事に戻る

Autodesk Inventor API Hacking (概略)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0