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 <[email protected]>:

> 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 <[email protected]>
> Subject: Setting ICE attribute DataArray in javascript
> To: "[email protected]"
> <[email protected]>
>
> 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<faces.count;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: <Attribute: rbdId>*
> *// <Offset: -1>*
>
> Any hints on what I'm doing wrong ??
>
> Thanks!
>
>
> ------
> Softimage Mailing List.
> To unsubscribe, send a mail to [email protected]
> with "unsubscribe" in the subject, and reply to confirm.
------
Softimage Mailing List.
To unsubscribe, send a mail to [email protected] with 
"unsubscribe" in the subject, and reply to confirm.

Reply via email to