Ok, here's the complete JScript for creating MaterialIDs.
A lot of hoops to jump through for something seemingly simple...
For some obscure reason the viewport does not update with the shader
colors. You have to render to see the result.
Also, I don't know why string attribute "Materials" can only be set via
a helper attribute, whereas "MaterialID" can be set directly.
NewScene("", "false");
SetDisplayMode("Camera", "shaded");
var oObj = CreatePrim("grid", "MeshSurface", "", "");
SetValue(oObj + ".polymsh.geom.subdivu", 2, null);
SetValue(oObj + ".polymsh.geom.subdivv", 2, null);
var sLib = "Sources.Materials.DefaultLib.";
var oMat = SICreateMaterial("$XSI_DSPRESETS\\Shaders\\Material\\Phong",
"Mat0", null, null, false, null);
SetValue(sLib + oMat.Name + ".NestedShaders." + oMat.Name +
".diffuse.red", 1.0, null);
SetValue(sLib + oMat.Name + ".NestedShaders." + oMat.Name +
".diffuse.green", 0.0, null);
SetValue(sLib + oMat.Name + ".NestedShaders." + oMat.Name +
".diffuse.blue", 0.0, null);
var oMat = SICreateMaterial("$XSI_DSPRESETS\\Shaders\\Material\\Phong",
"Mat1", null, null, false, null);
SetValue(sLib + oMat.Name + ".NestedShaders." + oMat.Name +
".diffuse.red", 0.0, null);
SetValue(sLib + oMat.Name + ".NestedShaders." + oMat.Name +
".diffuse.green", 1.0, null);
SetValue(sLib + oMat.Name + ".NestedShaders." + oMat.Name +
".diffuse.blue", 0.0, null);
var oMat = SICreateMaterial("$XSI_DSPRESETS\\Shaders\\Material\\Phong",
"Mat2", null, null, false, null);
SetValue(sLib + oMat.Name + ".NestedShaders." + oMat.Name +
".diffuse.red", 0.0, null);
SetValue(sLib + oMat.Name + ".NestedShaders." + oMat.Name +
".diffuse.green", 0.0, null);
SetValue(sLib + oMat.Name + ".NestedShaders." + oMat.Name +
".diffuse.blue", 1.0, null);
var oMat = SICreateMaterial("$XSI_DSPRESETS\\Shaders\\Material\\Phong",
"Mat3", null, null, false, null);
SetValue(sLib + oMat.Name + ".NestedShaders." + oMat.Name +
".diffuse.red", 1.0, null);
SetValue(sLib + oMat.Name + ".NestedShaders." + oMat.Name +
".diffuse.green", 1.0, null);
SetValue(sLib + oMat.Name + ".NestedShaders." + oMat.Name +
".diffuse.blue", 0.0, null);
var oIA = oObj.ActivePrimitive.AddICEAttribute("sMaterials",
siICENodeDataString, siICENodeStructureArray, siICENodeContextSingleton);
ApplyOp("ICETree", oObj, siNode, null, null, 0);
AddICECompoundNode("Set Data", oObj + ".polymsh.ICETree");
ConnectICENodes(oObj + ".polymsh.ICETree.port1", oObj +
".polymsh.ICETree.Set_Data.Execute");
SetValue(oObj + ".polymsh.ICETree.Set_Data.Reference", "self.Materials",
null);
AddICENode("$XSI_DSPRESETS\\ICENodes\\GetDataNode.Preset", oObj +
".polymsh.ICETree");
ConnectICENodes(oObj + ".polymsh.ICETree.Set_Data.Value", oObj +
".polymsh.ICETree.SceneReferenceNode.value");
SetValue(oObj + ".polymsh.ICETree.SceneReferenceNode.reference", oObj +
".sMaterials", null);
var aData = [sLib + "Mat0", sLib + "Mat1", sLib + "Mat2", sLib + "Mat3"];
var asData = getSafeArray(aData);
var asData1 = getSafeArray([asData]);
oIA.DataArray2D = asData1;
AddICECompoundNode("Set Data", oObj + ".polymsh.ICETree");
AddPortToICENode(oObj + ".polymsh.ICETree.port1",
siNodePortDataInsertionLocationAfter);
ConnectICENodes(oObj + ".polymsh.ICETree.port2",
"grid.polymsh.ICETree.Set_Data[1].Execute");
SetValue(oObj + ".polymsh.ICETree.Set_Data[1].Reference",
"self.MaterialID", null);
var oIA = oObj.ActivePrimitive.GetICEAttributeFromName("MaterialID");
var saData = getSafeArray([1,2,3,4]);
oIA.DataArray = saData;