GridData

GridData

Object Hierarchy | 関連する C++クラス:GridData

導入

v4.0

詳細

このオブジェクトは、データの 2D 配列です。"Grid"とは、グリッド制御(テーブル制御またはスプレッドシート制御と呼ばれることもあります)上の 2Dデータを視覚的に表したものを指しています。"Cell"とは、配列内の 1 つのエレメントを指しています。

配列は動的にサイズ変更され、いろいろなタイプのデータを Cell データとして保存できます。ColumnsおよびRows にはラベルを付けることが可能で、インデックスの代わりにこれらのラベル文字列を使用してデータを参照できます。

GridData オブジェクトには、主に3 つの用途があります。1 つ目は、カスタムオブジェクト上の SiGridControl のデータとして使用する場合です。詳細については、CustomProperty.AddGridParameterを参照してください。この場合、ユーザはデータを表示したり編集したりすることができ、データは CustomProperty とともにシーン内に保存されます。これは、リスト、ベクタまたはプラグインに関連するベクタ配列を格納する効果的な方法です。GridData オブジェクトを視覚的に表すと、その設定要素のいくつかの局面は、GridData.SetColumnTypeのようにGridData オブジェクト上で直接設定されます。ただし、ほとんどの属性は、PPGItem.SetAttributeを使用することによりPPGLayoutの内部に設定されます。siPPGItemAttributesiGridControl に適用するには、siUIGridColumnWidths と siUIGridHideRowHeade が含まれます。

GridData オブジェクトの 2 つ目の用途は、プラグインによる内部使用が目的の非表示のデータを格納することです。この場合もCustomPropertyの一部となりますが、ユーザには公開されません。このため、PPGLayoutのGridDataParameterを含めることなく簡単に処理できます。

GridData オブジェクトの 3 つ目の用途は、 2D 配列を操作するための一時的なオブジェクトとして気軽に使用することです。特に、Jscriptなどのスクリプティング言語では、ビルトインArrayオブジェクトで2D 配列をサポートしていないので、GridData オブジェクトを回避策として使用できます。XSIFactory.CreateGridDataを呼び出すことにより、一時的にGridData オブジェクトを取得できます。

メソッド

BeginEditオペレータ EndEditオペレータ GetCellオペレータ GetColumnComboItemsオペレータ
GetColumnLabelオペレータ GetColumnTypeオペレータ GetColumnValuesオペレータ GetRowBackgroundColor
GetRowLabelオペレータ GetRowValuesオペレータ SetCellオペレータ SetColumnComboItemsオペレータ
SetColumnLabelオペレータ SetColumnTypeオペレータ SetColumnValuesオペレータ SetRowBackgroundColor
SetRowLabelオペレータ SetRowValuesオペレータ    
       

プロパティ

ColumnCountオペレータ Dataオペレータ GridWidget RowCountオペレータ

1. JScript の例

GridTester();

function GridTester()

