Как скопировать лица и сохранить трансформацию в Sketchup Ruby
Я новичок в Sketchup Ruby, и я поражен, это не так просто, но здесь идет...
Я хотел бы скопировать все группы, соответствующие определенному имени слоя, в новую временную группу. Я в основном отказался от попыток скопировать всю группу, потому что это кажется чреватым опасностями и ошибками, если не сделать это каким-то суперанальным сохраняющим способом, который учитывает контекст, немедленное взрывание объектов и т. Д...
Итак, я прибег к попыткам перебрать все соответствующие группы объектов и вместо этого скопировать лица, что кажется гораздо более простым. Моя цель не в том, чтобы стать мастером Ruby, а в том, чтобы просто выполнить этот скрипт.
Я был в состоянии копировать лица, НО лица теряют свою трансформацию при копировании и просто оказываются в случайном размере в начале координат, а не там, где они были в модели.
Вот код:
SKETCHUP_CONSOLE.clear
mod = Sketchup.active_model # Open model
ent = mod.entities # All entities in model
temp_wall_primitives = ent.add_group #create a new empty temporary group
mod.definitions.each{|d|
next if d.image? || d.group? || d.name!="WALL"
d.entities.each{ |wall_primative_group|
if wall_primative_group.layer.name == "WALL_PRIMITIVES"
wall_primative_group.entities.each{ |wall_primative_group_entity|
if wall_primative_group_entity.is_a? Sketchup::Face
new_face = temp_wall_primitives.entities.add_face(wall_primative_group_entity.vertices)
end
}
end
}
}
Я считаю, что мне нужно как-то получить преобразование каждого лица и применить его к новым лицам по мере их создания?
1 ответ
Вместо того, чтобы пытаться скопировать сущности из экземпляра в другой, поместите новый экземпляр;
# Lets say we have a group.
source_group = model.entities.grep(Sketchup::Group)
# We can "copy" this to another group by fetching it'd definition and adding a new one:
new_group = model.entities.add_group
new_group.entities.add_instance(source_group.definition, source_group.transformation)
В вашем текущем решении, где вы воссоздаете каждое лицо, причина потери преобразования заключается в том, что позиции вершин относительно их родителя. Вы передаете вершины, которые копируете напрямую: temp_wall_primitives.entities.add_face(wall_primative_group_entity.vertices)
Но вам нужно применить преобразование для экземпляра, к которому они относятся.
Кроме того, ваше текущее решение, похоже, не учитывает вложенные экземпляры. И что лица могут иметь отверстия в них - в этом случае face.vertices
не будет формировать правильный цикл. Вручную воссоздание лица быстро становится сложным. Если вам нужно все содержимое экземпляра группы или компонента, просто сделайте копию самого экземпляра. Вы можете взорвать новый экземпляр, если хотите.
Но я бы спросил, почему у вас временная группа? (Часто это оказывается необязательным. Было бы полезно, если бы вы объяснили задачу более высокого уровня, которую вы пытаетесь выполнить здесь.)