[Plugin] ReGlue
-
There are times when I would like to select several components and reglue them to a face with one "ReGlue" operation. I have modified TIG's code a little to allow multiple selections of components. Hope you don't mind, TIG. The code is below, and not tested that much....
#----------------------------------------------------------------------- # Copyright 2006-2013, TIG # Permission to use, copy, modify, and distribute this software for # any purpose and without fee is hereby granted, provided the above # copyright notice appear in all copies. # THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. #----------------------------------------------------------------------- # Name; ReGlue # Description; A Tool to ReGlue a Component to a [recreated] Face. # Menu Item; Plugins -> ReGlue # Author; TIG # Usage; Select ONE Face and ONE [or MORE] UnGlued Component[s]. # Use with care - because by picking a Component and an # unconnected Face you can 'UnGlue' it and 'ReGlue' it # onto this new Face even if it's not actually on the same # plane or at the same rotation ! # Version; 1.0 27/12/06 First issue. # 1.1 20131210 Future-proofed #----------------------------------------------------------------------- require('sketchup.rb') module TIG module TIG;;ReGlue def self.do() model=Sketchup.active_model model.start_operation("ReGlue") ss=model.selection def self.status(txt) Sketchup;;set_status_text(txt, SB_PROMPT) Sketchup;;set_status_text(" ", SB_VCB_LABEL) Sketchup;;set_status_text(" ", SB_VCB_VALUE) end#def status def self.error(txt) self.status("REGLUE; ERROR...") UI.messagebox(txt) return nil end#def error return self.error("ReGlue;\nNO Selection !") if ss.empty? faces=ss.grep(Sketchup;;Face) comps=ss.grep(Sketchup;;ComponentInstance) return self.error("ReGlue;\nSelection MUST contain ONE Face !") if faces.length==0 || faces[1] return self.error("ReGlue;\nSelection MUST contain ONE Component !") if comps.length==0 face=faces[0] #Do for each component i = 0 while defined? comps[i] do comp=comps[i] return nil unless comp && face comp.glued_to = face i = i + 1 end#while model.commit_operation end#def #----------------------------------------------------------------------- unless file_loaded?(__FILE__)### UI.menu("Plugins").add_item("ReGlue"){self.do()} end file_loaded(__FILE__)### #----------------------------------------------------------------------- end#module end#TIG
-
nice little gem TIG. Saves a lot of repetitive stupid work.
Just as TommyK I changed it to a multiple reglue by
comps.each{|c|c.glued_to = face}
and uncommenting the
#return self.error("ReGlue:\nSelection MUST contain ONE Component !") if comps.length==0 || comps[1] #comp=comps[0] #comp.glued_to = face
-
I also feel the need to have multiple components reglued. I'm used to using Superglue for that but Tig's Reglue works much better.
So, Tig, are you thinking of adapting your own script to any of the above methods?
If not, I think I'll use Tommy's from now on...
Thank you guys!
-
TIG, Is it possible to enable multiple components (implemented above by TommyK) re-glueing to multiple faces please?
-
An instance can only glue to one face.
It's a limitation within SketchUp, not the API. -
Does this API the Great and Powerful, allows to select all the components glued to a preselected face? If yes, maybe the script could take one face, select all the glued and reglue; then go to another face, repeat reglueing, and so on?
-
Maybe Fredotools Move along could be helpful?
-
@rv1974 said:
Does this API the Great and Powerful, allows to select all the components glued to a preselected face? If yes, maybe the script could take one face, select all the glued and reglue; then go to another face, repeat reglueing, and so on?
ToomyK's version a few posts back does that.
Just replace the text in the RB file with his alternative and save it.
Use a plain-text editor like Notepad++ to do the editing. -
How is the code to determine which of the selected components gets glued to which selected face ?
Please outline the 'logic'... -
@tig said:
@rv1974 said:
Does this API the Great and Powerful, allows to select all the components glued to a preselected face? If yes, maybe the script could take one face, select all the glued and reglue; then go to another face, repeat reglueing, and so on?
ToomyK's version a few posts back does that.
Just replace the text in the RB file with his alternative and save it.
Use a plain-text editor like Notepad++ to do the editing.No, TommyK's code works only with one face.
@Pixero, the connection between MoveAlong and reglueing slips away from me. -
@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?
Advertisement