This example demonstrates how to enumerate polygon islands by implementing a function that returns an array of all the polygon islands, each one as a PolygonFaceCollection.
function GetIslands(in_obj)
{
var arrIslands = new Array();
var plyPolygons = in_obj.ActivePrimitive.Geometry.Polygons;
var arrSeen = new Array(plyPolygons.Count); // for optimization
for ( var i=0; i<plyPolygons.Count; i++ ) {
// Skip any we've already seen
if ( arrSeen[i] ) { continue; }
// Stuff the current polygon into an XSICollection (custom
// filters only accept and return XSICollections)
var xsiCurrPolygons = new ActiveXObject("XSI.Collection");
xsiCurrPolygons.Add(plyPolygons(i));
// Activate and apply the filter
var fltPolyIslandFilter = Application.Filters("Polygon_Island");
var xsiCurrIslands = fltPolyIslandFilter.Subset(xsiCurrPolygons);
// To return an actual PolygonFaceCollection instead of an
// XSICollection, we can convert it via the SubComponent
var plyCurrIslands = Dictionary.GetObject(xsiCurrIslands).SubComponent.ComponentCollection;
// Indicate that we've see all of these components (optimization)
for ( var j=0; j<plyCurrIslands.Count; j++ ) {
arrSeen[plyCurrIslands(j).Index] = 1;
}
// Add the PolygonFaceCollection of polygon islands to the return array
arrIslands.push(plyCurrIslands);
}
return arrIslands;
}
// Open the club bot sample scene and select the feet polygon mesh
var strClubBot = XSIUtils.BuildPath(
Application.InstallationPath(siFactoryPath),
"Data", "XSI_SAMPLES", "Scenes", "club_bot.scn"
);
OpenScene(strClubBot, false);
SelectObj("club_bot.BotFeet");
// Using this in a tool, you might use the selection:
var e = new Enumerator(Selection);
for ( ; !e.atEnd(); e.moveNext() ) {
var obj = e.item();
var arrPolyIslands = GetIslands(obj);
Application.LogMessage( "# of polygon islands: " + arrPolyIslands.length );
}
// Expected results:
// INFO : # of arrPolyIslands: 2
Except where otherwise noted, this work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License