{

	// 

	// A demonstration of the Grid Control on a Custom Property Set.

	// Controls on the Property Page demonstrate the OM API that 

	// can be used to change the values and even size of the Grid Control

	// based on Property Page Logic code.

	//

	var oPSet = ActiveSceneRoot.AddProperty( "CustomProperty", false, "GridTester" ) ;

	var oGridParam = oPSet.AddGridParameter( "TestGrid" ) ;

	// Set up some initial size

	oGridParam.Value.RowCount = 3 ;

	oGridParam.Value.ColumnCount = 2 ;

	// Add the Edit boxes and other controls that will

	// be used to get information from the user

	oPSet.AddParameter3( "DimRows", siInt2, 3,null,null,false ) ;

	oPSet.AddParameter3( "DimCols", siInt2, 2,null,null,false ) ;

	oPSet.AddParameter3( "CellRow", siInt2, 0,null,null,false ) ;

	oPSet.AddParameter3( "CellCol", siInt2, 0,null,null,false ) ;

	oPSet.AddParameter3( "CellValue", siString, "New Value" ) ;

	oPSet.AddParameter3( "RowToChange", siInt2, 0,null,null,false ) ;

	oPSet.AddParameter3( "RowValue", siString, "New Value" ) ;

	oPSet.AddParameter3( "ColToChange", siInt2, 0,null,null,false ) ;

	oPSet.AddParameter3( "ColValue", siString, "New Value" ) ;

	oPSet.AddParameter3( "RowLabelToChange", siInt2, 0,null,null,false ) ;

	oPSet.AddParameter3( "RowLabel", siString, "New Row Label" ) ;

	oPSet.AddParameter3( "ColLabelToChange", siInt2, 0,null,null,false ) ;

	oPSet.AddParameter3( "ColLabel", siString, "New Column Label" ) ;

	oPSet.AddParameter3( "Batch", siBool,false,null,null,false ) ;

	oPSet.AddParameter3( "ColHeaderMode", siInt2, 0,null,null,false) ;

	oPSet.AddParameter3( "RowHeaderMode", siInt2, 0,null,null,false) ;

	oPSet.AddParameter3( "Width", siInt4, 0,null,null,false ) ;

	oPSet.AddParameter3( "Height", siInt4, 0,null,null,false ) ;

	oPSet.AddParameter3( "ColWidths", siString, "45;30;50" ) ;

	oPSet.AddParameter3( "ROCols", siString, "0;1" ) ; // second column read-only be default

	// Organize the controls on the PPG

	var oLayout = oPSet.PPGLayout

	var oPPGItem = oLayout.AddItem( "TestGrid", "",siControlGrid ) ;

	oPPGItem.SetAttribute( "NoLabel", true  ) ;

	oLayout.AddGroup( "Change Contents Via OM" ) ;

		oLayout.AddGroup( "Dimensions" ) ;

		oLayout.AddRow() ;

			AddNonSliderItem( oLayout, "DimRows", "Rows", 50) ;

			AddNonSliderItem( oLayout, "DimCols", "Columns", 50) ;

			oLayout.AddButton( "DimUpdate", "Update" ) ;

		oLayout.EndRow() ;

		oLayout.EndGroup();

		oLayout.AddGroup( "Cell value" ) ;

		oLayout.AddRow() ;

			AddNonSliderItem( oLayout, "CellRow", "Row", 75 ) ;

			AddNonSliderItem( oLayout, "CellCol", "Column", 75 ) ;

		oLayout.EndRow() ;

		oLayout.AddRow() ;		

			oLayout.AddItem( "CellValue", "Value" ) ;

			oLayout.AddButton( "CellValueUpdate", "Update" ) ;

		oLayout.EndRow() ;		

		oLayout.EndGroup();

		oLayout.AddGroup( "Row Values" ) ;

		oLayout.AddRow() ;

			AddNonSliderItem( oLayout, "RowToChange", "Row", 50 ) ;

			oLayout.AddItem( "RowValue", "Value" ) ;

			oLayout.AddButton( "RowUpdate", "Update" ) ;

		oLayout.EndRow() ;

		oLayout.EndGroup();

		oLayout.AddGroup( "Column Values" ) ;

		oLayout.AddRow() ;

			AddNonSliderItem( oLayout, "ColToChange", "Column", 50 ) ;

			oLayout.AddItem( "ColValue", "Value" ) ;

			oLayout.AddButton( "ColUpdate", "Update" ) ;

		oLayout.EndRow() ;

		oLayout.EndGroup();

		oLayout.AddGroup( "Row Label" ) ;

		oLayout.AddRow() ;

			AddNonSliderItem( oLayout, "RowLabelToChange", "Row", 50 ) ;

			oLayout.AddItem( "RowLabel", "Label" ) ;

			oLayout.AddButton( "RowLabelUpdate", "Update" ) ;

		oLayout.EndRow() ;

		oLayout.EndGroup();

		oLayout.AddGroup( "Column Label" ) ;

		oLayout.AddRow() ;

			AddNonSliderItem( oLayout, "ColLabelToChange", "Column", 50 ) ;

			oLayout.AddItem( "ColLabel", "Label" ) ;

			oLayout.AddButton( "ColLabelUpdate", "Update" ) ;

		oLayout.EndRow() ;

		oLayout.EndGroup();

		AddPushButton( oLayout, "Batch", "Batch Edit" ) ;

	oLayout.EndGroup();

	oLayout.AddGroup( "Change Layout" ) ;

		oLayout.AddRow() ;

			var headerModes = new Array( "Normal", 0, "None", 1, "Locked", 2) ;					

			var oItem = oLayout.AddEnumControl( "ColHeaderMode", headerModes ) ;

			oItem.SetAttribute( siUICX, 75 ) ;

			oItem = oLayout.AddEnumControl( "RowHeaderMode", headerModes ) ;

			oItem.SetAttribute( siUICX, 75 ) ;

		oLayout.EndRow();			

		oLayout.AddRow() ;

			AddNonSliderItem( oLayout, "Height", "Height",75 ) ;

			AddNonSliderItem( oLayout, "Width", "Width",75 ) ;

		oLayout.EndRow() ;

		oLayout.AddItem( "ColWidths" ) ;

		oLayout.AddItem( "ROCols", "Read Only Columns" ) ;

		oLayout.AddButton( "Refresh", "Full Refresh" ) ;

	oLayout.EndGroup();

	// Inject the event code

	oLayout.Language = "JScript" ;	

	oLayout.SetAttribute( "HelpFile", "www.yahoo.com" ) ;

	oLayout.SetAttribute( "LogicPrefix", "GridTester_" )	

	oLayout.Logic = GridTester_OnInit.toString() +	

			GridTester_TestGrid_OnChanged.toString() +	

			GridTester_DimUpdate_OnClicked.toString() +

			GridTester_CellValueUpdate_OnClicked.toString() +

			GridTester_RowUpdate_OnClicked.toString() +

			GridTester_ColUpdate_OnClicked.toString() +

			GridTester_RowLabelUpdate_OnClicked.toString() +

			GridTester_ColLabelUpdate_OnClicked.toString() +

			GridTester_Height_OnChanged.toString() +

			GridTester_Width_OnChanged.toString() +

			GridTester_Batch_OnChanged.toString() +

			GridTester_ColHeaderMode_OnChanged.toString() +

			GridTester_RowHeaderMode_OnChanged.toString() +

			GridTester_Refresh_OnClicked.toString() + 

			GridTester_ColWidths_OnChanged.toString() + 

			GridTester_ROCols_OnChanged.toString() ;

	InspectObj( oPSet ) ;

}

