sketchucation logo sketchucation
    • Login
    ℹ️ Licensed Extensions | FredoBatch, ElevationProfile, FredoSketch, LayOps, MatSim and Pic2Shape will require license from Sept 1st More Info

    Move points to a '3D grid'

    Scheduled Pinned Locked Moved Developers' Forum
    26 Posts 8 Posters 2.2k Views 8 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • Dan RathbunD Offline
      Dan Rathbun
      last edited by

      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
       
       
      

      I'm not here much anymore.

      1 Reply Last reply Reply Quote 0
      • V Offline
        VertexMover
        last edited by

        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?

        1 Reply Last reply Reply Quote 0
        • Dan RathbunD Offline
          Dan Rathbun
          last edited by

          @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

          I'm not here much anymore.

          1 Reply Last reply Reply Quote 0
          • tt_suT Offline
            tt_su
            last edited by

            @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.

            1 Reply Last reply Reply Quote 0
            • Dan RathbunD Offline
              Dan Rathbun
              last edited by

              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.)

              I'm not here much anymore.

              1 Reply Last reply Reply Quote 0
              • thomthomT Offline
                thomthom
                last edited by

                This wasn't something I ever planned to publish. It was just a code snipped posted for anyone to grab.

                Thomas Thomassen — SketchUp Monkey & Coding addict
                List of my plugins and link to the CookieWare fund

                1 Reply Last reply Reply Quote 0
                • 1
                • 2
                • 2 / 2
                • First post
                  Last post
                Buy SketchPlus
                Buy SUbD
                Buy WrapR
                Buy eBook
                Buy Modelur
                Buy Vertex Tools
                Buy SketchCuisine
                Buy FormFonts

                Advertisement