ポリゴン アイランドの列挙

 
 
 

この例では、すべてのポリゴン アイランド(それぞれを PolygonFaceCollection として)の配列を戻す関数を実装することにより、ポリゴン アイランドを列挙する方法を示します。

JScript の例:ポリゴンアイランドの列挙

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