//Helper function to create a button rather than a check box

//for showing a boolean parameter

function AddPushButton( in_oLayout, in_ParamName, in_Label )

{

	var oPPGItem = in_oLayout.AddItem( in_ParamName, "", "dscontrol" ) ;

	oPPGItem.SetAttribute( "Caption", in_ParamName );

	oPPGItem.SetAttribute( "Class", "Button" );

	oPPGItem.SetAttribute( "CX", 200 );		

	oPPGItem.SetAttribute( "Style", 0x00001003 );//(BS_AUTOCHECKBOX|BS_PUSHLIKE)

	oPPGItem.SetAttribute( "NoLabel", true ) ;

}

// By default numeric params have a slider, but

// if we hide the slider the control takes up less horizontal space

function AddNonSliderItem( in_oLayout, in_strParamName, in_strLabel, in_width )

{

	var oPPGItem = in_oLayout.AddItem( in_strParamName, in_strLabel ) ;

	oPPGItem.SetAttribute( siUINoSlider, true ) ;

	// Set a small width

	oPPGItem.SetAttribute( siUICX, in_width ) ;

	oPPGItem.WidthPercentage = 20 ;

	oPPGItem.LabelPercentage = 20 ;

	oPPGItem.LabelMinPixels = 20 ;	

}

//Logic Code for GridTester

function GridTester_OnInit()

{

//Force the logic code to run for setting the Column Widths to the 

//default values

	GridTester_ColWidths_OnChanged()

	GridTester_ROCols_OnChanged()

}

function GridTester_TestGrid_OnChanged()

{

	// This is never called if the change to the grid

	// if provoked by changes to the grid caused

	// by the logic code itself.  It is only called

	// if the cell contents are changed manually or by

	// an external script that uses the Object Model.

	logmessage( "Callback called for contents of TestGrid changing" ) ;

	var oGridData = PPG.TestGrid.value ;

	//Update the dimensions items based on the current size

	PPG.DimRows.Value = oGridData.RowCount ;

	PPG.DimCols.Value = oGridData.ColumnCount ;

}

function GridTester_DimUpdate_OnClicked()

{

	var oGridData = PPG.TestGrid.value ;

	//Bracket with BeginEdit/EndEdit 

	//so we only do a single update

	oGridData.BeginEdit() ;

	oGridData.RowCount = DimRows ;

	oGridData.ColumnCount = DimCols ;

	oGridData.EndEdit() ;

	Logmessage( "Calling GridData.RowCount = " + DimRows ) ;

	Logmessage( "Calling GridData.ColumnCount = " + DimCols ) ;

	// Notice that no call to PPG.Refresh is necessary

}

function GridTester_CellValueUpdate_OnClicked()

{

	var oGridData = PPG.TestGrid.value ;

	oGridData.SetCell( 

				PPG.CellCol.Value, 

				PPG.CellRow.Value, 

				PPG.CellValue.Value ) ;

	Logmessage( "Calling GridData.SetCell" ) ;

}

function GridTester_RowUpdate_OnClicked()

