@TIG I think I found it. Gemini gave me this solution and it works logically. The components will become unique, but it does exactly what I wanted. Since you're the expert, could you check if it works well?
require 'sketchup.rb'
module Visual_Scale_Applier
def self.apply_scale_to_selection
model = Sketchup.active_model
selection = model.selection
if selection.empty?
UI.messagebox("Seleziona gli oggetti a cui vuoi 'fissare' la scala.")
return
end
model.start_operation('Fissa Scala Corrente', true)
selection.each do |entity|
self.process_entity(entity)
end
model.commit_operation
puts "Scala 'fissata' a 1.0 per la selezione e tutti i contenuti nidificati."
end
def self.process_entity(entity)
return unless entity.is_a?(Sketchup::ComponentInstance) || entity.is_a?(Sketchup::Group)
# 1. Se è un componente con più copie, lo rendiamo unico per non rovinare il resto del modello
entity.make_unique if entity.is_a?(Sketchup::ComponentInstance)
t = entity.transformation
# Estrarre i fattori di scala correnti
scale_x = Math.sqrt(t.to_a[0]**2 + t.to_a[1]**2 + t.to_a[2]**2)
scale_y = Math.sqrt(t.to_a[4]**2 + t.to_a[5]**2 + t.to_a[6]**2)
scale_z = Math.sqrt(t.to_a[8]**2 + t.to_a[9]**2 + t.to_a[10]**2)
# Se la scala è già 1.0, non facciamo nulla su questo livello
unless (scale_x - 1.0).abs < 0.001 && (scale_y - 1.0).abs < 0.001 && (scale_z - 1.0).abs < 0.001
# 2. Creiamo una trasformazione di scala per la geometria interna
internal_scaling = Geom::Transformation.scaling(scale_x, scale_y, scale_z)
# 3. Trasformiamo la geometria interna (bordi, facce, etc.)
entity.definition.entities.transform_entities(internal_scaling, entity.definition.entities.to_a)
# 4. Resettiamo la scala del contenitore esterno a 1.0 mantenendo posizione e rotazione
new_transformation = Geom::Transformation.axes(
t.origin,
t.xaxis.normalize,
t.yaxis.normalize,
t.zaxis.normalize
)
entity.transformation = new_transformation
end
# 5. Entra ricorsivamente nei gruppi/componenti nidificati
entity.definition.entities.each do |child|
self.process_entity(child)
end
end
end
Esegui
Visual_Scale_Applier.apply_scale_to_selection



