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]; // ここで例外送出の可能性
// 何か処理
}