Re: Setting ICE attribute DataArray in javascript

2016-12-14 Thread Fabricio Chamon
hey nice tips Matt, thanks for the detailed explanation. I'll look into the
GridData object on the next time.

cheers.

2016-12-14 2:33 GMT-02:00 Matt Lind :

> I always cringe when I see the SafeArray suggestion as it doesn't tell the
> whole story.
>
> I haven't tried this for ICE attributes, but for all other things JScript
> requiring the use of an array, you can use the GridData object from the
> Softimage SDK.  It's a lot more convenient than dabbling with the esoteric
> SafeArray object and is fully supported by the Softimage SDK avoiding the
> workarounds for certain commands and methods.  The GridData object is smart
> enough to automatically resize itself when ingesting data from a known
> source (for multi-dimensional arrays):
>
> var oObject= Selection(0);
> var oGridData  = XSIFactory.CreateGridData();
> oGridData.Data = oObject.ActivePrimitive.Geometry.Vertices.PositionArray;
>
> LogMessage( "Grid[rows,cols]: " + oGridData.RowCount + ", " +
> oGridData.ColumnCount, siComment );
>
>
> The Grid doesn’t auto-resize for all array types, but it supports most
> you’ll
> encounter such as cluster data (envelopes, materials, user normals, vertex
> colors, texture UVWs, ...).  to write the data to another property, just
> assign the .Data property in reverse of what is shown above.
>
> oCluster.Elements.Array = oGridData.Data;
>
> Anyway, writing the data to the ICE Attribute does work, but as you found
> out you must freeze the modeling history of the ICE Attribute property
> because technically (I think) it’s an operator.  That implies it has an
> internal update callback which will get triggered after any attempt you
> make
> to modify the data.  You make a change, then the update callback is
> triggered recomputing and applying the original data you overwrote.
> Freezing the operator converts it to static data which you can then modify
> with script.
>
> As for purely JScript issues with arrays, you only need to convert to a
> safeArray when you need to modify array data and send it back into
> Softimage.  If you’re just reading data, or modifying it locally with no
> intention of sending it back where it came from, you don’t have to convert.
> that’ll save overhead in the runtime of your code.
>
> Another shortcut is the use of the .Array() method to convert the data to
> safeArray to make it more concise and easier to read in code.  For example:
>
> // Get envelope weights and convert from safeArray to JScript array in the
> process
> var aEnvelopeWeights = ( oEnvelope.weights.Array ).toArray();
>
> // Get vertex colors on mesh located nearest specified set of position
> coordinates
> var oPointLocators = oPolygonMesh.GetClosestLocations( aPositions );
> aVertexColors = oPolygonMesh.EvaluateClusterProperty( oPointLocators,
> oParentCluster, oClusterProperty ).toArray();
>
> Just enclose the quantity to be converted in parentheses, then append
> .Array() to the right parenthesis.  the only caveat is to make sure the
> quantity to be converted is not null or else it’ll throw an error.
>
> Matt
>
>
>
>
>
> Date: Tue, 13 Dec 2016 20:34:02 -0200
> From: Fabricio Chamon 
> Subject: Setting ICE attribute DataArray in javascript
> To: "softimage@listproc.autodesk.com"
> 
>
> Hey,
>
> lots of questions these days, sorry.
>
> So I'm searching all day through the list and internet to find a solution
> for this... I'm trying to set per polygon ice attribute values on a mesh
> via sdk (javascript).
> The subject was already discussed, Stephen Blair have some studies on it,
> one solution was given but in the end I'm still not able to get it working.
>
> So here's roughly my code:
>
> var ICEAttr = highResGeo.AddICEAttribute("rbdId", siICENodeDataLong,
> siICENodeStructureSingle, siICENodeContextComponent2D );
> var myDataArray = new Array();
> var faces = highResGeo.Facets;
> for (i=0;i var face = faces(i);
> myDataArray[i] = parseInt(x); //does not matter, assume any value for x
> }
>
> //now here's the tricky part
>
> da1 = getSafeArray(myDataArray);
> da2 = getSafeArray([myDataArray]);
> ICEAttr.DataArray = da2;
>
>
> //helper function
> function getSafeArray(jsArr) {
> var dict = new ActiveXObject("Scripting.Dictionary");
> for (var i = 0; i < jsArr.length; i++)
> dict.add(i, jsArr[i]);
> return dict.Items();
> }
>
>
>
>
> This SafeArray stuff is the solution proposed by Stephen on his blog...but
> gives me :
>
> *WARNING : 3392 - Invalid offset specified while extracting data from this
> attribute: *
> *// *
>
> Any hints on what I'm doing wrong ??
>
> Thanks!
>
>
> --
> Softimage Mailing List.
> To unsubscribe, send a mail to softimage-requ...@listproc.autodesk.com
> with "unsubscribe" in the subject, and reply to confirm.
--
Softimage Mailing List.
To unsubscribe, send a mail to softimage-requ...@listproc.autodesk.com with 
"unsubscribe" in the subject, and reply to confirm.

