8.1 輪郭命名規則のチェック

目的

輪郭名の命名規則をチェックします。本実習では、DICOM typeが PTV になっている輪郭が、「PTV」という名前から始まっているかを判定しましょう。

必要な情報

輪郭名、輪郭のDICOM Type

与えられている引数

PlanSetupクラスのインスタンスplan

必要な情報へのアクセス方法

プランで用いられているStructureSetの取得

1
var ss = plan.StructureSet;

StructureSetに含まれるStructureオブジェクトのコレクション

1
var structures = ss.Structures;

必要な情報の表示

Exercise_PlanCheck_Ex1.3.csを開き、関数CheckStructureFunc内に以下のコードを記述します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
var ss = plan.StructureSet;
var structures = ss.Structures;

string m = "";

// foreachでstructuresをループ
foreach (var s in structures)
{
    if (s.DicomType == "PTV")
    {
        m += s.Id + "\n";
    }
}

MessageBox.Show(m);

StructureのDicomTypeがPTVのものだけ抽出し、それを表示しています。 表示されたStructureのDicomTypeをEclipseで表示し、間違いがないか確認しましょう。

実装

まず、Exercise_PlanCheck_Ex1.3.csCheckStructureFunc内の以下の部分をコメントアウトします。

1
2
3
// 輪郭の命名規則のチェック
// Volume TypeがPTVの場合に輪郭名がPTVから始まっているかチェック
checkName = "Check structure ID";

まず、チェック判定を行うフラグと、出力する文字列を定義しておきましょう。

1
2
string checkStructureText = "\n";
bool checkStructureId = true;

foreach文を使い、Structureオブジェクトを順番に取得して処理します。
DICOM Type を取得する場合は、StructureクラスのDicomTypeプロパティにアクセスします。
また、輪郭名の文字列が「PTV」から始まっているかは、string.StartsWith(文字列)とすることで判定可能です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
foreach (var s in ss.Structures)
{
    if (s.DicomType == "PTV")
    {
        if (!s.Id.StartsWith("PTV"))
        {
            checkStructureText += string.Format("{0} should start with PTV\n", s.Id);
            checkStructureId = false;
        }
    }
}

最後に結果を出力すればOKです。

1
2
3
4
5
6
7
8
if (checkStructureId)
{
    oText += MakeFormatText(true, checkName, "");
}
else
{
    oText += MakeFormatText(false, checkName, checkStructureText);
}