| 
       << Click to Display Table of Contents >> トレーニング(PA-Panel) > DCSサンプルのカスタマイズ > 新しいシンボルの追加 | 
    
既存のグラフィックシンボルと同仕様のシンボルを追加する
サンプルに存在するグラフィックシンボルと同じ仕様の部品を追加したい場合は、対象の部品を参考に、同様の仕組みのシンボルを追加してください。
■シンボルサンプルと同仕様のシンボルを追加する
SI(状態表示)のグラフィックシンボルには以下のようなサンプルが用意されていますが、これと全く同仕様の動作で、かつ、形状の異なるグラフィック部品を追加したい場合には、以下の様にします。

上画像のモーター部品には、以下の様なカスタムプロパティが設定されています。
[Property] _Point=[string];ShowBind:F _Type=[string];ShowBind:F _PopupPosX=[string];ShowBind:F _PopupPosY=[string];ShowBind:F _LampColor=body1.FillColor, body2.FillColor, body3.FillColor, body4.FillColor;ShowBind:F  | 
シンボルロジックは、上のカスタムプロパティに対するバインド式を動的に生成するため、独自に作成するシンボルについても、全く同じ構成のカスタムプロパティを設定するようにします。
  | 
試しに、左記のような四角形と円の2つのオブジェクトをグループ化し、グループオブジェクトを作成してみます。 
 ここで、各オブジェクトの「Focusable」プロパティをFALSEにしておきます。このプロパティはデフォルト値としてTRUEになっており、TRUEのままだとマウスカーソルを重ねた際に不要なフォーカス枠が表示されてしまいます。 
  | 
  | 
グループ化を行いました。 
 ここで、新たに作成したグループオブジェクトの「FocusHover」プロパティを、TRUEに設定してください。この設定により、オンライン時にマウスカーソルを重ねた際にグループ部品の周囲にフォーカス枠が表示されるようになります。 
  | 
  | 
続いて、グループオブジェクトをCtrlを押しながらダブルクリックしてグループ編集状態にします。 
 この状態で、個々のオブジェクトのNameプロパティにオブジェクト名を設定します。ここでは、例として、四角形を「body1」円を「body2」としておきます。 
  | 
  | 
各オブジェクトに名前をつけたら、グループ部品の枠外をダブルクリックして編集状態を解除します。グループオブジェクトをクリックし、カスタムプロパティに以下の設定を行います(モーター部品のカスタムプロパティをコピーし、_LampColorの行を編集するだけでOKです)。 
 [Property] _Point=[string];ShowBind:F _Type=[string];ShowBind:F _PopupPosX=[string];ShowBind:F _PopupPosY=[string];ShowBind:F _LampColor=body1.FillColor, body2.FillColor;ShowBind:F 
  | 
続いて、シンボルのプロパティを設定します。モーター部品と同様の設定としてください。
  | 
_Type : SI_TYPE1 と設定します。 
 _LampColor : 初期表示色を指定します。  | 
続いて、シンボル部品のスクリプトコードを記述します。モーター部品に記述されている以下のスクリプトを、新シンボル(グループオブジェクト)のスクリプトにそのままコピーしてください。尚、このスクリプトは全てのグラフィック部品で共通です。特別な理由がない限り、特に変更する必要はありません。
event OnInitialize()
{
	::CORE.SymbolV6.gBindSymbolScript(this);
}
event OnMouseUp(button)
{
	if(button == 1) {
		::CORE.SymbolV6.gPopupSymbol(this);
	}
}
event OnTerminate()
{
	::CloseDialog("%" & this._Point & "%", T);
}
以上で、モーター部品と同仕様の新シンボルが完成しました。
動作を確認するには、新たに作成したシンボルの_Pointにアドレスを割り付けます。
ここでは例として「SI.001」を割り付けてオンライン実行してみます。

新たに追加したシンボルが、モーター部品と同様の動作となることを確認してください。

全く新しい仕様のシンボルを新たに作成する
シンボルのサンプルとして提供されている部品では目的の仕様を満たさない場合は、新たな動作仕様のサンプルを別途追加することで対応します。
部品のバインド式の動的生成は、CORE側のシンボルロジックによって行われています。各部品から呼び出された際に、どのような動作を動的に生成するのかの識別は、部品に設定された「BindType」プロパティの設定値に基づいて行われます。新たな動作仕様を満たすシンボルを作成する際には、新たなBindTypeを定義し、CORE側のシンボルロジックに新BindTypeに対応したバインド生成ロジックを実装してください。
シンボルロジックは、COREフォーム上の以下のラベルオブジェクト「SymbolV6」上に実装されています。

SymbolV6オブジェクトのスクリプトコードをエディタで開き、新たなロジックを追加します。
編集対象になるのは、「gBindSymbolScript()」関数です。

この関数の大まかな構造としては、以下のようにBindTypeプロパティの内容を比較するswitch-case文で分岐されています。このcase文に、新たに追加する部品のBindTypeに対応したバインド式自動生成のためのロジックを追記してください。
function gBindSymbolScript(vObj)
{
	var vType = vObj.BindType;
	var vAddr = vObj.StructTagAddr;
    : : :
	switch (vType) {
	
	case "PID_PV_TYPE1":
		vValueStr = "NS(" & vAddr & ".PV ," & vAddr & ".DecimalPlace" & ")";
		vFaultStr = "(" & vAddr & ".Reliability == 0 ||
		" & vAddr & ".Reliability == 2 || " & vAddr & ".PVFailure == TRUE)";
		
		vDefault = vObj.FillColor;
		vBindStr = "IN:{" & vFaultStr & "}{SV(" & ::gcBLINK_FAST & ",
		::gColor_Fault_Blink(1),::gColor_Fault_Blink(0))}," &
		               "{default}{" & vDQ & vDefault & vDQ &"}";
		vObj.SetBindScript("FillColor", vBindStr);
		break;
    : : :
	case "あらたに追加するBindType文字列":
		//ここに、新たなBindType独自のバインドロジックを記述する。
		
		break;
    : : :
}