5.1 治療装置名のチェック

目的

統一された治療装置が選択されているかチェックします。

必要な情報

プランで使用されている治療装置名

与えられている引数

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

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

現在開いているプランの最初の照射野で設定されている治療装置IDへアクセスするには、以下のようにします。

照射野情報はシーケンスに格納されており、指定されたインデックスの要素を取得するために ElementAt() を使用します。 ElementAt(0)を指定することで最初の照射野情報を取得できます。

治療装置IDは TreatmentUnit.Id に格納されています。

1
string machine = plan.Beams.ElementAt(0).TreatmentUnit.Id;

foreach構文(C#に特異な制御構文)

ループ処理で使用されるwhileやfor構文の書き方はC++やJavaと変わりません。

foreach構文は、コレクションのすべての要素を1回ずつ読み出すループ処理を実現できるC#の構文です。

1
2
3
4
5
6
//foreach構文

foreach(型名 変数 in コレクション)
{
    処理
}

foreach構文を使用したループ処理の例は以下のように記述できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
// foreach構文の使用例

int[] data = new int[]{1, 2, 3};

foreach(var x in data)
{
    Console.WriteLine(x);
}

// foreach構文を使用しないで同じ処理をwhile構文で書き直すと

var e = data.GetEnumerator();
while(e.MoveNext())
{
  int val = (int)e.Current;
  Console.WriteLine(x);
}
foreach構文でコレクションのすべての要素を読み出すループ処理を簡単に記述できます。

foreach構文の注意点: 要素を受け取るための変数(上記の例でいうx)は書き換えできません。

1
2
3
4
5
6
7
8
int[] data = new int[]{1, 2, 3};

foreach(var x in data)
{
    x = 1; // コンパイルエラー. xは書き換えできないため

    Console.WriteLine(x);
}

メッセージボックスによる情報の表示

思ったように動作しない場合には(条件判定等)、メッセージボックスを使用して変数に代入されている値を確認しましょう。

メッセージボックスの使用方法は次のとおりです。

1
2
3
4
5
6
7
int ans = 1 + 1;

// MessageBoxで表示できるのが文字列のためToStringメソッドを使用して変換を行う
String str_ans = ans.ToString ();

//Showメソッドを使用して表示する
MessageBox.Show(str_ans);
ShowはMessageBoxクラス(System.Windows.Forms名前空間)のメソッドです。

実装

本演習ではプランの治療装置が統一されているかチェックする仕組みを作ります。

上記の方法で最初の照射野情報から治療装置IDを取得し、 foreach構文ですべての照射野情報にアクセスしてこの装置名と一致しているかを確認します。 異なる装置が設定されている場合にメッセージを出力するようにします。

また、セットアップフィールドは IsSetupField で判定することができます。

1
2
3
4
5
6
////////////////////////////////////////////////////////////////////////////////
// Check Treatment Machine
//
checkName = "Check treatment machine";

 ~~以下にコドを記述~~

実装例

装置が統一されていたかを判定するためのbool型変数を定義する。 最初の照射野情報に設定された装置と比較して異なる場合には照射野IDと装置IDを出力する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 装置が統一されていたかを判定するためのbool型変数を定義してtrueで初期化。
bool machineChkFlag = true;

// 最初の照射野情報に設定された装置の取得
string machine = plan.Beams.ElementAt(0).TreatmentUnit.Id;

// foreach構文でループしてすべての照射野について確認する
foreach (var beam in plan.Beams)
{
    // セットアップフィールドの判定 -> セットアップフィールドではないときに次の判定にすすむ。
    if (!beam.IsSetupField)
    {
        // 最初の照射野情報に設定された装置と異なる場合
        if (machine != beam.TreatmentUnit.Id)
        {
            //machineChkFlagをfalseに変更
            machineChkFlag = false;
            //設定が間違っている照射野IDと装置IDを出力する
            oText += MakeFormatText(false, checkName, beam.Id + ": " + beam.TreatmentUnit.Id + " -> " + machine);
        }                 
    }
}

// すべての照射野の装置が統一して設定されていた場合(machineChkFlagがtrueの場合)
if (machineChkFlag == true)
{    
    //エラーメッセージ無し
    oText += MakeFormatText(true, checkName, "");
}