{

	var oGridData = PPG.TestGrid.value ;

	//All items in the row will have the same value

	var newValue = PPG.RowValue.Value ;

	var aRowValues = new Array( oGridData.ColumnCount ) ;

	for ( var i = 0 ; i < aRowValues.length ; i++ )

	{

		aRowValues[i] = newValue ;

	}

	oGridData.SetRowValues( PPG.RowToChange.Value, aRowValues ) ;

	Logmessage( "Calling GridData.SetRowValues" ) ;

}

function GridTester_ColUpdate_OnClicked()

{

	var oGridData = PPG.TestGrid.value

	var newValue = PPG.ColValue.Value ;

	var aColValues = new Array( oGridData.RowCount ) ;

	for ( var i = 0 ; i < aColValues.length ; i++ )

	{

		aColValues[i] = newValue ;

	}

	oGridData.SetColumnValues( PPG.ColToChange.Value, aColValues ) ;

	Logmessage( "Calling GridData.SetColumnValues" ) ;

}

function GridTester_RowLabelUpdate_OnClicked()

{

	var oGridData = PPG.TestGrid.value ;	

	oGridData.SetRowLabel( PPG.RowLabelToChange.Value, PPG.RowLabel ) ;

	Logmessage( "Calling GridData.SetRowLabel" ) ;

}

function GridTester_ColLabelUpdate_OnClicked()

{

	var oGridData = PPG.TestGrid.value ;

	oGridData.SetColumnLabel( PPG.ColLabelToChange.Value, PPG.ColLabel ) ;

	Logmessage( "Calling GridData.SetColumnLabel" ) ;

}

function GridTester_Batch_OnChanged()

{

	var oGridData = PPG.TestGrid.value ;

	// Demonstrate the ability to do multiple

	// updates without forcing a refresh

	if ( PPG.Batch.Value == 0 )

	{

		logmessage( "Calling GridData.EndEdit" ) ;

		oGridData.EndEdit() ;

	}

	else

	{

		// Button pushed in

		logmessage( "Calling GridData.BeginEdit" ) ;

		oGridData.BeginEdit() ;

	}

}

function GridTester_Refresh_OnClicked()

{

	// Does a complete refresh of the Property Page

	// Normal updates to the Grid should not require this

	PPG.Refresh() ;

	Logmessage( "Calling PPG.Refresh" ) ;

}

function GridTester_Height_OnChanged()

{

	var oLayout = PPG.PPGLayout

	var oPPGItem = oLayout.Item( "TestGrid" )

	if ( PPG.Height.Value != 0 ) 

	{

		oPPGItem.SetAttribute( "CY", PPG.Height.Value ) ;

	}

	else

	{

		// When no attribute is set control will resize to fit the data

		oPPGItem.SetAttribute( "CY", null ) ;

	}

	// Attribute changes don't appear until there is a complete refresh

	PPG.Refresh() ;

}

function GridTester_Width_OnChanged()

{

	var oLayout = PPG.PPGLayout

	var oPPGItem = oLayout.Item( "TestGrid" )

	if ( PPG.Width.Value != 0 ) 

	{

		oPPGItem.SetAttribute( "CX", PPG.Width.Value ) ;

	}

	else

	{

		oPPGItem.SetAttribute( "CX", null ) ;

	}

	PPG.Refresh() ;

}

function GridTester_ColWidths_OnChanged()

{

	var oLayout = PPG.PPGLayout

	var oPPGItem = oLayout.Item( "TestGrid" )

	if ( PPG.ColWidths.Value != "" )

	{

		oPPGItem.SetAttribute( "ColumnWidths", PPG.ColWidths.Value ) ;

	}

	else

	{

		oPPGItem.SetAttribute( "ColumnWidths", null ) ;

	}

	PPG.Refresh() ;	

}

function GridTester_ROCols_OnChanged()

{

	var oLayout = PPG.PPGLayout

	var oPPGItem = oLayout.Item( "TestGrid" )

	if ( PPG.ColWidths.Value != "" )

	{

		oPPGItem.SetAttribute( "ReadOnlyColumns", PPG.ROCols.Value ) ;

	}

	else

	{

		oPPGItem.SetAttribute( "ReadOnlyColumns", null ) ;

	}

	PPG.Refresh() ;	

}

function GridTester_ColHeaderMode_OnChanged()

{

	var oLayout = PPG.PPGLayout

	var oPPGItem = oLayout.Item( "TestGrid" )

	//Locked only makes sense if you set an explicit Height to the control

	oPPGItem.SetAttribute( "LockColumnHeader", PPG.ColHeaderMode.Value == 2 ) ;

	oPPGItem.SetAttribute( "HideColumnHeader", PPG.ColHeaderMode.Value == 1 ) ;

	PPG.Refresh()

	if ( PPG.ColHeaderMode.Value == 2 )

	{

		Logmessage( "Setting LockColumnHeader attribute on Layout" ) ;

	}

	else if (  PPG.ColHeaderMode.Value == 1 )

	{

		Logmessage( "Setting HideColumnHeader attribute on Layout" ) ;

	}

}

