How to pause a ruby script for 1 second
-
Mac issue ? on PC works even with 0.1
-
@unknownuser said:
Mac issue ? on PC works even with 0.1
Are you sure? (Windows XP Pro SP2)
t1=Time.now; UI.start_timer(0.1) {p Time.now-t1} ==> 0.01 t1=Time.now; UI.start_timer(0.999) {p Time.now-t1} ==> 0.01 t1=Time.now; UI.start_timer(1) {p Time.now-t1} ==> 1.001 t1=Time.now; UI.start_timer(5) {p Time.now-t1} ==> 5.007
-
Yes, Mac
select_comp_by_name("Fahrstuhl");Morisdov.transf_get("transf1");UI.start_timer( 0.99999, false) { Sketchup.active_model.selection.clear}
does not clear.
Perhaps »Morisdov.trasf_get("transf1")« needs exact 1 second, so it goes with 1 and with 1.01 seconds, but not with littlebit less (0.999).On Mac on ruby console does not go:
t1=Time.now; UI.start_timer(0.1) {p Time.now-t1} ==> 0.01
Error is:
@unknownuser said:
t1=Time.now; UI.start_timer(5) {p Time.now-t1} ==> 0.01
t1=Time.now; UI.start_timer(0.1) {p Time.now-t1} ==> 0.01Error: #<SyntaxError: (eval):202: compile error
(eval):201: parse error
t1=Time.now; UI.start_timer(5) {p Time.now-t1} ==> 0.01
^
(eval):202: parse error
t1=Time.now; UI.start_timer(0.1) {p Time.now-t1} ==> 0.01
^>
(eval):202 -
of course, ==> means what it should return and you must not type that
-
Yes, TDB, that I could know myself. Excuse me, please.
@Jim
Your times are the same with me.
How can I get ==> 0.5 or ==> 0.99?Mac OS X 10.4.11
-
yup. my bad. I checked only visual and didnt do any time checks.
seems that it ignores decimals (0.1...0.9 = 0, 1.1 ... 1.9 = 1) - so we need to use that. for interface like clear selection doesnt matter that much anyway
-
To pause is a workaround. Would be better to ask how long
Morisdov.transf_get("transf2")
works and then clear without pause/delay.
Can ruby know how long the earlier line works?
-
Here such variant:
time_limit = 0.2 @val_time = Time.now @timer = UI.start_timer(0, true) do if Time.now - @val_time >= time_limit UI.stop_timer @timer Sketchup.active_model.selection.clear @val_time = @timer = nil end end
It works
-
Unfortunately it does not work, if this line is before
Morisdov.transf_get("transf2")
Please try with proper_animation.rb and one selected component with Position 2
Morisdov.transf_get("transf2") time_limit = 0.2 @val_time = Time.now @timer = UI.start_timer(0, true) do if Time.now - @val_time >= time_limit UI.stop_timer @timer Sketchup.active_model.selection.clear @val_time = @timer = nil end end
The selected component will stay selected.
-
welcome to thread synchronization fun - as you can see Morisdov.transf_get uses start_timer
so you need to sync with that (e.g. add global variable in transf_get end for example) -
How?
-
btw, did you increased time_limit from AlexMozg example first ? to like 5 ?
-
And it is possible and so:
... ... def self.timer(proc, time_limit=0.5) $val_time = Time.now $timer = UI.start_timer(0, true) do if Time.now - $val_time >= time_limit UI.stop_timer $timer proc.call $val_time = $timer = nil end end end ... select_comp_by_name("Fahrstuhl") Morisdov.transf_get("transf2") self.timer(proc{Sketchup.active_model.selection.clear}) ...
Though it is possible to do without global variables.
But, I do not know that Morisdov.transf_get does.
; -
def self.timer(proc, time_limit=0.9) $val_time = Time.now $timer = UI.start_timer(0, true) do if Time.now - $val_time >= time_limit UI.stop_timer $timer proc.call $val_time = $timer = nil end end end select_comp_by_name("Fahrstuhl") Morisdov.transf_get("transf2") self.timer(proc{Sketchup.active_model.selection.clear})
With 0.9 it works for exactly one time, each next start lets Sketchup crash down.
With 0.2 SketchUp crashes immediately.I think I have to ask Morisdov by PM.
-
@n lindenthal said:
...
I think I have to ask Morisdov by PM.Ask me, and I shall try to answer.
-
@alexmozg said:
… Ask me, and I shall try to answer.
Here is my »Fahrstuhl«, english elevator.
My script selects the "Fahrstuhl“, puts it to another position (here position 1 and 2), and then clears the selection:
select_comp_by_name("Fahrstuhl") Morisdov.transf_get("transf1") UI.start_timer(1, false) {Sketchup.active_model.selection.clear}
Position 1
select_comp_by_name("Fahrstuhl") Morisdov.transf_get("transf2") UI.start_timer(1, false) {Sketchup.active_model.selection.clear}
Position 2
To get the script work, the following .rbs must be installed:
- select_com_by_name.rb
def select_comp_by_name(comp_name) model = Sketchup.active_model sel = model.selection sel.clear if compdef = Sketchup.active_model.definitions[comp_name] sel.add(compdef.instances) else Sketchup.active_model.active_entities.each do |d| if d.typename == "ComponentInstance" sel.add d if d.name==comp_name end end if sel.count == 0 UI.beep else UI.messagebox(sel.count.to_s + " gesuchte Dinger gefunden.") end end end
- proper_animation.rb
My question is, how to select the "Fahrstuhl/elevator" without selection marks.
So I tried to use the following script:
def self.timer(proc, time_limit=1) $val_time = Time.now $timer = UI.start_timer(0, true) do if Time.now - $val_time >= time_limit UI.stop_timer $timer proc.call $val_time = $timer = nil end end end select_comp_by_name("Fahrstuhl") Morisdov.transf_get("transf2") self.timer(proc{Sketchup.active_model.selection.clear})
Would be a wonder to get the arrows in model be buttons, which start the elevator scripts.
-
@unknownuser said:
My question is, how to select the "Fahrstuhl/elevator" without selection marks.
The simplest - to make changes to a script "Morisdov".
Somehow here so:def Morisdov.transf_get(dict_key, ss=nil) model=Sketchup.active_model ents=model.active_entities if ss @ents = ss else @ents=[] model.selection.each {|e| @ents.push(e)} end @ents.freeze model.selection.clear .... .... end
And completely to get rid from selection.
Where I can find "following.rbs"?
I shall think... -
@alexmozg said:
@unknownuser said:
…And completely to get rid from selection.
Where I can find "following.rbs"?
I shall think...Yes, rid from selection …
… but how? This way?
select_comp_by_name("Fahrstuhl") def Morisdov.transf_get(dict_key, ss=nil) model=Sketchup.active_model ents=model.active_entities if ss @ents = ss else @ents=[] model.selection.each {|e| @ents.push(e)} end @ents.freeze model.selection.clear end
(my poor english) Which "following.rbs" you need?
-
@unknownuser said:
Yes, rid from selection …
… but how? This way?
def select_comp_by_name(comp_name) model = Sketchup.active_model if compdef = Sketchup.active_model.definitions[comp_name] sel = compdef.instances else sel=[] Sketchup.active_model.active_entities.each do |d| if d.typename == "ComponentInstance" sel << d if d.name==comp_name end end if sel.count == 0 UI.beep else UI.messagebox(sel.count.to_s + " gesuchte Dinger gefunden.") end end sel end def Morisdov.transf_get(dict_key, ss=nil) model=Sketchup.active_model ents=model.active_entities if ss @ents = ss else @ents=[] model.selection.each {|e| @ents.push(e)} end @ents.freeze model.selection.clear ... ...<<original code>>... ... end
Use:
- ss = select_comp_by_name("Fahrstuhl")
- Morisdov.transf_get(dict_key, ss)
@unknownuser said:
(my poor english) Which "following.rbs" you need?
Here this:
@unknownuser said:
...Position 2
To get the script work, the following .rbs must be installed:????
-
I know this is old, but I was needing an answer to something similar today, and this thread over-complexificated the issue for me. I just wanted to add a short .2 second delay before carrying on with my script. This is what I've come up with and it worked for me. No need to invoke the UI.timer
time_mark = ( Time.now + 0.2 ) while time_mark > Time.now end
Hopefully thats helpful if anyone stumbles on this thread,
Chris
Advertisement