Move points to a '3D grid'
-
OK... added support for a selection. (Pssst! ... there was no selection support from the beginning Ross.)
This utility should probably be wrapped in Thomas' toplevel author module, and reside below his author directory in some manner.
I'll leave those choices up to him, and when he releases version 1.0.0, we'll delete these beta versions in this thread and put in a link to the release thread.
# ========================================================================== # GridSnap.rb # -------------------------------------------------------------------------- # by Thomas Thomassen # # -------------------------------------------------------------------------- # 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. # -------------------------------------------------------------------------- # # This utility quantizes the vertex locations, of the current selection, # of the model, or just the current context, to a 3D grid, whose interval # can be set via a popup inputbox. # # -------------------------------------------------------------------------- # Revisions; # # 0.1.0 ; 2012-03-26 ; by Thomas Thomassen # | # initial beta release # # 0.2.0 ; 2012-03-26 ; by Dan Rathbun # | # + Added menu_command() method for inputbox and undo operation. # # 0.3.0 ; 2012-03-28 ; by Dan Rathbun # | # + Revised the menu_command() method to pass a selection set to the # adjust_vertices() method as a 2nd argument. # # ========================================================================== module GridSnap @@last_tolerance = 0.25.m class << self # PROXY CLASS def round_point( point, tolerance ) grid_pt = point.to_a.map { |n| b = ( n / tolerance ).to_i * tolerance r = n % tolerance (r > tolerance / 2) ? b + tolerance ; b } Geom;;Point3d.new( *grid_pt ) end def test_it pt = Geom;;Point3d.new( 3.976879.m, 3.760209.m, 1.002568.m ) tolerance = @@last_tolerance grid_pt = round_point( pt, tolerance ) puts "Original; #{pt}" puts "Tolerance; #{tolerance}" puts "Grid Point; #{grid_pt}" end def adjust_vertices( tolerance = @@last_tolerance, ents = nil ) model = Sketchup.active_model vertices = [] # determine the context; ents = model.active_entities() if ents.nil? # Collect vertices. for e in ents #model.active_entities vertices << e.vertices if e.is_a?( Sketchup;;Edge ) end vertices.flatten! vertices.uniq! # Calculate grid adjustments. vectors = [] entities = [] for vertex in vertices pt = vertex.position grid_pt = round_point( pt, tolerance ) vector = pt.vector_to( grid_pt ) next unless vector.valid? entities << vertex vectors << vector end # Apply transformations model.active_entities.transform_by_vectors( entities, vectors ) puts "#{entities.size} adjusted to grid." end def menu_command() title = 'Adjust Vertices' prompt = 'Tolerance' default = @@last_tolerance result = UI.inputbox([prompt],[@@last_tolerance],title) rescue @@last_tolerance if result model = Sketchup.active_model begin ### model.start_operation("#{title} (#{Sketchup.format_length(result[0])})") # if model.selection.empty? adjust_vertices( result[0] ) else adjust_vertices( result[0], model.selection.to_a() ) end # model.commit_operation() ### rescue model.abort_operation() else @@last_tolerance = result[0] end end end end # PROXY CLASS #{# RUN ONCE # unless file_loaded?("GridSnap.rb") # Menu Entry; UI.menu("Tools").add_item("GridSnap") { menu_command() } file_loaded("GridSnap.rb") end #} end # module
-
Is there an easy way to have it go through the Outliner list and open each model group and snap those corners to the grid?
What would need changed in the script so that it would snap all visible geometry to the grid, Without having to manually select and open each group? -
@dan rathbun said:
This utility should probably be wrapped in Thomas' toplevel author module, and reside below his author directory in some manner.
I'll leave those choices up to him, and when he releases version 1.0.0, we'll delete these beta versions in this thread and put in a link to the release thread.
It would need to iterate the model's definition list, changing those that have instances.
But I'm not sure if it is really safe to change entities collections outside the current context?
PM'ing TT
-
@dan rathbun said:
But I'm not sure if it is really safe to change entities collections outside the current context?
That should be ok. One just need to keep in mind that the current open context apply a transformation that affect 3d points.
-
Ok.. but are ya gonna repost under
TT_GripSnap
or whatever? (I had said we'd remove the code blocks above and replace with Store links when done.) -
This wasn't something I ever planned to publish. It was just a code snipped posted for anyone to grab.
Advertisement