Re: Setting ICE attribute DataArray in javascript

2016-12-13 Thread Matt Lind
I always cringe when I see the SafeArray suggestion as it doesn't tell the 
whole story.

I haven't tried this for ICE attributes, but for all other things JScript 
requiring the use of an array, you can use the GridData object from the 
Softimage SDK.  It's a lot more convenient than dabbling with the esoteric 
SafeArray object and is fully supported by the Softimage SDK avoiding the 
workarounds for certain commands and methods.  The GridData object is smart 
enough to automatically resize itself when ingesting data from a known 
source (for multi-dimensional arrays):

var oObject= Selection(0);
var oGridData  = XSIFactory.CreateGridData();
oGridData.Data = oObject.ActivePrimitive.Geometry.Vertices.PositionArray;

LogMessage( "Grid[rows,cols]: " + oGridData.RowCount + ", " + 
oGridData.ColumnCount, siComment );


The Grid doesn’t auto-resize for all array types, but it supports most you’ll 
encounter such as cluster data (envelopes, materials, user normals, vertex 
colors, texture UVWs, ...).  to write the data to another property, just 
assign the .Data property in reverse of what is shown above.

oCluster.Elements.Array = oGridData.Data;

Anyway, writing the data to the ICE Attribute does work, but as you found 
out you must freeze the modeling history of the ICE Attribute property 
because technically (I think) it’s an operator.  That implies it has an 
internal update callback which will get triggered after any attempt you make 
to modify the data.  You make a change, then the update callback is 
triggered recomputing and applying the original data you overwrote. 
Freezing the operator converts it to static data which you can then modify 
with script.

As for purely JScript issues with arrays, you only need to convert to a 
safeArray when you need to modify array data and send it back into 
Softimage.  If you’re just reading data, or modifying it locally with no 
intention of sending it back where it came from, you don’t have to convert. 
that’ll save overhead in the runtime of your code.

Another shortcut is the use of the .Array() method to convert the data to 
safeArray to make it more concise and easier to read in code.  For example:

// Get envelope weights and convert from safeArray to JScript array in the 
process
var aEnvelopeWeights = ( oEnvelope.weights.Array ).toArray();

// Get vertex colors on mesh located nearest specified set of position 
coordinates
var oPointLocators = oPolygonMesh.GetClosestLocations( aPositions );
aVertexColors = oPolygonMesh.EvaluateClusterProperty( oPointLocators, 
oParentCluster, oClusterProperty ).toArray();

Just enclose the quantity to be converted in parentheses, then append 
.Array() to the right parenthesis.  the only caveat is to make sure the 
quantity to be converted is not null or else it’ll throw an error.

Matt





Date: Tue, 13 Dec 2016 20:34:02 -0200
From: Fabricio Chamon 
Subject: Setting ICE attribute DataArray in javascript
To: "softimage@listproc.autodesk.com"


Hey,

lots of questions these days, sorry.

So I'm searching all day through the list and internet to find a solution
for this... I'm trying to set per polygon ice attribute values on a mesh
via sdk (javascript).
The subject was already discussed, Stephen Blair have some studies on it,
one solution was given but in the end I'm still not able to get it working.

So here's roughly my code:

