sketchucation logo sketchucation
    • Login
    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!
    🫛 Lightbeans Update | Metallic and Roughness auto-applied in SketchUp 2025+ Download

    Edit group by ruby-code instead of a right mouse click

    Scheduled Pinned Locked Moved Developers' Forum
    16 Posts 6 Posters 3.1k Views 6 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.
    • M Offline
      MartinRinehart
      last edited by

      @andreas said:

      I would like to make a cutout in a wall (group) to insert a door or window.

      Andreas

      That is definitely possible. The group has an Entities collection.

      Add a Rectangle to the groups Entities. Pushpull its face to the opposite side of the wall. Delete the face.

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

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

        You work directly with the Group's entities, just like you would the model's entities. Having an editing context is a useful concept for people when modeling, but is not necessary when editing geometry using the Ruby API.

        This sample shows how you might get to a Group's entities.

        
        all_groups = Sketchup.active_model.entities.find_all{|e| e.class == Sketchup;;Group}
        my_group = all_groups.select{|g| g.name == "My Group"}
        my_entities = group.entities
        my_entities.add_face(...)
        
        

        Hi

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

          When you add geometry it goes into an entities collection.
          You have:-
          model.entities = everything that's placed in the model
          group.entities = everything that's placed in the group
          definition.entities = everything that's placed in the component's definition
          there is also
          model.active_entities = everything that is placed in the current context - so this could be equal to the model.entities, OR if the user starts your tool whilst he is editing a group it would become the group.entities automatically.
          Example - this code snippet adds a new [empty] group into the model, then it adds a line 1" tall into that group, it then adds a second [empty] group inside the first group and adds a line 10" long at the first line's end but in that new group.

          model=Sketchup.active_model
          group1=model.entities.add_group()
          group1.entities.add_line([0,0,0],[0,0,1])
          group2=group1.entities.add_group()
          group2.entities.add_line([0,0,1],[10,0,1])
          
          

          Run it [copy/paste the into a file in Plugins and use load"file.txt" in the Ruby Console] and see the results...
          Hopefully this is helpful... 🤓

          TIG

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

            @jim said:

            You work directly with the Group's entities, just like you would the model's entities. Having an editing context is a useful concept for people when modeling, but is not necessary when editing geometry using the Ruby API.

            This sample shows how you might get to a Group's entities.

            
            > all_groups = Sketchup.active_model.entities.find_all{|e| e.class == Sketchup;;Group}
            > my_group = all_groups.select{|g| g.name == "My Group"}
            > my_entities = group.entities
            > my_entities.add_face(...)
            > 
            

            my_entities = group.entities don´t works.
            I think it must be:
            my_entities = my_group.entities
            but that don´t works too.

            Can someone help me?

            Thanks
            Andreas

            With best regards from Germany

            Andreas

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

              You first get a reference to the required group, then one to its entities, and then do stuff in that entities collection...
              To see if each step is working add puts my_group etc after it's defined it should then print up the group-id in the ruby console or 'nil'!
              It should be my_group in your code if you want to work inside that group.
              Do you have a group with that specific name ?
              Obviously the .add_face(...) needs expanding so the ... is a list of at least three coplanar points!!
              It WILL work...
              Why not test it using my method that adds a new group to model.active_entities with
              my_group=model.active_entities.add_group()
              NOW you are sure to have my_group... now add the face to my_group.entities

              TIG

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

                @tig said:

                You first get a reference to the required group, then one to its entities, and then do stuff in that entities collection...
                To see if each step is working add puts my_group etc after it's defined it should then print up the group-id in the ruby console or 'nil'!
                It should be my_group in your code if you want to work inside that group.
                Do you have a group with that specific name ?
                Obviously the .add_face(...) needs expanding so the ... is a list of at least three coplanar points!!
                It WILL work...
                Why not test it using my method that adds a new group to model.active_entities with
                my_group=model.active_entities.add_group()
                NOW you are sure to have my_group... now add the face to my_group.entities

                Hello TIG,

                I need access to an existing group to add a face. I would like to make a cutout in a wall (existing group) to insert a door or window.

                Andreas

                With best regards from Germany

                Andreas

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

                  I only suggested the making a new group method so that you might understand how it works in a test... 😒
                  Did you try my 'puts' methods to report if you are actually getting the 'group' etc using your methods ?
                  Assuming you corrected the group >> my_group it should work IF the names match... 😕

                  TIG

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

                    @tig said:

                    ...Assuming you corrected the group >> my_group it should work IF the names match... 😕

                    It does not work.

                    all_groups = Sketchup.active_model.entities.find_all{|e| e.class == Sketchup;;Group}
                    my_group = all_groups.select{|g| g.name == "G1"}
                    my_entities = my_group.entities
                    
                    

                    The result is:

                    all_groups = Sketchup.active_model.entities.find_all{|e| e.class == Sketchup::Group}
                    finds several groups
                    => [#Sketchup::Group:0x80db350, #Sketchup::Group:0x80db320, #Sketchup::Group:0x80db2f0, #Sketchup::Group:0x80e6768]

                    my_group = all_groups.select{|g| g.name == "G1"}
                    picks one of the groups
                    => [#Sketchup::Group:0x80e6768]

                    my_entities = my_group.entities
                    gives the following error
                    NoMethodError: (eval):1:in get_binding': undefined method entities' for [#Sketchup::Group:0x80e6768:Array]

                    I don`t understand that!!!

                    Is there anybody who can explain it to me?

                    With best regards from Germany

                    Andreas

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

                      all_groups.select{|g| g.name == "G1"} returns an array with a group - not just the group itself.

                      Since this line is suppose to filter out a single group we assume there will be only one item in the array and therefore extract the first item in the array.

                      my_group = all_groups.select{|g| g.name == "G1"}.first

                      So the whole lot would be:

                      
                      all_groups = Sketchup.active_model.entities.find_all{|e| e.class == Sketchup;;Group}
                      my_group = all_groups.select{|g| g.name == "G1"}.first
                      my_entities = my_group.entities
                      
                      

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

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

                        @thomthom said:

                        my_group = all_groups.select{|g| g.name == "G1"}.first

                        Thanks - that´s exactly what I need!!! 😄

                        With best regards from Germany

                        Andreas

                        1 Reply Last reply Reply Quote 0
                        • K Offline
                          kaas
                          last edited by

                          @tig said:

                          You could simulate the 'edit group' command - set a shortcut e.g. ' Shift+Ctrl+Alt+G' to the 'edit group' menu item and then use ' win32ole.so' to run the key-stroke(s) to make that group active..

                          I'd like to dig up this old thread because I'm looking for a way (a tool started by a keypress) to drill down many nested groups up to the group with the face I picked, and have that group opened to start pushpulling / modifying etc.

                          Normally I use the outliner to get to the right group but sometimes it's not clear and I have to double click a few times on the target face to drill down the hierarchy. I'd like to skip that double clicking by firing a tool and just pick the face.

                          I tried making this into a small tool. With the pickhelper I can select the picked face but the group itself isn't opened.

                          I also tried TIG's suggestion above in a tool but I can't find the 'edit group' command in the shortcuts so can't bind it to a keypress.

                          Any suggestions??

                          edit: turns out the shortcut list is generated dynamically. If I select a group and then open the shortcut preferences, I do get the option to assign a key.

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

                            To set up a shortcut that is context-sensitive you must be in that selection-context.
                            So to shortcut 'Edit Group' you first need to select a group to get that possibility in the context-menu and you must then open SketchUp's Preferences > Shortcuts and filter for 'Group'... - then set up the shortcut on that tool's command... then of course you'll need to mimic some key-presses etc in some third party code executed by Ruby - all as outlined earlier [PC only]...

                            PS: This 'context' issue when making shortcuts applies to many selection-sensitive commands - like Reverse and Orient, which both need a face to be selected before they appear in the context-menu list...

                            TIG

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

                            Advertisement