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

    Adding group to existing entities

    Scheduled Pinned Locked Moved Dynamic Components
    sketchup
    7 Posts 3 Posters 1.6k Views 3 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.
    • V Offline
      vimleshpatel
      last edited by

      I tried to create a box and add it to the cabinet like:

      
      entities = []
      entities<< create_left_panel
      entities<< create_right_panel
      entities<< create_front_panel
      entities<< create_back_panel
      entities<< create_bottom_panel
      
      group = Sketchup.active_model.entities.add_group(entities) # here entities is array of entity(back, front side etc)
      box = group.to_component
      
      comp = cabinet.definition.entities.add_instance box.definition, transform
      #cabinet is an ComponentInstance object.
      box.erase! #If I'm not deleting this entity then 3 copies will be there.
      
      

      But here I'm getting two copies for every entity in the group.
      1. as a group of component inside a instance i.e box as ComponentInstance.[/list]
      2. as all separate ComponentInstance object for every entity in group.[/list]

      @unknownuser said:

      So, while moving any of the ungrouped entities the entity inside the box object is also moving. and if I tried to delete the ungrouped entity then Sketchup itself crashed.

      @unknownuser said:

      I need some short of code that can add a group of entities into another entities [ComponentInstance.definition] group, without making another copy of it or the other copy should be deleted without crashing the Sketchup.

      1 Reply Last reply Reply Quote 0
      • sdmitchS Offline
        sdmitch
        last edited by

        I think the problem is that you create the various panels in a method, probably as a group then you copy them into another group thus duplicating them.

        Nothing is worthless, it can always be used as a bad example.

        http://sdmitch.blogspot.com/

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

          You only give us half of the story ! πŸ˜’
          Presumably each of your methods ' create...' returns a valid ' entity'.
          These must be in the model.active_entities context for the add_group(...) to work...
          You somehow magic a ' transform' - in the add_instance(...) what is that ?

          In principle the limited code you show us ought to work...
          But of course you can easy screw it up in the parts you haven't shewn...
          😲

          TIG

          1 Reply Last reply Reply Quote 0
          • V Offline
            vimleshpatel
            last edited by

            Here I'm copying the related method I used to create panel's

            
            #This method will return a panel as ComponentInstance
            #RectangleBox is another class which will create a panel using 2 diagonal points, thickness
            def create_box
               entities = []
               entities<< create_left_panel
               entities<< create_right_panel
               entities<< create_front_panel
               entities<< create_back_panel
               entities<< create_bottom_panel
               group = Sketchup.active_model.entities.add_group(entities)
               box = group.to_component
               rotate_panel box, [0,0,0], X_AXIS, 270
               add_box_in_cabinet(box)
            end
            
            def add_box_in_cabinet box
               selection = Sketchup.active_model.selection
               if selection.count!=3
                 UI.messagebox("Please select 3 panels and try again!")
                 return
               end
               h_panel=nil
               v_panels=[]
               selection.each{|panel|
                 if panel.name == "HShelf"
                   h_panel = panel
                 else
                   v_panels << panel
                 end
               }
               definition = h_panel.parent
               parent_component = definition.instances[0]
               points = get_box_position_in_cabinet box
               if !points
                 puts "Points are not valid"
                 return
               end
               trans_move = Geom;;Transformation.translation points
               component = parent_component.definition.entities.add_instance box.definition, trans_move
               box.erase!
            end
            
            def get_box_position_in_cabinet h_panel, v_panels
               points = []
               dict1 = nil
               if v_panels.length == 2
                 vdict1 = SketchupInfo.rootDictionary v_panels[0]
                 vdict2 = SketchupInfo.rootDictionary v_panels[1]
                 x1 = vdict1['x'].to_l.inch
                 x2 = vdict2['x'].to_l.inch
                 panel1= nil
                 if x1 > x2
                   points.push((x2+18).mm)
                 else
                   points.push((x1+18).mm)
                 end
               end
               dict = SketchupInfo.rootDictionary h_panel
               points.push(dict['y'].to_l.inch)
               points.push(dict['z'].to_l.inch)
               if !points
                 return false
               end
               points
            end
            
            def create_panel pts, thickness
                ply_type ="PLY"
                info = Hash.new
                info[DESCRIPTION] = BACK
                b = RectangleBox.new(pts[0], pts[1], thickness)
                component = b.draw
            end
            
            def rotate_panel component, points, axis, angle
                trans_rotate = Geom;;Transformation.rotation points, axis, angle.degrees
                component.transform! trans_rotate
            end
            
            def translate_panel component, points
                trans_move = Geom;;Transformation.translation points
                component.transform! trans_move
            end
            
            def create_left_panel
               panel = create_panel @left, @thickness
               rotate_panel panel, [0,0,0], Y_AXIS, 90
               points =[...] #Position for panel to fit
               translate_panel panel, points
               panel
            end
            def create_right_panel
               panel = create_panel @right, @thickness
               rotate_panel panel, [0,0,0], Y_AXIS, 270
               points =[...] #Position for panel to fit
               translate_panel panel, points
               panel
            end
            def create_front_panel
               panel = create_panel @front, @thickness
               rotate_panel panel, [0,0,0], Y_AXIS, 180
               points =[...] #Position for panel to fit
               translate_panel panel, points
               panel
            end
            def create_back_panel
               panel = create_panel @back, @thickness
               points =[...] #Position for panel to fit
               translate_panel panel, points
               panel
            end
            def create_bottom_panel
               panel = create_panel @bottom, @thickness
               rotate_panel panel, [0,0,0], Y_AXIS, 90
               points =[...] #Position for panel to fit
               translate_panel panel, points
               panel
            end
            
            
            

            @unknownuser said:

            Other than these methods I'm setting some value in the dictionary like x,y,z, lenx, leny etc.

            One more thing that I observed is: If I'm not creating box in cabinet, then only one copy is created. but If I'm selecting panels in the cabinet and tried to create box then it will create 2 copies of of box.

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

              Is you code inside a module ??

              def create_panel pts, thickness
                  ply_type ="PLY"
                  info = Hash.new
                  info[DESCRIPTION] = BACK
                  b = RectangleBox.new(pts[0], pts[1], thickness)
                  component = b.draw
              end
              

              Leaves unanswered questions...
              Where do the Constants DESCRIPTION and BACK come from ?
              what is 'b' that RectangleBox makes ?
              Is it a 'box' in geometry ?
              What is the '.draw' method for it ?
              This method returns a 'component' ??
              I'm sure your code could be less convoluted and thereby more easily understood...
              😒

              TIG

              1 Reply Last reply Reply Quote 0
              • V Offline
                vimleshpatel
                last edited by

                All those method are defined inside class like:

                class DBox
                   DESCRIPTION = 'Description'
                   BACK = "Back" # It means nothing yet.
                   def get_all_points
                     @left = [[0, 0, 0], [500.mm, 150.mm, 0]]
                     @right = [[0, 0, 0], [500.mm, 150.mm, 0]]
                     @front = [[0, 0, 0], [200.mm, 150.mm, 0]]
                     @back = [[0, 0, 0], [200.mm, 150.mm, 0]]
                     @bottom = [[0, 0, 0], [480.mm, 180.mm, 0]]
                     @thickness = 18
                   end
                   def create_box
                     entities = []
                     entities<< create_left_panel
                     entities<< create_right_panel
                     entities<< create_front_panel
                     entities<< create_back_panel
                     entities<< create_bottom_panel
                     group = Sketchup.active_model.entities.add_group(entities)
                     box = group.to_component
                     rotate_panel box, [0,0,0], X_AXIS, 270
                     add_box_in_cabinet(box)
                  end
                
                  def add_box_in_cabinet box
                     selection = Sketchup.active_model.selection
                     if selection.count!=3
                       UI.messagebox("Please select 3 panels and try again!")
                       return
                     end
                     h_panel=nil
                     v_panels=[]
                     selection.each{|panel|
                       if panel.name == "HShelf"
                         h_panel = panel
                       else
                         v_panels << panel
                       end
                     }
                     definition = h_panel.parent
                     parent_component = definition.instances[0]
                     points = get_box_position_in_cabinet box
                     if !points
                       puts "Points are not valid"
                       return
                     end
                     trans_move = Geom;;Transformation.translation points
                     component = parent_component.definition.entities.add_instance box.definition, trans_move
                     box.erase!
                  end
                
                  def get_box_position_in_cabinet h_panel, v_panels
                     points = []
                     dict1 = nil
                     if v_panels.length == 2
                       vdict1 = SketchupInfo.rootDictionary v_panels[0]
                       vdict2 = SketchupInfo.rootDictionary v_panels[1]
                       x1 = vdict1['x'].to_l.inch
                       x2 = vdict2['x'].to_l.inch
                       panel1= nil
                       if x1 > x2
                         points.push((x2+18).mm)
                       else
                         points.push((x1+18).mm)
                       end
                     end
                     dict = SketchupInfo.rootDictionary h_panel
                     points.push(dict['y'].to_l.inch)
                     points.push(dict['z'].to_l.inch)
                     if !points
                       return false
                     end
                     points
                  end
                
                  def create_panel pts, thickness
                     ply_type ="PLY"
                     info = Hash.new
                     info[DESCRIPTION] = BACK
                     b = RectangleBox.new(pts[0], pts[1], thickness)
                     component = b.draw
                  end
                
                  def rotate_panel component, points, axis, angle
                     trans_rotate = Geom;;Transformation.rotation points, axis, angle.degrees
                     component.transform! trans_rotate
                  end
                
                  def translate_panel component, points
                     trans_move = Geom;;Transformation.translation points
                     component.transform! trans_move
                  end
                
                  def create_left_panel
                     panel = create_panel @left, @thickness
                     rotate_panel panel, [0,0,0], Y_AXIS, 90
                     points =[0,0,0] #Position for panel to fit
                     translate_panel panel, points
                     panel
                  end
                  def create_right_panel
                     panel = create_panel @right, @thickness
                     rotate_panel panel, [0,0,0], Y_AXIS, 270
                     points =[200.mm,0,0] #Position for panel to fit
                     translate_panel panel, points
                     panel
                  end
                  def create_front_panel
                     panel = create_panel @front, @thickness
                     rotate_panel panel, [0,0,0], Y_AXIS, 180
                     points =[18.mm,0,0] #Position for panel to fit
                     translate_panel panel, points
                     panel
                  end
                  def create_back_panel
                     panel = create_panel @back, @thickness
                     points =[18.mm,0,482.mm] #Position for panel to fit
                     translate_panel panel, points
                     panel
                  end
                  def create_bottom_panel
                     panel = create_panel @bottom, @thickness
                     rotate_panel panel, [0,0,0], Y_AXIS, 90
                     points =[10.mm, 140.mm, 490.mm] #Position for panel to fit
                     translate_panel panel, points
                     panel
                  end
                end
                
                class RectangleBox
                  DESCRIPTION = 'Description'
                  attr_reader ;near, ;far, ;thickness
                  
                  def initialize( near, far, thickness, ply_type, info = {})
                    @near = near; @far = far
                    @thickness= thickness
                    @ply_type = ply_type
                    @description = info[DESCRIPTION]
                  end
                  def draw(*args)
                    model=Sketchup.active_model()
                    if args.length == 0
                      ents = model.entities()
                      group = ents.add_group()
                    else
                      group = args[0]
                    end 
                    corners = get_corners()
                    face = group.entities().add_face(corners[0], corners[1], corners[2], corners[3])
                    face.pushpull(@thickness.mm)
                    panel= group.to_component
                    panel.definition.name = "#{@ply_type}"
                    panel.name = @description
                    return panel
                  end
                  def get_corners()
                    ret = []
                    ret[0] = @near
                    ret[2] = @far
                    ret[1] = [ @near[r], @far[g], @far[b] ]
                    ret[3] = [ @far[r], @near[g], @near[b] ]
                    return ret
                  end
                end
                
                class SketchupInfo
                   def self.getDictionary(entity, dictionary)
                      dicts = entity.attribute_dictionaries
                      if !dicts.nil?
                         dicts[dictionary]
                      end
                   end
                   def self.rootDictionary(entity)
                     SketchupInfo.getDictionary(entity,'dynamic_attributes')
                   end
                end
                
                

                I called create_box method form menu by creating object for DBox

                box = DBox.new
                box.create_box
                

                I removed some of the method which are not used till now.
                If I'm creating box independently (not inside Cabinet) then it creates only one box as ComponentInstance, but when I tried to create it withing Cabinet then one extra box is creating which is not even a group(all panels are individual) & if I'm moving one of the panel the the panel inside grouped box is also moving. or if I tried to delete any panel then Sketchup got crashed.

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

                  The class is somewhat like a module in this context...
                  But still best to include the whole lot inside your own module...

                  Can I suggest you revisit your various entities definitions.
                  Sometimes you use model.active_entities, another model.entities, they might not always be the same thing...
                  Also if you make your group and immediately add thing to group.entities it might be easier...

                  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