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.
    • TIGT Offline
      TIG Moderator
      last edited by

      Not sure this reduced poly rock is so good ?Cuboidalizer.PNG'Cuboidalizer' is another name idea too... that or 'Discombobulizer' 😲

      TIG

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

        Here's a beta version with an inputbox and undo operation...

        It seemed to only change a cubes vertices in the Z axis ??

        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 )
              model = Sketchup.active_model
              vertices = []
              # Collect vertices.
              for e in 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
                begin
                  ###
                  Sketchup.active_model.start_operation("#{title} (#{Sketchup.format_length(result[0])})")
                  #
                  adjust_vertices( result[0] )
                  #
                  ###
                  Sketchup.active_model.commit_operation()
                rescue
                  Sketchup.active_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
        • thomthomT Offline
          thomthom
          last edited by

          @dan rathbun said:

          It seemed to only change a cubes vertices in the Z axis ??

          Should apply to X,Y and Z... Seemed to work correctly in my quick test...

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

          1 Reply Last reply Reply Quote 0
          • daikuD Offline
            daiku
            last edited by

            @dan rathbun said:

            @thomthom said:

            Cubificator?

            Polyhedronizer ?

            Orthogonizer ?

            Orthographizer ?

            OrthograFixer ?

            πŸ˜†

            It's like Autotune for cad! They can make you sound good, even if you can't sing.
            If you are editing digital music, and you need to make the drum beats perfect, you can move the beats to the nearest sixteenth note, or whatever. It's call "quantizing".

            Clark Bremer
            http://www.northernlightstimberframing.com

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

              @daiku said:

              It's called "quantizing".

              TRUE !!

              Restriction to discrete values (or multiples thereof,) rather than any values in the set of possibles (real numbers, in this case.)

              So.. the long term:
              Vertex Positional Quantization

              The short form:
              Vertex to Grid

              I'm not here much anymore.

              1 Reply Last reply Reply Quote 0
              • R Offline
                rossthompson
                last edited by

                Hi guys, I have had a play with Dan's Beta version and for me it works really well. The verticies are adjusted in X,Y and Z directions and the undo function works fine!

                The only slight problem: it adjusts all the geometry in the model, rather than just the active selection. The original module just adjusted the active selection.

                Any ideas?

                Again thanks for the support - this script should be a realy time saver!

                Ross

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

                  Well .. I did not think I changed the context of what Thomas' code did... just tried to wrap the code properly and added the menu_command() method to handle an inputbox.

                  I'll have a look at it.. again.

                  (And it's not really MY edition just because I added the inputbox.. it's still Thomas' thing.)

                  I'm not here much anymore.

                  1 Reply Last reply Reply Quote 0
                  • 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