Move sub-groups to the root

Hi. I’m trying to “move” a sub group to the root using this code but the “new group” moves in x,y,z…I need to keep the same position.

Could some one help me?
Thanks

(note: if I activate “manually” the sub-group" the routine works… :frowning:

def select_and_move_group_to_root_and_rename
  model = Sketchup.active_model
  entities = model.entities
  selection = model.selection

  # Metodo per cercare ricorsivamente il sottogruppo "VANI_PROVV"
  def find_and_select_vani_provv_subgroup(entity, selection)
    if entity.is_a?(Sketchup::Group) && entity.name == "VANI_PROVV"
      selection.add(entity)
      return true
    elsif entity.is_a?(Sketchup::Group) || entity.is_a?(Sketchup::ComponentInstance)
      entity.entities.each do |inner_entity|
        if find_and_select_vani_provv_subgroup(inner_entity, selection)
          return true
        end
      end
    end
    false
  end

  # Avvia la ricerca a partire dalle entità di livello più alto del modello
  model.entities.each do |entity|
    break if find_and_select_vani_provv_subgroup(entity, selection)
  end

  if selection.empty?
    UI.messagebox("Sottogruppo 'VANI_PROVV' non trovato.")
    return
  end

  # Metodo per spostare il gruppo selezionato alla radice e rinominarlo
  def move_group_to_root_and_rename(selected_group, entities)
    model = Sketchup.active_model
    # Inizia una nuova operazione che può essere annullata
    model.start_operation('Sposta e Rinomina Gruppo', true)
    
    # Ottieni la definizione e la trasformazione del gruppo selezionato
    def_selected = selected_group.definition
    trans_selected = selected_group.transformation
    
    # Aggiungi un'istanza di questa definizione alle entità di root del modello
    new_group = entities.add_instance(def_selected, trans_selected)
    
    # Rinomina il nuovo gruppo
    new_group.name = "VANI_PROVV"
    
    # Elimina il gruppo originale
    selected_group.erase!
    
    # Concludi l'operazione
    model.commit_operation
  end

  # Assicurati che sia selezionato esattamente un gruppo
  if selection.length != 1 || !selection[0].is_a?(Sketchup::Group)
    UI.messagebox("Seleziona esattamente un gruppo.")
    return
  end

  selected_group = selection.first
  move_group_to_root_and_rename(selected_group, entities)
end

select_and_move_group_to_root_and_rename

Your post is hard to read. Please use triple back ticks. See this post:

[How to] Post correctly formatted and colorized code on the forum? - Developers - SketchUp Community

1 Like

When in edit mode, the API methods change to work in world coordinates.

So, you will need to keep track of the cumulative transformation as you dig down to find your group instance.

Tried to change the code but still not working

def move_group_to_root_and_rename
  model = Sketchup.active_model
  entities = model.entities
  selection = model.selection
  vani_provv_group = nil
  vani_provv_transformation = nil

  # Metodo per cercare ricorsivamente il sottogruppo "VANI_PROVV"
  def find_vani_provv_group(entities)
    entities.each do |entity|
      if entity.is_a?(Sketchup::Group) && entity.name == "VANI_PROVV"
        return entity
      elsif entity.is_a?(Sketchup::Group) || entity.is_a?(Sketchup::ComponentInstance)
        result = find_vani_provv_group(entity.entities)
        return result if result
      end
    end
    nil
  end

  # Trova il gruppo "VANI_PROVV"
  vani_provv_group = find_vani_provv_group(model.entities)

  if vani_provv_group.nil?
    UI.messagebox("Il gruppo 'VANI_PROVV' non è stato trovato.")
    return
  end

  # Salva la trasformazione originale del gruppo "VANI_PROVV"
  vani_provv_transformation = vani_provv_group.transformation

  # Inizia una nuova operazione che può essere annullata
  model.start_operation('Sposta e Rinomina Gruppo', true)

  # Aggiungi un'istanza di questa definizione al livello radice del modello con la trasformazione originale
  new_group_instance = entities.add_instance(vani_provv_group.definition, vani_provv_transformation)

  # Rinomina il nuovo gruppo (se necessario, puoi cambiare il nome qui)
  new_group_instance.name = "VANI_PROVV_MOVED"

  # Elimina il gruppo "VANI_PROVV" originale
  vani_provv_group.erase!

  # Concludi l'operazione
  model.commit_operation
end

move_group_to_root_and_rename

PIANO TERRA.skp (908.8 KB)

You need to build an InstancePath array as you dig down in the find_vani_provv_group() method.

Once you find the group, you use the InstancePath#transformation method to get it’s world transformation.

I had the same questions. Check out this thread.

1 Like

Super! Works!
Thank you!

1 Like