このスクリプトの 1 行目は選択した項目のリストを戻します。これにより、ブランチ選択された項目を確実にノード選択(SelectChildNodes)に変えます。 スプレッドシートのスクリプトは配列を返さなければなりません。このため、GetValue("SelectionList")の戻り値としてコレクションを取得してから、SelectChildNodes をループ内の配列に転送する必要があります。 配列の先頭インデックスが 0 から始まるプログラム言語もあるので、配列のサイズはエレメントの正しい個数分だけ確保するよう注意してください。
Function Current_Selection () Dim R(), SelList Set SelList = GetValue( "SelectionList" ) if SelList.Count = 0 then Current_Selection = R Exit Function end if Set SelList = SelectChildNodes( SelList, False ) Dim i ReDim R(SelList.Count - 1) for i = 0 to SelList.Count - 1 R(i) = SelList(i) next Current_Selection = R End Function
列スクリプトも配列を戻します。しかし、シーン エレメントのリストではなく、各列が表示すべきパラメータの詳細を戻すためには、特別な構文が必要です。 この例では、すべての列が標準 Softimage パラメータを表示するので、構文は比較的単純です。 配列内の各エレメントは、次の 3 つの値からなる文字列です。
セルのタイプ。 この例の場合、Softimage はパラメータのタイプ(浮動小数、整数、ブール、文字列など)を認識しているので、Default で十分です。
列の最上部に表示するラベル。 空にした場合、列のタイトルにはパラメータ名が使用されます。 ですから、オブジェクトの名前を収容する最初の列に対しては、タイプとラベル情報を省略できるのです(例をご覧ください)。
Function Object_Xfo () Dim R(9) R(0) = "Name" R(1) = "kine.local.posx:Default:Local posx" R(2) = "kine.local.posy:Default:Local posy" R(3) = "kine.local.posz:Default:Local posz" R(4) = "kine.local.rotx:Default:Local rotx" R(5) = "kine.local.roty:Default:Local roty" R(6) = "kine.local.rotz:Default:Local rotz" R(7) = "kine.local.sclx:Default:Local sclx" R(8) = "kine.local.scly:Default:Local scly" R(9) = "kine.local.sclz:Default:Local sclz" Object_Transformations = R End Function
クエリ ファイルは、Softimage スプレッドシートにロードして、Softimage に使用スクリプトを伝えるための単純なファイルです。 任意の場所に格納できます。
各タグに対して、使用するスクリプト言語、スクリプトを実装したファイル、呼び出す関数の名前を定義します。
スクリプト ファイルには任意の名前を付けることができます。ただし、スクリプト ファイルは、..¥Application¥DSScripts フォルダに置く必要があります(必要に応じて絶対パスにすることも可能)。
Ex: Object_Xfo_Selected.query <version>{1} <line_def> { vbscript spreadsheet.vbs Current_Selection } <col_def> { vbscript spreadsheet.vbs Object_Xfo }
この例では、シーン内の三角形、ポイント、エッジ(セグメント)、およびポリゴンの個数をクエリがカウントします。 これは、Softimage のスプレッドシートで使用されるジオメトリ クエリです。 各コンポーネントの個数を保持する特定のシーン パラメータが存在しない場合は、これらの数値を戻す関数をスプレッドシートに与えなければなりません。 これらの関数は、オブジェクトからカメラまでの距離、そのボリュームなど、あらゆる種類の計測を演算するために使用できます。
シーン内のすべてのエレメントを扱いたいので、行スクリプトは以下のようになります。 SIFilter コマンドでは、"*" を選択することにより、3D オブジェクトのみを確実に取得しています。
Function All_SceneObject () Dim R(), sceneObjectList set sceneObjectList = SIFilter( "*", "sceneobject",,siQuickSearch) if sceneObjectList.Count = 0 then All_SceneObject = R Exit Function end if End Function
カスタム情報を格納するセルの列は、次のような構文で定義されます。
Function Object_Geometry () Dim R(7) R(0) = "Name" R(1) = "Type:Script:vbscript~spreadsheet.vbs~GetObjType" R(2) = "Triangles:Script:vbscript~spreadsheet.vbs~GetNbrTriangles" R(3) = "Points:Script:vbscript~spreadsheet.vbs~GetNbPoints" R(4) = "Segments:Script:vbscript~spreadsheet.vbs~GetNbSegments" R(5) = "Facets:Script:vbscript~spreadsheet.vbs~GetNbFacets" R(6) = "Particles:Script:vbscript~spreadsheet.vbs~GetNbParticles" R(7) = "geomapprox.gapproxmosl:Default:Subdiv" Object_Geometry = R End Function
以下のスクリプト関数は、上記のスクリプトの列クエリで使用されているものです。 これらの関数は、各スクリプト セルと各行ごとに呼び出されます。 結果は、並び替え操作などのためにキャッシュされます。
'---------------------------------------------------------------------- ' GetObject ' Function that converts an object string into a scripting object ' (for the object model) '---------------------------------------------------------------------- Function GetObject (in_obj) GetObject = "Nothing" if IsEmpty(in_obj) Then exit function end if dim l_coll set l_coll = CreateObject("XSI.Collection") l_coll.Add in_obj set GetObject = l_coll(0) ' returns a X3DObject End Function Function GetNbrTriangles( in_obj ) GetNbrTriangles = 0 Dim l_obj set l_obj = GetObject( in_obj ) if l_obj.type = "polymsh" Or l_obj.type = "surfmsh" Or l_obj.type = "crvlist" then GetNbrTriangles = GetNbTriangles( in_obj ) end if End Function Function GetNbPoints( in_obj ) GetNbPoints = 0 Dim l_obj, l_geom set l_obj = GetObject( in_obj ) if l_obj.type = "polymsh" Or l_obj.type = "surfmsh" Or l_obj.type = "crvlist" then set l_geom = l_obj.obj GetNbPoints = l_geom.nb0D end if End Function Function GetNbSegments( in_obj ) GetNbSegments = 0 Dim l_obj, l_geom set l_obj = GetObject( in_obj ) if l_obj.type = "polymsh" then set l_geom = l_obj.obj GetNbSegments = l_geom.nb1D end if End Function Function GetNbFacets( in_obj ) GetNbFacets = 0 Dim l_obj, l_geom set l_obj = GetObject( in_obj ) if l_obj.type = "polymsh" Or l_obj.type = "surfmsh" then set l_geom = l_obj.obj GetNbFacets = l_geom.nb2D end if End Function Function GetNbParticles( in_obj ) Dim myType, l_obj, l_part GetNbParticles = 0 myType = GetObjType( in_obj ) if myType = "cloud" then set l_obj = GetObject( in_obj ) set l_part = l_obj.particles GetNbParticles = l_part.count end if End Function
この例では、2 段レベルのクエリを示します。 第 1 レベルは、選択オブジェクトをすべて一覧表示し、表示/非表示の情報も多少表示します。 クラスタが存在する場合は、オブジェクトごとにその情報が表示されます。 クラスタごとに、その名前、タイプ、エレメント数が表示されます。
ここでは、クエリ ファイルから始めましょう。 ご覧のように、次の 3 つのタグが追加されています。
<relation_object_def>: <line_def>スクリプトで提供される各項目に対して、スプレッドシートに表示する第 2 レベルの項目行を定義するスクリプトを提供します。
<relation_param_def>: 第 2 レベルの項目用に表示する列を定義するスクリプトを提供します。 <col_def>タグで定義したスクリプトと同じものを使用しても問題ありません。各行に表示する項目、そして表示する列次第です。
<version>{1} <line_def> { vbscript spreadsheet.vbs Current_Selection } <col_def> { vbscript spreadsheet.vbs Object_Visibility } <relation> { Clusters } <relation_object_def> { vbscript spreadsheet.vbs ObjectClusters } <relation_param_def> { vbscript spreadsheet.vbs Cluster_Info } <sort_order> { asc:-1 }
このスクリプトは各行のオブジェクトを受け取ります。そして、第 2 レベルの項目を格納する配列を戻さなければなりません。 それ以外では、Softimage の標準スクリプトとほぼ同じことを実行できるので、さまざまな種類のリレーションを定義できます(たとえば、カメラ近くのオブジェクト、青色のオブジェクト、プロパティを持つクラスタなどです)。
以下の例では、スクリプトはオブジェクトのジオメトリにアクセスします(このスクリプトは、コマンドではなくオブジェクト モデルを使用しています)。そこでユーザは、このオブジェクトに対するクラスタの一覧を検索できます。 テクスチャ サポートのオブジェクトは除外されています。テクスチャ サポートのオブジェクトは、ジオメトリは持っていますが、クラスタのコンテナは保持していないからです。
Function ObjectClusters( in_obj ) Dim l_obj, i, l_geom, l_clusters, l_cluster set l_obj = GetObject( in_obj ) Dim l_cArray() if typename(l_obj) = "X3DObject" and not (l_obj.type = "Texture Support") then set l_geom = l_obj.activeprimitive.geometry set l_clusters = l_geom.clusters if ( l_clusters.count > 0 ) then ReDim l_cArray( l_clusters.count - 1 ) for i = 0 to l_clusters.count - 1 l_cArray(i) = l_clusters.Item(i) next else ReDim l_cArray(0) end if else ReDim l_cArray(0) end if ObjectClusters = l_cArray end function
このスクリプトは各クラスタの名前、タイプ、コンポーネント数を表示します。 特記すべき新しい事項はありません。必要なスクリプトは以下のようになります。
Function Cluster_Info () Dim R(2) R(0) = "Name" R(1) = "Type:Script:vbscript~spreadsheet.vbs~GetObjType" R(2) = "Components:Script:vbscript~spreadsheet.vbs~GetNbClsComponents" Cluster_Info = R End Function Function GetObjType (in_obj) Dim l_obj GetObjType = " " if IsEmpty(in_obj) Then exit function end if set l_obj = GetObject( in_obj ) GetObjType = l_obj.Type End Function Function GetNbClsComponents( in_cls ) Dim l_cls, l_elems GetNbClsComponents = 0 set l_cls = GetObject( in_cls ) if typename(l_cls) = "Cluster" then set l_elems = l_cls.elements GetNbClsComponents = l_elems.count end if End Function
最終的に、第 1 レベルの列は以下に示すスクリプトを使用します。 このスクリプトでは、セルに別の構文を使用しており、列に対して明示的にラベルを指定する代わりに、パラメータの GUID 識別を使用しています(GUID 識別は該当する SPDL ファイル内にあります)。 これは適切なパラメータ名を検索して表示します。
Function Object_Visibility () Dim R(4) R(0) = "Name" R(1) = "Type:Script:vbscript~spreadsheet.vbs~GetObjType" R(2) = "visibility.viewvis:Default:{D636F4D0-D94B-11D1-B0ED-00A024C79287}" R(3) = "visibility.rendvis:Default:{A9D242E0-D948-11D1-B0ED-00A024C79287}" R(4) = "visibility.selectability:Default:{4256027B-C691-11d2-B740-0008C7A011A6}" Object_Visibility = R End Function
最後に、クエリを実行するとユーザに示されるクエリ結果の並び替え方について説明します。
デフォルトで、並び替え用タグには以下の情報を使用できます。 この場合、並び替えは行見出しに基づいて行われます。 昇順の並び替えには asc を使用し、降順には des を使用します。
<sort_order> { asc:-1 }
しかし、特定の列に基づいてクエリを並び替えることも可能です。 以下の例の場合、クエリは 8 番目の列を昇順、3 番目の列を降順というように順に並び替えます。 もちろん、ユーザはコンテキスト メニューの並び替えコマンドを使用してスプレッドシートの任意の列を並び替えることもできます(現在のところ、並び替えできるのは 1 つの列のみです)。
<sort_order> { asc: 8 des: 3 asc:-1 }