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

    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