var ICEAttr = highResGeo.AddICEAttribute("rbdId", siICENodeDataLong,
siICENodeStructureSingle, siICENodeContextComponent2D );
var myDataArray = new Array();
var faces = highResGeo.Facets;
for (i=0;i*
*// *

Any hints on what I'm doing wrong ??

Thanks! 


--
Softimage Mailing List.
To unsubscribe, send a mail to softimage-requ...@listproc.autodesk.com with 
"unsubscribe" in the subject, and reply to confirm.

Re: Setting ICE attribute DataArray in javascript

2016-12-13 Thread Fabricio Chamon
found the culprit... I was running this on a live alembic file...for some
reason it does not work. As soon as I freeze the mesh then it works great.

2016-12-13 20:38 GMT-02:00 Fabricio Chamon :

> ...and here is the blog post where Stephen shows his code:
> https://xsisupport.com/2013/03/25/aha-setting-dataarray2d-with-jscript/
>
> btw I'm on soft 2015 SP2
>
> 2016-12-13 20:34 GMT-02:00 Fabricio Chamon :
>
>> Hey,
>>
>> lots of questions these days, sorry.
>>
>> So I'm searching all day through the list and internet to find a solution
>> for this... I'm trying to set per polygon ice attribute values on a mesh
>> via sdk (javascript).
>> The subject was already discussed, Stephen Blair have some studies on it,
>> one solution was given but in the end I'm still not able to get it working.
>>
>> So here's roughly my code:
>>
>> var ICEAttr = highResGeo.AddICEAttribute("rbdId", siICENodeDataLong,
>> siICENodeStructureSingle, siICENodeContextComponent2D );
>> var myDataArray = new Array();
>> var faces = highResGeo.Facets;
>> for (i=0;i> var face = faces(i);
>> myDataArray[i] = parseInt(x); //does not matter, assume any value for x
>> }
>>
>> //now here's the tricky part
>>
>> da1 = getSafeArray(myDataArray);
>> da2 = getSafeArray([myDataArray]);
>> ICEAttr.DataArray = da2;
>>
>>
>> //helper function
>> function getSafeArray(jsArr) {
>> var dict = new ActiveXObject("Scripting.Dictionary");
>> for (var i = 0; i < jsArr.length; i++)
>> dict.add(i, jsArr[i]);
>> return dict.Items();
>> }
>>
>>
>>
>>
>> This SafeArray stuff is the solution proposed by Stephen on his
>> blog...but gives me :
>>
>> *WARNING : 3392 - Invalid offset specified while extracting data from
>> this attribute: *
>> *// *
>>
>> Any hints on what I'm doing wrong ??
>>
>> Thanks!
>>
>>
>>
>
--
Softimage Mailing List.
To unsubscribe, send a mail to softimage-requ...@listproc.autodesk.com with 
"unsubscribe" in the subject, and reply to confirm.

Re: Setting ICE attribute DataArray in javascript

2016-12-13 Thread Fabricio Chamon
...and here is the blog post where Stephen shows his code:
https://xsisupport.com/2013/03/25/aha-setting-dataarray2d-with-jscript/

btw I'm on soft 2015 SP2

2016-12-13 20:34 GMT-02:00 Fabricio Chamon :

> Hey,
>
> lots of questions these days, sorry.
>
> So I'm searching all day through the list and internet to find a solution
> for this... I'm trying to set per polygon ice attribute values on a mesh
> via sdk (javascript).
> The subject was already discussed, Stephen Blair have some studies on it,
> one solution was given but in the end I'm still not able to get it working.
>
> So here's roughly my code:
>
> var ICEAttr = highResGeo.AddICEAttribute("rbdId", siICENodeDataLong,
> siICENodeStructureSingle, siICENodeContextComponent2D );
> var myDataArray = new Array();
> var faces = highResGeo.Facets;
> for (i=0;i var face = faces(i);
> myDataArray[i] = parseInt(x); //does not matter, assume any value for x
> }
>
> //now here's the tricky part
>
> da1 = getSafeArray(myDataArray);
> da2 = getSafeArray([myDataArray]);
> ICEAttr.DataArray = da2;
>
>
> //helper function
> function getSafeArray(jsArr) {
> var dict = new ActiveXObject("Scripting.Dictionary");
> for (var i = 0; i < jsArr.length; i++)
> dict.add(i, jsArr[i]);
> return dict.Items();
> }
>
>
>
>
> This SafeArray stuff is the solution proposed by Stephen on his blog...but
> gives me :
>
> *WARNING : 3392 - Invalid offset specified while extracting data from this
> attribute: *
> *// *
>
> Any hints on what I'm doing wrong ??
>
> Thanks!
>
>
>
--
Softimage Mailing List.
To unsubscribe, send a mail to softimage-requ...@listproc.autodesk.com with 
"unsubscribe" in the subject, and reply to confirm.

Setting ICE attribute DataArray in javascript

2016-12-13 Thread Fabricio Chamon
Hey,

lots of questions these days, sorry.

So I'm searching all day through the list and internet to find a solution
for this... I'm trying to set per polygon ice attribute values on a mesh
via sdk (javascript).
The subject was already discussed, Stephen Blair have some studies on it,
one solution was given but in the end I'm still not able to get it working.

So here's roughly my code:

var ICEAttr = highResGeo.AddICEAttribute("rbdId", siICENodeDataLong,
siICENodeStructureSingle, siICENodeContextComponent2D );
var myDataArray = new Array();
var faces = highResGeo.Facets;
for (i=0;i*
*// *

Any hints on what I'm doing wrong ??

Thanks!
--
Softimage Mailing List.
To unsubscribe, send a mail to softimage-requ...@listproc.autodesk.com with 
"unsubscribe" in the subject, and reply to confirm.