MoI discussion forum
MoI discussion forum

Full Version: Selection questions

Show messages:  1-15  16-22

From: Michael Gibson
10 Dec 2018   [#16] In reply to [#15]
Hi Bravlin, I'm not noticing any lag over here with your script.

But a couple of things that could improve performance though - first thing is a script that does selection type stuff is better to run as an "instant script" than as a command.

A command in MoI handles various things related to creating and deleting objects like setting up undo units, clearing selection lock, loading UI files, etc...

If you run it as instant script you will bypass all that stuff. Also you can trigger instant script while running inside of a command. If it's run as a command it will exit any currently running command since there can only be one "command" running at a time.

One way to run things as an instant script is to have the script code pasted directly into the Command field of the Shortcut key editor, prefixed with "script:" . But it is also possible to set up instant script from a .js file. To do that, make a directory named "scripts" as a sibling of "commands" in the moi appdata directory and put it in there. Then for your shortcut key use the name of the script file including the .js file extension like: SaveSelectToStyle.js . You can also put it in any directory and put the whole path to it in the shortcut key like c:\scripts\SaveSelectToStyle.js .

Also a couple other things would be to use geometryDatabase.findStyle() to get the style, and also line 23 if(obj.type = 7) looks like a bug, first you would need == there but also type number 7 is a mesh object will only be around when you're exporting to a mesh format. The objects that you're working with in TEST.3dm are BRep objects so you could use obj.isBRep . I would kind of think that trying to assign to the read only obj.type property would trigger an exception but I guess not, that might be a bug.

So give this one a try with it set up to run as immediate script, does it behave any better for you? :

code:
function DoSaveSelectToStyle()
{
    var gd = moi.geometryDatabase; 
    var activstyleidx = moi.geometryDatabase.activeStyle;
    var objects = gd.getObjects(); 
    var savedobjsnum = 0;

    var si = moi.geometryDatabase.findStyle( 'selectset', true /*CreateIfNotFound*/ ).index;
   
    
    // reselect all selectset objs
    for ( var i = 0; i < objects.length; ++i )
    { 
        var obj = objects.item(i); 
        if(obj.styleIndex == si)
        {
            obj.styleIndex=activstyleidx; 
            obj.selected=true;
            savedobjsnum +=1;
        }
        else
        {
            if(obj.isBRep)
            {
                var subs = obj.getSubObjects();
                for ( var j = 0; j < subs.length; ++j ) 
                { 
                    var sub = subs.item(j); 
                    if(sub.styleIndex == si)
                    {
                        sub.styleIndex=activstyleidx; 
                        sub.selected=true;
                        savedobjsnum +=1;
                    }
                }
            }
        }
    }
    
    // if no objs in style selectset
    if(savedobjsnum == 0)
    {
        var selobjects = gd.getSelectedObjects(); 
        selobjects.setProperty( 'styleIndex', si ); 
    }
}
DoSaveSelectToStyle();




- Michael
From: Bravlin
11 Dec 2018   [#17]
"=". My bad. That's what happens when you work without IDE support.
I paste code of functions here, but i use them as .js files.

I tried your code today but unfortunately it also have this lag.
Maybe we can somehow reach UI style selection functions (those that fires up when we press near style gui to select all obj)?
They sure doesn't have any performance issues.

Here is how this lag looks like: https://www.dropbox.com/s/wjy47s71b8quh5r/Dv5mujpFSg.mp4
I use " SHIFT+` " as hotkey to fire script.
From: Michael Gibson
11 Dec 2018   [#18] In reply to [#17]
Hi Bravlin,

re:
> Maybe we can somehow reach UI style selection functions (those that fires up when we press near
> style gui to select all obj)?
> They sure doesn't have any performance issues.

There isn't any way set up to access that from script right now but I can add script access to it for the next v4 beta.

Just to make sure I understand, you mean a way to trigger by script the same thing that happens when you click on this selection dot spot in the scene browser? :


- Michael

Image Attachments:
bravlin_scene_browser.jpg 


From: Bravlin
11 Dec 2018   [#19]
Yes. I guess the similar query interface will be handy for a group selection also.
From: Bravlin
2 Jan 2019   [#20]
Theas thread helps with performance issue a lot.
http://moi3d.com/forum/messages.php?webtag=MOI&msg=6440.1

script: /*SAVE SELECT TO STYLE*/moi.command.execCommand ('var gd = moi.geometryDatabase; var activstyleidx = moi.geometryDatabase.activeStyle; var objects = gd.getObjects(); var savedobjsnum = 0;var si = moi.geometryDatabase.findStyle( "selectset", true ).index; for ( var i = 0; i < objects.length; ++i ) { var obj = objects.item(i); if(obj.styleIndex == si){ obj.styleIndex=activstyleidx; obj.selected=true; savedobjsnum +=1; } else { if(obj.isBRep) { var subs = obj.getSubObjects(); for ( var j = 0; j < subs.length; ++j ) { var sub = subs.item(j); if(sub.styleIndex == si){sub.styleIndex=activstyleidx; sub.selected=true; savedobjsnum +=1; }}}}}if(savedobjsnum == 0){var selobjects = gd.getSelectedObjects(); selobjects.setProperty( "styleIndex", si ); }');
From: Michael Gibson
2 Jan 2019   [#21] In reply to [#20]
Hi Bravlin, some of the advice in that thread is outdated now as of MoI v4. In v4 MoI no longer runs command scripts in a separate process, they are run inside the main MoI process and so there is no longer any performance gain from moving functions from a .js file into the .htm file.

- Michael
From: Bravlin
14 Jan 2019   [#22]
XSI-like hide toggler. Hide and unhide only last selected object (in our case last named object).

script: /*HIDE*/ var selobjs = moi.geometryDatabase.getSelectedObjects();if(selobjs.length > 0){var allobjs = moi.geometryDatabase.getObjects();for ( var i = 0; i < allobjs.length; ++i ){var obj = allobjs.item(i);if(obj.name == "lasthide")obj.name="";}selobjs.SetProperty("name", "lasthide");selobjs.SetProperty("hidden", true);}else{moi.geometryDatabase.selectNamed("lasthide");selobjs = moi.geometryDatabase.getSelectedObjects();selobjs.SetProperty("name", "");selobjs.SetProperty("hidden", false);}

Show messages:  1-15  16-22