Re: Setting ICE attribute DataArray in javascript
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
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
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
...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
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.