function GridTester_RowHeaderMode_OnChanged()

{

	var oLayout = PPG.PPGLayout

	var oPPGItem = oLayout.Item( "TestGrid" )

	oPPGItem.SetAttribute( "LockRowHeader", PPG.RowHeaderMode.Value == 2 ) ;

	oPPGItem.SetAttribute( "HideRowHeader", PPG.RowHeaderMode.Value == 1 ) ;

	PPG.Refresh()

	if ( PPG.RowHeaderMode.Value == 2 )

	{

		Logmessage( "Setting LockRowHeader attribute on Layout" ) ;

	}

	else if (  PPG.RowHeaderMode.Value == 1 )

	{

		Logmessage( "Setting HideRowHeader attribute on Layout" ) ;

	}

}

2. JScript の例

// Example of using GridData as a convenient way

// to deal with 2D arrays from JScript

//

// ClusterProperties are widely used in scripting

// and their data is represented as a 2D array.  E.g.

// there is a row for each component and each component

// has multiple values (e.g. RGBA or UVW) which

// are the column values.  Even a Weight map is represented

// this way, even though there is only 1 value per component

//

// JScript has no 2D support.  Normally it is necessary to 

// convert to a 1D array using the VBArray.toArray method.

// However if the data is transfered into a DataGrid object

// it is then possible to access the data via a more convenient

// API, for example Row by Row or setting values at a precise

// Row/Column coordinate.  This is demonstrated here:

var oGrid = ActiveSceneRoot.AddGeometry( "Grid", "MeshSurface" ) ;

oGrid.subdivu = 1 ;

oGrid.subdivv = 1 ;

SelectObj( oGrid ) ;

CreateVertexColorSupport(null, "Vertex_Color", null, null);

var oClusterProp = oGrid.ActivePrimitive.Geometry.Clusters(0).Properties( "Vertex_Color" ) ;

var oGridData = XSIFactory.CreateGridData()

// Example 1: Read the vertex color values

// By transfering into GridData.  

// There are 4 Columns - R,G,B, and A 

// and there is 1 Row for each vertex.

oGridData.Data = oClusterProp.Elements.Array

LogMessage( "Blue Component on Vertex 0: " + oGridData.GetCell( 2, 0 ) ) ;

LogMessage( "Red Component on Vertex 2: " + oGridData.GetCell( 0, 2 ) ) ;

// Example 2: Change the vertex color values

for ( var i = 0 ; i < oGridData.RowCount ; i++ )

{

	// Set RGBA value on each vertex

	oGridData.SetRowValues( i, Array( i * 0.10, 0.50, 0.75, 0.1 ) ) ;

}

// We MUST put the changed data back into the cluster property if we

// want our changes to take effect

oClusterProp.Elements.Array = oGridData.Data

// Example 3: Display the values in custom pset

var oPSet = ActiveSceneRoot.AddProperty( "CustomProperty", false, "ClusterPropContents" ) ;

var oParam1 = oPSet.AddGridParameter( "mygrid" ) ;

var oLayout = oPSet.PPGLayout

var oPPGItem = oLayout.AddItem( "mygrid", "",siControlGrid ) ;

oPPGItem.SetAttribute( "NoLabel", true  ) ;

//Copy data from our free floating 

//GridData object to the one on the Custom Property

var oGridDataOnPSet = oParam1.Value ;

oGridDataOnPSet.Data = oGridData.Data ;

// Set up labels so the user knows what the data is

oGridDataOnPSet.SetColumnLabel(0, "R" ) ;

oGridDataOnPSet.SetColumnLabel(1, "G" ) ;

oGridDataOnPSet.SetColumnLabel(2, "B" ) ;

oGridDataOnPSet.SetColumnLabel(3, "A" ) ;

for ( i = 0 ; i < oGridData.RowCount ; i++ )

{

	oGridDataOnPSet.SetRowLAbel( i, "Vertex " + i.toString() ) ;

}

// Now you can change the data by using the labels

// (this doesn't change the copy of the data inside oGridData)

oGridDataOnPSet.SetCell( "G", "Vertex 2", 0.99 ) ;

InspectObj( oPSet ) ;

関連項目

XSIFactory.CreateGridData CustomProperty.AddGridParameter