sketchucation logo sketchucation
    • 登入
    Oops, your profile's looking a bit empty! To help us tailor your experience, please fill in key details like your SketchUp version, skill level, operating system, and more. Update and save your info on your profile page today!
    🔌 Smart Spline | Fluid way to handle splines for furniture design and complex structures. Download

    Move points to a '3D grid'

    已排程 已置頂 已鎖定 已移動 Developers' Forum
    26 貼文 8 Posters 2.7k 瀏覽 8 Watching
    正在載入更多貼文
    • 從舊到新
    • 從新到舊
    • 最多點贊
    回覆
    • 在新貼文中回覆
    登入後回覆
    此主題已被刪除。只有擁有主題管理權限的使用者可以查看。
    • TIGT 離線
      TIG Moderator
      最後由 編輯

      In case TT is away...
      Inside the code making the menu use
      {GridSnap**.adjust_vertices(1.cm)**}
      It affects the whole model.
      This example uses 1cm grid
      Use another 'tolerance' if desired...
      If you use () it defaults to 0.25m anyway...
      It's only some example code and could be better assembled into something working on a selection with warnings and an 'undo' ???

      TIG

      1 條回覆 最後回覆 回覆 引用 0
      • TIGT 離線
        TIG Moderator
        最後由 編輯

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

        TIG

        1 條回覆 最後回覆 回覆 引用 0
        • Dan RathbunD 離線
          Dan Rathbun
          最後由 編輯

          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 條回覆 最後回覆 回覆 引用 0
          • thomthomT 離線
            thomthom
            最後由 編輯

            @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 條回覆 最後回覆 回覆 引用 0
            • daikuD 離線
              daiku
              最後由 編輯

              @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 條回覆 最後回覆 回覆 引用 0
              • Dan RathbunD 離線
                Dan Rathbun
                最後由 編輯

                @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 條回覆 最後回覆 回覆 引用 0
                • R 離線
                  rossthompson
                  最後由 編輯

                  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 條回覆 最後回覆 回覆 引用 0
                  • Dan RathbunD 離線
                    Dan Rathbun
                    最後由 編輯

                    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 條回覆 最後回覆 回覆 引用 0
                    • Dan RathbunD 離線
                      Dan Rathbun
                      最後由 編輯

                      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 條回覆 最後回覆 回覆 引用 0
                      • V 離線
                        VertexMover
                        最後由 編輯

                        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 條回覆 最後回覆 回覆 引用 0
                        • Dan RathbunD 離線
                          Dan Rathbun
                          最後由 編輯

                          @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 條回覆 最後回覆 回覆 引用 0
                          • tt_suT 離線
                            tt_su
                            最後由 編輯

                            @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 條回覆 最後回覆 回覆 引用 0
                            • Dan RathbunD 離線
                              Dan Rathbun
                              最後由 編輯

                              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 條回覆 最後回覆 回覆 引用 0
                              • thomthomT 離線
                                thomthom
                                最後由 編輯

                                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 條回覆 最後回覆 回覆 引用 0
                                • 1
                                • 2
                                • 1 / 2
                                • 第一個貼文
                                  最後的貼文
                                Buy SketchPlus
                                Buy SUbD
                                Buy WrapR
                                Buy eBook
                                Buy Modelur
                                Buy Vertex Tools
                                Buy SketchCuisine
                                Buy FormFonts

                                Advertisement