クエリ対応の関数の記述

 
 
 

シングルレベルのクエリ

選択オブジェクトのローカル SRT 値の表示例

例: 行スクリプト

このスクリプトの 1 行目は選択した項目のリストを戻します。これにより、ブランチ選択された項目を確実にノード選択(SelectChildNodes)に変えます。 スプレッドシートのスクリプトは配列を返さなければなりません。このため、GetValue("SelectionList")の戻り値としてコレクションを取得してから、SelectChildNodes をループ内の配列に転送する必要があります。 配列の先頭インデックスが 0 から始まるプログラム言語もあるので、配列のサイズはエレメントの正しい個数分だけ確保するよう注意してください。

注:

クエリの実行中にスクリプトにエラーが発生した場合、エラー内容は Script Editor のログ ウィンドウに表示されます。 ログ メッセージ呼び出しを使用すると、スクリプトのデバッグに役立ちます。

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 つの値からなる文字列です。

  • 表示するパラメータ(たとえば、kine.local.posx です。これは、各行の各項目に付加されます)。

  • セルのタイプ。 この例の場合、Softimage はパラメータのタイプ(浮動小数、整数、ブール、文字列など)を認識しているので、Default で十分です。

  • 列の最上部に表示するラベル。 空にした場合、列のタイトルにはパラメータ名が使用されます。 ですから、オブジェクトの名前を収容する最初の列に対しては、タイプとラベル情報を省略できるのです(例をご覧ください)。

注:

VBSscript の場合、配列の先頭インデックスは 0 になるので、配列のサイズを決める際に注意してください。たとえば、配列を Dim(9) と宣言すると、インデックスは 0~9 になり、10 個の項目を格納することになります。

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 に使用スクリプトを伝えるための単純なファイルです。 任意の場所に格納できます。

  • 行スクリプトはこのタグで定義されます。 <line_def>.

  • タグを含む列スクリプト <col_def>.

各タグに対して、使用するスクリプト言語、スクリプトを実装したファイル、呼び出す関数の名前を定義します。

スクリプト ファイルは好きな名前を付けることができますが、必ず ...¥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

例: 列スクリプト

カスタム情報を格納するセルの列は、次のような構文で定義されます。

  • 列のラベルに使用する名前の文字列。

  • セルのタイプがスクリプトであることを示すキーワード Script。

  • <スクリプト言語>~<スクリプト ファイル名>~<呼び出す関数名>

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 関数を使用していますが、この処理を実行するメソッドは他にもあります。

'----------------------------------------------------------------------
' 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

例: クエリ ファイル

最終的に、クエリ ファイルは以下のようになります(すでに想像できたユーザもいるかもしれません)。

Object_Geometry_All.query
<version>{1}
<line_def>
{
	vbscript
	spreadsheet.vbs
	All_SceneObject
}
<col_def>
{
	vbscript
	spreadsheet.vbs
	Object_Geometry
}
<sort_order>
{
	asc:-1
}

リレーショナル クエリ

全選択オブジェクトのクラスタ リストの表示例

この例では、2 段レベルのクエリを示します。 第 1 レベルは、選択オブジェクトをすべて一覧表示し、表示/非表示の情報も多少表示します。 クラスタが存在する場合は、オブジェクトごとにその情報が表示されます。 クラスタごとに、その名前、タイプ、エレメント数が表示されます。

例: クエリ ファイル

ここでは、クエリ ファイルから始めましょう。 ご覧のように、次の 3 つのタグが追加されています。

  • <relation>: スプレッドシートに表示するリレーションの名前になります。

  • <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

例: 第 2 レベルの列スクリプト

このスクリプトは各クラスタの名前、タイプ、コンポーネント数を表示します。 特記すべき新しい事項はありません。必要なスクリプトは以下のようになります。

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 レベルの列スクリプト

最終的に、第 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
}

スクリプトの列の構文

以下は、このケース スタディの例で説明してきたように、スクリプトの列に対して現在利用可能な構文をまとめたものです。

セルの詳細は、以下のいずれかのオプションで指定できます。

  • "<パラメータ名>"

  • "<パラメータ名>:<セルのタイプ>"

  • "パラメータ名>:<セルのタイプ>:<列のラベル>"

  • "<パラメータ名>:<セルのタイプ>:<パラメータの GUID>"(列の自動ラベル付け)

  • "<パラメータ名>:Script:<スクリプト言語>~<スクリプトファイル名>~<呼び出す関数名>"

<パラメータ名>

先行ピリオドなし(例: kine.posx)でスクリプトのログに表示されるパラメータ名。

<セルのタイプ>

"Default" または "Script"。 他のタイプもありますが、現時点では利用しないことをお勧めします。

<列のラベル>

列見出しに使用する文字列。

<パラメータの GUID>

パラメータに関連付けられた GUID。SPDL ファイル内にあります。