[Plugin] ReGlue
-
@tig said:
How is the code to determine which of the selected components gets glued to which selected face ?
Please outline the 'logic'...Thats what I tried to ask you earlier- Whether API allows to detect the components glued to a preselected face. IF the answer is YES, then MAYBE the script could(?) progressevly take face by face and reglue corresponding components.
-
@rv1974
I did this but it’s small script. Select face and components for reglue. -
-
There is a method:
glued = face.get_glued_instances
And it'd be easy to grep then iterate all of the faces and their glued components etc...
BUT there's no API '.could_be_glued_instances
' method...BUT here's some possible [pretty much untested] code which might just do it...
ctr=0 model=Sketchup.active_model faces=model.active_entities.grep(Sketchup;;Face) comps=model.active_entities.grep(Sketchup;;ComponentInstance).find_all{|e| e.definition.behavior.is2d? && ! e.glued_to } ### collect if comp can glue, but not glued ! cct=comps.length faces.each{|f| plane=f.plane norm =f.normal comps.dup.each{|e| pt=e.transformation.origin nm=e.transformation.zaxis if pt.distance_to_plane(plane)==0 && norm==nm ### glue-able cp=f.classify_point(pt) if cp==Sketchup;;Face;;PointInside || cp==Sketchup;;Face;;PointOnEdge || cp==Sketchup;;Face;;PointOnVertex ### on face so can glue e.glued_to=f comps.delete(e) ctr+=1 ### reduce tested comps collection for speed end end } } puts "\n\nReglued #{ctr} of #{cct}" ### print how many reglued
-
@TIG This plugin reglues multiple components in SU 2022. In v2023 and newer it reglues only one component.
What is the reason for this degradation? Thanks
-
This plugin is over a decade old !
As far as I recall, and tell from the code and version, it has always needed a selection of one face and one component to work. for 19 years.
Although I do see from my posts do speaks of one or more components being processed...As far as I can see this old code is very simplistic... e.g.
It does not check for gluing properties, or face-normal, or Z-axis, or position on the face.plane, or transformation.origin point on the face at all.
If it checked for several components being on the face and sharing the face.normal as their Z-axis etc, then it would be possible the get it to process several gluing components. However, this would require a complete rewrite...
I'll back check...
-
Here's v2.0 in the PluginStore...
https://sketchucation.com/pluginstore?pln=Re_Glue
It now allows multiple pre selected component-instances, but still only one preselected face.
These are glued to the face [is possible], any errors or unsuitable instances are reported in the Ruby Console... -
@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.
Advertisement