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

    [Plugin] Loose Geometry to Groups (Updated August 28, 2009)

    Scheduled Pinned Locked Moved Plugins
    36 Posts 10 Posters 37.2k Views 10 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.
    • Chris FullmerC Offline
      Chris Fullmer
      last edited by

      Oh, I think the first thing I want to change is to make the whole grouping thing a single undo. So I'll re-read my start_operation and commit_operation methods or whatever they are called. Then I'll repost the updated version later tonight 😄

      Chris

      All right, I got that included. It worked out as easy as I was hoping it would. Now just one undo will undo all groups that were created.

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

      1 Reply Last reply Reply Quote 0
      • thomthomT Offline
        thomthom
        last edited by

        I didn't have a time to look properly at it. But I got one suggestion; put your code into modules. That way you reduce the risk of problems with other rubys.

        And I'm not 100% sure here, but I think the require statement should be outside your method.

        
        #loose2groups.rb
        #Chris Fullmer
        #v1.0 Jan 28th, 2009
        #Please use and distribute, but do not sell this script.
        #Released to the Sketchucation.com website first. Go there
        #to find updates (if there are any).
        
        require 'sketchup.rb' # (!) note that this was moded
        
        module ChrisFullmerUniqueModuleName # (!) pick the name you find fit which is likely to be unique
        def make_groups
        
        model = Sketchup.active_model
        entities = model.active_entities
        entity = entities[0]
        entity_counter = 0
        
        while entity_counter < entities.length
          entity = entities[entity_counter]
          if entity.typename == ("Edge" or "Face")
        	ents = entity.all_connected
        	group = entities.add_group(ents)
        	entity_counter = 0
          else
        	entity_counter = entity_counter + 1
          end
        end
        end
        end # (!) End Module
        
        if( not file_loaded?("loose2groups.rb") )
          UI.menu("Plugins").add_item("Loose Geometry to groups") { make_groups }
        end
          file_loaded("loose2groups.rb")
        
        

        Here's a suggestion. I maked the changed by appending # (!) at the end of the lines.

        Thomas Thomassen — SketchUp Monkey & Coding addict
        List of my plugins and link to the CookieWare fund

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

          Great! Thanks thomthom. I've got the require sketchup line moved outside of the main method now.

          Now for modules. I don't entirely understand classes, modules, and mathods. I thought that since I had put everything into a method that it would be insulated from all other scripts. So I also need to wrap it in a module. I've re-read Rick's warning post and it says:

          @rickw said:

          1. Encapsulate methods in a Module or a Class - within a class, you don't have to worry about method naming conflicts, and within a module, you can be less careful about both class and method names.

          I'll try to read-up on modules and classes. Thanks for the advice. I'll make those important changes right now!

          Chris

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

          1 Reply Last reply Reply Quote 0
          • thomthomT Offline
            thomthom
            last edited by

            Classes are objects. Modules are like namespaces.

            While the stuff inside your method was insulated from everything else, your method wasn't. If another ruby had a method with the name of make_groups (not a very unlikely name) there'd be a conflict.

            Use Modules to group and isolate code. Use classes when you need new objects.

            Thomas Thomassen — SketchUp Monkey & Coding addict
            List of my plugins and link to the CookieWare fund

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

              ok, updated to be inside of its own module. I also updated the code in the first post so its current. Now if I wanted to access a method in this script from another script, what would be the syntax. Is it possible? Or would I have to have made it a class instead of a module?

              Chris

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

              1 Reply Last reply Reply Quote 0
              • thomthomT Offline
                thomthom
                last edited by

                
                module SomeModuleName
                def make_groups 
                    ...
                end
                
                def foo_bar
                    # lets call the other method
                    make_groups
                end
                end # module end
                
                SomeModuleName;;make_groups # prefix with SomeModuleName;; to access stuff inside
                
                

                For classes, methods needs to be prefixed with self. inside the class. http://sidtalk.wordpress.com/2008/10/06/what-exactly-is-ruby-self/

                Thomas Thomassen — SketchUp Monkey & Coding addict
                List of my plugins and link to the CookieWare fund

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

                  EDIT: I don't need to bump the thread, but I wanted to say that I fixed the problem I was having below. I had to make the module name start with an uppercase letter, and then define the method as "def Modulename.methodname" format. So its all better now. Thanks!

                  Bummer, I think the module bit didn't work. I am getting this error:

                  Error Loading File loose2groups.rb
                  C;/Program Files/Google/Google SketchUp 7/Plugins/loose2groups.rb;12; class/module name must be CONSTANT
                  

                  And here is the code to my plugin:

                  #loose2groups.rb
                  #Chris Fullmer
                  #v1.0 Jan 28th, 2009
                  #Please use and distribute, but do not sell this script.
                  #Released to the Sketchucation.com website first. Go there
                  #to find updates (if there are any).
                  #History v1.1 added a single Undo command for entire script.
                  #History v1.2 wrapped it all into a module
                  
                  require 'sketchup.rb'
                  
                  module clf_loose_groups
                  def make_groups
                  
                  model = Sketchup.active_model
                  entities = model.active_entities
                  entity = entities[0]
                  entity_counter = 0
                  model.start_operation "Make Groups"
                  
                  while entity_counter < entities.length
                    entity = entities[entity_counter]
                    if entity.typename == ("Edge" or "Face")
                      ents = entity.all_connected
                      group = entities.add_group(ents)
                      entity_counter = 0
                    else
                      entity_counter = entity_counter + 1
                    end
                  end
                  model.commit_operation
                  end
                  end 
                  if( not file_loaded?("loose2groups.rb") )
                    UI.menu("Plugins").add_item("Loose Geometry to groups") { make_groups }
                  end
                    file_loaded("loose2groups.rb")
                  

                  Thanks folks,

                  Chris

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

                  1 Reply Last reply Reply Quote 0
                  • R Offline
                    RickW
                    last edited by

                    Chris,
                    Congrats on your first script! Way to jump in and make things happen 😄
                    Regarding classes and understanding them a little bit more - they are like the framework for objects. They contain the rules for behavior and parameters. When you want one of those objects, you create an instance of it. That instance will behave like other instances that share similar parameters.

                    I created this (overly simple) example a long time (5 years) ago, on the old SketchUp forum. Perhaps it will help.

                    As for understanding modules, let's continue with the Ball class. I like playtime with my 15-month-old son. He has several toy balls that he plays with. With him in mind, I would write the Ball class as in my linked example.

                    On the other hand, my wife loves to dance. With her in mind, I would write a Ball class like this:

                    class Ball
                      def initialize
                        #code goes here
                      end
                    
                      def music=(style)
                        #code goes here
                      end
                    
                      def orchestra_size=(i)
                        #code goes here
                      end
                    
                      def refreshments=(good_eats)
                        #code goes here
                      end
                    
                    end # class Ball
                    
                    strictly_ballroom = Ball.new
                    strictly_ballroom.orchestra_size=50
                    strictly_ballroom.refreshments=["caviar","champagne","cheese","foie gras","hot wings"]
                    etc...
                    

                    The problem is that both classes have the same name, but different methods and uses. A toy ball isn't likely to need refreshments or an orchestra size, and a grand ball with dancing and an orchestra isn't likely to be inflated or inclined to bounce. Yet if both files were loaded, a bizarre merger would occur where one could see bouncing ballrooms and round rubber toys stuffed with hors d'oeuvres. That's where modules come into play.

                    module Toys
                      class Ball
                        ...etc
                      end
                    end
                    
                    module Parties
                      class Ball
                        ...etc
                      end
                    end
                    
                    bouncyball = Toys;;Ball.new
                    grandball = Parties;;Ball.new
                    

                    This significantly cuts down on the possibility of conflicting classes and methods, but even then, selecting a unique module name is important.

                    RickW
                    [www.smustard.com](http://www.smustard.com)

                    1 Reply Last reply Reply Quote 0
                    • J Offline
                      Jim
                      last edited by

                      Chris,

                      I just saw this - it doesn't do what you think it does.

                      if entity.typename == ("Edge" or "Face")
                      

                      What does the right-hand-side of the evaluate to?

                      You need to write it like this:

                      
                      if entity.typename == "Edge" or entity.typename == "Face"
                      

                      or perhaps even this:

                      
                      if( %w(Edge Face).include?(entity.typename))
                      
                      

                      Hi

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

                        Hmm, what does what I wrote do then? It seems to work. I was thinking that it would evaluate to a true or false depending if the typename was edge,face,component, or group (Edge or face = true, group or component = false). It seems to be working in the code, but I'm sure its just dumb luck and will probably fail in circumstances I have not tested. I'll re-write like your first example (because I don't follow what's happening in the 2nd example 😆 ). I need to look at what %w is. Thank you so much for taking the time to read through the script Jim,

                        Chris

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

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

                          ok, I think I'm getting the problem with what I wrote. I want an IF statement to essentially boil to down "if true"

                          but my code

                          if entity.typename == ("Edge" or "Face")
                          

                          is evaluating down (over the 3 steps I've written out)

                          "if entity.typename == (true)"
                          
                          if face == true
                          
                          if false
                          

                          So I should be getting a false no matter what the 2nd half of the evaluate is, since neither true nor false == face. Am I understanding the logic flow there correctly?

                          Chris

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

                          1 Reply Last reply Reply Quote 0
                          • J Offline
                            Jim
                            last edited by

                            Sorry, I tried to be too clever in my last example...

                            this:

                            
                            ("Edge" or "Face")
                            
                            

                            always returns "Edge" so your comparison always boils down to

                            
                            if entity.typename == "Edge"
                            
                            

                            which works just fine since all_connected will pick up any connected faces.

                            Hi

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

                              Ohh! That makes so much sense now. I was wondering why it was working, but that explains it. But yes,it was not doing what I thought it was doing. Thanks for clearing that up Jim.

                              Chris

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

                              1 Reply Last reply Reply Quote 0
                              • M Offline
                                mimnbazhq
                                last edited by

                                😄

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

                                  This script had a bug that I updated. I also added a counter to the status bar so that you can see the script in action. It counts the entities as it processes them so you know where it is in the process (though it is possible that the Sketchup user interface might freeze and quite showing the counter while processing large selections).

                                  version 1.2 2009-08-28

                                  • Fixed a major bug where the script was not working with selections.
                                  • Fixed some internal coding that might make it slightly faster.
                                  • Added an entity counter to the Status Bar so you can see the script working.
                                  • Changed the Undo title from "Make groups" to "Loose to Groups" (this is the title that you see in the Edit > Undo command).

                                  This is script is located on smustard.com at:

                                  favicon

                                  (www.smustard.com)

                                  Chris

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

                                  1 Reply Last reply Reply Quote 0
                                  • bagateloB Offline
                                    bagatelo
                                    last edited by

                                    Hi Chris Fullmer

                                    Great plugin, it is very usefull.

                                    Would the plugin be possible to make components instead of groups??

                                    While the cat's away, the mice will play

                                    1 Reply Last reply Reply Quote 0
                                    • TIGT Offline
                                      TIG Moderator
                                      last edited by

                                      Just edit it when the group is made and group.to_component ?

                                      TIG

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

                                        Yup, add that line:

                                        group.to_component

                                        in between lines 82 and 83 - so right after this line:

                                        group = @entities.add_group(to_group)

                                        Its near the bottom of the scipt. about 25 lines up from the bottom.

                                        Chris

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

                                        1 Reply Last reply Reply Quote 0
                                        • bagateloB Offline
                                          bagatelo
                                          last edited by

                                          works very whell, thanks

                                          Add in menu plugin this option


                                          Add in menu plugin this option

                                          While the cat's away, the mice will play

                                          1 Reply Last reply Reply Quote 0
                                          • thomthomT Offline
                                            thomthom
                                            last edited by

                                            Chris, why are you splitting the geometry processing into chunks of 1000? Is it to speed up creation?
                                            do you not risk splitting groups of loose geometry?

                                            Thomas Thomassen — SketchUp Monkey & Coding addict
                                            List of my plugins and link to the CookieWare fund

                                            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