Single script to select different things

 From:  Flowgun
11127.18 In reply to 11127.17 
Here's what I came up with for now. It's not perfect, but still very useful:
code:
script: var selected_objs = moi.geometryDatabase.getSelectedObjects();
var all_objs = moi.geometryDatabase.getObjects();
var done = false;

if ( selected_objs.length == 0 )
{
	/* If nothing selected, select last-created object */
	moi.geometryDatabase.selectLastCreated();
	done = true;
}
else if ( selected_objs.numBReps > 0 )
	{
		/* If only joined surfaces are selected, select their naked edges */
		selected_objs.setProperty( 'selected', false );

		var breps = selected_objs.getBReps();
		var allNaked = true;
		
		for ( var i = 0; i < breps.length; ++i )
		{
			var brep = breps.item(i);
			if (brep.getNakedEdges().length == 0)
				allNaked = false;
		}
		if (allNaked)
		{
			for ( var i = 0; i < breps.length; ++i )
			{
				var brep = breps.item(i);
				var naked = brep.getNakedEdges();
				if (naked.length> 0)
					naked.setProperty( 'selected', true );
			}				
			done = true;
		}			
		else
			selected_objs.setProperty( 'selected', true );
}

/* If some points on a curve are selected, select the rest */
if ( !done )
{
for ( var i = 0; i < all_objs.length; ++i )
{
	var obj = all_objs.item(i);
	if ( obj.isCurve && obj.hasSelectedEditPoints ) /* this only works in latest versions */
	{
		moi.geometryDatabase.selectAll();
		done = true;
		break;
	}
}
}
/* If a named object is selected, deselect it and select the next one */

if ( !done )
{
	var objects = [], name_index = [];
	for ( var i = 0; i < all_objs.length; ++i )
	{
		var obj = all_objs.item(i);
		var name = obj.name;
		if ( name )
		{
			if ( name_index[name] == undefined )
			{
				name_index[name] = objects.length;
				objects.push( [] );
			}

			var index = name_index[name];
			objects[index].push( obj );
		}
	}

	function sortfunc( a, b )
	{
		var a_name = a[0].name;
		var b_name = b[0].name;

		return a_name.localeCompare(b_name);
	}

	objects.sort( sortfunc );

	var index_to_select = -1;

	for ( var i = 0; i < objects.length && index_to_select == -1; ++i )
	{
		var obj_array = objects[i];
		for ( var j = 0; j < obj_array.length && index_to_select == -1; ++j )
		{
			var obj = obj_array[j];
			if ( obj.selected )
			{
				var any_unselected = false;

				for ( var k = 0; k < obj_array.length; ++k )
				{
					if ( !obj_array[k].selected )
					{
						any_unselected = true;
						break;
					}
				}

				if ( any_unselected )
					index_to_select = i;
				else
					index_to_select = (i+1) % objects.length;
			}
		}
	}
	if ( index_to_select != -1 )
	{
		moi.geometryDatabase.deselectAll();

		var obj_array = objects[index_to_select];
		for ( var i = 0; i < obj_array.length; ++i )
		{
			var obj = obj_array[i];
			obj.selected = true;
		}
		done = true;
	}
}

if ( !done )
{
	if ( selected_objs.numStandaloneCurves> 0 )
	{
		/* If some curves are already selected, we loop through curve selection. */
		var curves = moi.geometryDatabase.getObjects().getCurves();
		var allSelected = true;
		var closedCurves = true;

		for ( var i = 0; i < curves.length; ++i )
		{
			var crv = curves.item(i);
			if (! crv.selected)
			{
				allSelected = false;
				if ( crv.isClosed)
					closedCurves = false;
			}
		}
		selected_objs.setProperty( 'selected', false );

		if (allSelected)
		{
			for ( var i = 0; i < curves.length; ++i )
			{
				var crv = curves.item(i);
				if (crv.isClosed)
				crv.selected = true;
			}
		}
		else if (closedCurves)
		{
			for ( var i = 0; i < curves.length; ++i )
			{
				var crv = curves.item(i);
				if (! crv.isClosed)
					crv.selected = true;
			}
		}
		else /* select all */
		{
			curves.setProperty( 'selected', true );
		}
	}
	else if ( selected_objs.length> 0 && selected_objs.numFaces >= selected_objs.length )
	{
		/* faces selected, select the edges of the faces */
		for ( var i = 0; i < selected_objs.numFaces; ++i )
		{
			var face = selected_objs.item(i);
			face.selected = false;
			face.getEdges().setProperty( 'selected', true );
		}
	}
	else if ( selected_objs.numEdges> 0 )
	{
		/* If any edges are selected do loop selection */
		moi.geometryDatabase.selectLoop();
	}
}



// - Flowgun


Edited by Michael - convert // comments into /* */ and add a couple missing semi-colons so it can work pasted into a single line as a shortcut key.

EDITED: 14 Jul 2023 by MICHAEL GIBSON