#
# This example shows how to get all attribute 2D data in chunks from an envelope weight property.
#
from win32com.client import constants
xsi = Application
cone = xsi.CreatePrim("Cone", "MeshSurface", "", "")
xsi.Create2DSkeleton(2.90328069018741, 3.34950957748764, -0.334950957748767, 4.73127223586102, -8.03882298597018E-02, 8.03882298597003E-03, -5.71059313749964, 0, 0, 4, "", "")
xsi.AppendBone("eff", 3.70974754857278, -3.02795665804866, 0.302795665804869, "")
xsi.ApplyFlexEnv( "cone;bone,bone1,eff", -1 )
xsi.SelectObj("cone.polymsh.cls.EnvelopWeightCls.Envelope_Weights", "", "")
attrs = xsi.Selection(0).ICEAttributes;
# Make sure the envelope weight data is generated
cone.ActivePrimitive2.GetGeometry( 0 )
for attr in attrs:
	if attr.StructureType != constants.siICENodeStructureArray:
		continue
	xsi.LogMessage( "*******************************************************************" )
	xsi.LogMessage( "Name: " + attr.Name )
	xsi.LogMessage( "DataType: " + str(attr.DataType) )
	xsi.LogMessage( "StructType: " + str(attr.StructureType) )
	xsi.LogMessage( "ContextType: " + str(attr.ContextType) )
	xsi.LogMessage( "IsDefined: " + str(attr.IsDefined) )	
	xsi.LogMessage( "IsConstant: " + str(attr.IsConstant) )
	xsi.LogMessage( "Readonly: " + str(attr.IsReadonly) )
	xsi.LogMessage( "AttributeCategory: " + str(attr.AttributeCategory) )
	xsi.LogMessage( "Element count: " + str(attr.ElementCount) )
	if attr.IsDefined == 0:
		continue
	# Compute the chunk vector
	nChunkCount = 4
	nChunk = attr.ElementCount / nChunkCount
	nLastChunk = attr.ElementCount % nChunkCount
	chunks = []
	for i in range(nChunkCount):
		chunks.append( nChunk )
	chunks.append( nLastChunk )
	nOffset = 0		
	dataType = attr.DataType		
	for i in range(len(chunks)):
		nChunk = chunks[i]
		if nChunk == 0:
			continue;
		xsi.LogMessage( ">>>>offset: " + str(nOffset) + " chunk size: " + str(nChunk) )			
		data = attr.GetDataArray2DChunk( nOffset, nChunk );
		nOffset += nChunk
		for elem in data:
			if dataType == constants.siICENodeDataFloat:
				xsi.LogMessage( "float: " + str(elem) )
			elif dataType == constants.siICENodeDataLong: 
				xsi.LogMessage( "long: " + str(elem) )
			elif dataType == constants.siICENodeDataBool: 
				xsi.LogMessage( "bool: " + str(elem) )
			elif dataType == constants.siICENodeDataVector3: 
				xsi.LogMessage( "Vector3: " + str(elem.X) + ":" + str(elem.Y) + ":" + str(elem.Z) )
			elif dataType == constants.siICENodeDataQuaternion: 
				xsi.LogMessage( "Quaternion: " + str(elem.W) + ":" + str(elem.X) + ":" + str(elem.Y) + ":" + str(elem.Z) )
			elif dataType == constants.siICENodeDataRotation: 
				xsi.LogMessage( "Rotation: " + str(elem.RotX) + ":" + str(elem.RotY) + ":" + str(elem.RotZ) )
			elif dataType == constants.siICENodeDataMatrix33: 
				xsi.LogMessage( "Matrix33:" );
				xsi.LogMessage( str(elem.Value(0,0)) + ":" + str(elem.Value(0,1)) + ":" + str(elem.Value(0,2)) )
				xsi.LogMessage( str(elem.Value(1,0)) + ":" + str(elem.Value(1,1)) + ":" + str(elem.Value(1,2)) )
				xsi.LogMessage( str(elem.Value(2,0)) + ":" + str(elem.Value(2,1)) + ":" + str(elem.Value(2,2)) )
			elif dataType == constants.siICENodeDataMatrix44: 
				xsi.LogMessage( "Matrix44:" );
				xsi.LogMessage( str(elem.Value(0,0)) + ":" + str(elem.Value(0,1)) + ":" + str(elem.Value(0,2)) + ":" + str(elem.Value(0,3)))
				xsi.LogMessage( str(elem.Value(1,0)) + ":" + str(elem.Value(1,1)) + ":" + str(elem.Value(1,2)) + ":" + str(elem.Value(1,3)))
				xsi.LogMessage( str(elem.Value(2,0)) + ":" + str(elem.Value(2,1)) + ":" + str(elem.Value(2,2)) + ":" + str(elem.Value(2,3)))
				xsi.LogMessage( str(elem.Value(3,0)) + ":" + str(elem.Value(3,1)) + ":" + str(elem.Value(3,2)) + ":" + str(elem.Value(3,3)))
			elif dataType == constants.siICENodeDataColor4: 
				xsi.LogMessage( "Color:" );
				xsi.LogMessage( str(elem.Red) + ":" + str(elem.Green) + ":" + str(elem.Blue) + ":" + str(elem.Alpha) )
			elif dataType == constants.siICENodeDataString: 
				xsi.LogMessage( "String: " + elem ); |