ℹ️ Licensed Extensions | FredoBatch, ElevationProfile, FredoSketch, LayOps, MatSim and Pic2Shape will require license from Sept 1st More Info
[Plugin] ReGlue
-
@TIG Many thanks!
-
def self.glue_components_to_faces model = Sketchup.active_model selection = model.selection return UI.messagebox("Error: No selection!") if selection.empty? faces = selection.grep(Sketchup::Face) components = selection.grep(Sketchup::ComponentInstance) return UI.messagebox("Error: Select faces and components!") if faces.empty? || components.empty? model.start_operation("Glue Components to Faces", true) begin components.each do |component| closest_face = find_closest_aligned_face(component, faces) component.glued_to = closest_face if closest_face end ensure model.commit_operation end end def self.find_closest_aligned_face(component, faces) component_normal = component.transformation.zaxis closest_face = faces.min_by { |face| face.normal.angle_between(component_normal) } closest_face end
-
@designerbursa what do you mean?
-
@rv1974 I developed the code for pasting on all selected surfaces at once, it would be useful for everyone if it is updated in this way.
-
@designerbursa
I might be missing something but currently I can do it without any plugin -
@rv1974 If you can paste without extensions, I really congratulate you...
-
-
@rv1974 I am using Sketchup 2021 version
-
@designerbursa ```
module GlueComponentsToFaces extend self def glue_components_to_faces model = Sketchup.active_model selection = model.selection if selection.empty? return UI.messagebox("Error: No selection! Please select faces and components.") end faces = selection.grep(Sketchup::Face) components = selection.grep(Sketchup::ComponentInstance) if faces.empty? || components.empty? return UI.messagebox("Error: Select faces and components!") end model.start_operation("Glue Components to Faces", true) begin components.each do |component| closest_face = find_closest_aligned_face(component, faces) component.glued_to = closest_face if closest_face end rescue => e UI.messagebox("An error occurred: #{e.message}") ensure model.commit_operation end end def find_closest_aligned_face(component, faces) component_normal = component.transformation.zaxis closest_face = faces.min_by { |face| face.normal.angle_between(component_normal) } closest_face end end # Adding a menu item for ease of use in SketchUp if not file_loaded?(__FILE__) UI.menu("Plugins").add_item("Glue Components to Faces") { GlueComponentsToFaces.glue_components_to_faces } file_loaded(__FILE__) end
### I haven't tested it on the 2024 version but you can try this, maybe it will work. It works smoothly on my 2021 version
-
@designerbursa I took a closer look.. your version is indeed more advanced and user friendly, many thanks!
P.S. you can cut and paste in place multiple and un-glued components in any SU version to get the same positive result, but your script is less laborious indeed. -
module Reglue extend self # Menü öğesinin eklenme konumunu belirleyen değişken SUPPORT_MENU_POSITION ||= Sketchup::Menu.instance_method(:add_item).arity != 1 ? 8 : nil def glue_components_to_faces model = Sketchup.active_model selection = model.selection if selection.empty? UI.messagebox("Hata: Hiçbir seçim yapılmadı!") return end faces = selection.grep(Sketchup::Face) components = selection.grep(Sketchup::ComponentInstance).select { |comp| comp.glued_to.nil? } if faces.empty? || components.empty? UI.messagebox("Hata: Lütfen hem yüzeyleri hem de yapıştırılabilir bileşenleri seçin!") return end model.start_operation("Bileşenleri Yüzeylere Yeniden Yapıştır", true) components.each do |component| closest_face = find_closest_aligned_face(component, faces) component.glued_to = closest_face if closest_face end model.commit_operation end def find_closest_aligned_face(component, faces) component_normal = component.transformation.zaxis faces.min_by { |face| face.normal.angle_between(component_normal) } end unless @loaded UI.add_context_menu_handler do |menu| selection = Sketchup.active_model.selection next if selection.empty? has_faces = selection.any? { |entity| entity.is_a?(Sketchup::Face) } has_glueable_components = selection.any? { |entity| entity.is_a?(Sketchup::ComponentInstance) && entity.glued_to.nil? } if has_faces && has_glueable_components position = SUPPORT_MENU_POSITION menu.add_item("Reglue", position) { glue_components_to_faces } end end @loaded = true end end
Advertisement