sketchucation logo sketchucation
    • Login
    ℹ️ Licensed Extensions | FredoBatch, ElevationProfile, FredoSketch, LayOps, MatSim and Pic2Shape will require license from Sept 1st More Info

    How to pause a ruby script for 1 second

    Scheduled Pinned Locked Moved Developers' Forum
    25 Posts 5 Posters 5.0k Views 5 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • J Offline
      Jim
      last edited by

      @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
      
      

      Hi

      1 Reply Last reply Reply Quote 0
      • N Offline
        N Lindenthal
        last edited by

        @TDB

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

        Error: #<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

        1 Reply Last reply Reply Quote 0
        • tbdT Offline
          tbd
          last edited by

          of course, ==> means what it should return and you must not type that

          SketchUp Ruby Consultant | Podium 1.x developer
          http://plugins.ro

          1 Reply Last reply Reply Quote 0
          • N Offline
            N Lindenthal
            last edited by

            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

            1 Reply Last reply Reply Quote 0
            • tbdT Offline
              tbd
              last edited by

              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

              SketchUp Ruby Consultant | Podium 1.x developer
              http://plugins.ro

              1 Reply Last reply Reply Quote 0
              • N Offline
                N Lindenthal
                last edited by

                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?

                1 Reply Last reply Reply Quote 0
                • A Offline
                  AlexMozg
                  last edited by

                  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 😄

                  1 Reply Last reply Reply Quote 0
                  • N Offline
                    N Lindenthal
                    last edited by

                    @AlexMozg

                    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.

                    1 Reply Last reply Reply Quote 0
                    • tbdT Offline
                      tbd
                      last edited by

                      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)

                      SketchUp Ruby Consultant | Podium 1.x developer
                      http://plugins.ro

                      1 Reply Last reply Reply Quote 0
                      • N Offline
                        N Lindenthal
                        last edited by

                        How?

                        1 Reply Last reply Reply Quote 0
                        • tbdT Offline
                          tbd
                          last edited by

                          btw, did you increased time_limit from AlexMozg example first ? to like 5 ?

                          SketchUp Ruby Consultant | Podium 1.x developer
                          http://plugins.ro

                          1 Reply Last reply Reply Quote 0
                          • A Offline
                            AlexMozg
                            last edited by

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

                            1 Reply Last reply Reply Quote 0
                            • N Offline
                              N Lindenthal
                              last edited by

                              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.

                              1 Reply Last reply Reply Quote 0
                              • A Offline
                                AlexMozg
                                last edited by

                                @n lindenthal said:

                                ...
                                I think I have to ask Morisdov by PM.

                                Ask me, and I shall try to answer.

                                1 Reply Last reply Reply Quote 0
                                • N Offline
                                  N Lindenthal
                                  last edited by

                                  @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:

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


                                  Fahrstuhl = Elevator

                                  1 Reply Last reply Reply Quote 0
                                  • A Offline
                                    AlexMozg
                                    last edited by

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

                                    1 Reply Last reply Reply Quote 0
                                    • N Offline
                                      N Lindenthal
                                      last edited by

                                      @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?

                                      1 Reply Last reply Reply Quote 0
                                      • A Offline
                                        AlexMozg
                                        last edited by

                                        @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:

                                        1. ss = select_comp_by_name("Fahrstuhl")
                                        2. 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:

                                        ????

                                        1 Reply Last reply Reply Quote 0
                                        • Chris FullmerC Offline
                                          Chris Fullmer
                                          last edited by

                                          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

                                          Lately you've been tan, suspicious for the winter.
                                          All my Plugins I've written

                                          1 Reply Last reply Reply Quote 0
                                          • tbdT Offline
                                            tbd
                                            last edited by

                                            Chris: i hope your code is called only by the user and not in an Observer or right click menus, because it will stop Ruby thread and if you call this several times it will block a lot of things.

                                            SketchUp Ruby Consultant | Podium 1.x developer
                                            http://plugins.ro

                                            1 Reply Last reply Reply Quote 0
                                            • 1
                                            • 2
                                            • 1 / 2
                                            • First post
                                              Last post
                                            Buy SketchPlus
                                            Buy SUbD
                                            Buy WrapR
                                            Buy eBook
                                            Buy Modelur
                                            Buy Vertex Tools
                                            Buy SketchCuisine
                                            Buy FormFonts

                                            Advertisement