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.
|