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.
    • 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
                                • Chris FullmerC Offline
                                  Chris Fullmer
                                  last edited by

                                  Ahh, I see. I think its ok in this instance to stop up ruby entirely. I was having very little luck getting it to work any other way. I just kept sending SU into a deeep coma.

                                  Maybe I'll try to post my broken code using the timer and try to get that working instead then. Thanks Tavi,

                                  Chris

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

                                  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