• 登入
sketchucation logo sketchucation
  • 登入
⚠️ Libfredo 15.4b | Minor release with bugfixes and improvements Update

How to pause a ruby script for 1 second

已排程 已置頂 已鎖定 已移動 Developers' Forum
25 貼文 5 Posters 5.0k 瀏覽 5 Watching
正在載入更多貼文
  • 從舊到新
  • 從新到舊
  • 最多點贊
回覆
  • 在新貼文中回覆
登入後回覆
此主題已被刪除。只有擁有主題管理權限的使用者可以查看。
  • N 離線
    N Lindenthal
    最後由 編輯 2008年8月18日 下午8:33

    @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 條回覆 最後回覆 回覆 引用 0
    • T 離線
      tbd
      最後由 編輯 2008年8月18日 下午8:40

      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 條回覆 最後回覆 回覆 引用 0
      • N 離線
        N Lindenthal
        最後由 編輯 2008年8月18日 下午8:49

        How?

        1 條回覆 最後回覆 回覆 引用 0
        • T 離線
          tbd
          最後由 編輯 2008年8月18日 下午9:00

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

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

          1 條回覆 最後回覆 回覆 引用 0
          • A 離線
            AlexMozg
            最後由 編輯 2008年8月18日 下午10:17

            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 條回覆 最後回覆 回覆 引用 0
            • N 離線
              N Lindenthal
              最後由 編輯 2008年8月19日 上午6:58

              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 條回覆 最後回覆 回覆 引用 0
              • A 離線
                AlexMozg
                最後由 編輯 2008年8月20日 上午6:32

                @n lindenthal said:

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

                Ask me, and I shall try to answer.

                1 條回覆 最後回覆 回覆 引用 0
                • N 離線
                  N Lindenthal
                  最後由 編輯 2008年8月22日 上午7:12

                  @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 條回覆 最後回覆 回覆 引用 0
                  • A 離線
                    AlexMozg
                    最後由 編輯 2008年8月23日 上午5:30

                    @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 條回覆 最後回覆 回覆 引用 0
                    • N 離線
                      N Lindenthal
                      最後由 編輯 2008年8月23日 上午7:10

                      @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 條回覆 最後回覆 回覆 引用 0
                      • A 離線
                        AlexMozg
                        最後由 編輯 2008年8月25日 上午4:44

                        @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 條回覆 最後回覆 回覆 引用 0
                        • Chris FullmerC 離線
                          Chris Fullmer
                          最後由 編輯 2009年2月16日 上午5:36

                          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 條回覆 最後回覆 回覆 引用 0
                          • T 離線
                            tbd
                            最後由 編輯 2009年2月16日 上午7:18

                            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 條回覆 最後回覆 回覆 引用 0
                            • Chris FullmerC 離線
                              Chris Fullmer
                              最後由 編輯 2009年2月16日 上午7:26

                              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 條回覆 最後回覆 回覆 引用 0
                              • 1
                              • 2
                              • 2 / 2
                              • 第一個貼文
                                最後的貼文
                              Buy SketchPlus
                              Buy SUbD
                              Buy WrapR
                              Buy eBook
                              Buy Modelur
                              Buy Vertex Tools
                              Buy SketchCuisine
                              Buy FormFonts

                              Advertisement