Visual検索の方法 前編

皆さんこんにちは、Emulate3Dの技術担当の大竹です。

Emulate3Dで対象のVisualに対して、Scriptを使用して何か操作する…
こんなことは日常茶飯事ですよね。

操作するためには、操作するVisualを見つける必要がありますが、
大量のVisualの中から探し出すのは大変です。

そこで、今回はEmulate3Dで利用頻度の高いVisual検索を前編・後編に分けてご紹介します。

目次

■ シーン上に置かれたVisualから検索

  □「名前」で1個のVisualを取得する方法

  □「名前」で複数のVisualを取得する方法

  □「タイプ」で複数のVisualを取得する方法

■ プロパティ紐づけでVisualを取得

■ まとめ

シーン上に置かれたVisualから検索

シーン上に置かれたVisualから検索する方法での特徴は、
Visual同士の親子関係を気にせず、全てのVisualから特定のVisualを検索出来る点です。

以下のモデルをサンプルとして、動作を確認します。

シーン Visual 検索 サンプル

シーン上に置かれた全てのVisualから特定のVisualを検索する方法は、
大きく分けて以下の3種類があります。

●「名前」で1個のVisualを取得する方法

●「名前」で複数のVisualを取得する方法

●「タイプ」で複数のVisualを取得する方法

「名前」で1個のVisualを取得する方法

1つ目はVisualの「名前」で1個のVisualを取得する方法です。
一意で存在するVisualを取得したい時に便利です。

C#の場合

var target = document.FindVisual("TargetVisual");

var target = document.FindAnyVisual("TargetVisual");

var target = document.FindVisualByName("TargetVisual");

JScriptの場合

var target : Visual = doc.FindVisual("TargetVisual");

var target : Visual = doc.FindAnyVisual("TargetVisual");

var target : Visual = doc.FindVisualByName("TargetVisual");


各3つの処理では、検索したいVisual名を渡して一致するVisualを取得出来ます。

もし、シーン上に同じ名前のVisual複数存在する場合は、どれか1個のみを取得します。
サンプルモデルの場合、名前が「TargetVisual」の以下の3個のVisualの中の1個が取得出来ます。

名前 1つ Visual 検索


また、FindVisual関数FindVisualByName関数を使用した場合は、
シーン上に複数同じ名前のVisualが存在する時、警告メッセージが出力されます。

「名前」で複数のVisualを取得する方法

2つ目はVisualの「名前」で複数Visualを取得する方法です。
親子関係も無視してVisual検索出来るため、同じ子供の名前を持つVisualに対して同様の処理を実行したい時に便利です。

C#の場合

var targets = document.FindVisualsByName("TargetVisual");

JScriptの場合

var targets : List<Visual> = doc.FindVisualsByName("TargetVisual");


FindVisualsByName関数では、指定した名前と一致するVisual全てを取得出来ます。

サンプルモデルの場合、名前が「TargetVisual」の以下の3個のVisualが取得出来ます。

名前 複数 Visual 検索

「タイプ」で複数のVisualを取得する方法

3つ目はVisualの「タイプ」で複数Visualを取得する方法です。
同じTypeを持つVisualに対して、同様の処理を行う時に便利です。

C#の場合

var targets = document.FindType(typeof(SphereVisual));

JScriptの場合

var targets : List<Visual> = doc.FindType(Demo3D.Visuals.SphereVisual);


FindType関数では、指定したTypeと一致するVisualを全て取得できます。

サンプルモデルの場合、VisualのTypeが「SphereVisual」の以下の4個のVisualが取得出来ます。

Type 1つ Visual 検索


シーン上にある全てのVisualから検索が可能なため、
全体で操作を行いたい場合に3つの検索方法を利用してはいかがでしょうか。

プロパティ紐づけでVisualを取得

プロパティ紐づけでVisualを取得する方法での特徴は、
Visual内のプロパティから参照するため、操作したいVisualの「名前」や「親子関係」が変わったとしても見つける事が出来る点です。
また、同様の名前が複数存在していたとしても、検索したいVisualのみを確実に取得出来ます。

プロパティ紐づけでVisualを取得する方法は、プロパティに検索するVisualを参照するのみです。

Visual参照に使用するプロパティは「VisualReference型」「VisualList型」に関して紹介します。

以下のモデルをサンプルとして、VisualReference型の動作を確認します。

プロパティ Visual 検索


こちらのサンプルモデルでは、名前「Box」がシーン上に複数あり、
その中で赤いBoxVisualを検索したい場合、「シーン上に置かれたVisualから検索」をした場合、どのBoxが取得出来るか分かりません。

そこでVisualReference型「TargetBox」プロパティを付与し、赤いBoxVisualを参照します。

プロパティ Visual 検索 VisualReference


VisualReference型は、1個のVisualを参照することが出来ます。

これで、いつでも赤いBoxVisualを検索することが出来ます。
コードで取得する場合は、「TargetBox」プロパティの値を取得するだけです。


次に以下のモデルをサンプルとして、VisualList型の動作を確認します。

プロパティ Visual 検索


VisualReference型のサンプル同様、名前「Box」が複数存在しています。
今回は、その中で赤・橙・黄緑のBoxVisualを検索したい場合、
「シーン上に置かれたVisualから検索」をしても3個のBoxだけを取得することは難しいです。

そこでVisualList型「TargetBoxs」プロパティを付与し、赤・橙・黄緑のBoxVisualを参照します。

プロパティ Visual 検索 VisualList


VisualList型は、複数のVisualを参照することが出来ます。

これで、いつでも赤・橙・黄緑のBoxVisualを検索することが出来ます。
コードで取得する場合は、「TargetBoxs」プロパティから、リストのindexを指定して値を取得するだけです。

まとめ

いかがでしたでしょうか。
今回は2つのVisual検索方法をご紹介しました。
後編では、「子供から検索」する方法をご紹介しますので、よろしければそちらもご一緒にご覧ください。

今回ご紹介した内容が、少しでも皆様のお役に立てれば幸いです。