sketchucation logo sketchucation
    • 登入
    Oops, your profile's looking a bit empty! To help us tailor your experience, please fill in key details like your SketchUp version, skill level, operating system, and more. Update and save your info on your profile page today!
    🔌 Smart Spline | Fluid way to handle splines for furniture design and complex structures. Download

    [Plugin] Select by Z

    已排程 已置頂 已鎖定 已移動 Plugins
    25 貼文 7 Posters 18.2k 瀏覽 7 Watching
    正在載入更多貼文
    • 從舊到新
    • 從新到舊
    • 最多點贊
    回覆
    • 在新貼文中回覆
    登入後回覆
    此主題已被刪除。只有擁有主題管理權限的使用者可以查看。
    • M 離線
      MartinRinehart
      最後由 編輯

      @earthmover said:

      I had a few times this week that I needed to select all the faces at a given height ...

      Have you visited the Ruby Console? You could get this done there without waiting on a Ruby.

      Author, Edges to Rubies - The Complete SketchUp Tutorial at http://www.MartinRinehart.com/models/tutorial.

      1 條回覆 最後回覆 回覆 引用 0
      • TIGT 離線
        TIG Moderator
        最後由 編輯

        @earthmover said:

        Just wondering if this were possibly still in the works? TIG?

        I had a few times this week that I needed to select all the faces at a given height and this script would've been very useful. No hurry, just wondering. Thanks!

        Time flies when you are enjoying yourself... 😉

        These are the lines of code you need...

        
        def selectfacesbyz()
          model=Sketchup.active_model
          ss=model.selection; face=ss[0]; ss.clear
          model.active_entities.each{|e|ss.add(e)if e.class==Sketchup;;Face and e.bounds.min.z==face.bounds.min.z}
        end#if
        
        

        [Untested !]
        Paste all of it into a selectfacesbyz.rb file, restart SUp and see what happens...
        Usage:
        Select a face... then in Ruby Console type/paste:

        selectfacesbyz

        it selects every face at same height.

        You can make the menu by copying similar code ?

        TIG

        1 條回覆 最後回覆 回覆 引用 0
        • EarthMoverE 離線
          EarthMover
          最後由 編輯

          Thanks TIG! It indeed works. I tried this for adding to the menu as an option, but it didn't work. What am I missing?

          def selectfacesbyz()
            model=Sketchup.active_model
            ss=model.selection; face=ss[0]; ss.clear
            model.active_entities.each{|e|ss.add(e)if e.class==Sketchup;;Face and e.bounds.min.z==face.bounds.min.z}
          ### Menu ###
              UI.menu("Plugins").add_item("Select Faces by Z"){selectfacesbyz}
          end#if
          

          3D Artist at Clearstory 3D Imaging
          Guide Tool at Winning With Sketchup
          Content Creator at Skapeup

          1 條回覆 最後回覆 回覆 引用 0
          • TIGT 離線
            TIG Moderator
            最後由 編輯

            Put the menu OUTSIDE of the def...end thus:

            
            def selectfacesbyz()
              model=Sketchup.active_model
              ss=model.selection; face=ss[0]; ss.clear
              model.active_entities.each{|e|ss.add(e)if e.class==Sketchup;;Face and e.bounds.min.z==face.bounds.min.z}
            end#def
            UI.menu("Plugins").add_item("Select Faces by Z"){selectfacesbyz} if not file_loaded?(File.basename(__FILE__))
            file_loaded(File.basename(__FILE__))
            

            The file_loded bit ensures it only loads into menu if you reload the Ruby manually later...

            You're now a scripter ! 😉

            Next: test if ss[0], test if ss[0] is a Face etc and if not UI.messagebox()... "Must Select a Face First.."

            TIG

            1 條回覆 最後回覆 回覆 引用 0
            • EarthMoverE 離線
              EarthMover
              最後由 編輯

              @tig said:

              Next: test if ss[0], test if ss[0] is a Face etc and if not UI.messagebox()... "Must Select a Face First.."

              Would this work?

              
              def selectfacesbyz
              	mo=Sketchup.active_model()
              	ss = mo.selection()
              
              	if ss.empty? 
              		UI.messagebox("Must Select a Face First")
              	else
              		mo.start_operation "selectfacesbyz"
              
              

              3D Artist at Clearstory 3D Imaging
              Guide Tool at Winning With Sketchup
              Content Creator at Skapeup

              1 條回覆 最後回覆 回覆 引用 0
              • TIGT 離線
                TIG Moderator
                最後由 編輯

                Yes, that's OK.
                But I'd just use this:

                
                ###...
                if ss.empty? or not ss[0].class==Sketchup;;Face
                  UI.messagebox("Must Select a Face First...")
                  return nil
                end
                ### then rest of code assuming it does get past this test...
                

                'return nil' simply stops the process...
                Note how I also added a test to see if the first thing in the selection is not a Face...
                You will winkle a script out of me bit by bit... 😉

                TIG

                1 條回覆 最後回覆 回覆 引用 0
                • EarthMoverE 離線
                  EarthMover
                  最後由 編輯

                  So kind my friend. Thanks for making me work for it! I'm looking through code to try and determine how to also have the selection apply to edges, but the variables for edges are greater. If I could figure out how to apply it to just work with edges that exist solely on an xy plane....

                  3D Artist at Clearstory 3D Imaging
                  Guide Tool at Winning With Sketchup
                  Content Creator at Skapeup

                  1 條回覆 最後回覆 回覆 引用 0
                  • TIGT 離線
                    TIG Moderator
                    最後由 編輯

                    edge.start.position.z==edge.end.position.z
                    

                    is 'flat'
                    you could also get the lower value with

                    edge.bounds.min.z
                    

                    ?

                    TIG

                    1 條回覆 最後回覆 回覆 引用 0
                    • EarthMoverE 離線
                      EarthMover
                      最後由 編輯

                      ss=model.selection; face=ss[0]; ss.clear

                      So I assume this lines tells sketchup if the selection is a face then process this line

                      model.active_entities.each{|e|ss.add(e)if e.class==Sketchup::Face and e.bounds.min.z==face.bounds.min.z}

                      And this says to add to the selection all other faces with the with z bounds.

                      To translate this to apply for edges, is it as simple as changing the name face to edges and defining it further with the xy constraint code you provided? I tried it a few different ways and I keep getting errors.

                      3D Artist at Clearstory 3D Imaging
                      Guide Tool at Winning With Sketchup
                      Content Creator at Skapeup

                      1 條回覆 最後回覆 回覆 引用 0
                      • TIGT 離線
                        TIG Moderator
                        最後由 編輯

                        Correct - test that the entities are Edges...

                        e.class==Sketchup;;Edge
                        

                        Then test to see if same height as edge=ss[0] ###you need to have got edge's min.z...
                        There are several ways of testing for entity types - the [probable] fastest is e.class==Sketchup::Edge but there are also
                        e.is_a?("Edge") e.kind_of?("Edge") e.typename=="Edge"
                        etc...
                        Now you can also try code to manipulate a selection so that say only edges or faces are left in it...
                        For example:

                        ss.each{|e|ss.remove(e) if not e.class==Sketchup;;Face}### leaves only faces
                        ### OR
                        ss.each{|e|ss.remove(e) if not e.class==Sketchup;;Edge}### leaves only edges
                        

                        TIG

                        1 條回覆 最後回覆 回覆 引用 0
                        • EarthMoverE 離線
                          EarthMover
                          最後由 編輯

                          def selectedgesbyz()
                            model=Sketchup.active_model
                            ss=model.selection; Edge=ss[0]; ss.clear
                            model.active_entities.each{|e|ss.add(e)if e.class==Sketchup;;Edge and e.bounds.min.z==edge.start.position.z==edge.end.position.z}
                          end#if
                          UI.menu("Plugins").add_item("Select Edges by Z"){selectedgesbyz} if not file_loaded?(File.basename(__FILE__))
                          file_loaded(File.basename(__FILE__))
                          

                          Got this so far. Something is wrong in the syntax. Can you show me the error to my ways. I have no idea how the language works, but it's been a good mental exercise and I'd love to learn more. Thanks for your help.

                          3D Artist at Clearstory 3D Imaging
                          Guide Tool at Winning With Sketchup
                          Content Creator at Skapeup

                          1 條回覆 最後回覆 回覆 引用 0
                          • B 離線
                            BTM
                            最後由 編輯

                            @earthmover said:

                            def selectedgesbyz()
                            >   model=Sketchup.active_model
                            >   ss=model.selection; Edge=ss[0]; ss.clear
                            >   model.active_entities.each{|e|ss.add(e)if e.class==Sketchup;;Edge and e.bounds.min.z==edge.start.position.z==edge.end.position.z}
                            > end#if
                            > UI.menu("Plugins").add_item("Select Edges by Z"){selectedgesbyz} if not file_loaded?(File.basename(__FILE__))
                            > file_loaded(File.basename(__FILE__))
                            

                            Got this so far. Something is wrong in the syntax. Can you show me the error to my ways. I have no idea how the language works, but it's been a good mental exercise and I'd love to learn more. Thanks for your help.

                            Well, first problem is that you capitalized edge in edge=ss[0]. Second, you can't have something like 'if a==b==c'. You have to seperate it into 'if a==b and a==c'. Here's a working example.

                            def selectedgesbyz()
                              model=Sketchup.active_model
                              ss=model.selection; edge=ss[0]; ss.clear
                              model.active_entities.each{|e|ss.add(e)if e.class==Sketchup;;Edge and (e.bounds.min.z)==(edge.start.position.z) and (e.bounds.min.z)==(edge.end.position.z)}
                            end#if
                            UI.menu("Plugins").add_item("Select Edges by Z"){selectedgesbyz} if not file_loaded?(File.basename(__FILE__))
                            file_loaded(File.basename(__FILE__))
                            
                            1 條回覆 最後回覆 回覆 引用 0
                            • TIGT 離線
                              TIG Moderator
                              最後由 編輯

                              Thanks - BTM ... all variables must start with a lower-case letter and test 'x==y and z==a' are both the correct way forward... We'' make a scripter out of EarthMover yet 😆

                              TIG

                              1 條回覆 最後回覆 回覆 引用 0
                              • EarthMoverE 離線
                                EarthMover
                                最後由 編輯

                                Thanks BTM - that makes sense and I follow the logic behind the code. Perhaps I will try and find time to learn the language. I am good at obsessing and not so good at multi-tasking, so it may have to wait till the snow is falling and my work slows down.

                                Regarding the script, it indeed is working. However, it is not properly defining the edges end bounds. The script is selecting any edge which has one of the their bounds (verticies) corresponding with the selection, so it is thus selecting also vertical lines and diagonal lines who's start bounds is on the Z in relevance to the selection. Any suggestions for further defining the end bounds so that the script will only select lines only completely on the same XY plane as the selection?

                                3D Artist at Clearstory 3D Imaging
                                Guide Tool at Winning With Sketchup
                                Content Creator at Skapeup

                                1 條回覆 最後回覆 回覆 引用 0
                                • B 離線
                                  BTM
                                  最後由 編輯

                                  @earthmover said:

                                  Thanks BTM - that makes sense and I follow the logic behind the code. Perhaps I will try and find time to learn the language. I am good at obsessing and not so good at multi-tasking, so it may have to wait till the snow is falling and my work slows down.

                                  Regarding the script, it indeed is working. However, it is not properly defining the edges end bounds. The script is selecting any edge which has one of the their bounds (verticies) corresponding with the selection, so it is thus selecting also vertical lines and diagonal lines who's start bounds is on the Z in relevance to the selection. Any suggestions for further defining the end bounds so that the script will only select lines only completely on the same XY plane as the selection?

                                  Ah, here:

                                  def selectedgesbyz()
                                    model=Sketchup.active_model
                                    ss=model.selection; edge=ss[0]; ss.clear
                                    model.active_entities.each{|e|ss.add(e)if e.class==Sketchup;;Edge and (edge.start.position.z)== (edge.end.position.z) and (e.bounds.min.z)==(edge.start.position.z) and (e.bounds.max.z)==(edge.start.position.z)}
                                  end#if
                                  UI.menu("Plugins").add_item("Select Edges by Z"){selectedgesbyz} if not file_loaded?(File.basename(__FILE__))
                                  file_loaded(File.basename(__FILE__))
                                  
                                  1 條回覆 最後回覆 回覆 引用 0
                                  • EarthMoverE 離線
                                    EarthMover
                                    最後由 編輯

                                    Thanks BTM! It's working great. I see defining the max bounds for the edges was the trick!

                                    3D Artist at Clearstory 3D Imaging
                                    Guide Tool at Winning With Sketchup
                                    Content Creator at Skapeup

                                    1 條回覆 最後回覆 回覆 引用 0
                                    • C 離線
                                      conconbrr
                                      最後由 編輯

                                      Hello,

                                      I was searching for long for such a plugin. So, first of all thanks for it, it's quite useful to select all the contour lines at one level (topography).

                                      I just wondered if it is possible to make a small improvement on the execution procedure.

                                      In addition of the current method (select one edge or face and then execute the plugin), could it be possible to execute the plugin first and then enter a Z value on the VCB (I don't know if the name is correct, the little box on the right bottom 😉) and finally validate with "enter"?

                                      In order to keep the current method, the general procedure could be:

                                      1. Execute the plugin
                                      2. Enter a value on the VCB OR select an edge or a face
                                      3. Push "enter"

                                      At each step some short information could be displayed on the status bar.

                                      I just discover ruby and its power and unfortunately I don't really have the time to learn it so that I can make this modification.

                                      Thank you

                                      1 條回覆 最後回覆 回覆 引用 0
                                      • R 離線
                                        ricomon35
                                        最後由 編輯

                                        Any chance to get a rbz version that can b installed in 2019 or higher?

                                        1 條回覆 最後回覆 回覆 引用 0
                                        • BoxB 離線
                                          Box
                                          最後由 編輯

                                          The version in the extension store by Tig works in newer versions.

                                          1 條回覆 最後回覆 回覆 引用 0
                                          • 1
                                          • 2
                                          • 1 / 2
                                          • 第一個貼文
                                            最後的貼文
                                          Buy SketchPlus
                                          Buy SUbD
                                          Buy WrapR
                                          Buy eBook
                                          Buy Modelur
                                          Buy Vertex Tools
                                          Buy SketchCuisine
                                          Buy FormFonts

                                          Advertisement