sketchucation logo sketchucation
    • Login
    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!
    πŸ«› Lightbeans Update | Metallic and Roughness auto-applied in SketchUp 2025+ Download

    How to use Ruby API

    Scheduled Pinned Locked Moved Developers' Forum
    28 Posts 5 Posters 1.5k Views 5 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.
    • J Offline
      Jim
      last edited by

      The Vertex entity has a position.

      
      point = vertex.position
      
      

      The position will be relative to parent container, and not relative the SketchUp axes.

      Hi

      1 Reply Last reply Reply Quote 0
      • TIGT Offline
        TIG Moderator
        last edited by

        
        ### points>>>vertices
        vertices.each do |vertex|
          $points_file.puts(vertex.vertices.point.to_a)
          ### FILE of VERTICES POINTS AS AN ARRAY ONE PER LINE...
        end
        
        

        TIG

        1 Reply Last reply Reply Quote 0
        • honoluludesktopH Offline
          honoluludesktop
          last edited by

          Hi guys, Thanks for your help. I stumbled on e.vertices.x.position after starting over. Now how do I read the SU Ruby API to make this easier to understand?-(

          
          model = Sketchup.active_model
          entities = model.entities
          selection = model.selection
          
          if model.selection.empty?
          	entities = model.active_entities
          else
          	entities = model.selection
          end
          
          entities.each do |e|
          	if e.is_a? Sketchup;;ComponentInstance
          		ci_name=e.definition.name
          		#UI.messagebox(ci_name)
          		ci_collection=e.definition.entities
          		#UI.messagebox(ci_collection)
          		ci_collection.each do |e|
          			ci_faces_collection=[]
          			if e.is_a? Sketchup;;Face
          				ci_faces_collection.push e
          				ci_faces_collection.each do |e|
          					faces_vertices_collection=[]
          					if e.vertices
          						faces_vertices_collection.push e
          						puts(e.vertices.x.position)
          					end
          				end
          			end
          		end
          	end 
          end
          
          
          
          1 Reply Last reply Reply Quote 0
          • TIGT Offline
            TIG Moderator
            last edited by

            Edges, Loops, Curves, Faces, etc have vertices and those vertices have a position vertices.position (i.e. a point)
            points have x/y/z values vertices.position.x
            DON'T muddle them up! ❗

            TIG

            1 Reply Last reply Reply Quote 0
            • honoluludesktopH Offline
              honoluludesktop
              last edited by

              OK, so how do I get the coordinate values for each vertex on each face.vertices? I think I understand vertex.position, and face.vertices, but how do I get a collection of vertex for each vertices.

              Can't be impossible, can it?

              1 Reply Last reply Reply Quote 0
              • Chris FullmerC Offline
                Chris Fullmer
                last edited by

                look at the Face.vertices here:

                http://code.google.com/apis/sketchup/docs/ourdoc/face.html#vertices

                it says what it returns - an array of vertx objects. So to get positions for all those vertices, you need to loop through that array. Something like this:

                ` vert_array = my_face.vertices
                position_array = []
                x_position_array = []

                vert_array.each do |v|
                position_array << v.position
                x_position_array << v.position.x
                end`

                Lately you've been tan, suspicious for the winter.
                All my Plugins I've written

                1 Reply Last reply Reply Quote 0
                • TIGT Offline
                  TIG Moderator
                  last edited by

                  @honoluludesktop said:

                  OK, so how do I get the coordinate values for each vertex on each face.vertices? I think I understand vertex.position, and face.vertices, but how do I get a collection of vertex for each vertices.
                  Can't be impossible, can it?

                  That is not logical ❗
                  If you have run vertices=face.vertices you already have a collection [i.e. an array] of the face's vertices !
                  If you then look at each of them you can get their positions as another array,
                  e.g. positions=[]; vertices.each{|v|positions<< v.position}
                  Now you can look at each 'position' in that array (i.e. it's a point) and get the x/y/z values etc
                  positions.each{|p|puts p.x;puts p.y;puts p.z}
                  ❓
                  You seem to making this more complicated than it needs to be...

                  TIG

                  1 Reply Last reply Reply Quote 0
                  • honoluludesktopH Offline
                    honoluludesktop
                    last edited by

                    AGH!!!, Thats what happens when you don't really know what you are doing. I think I got it, again:-) puts(face_pts.position.to_a) almost at the bottom. Basically, I took a "vertices", got tne number of points by "vertices.length", then extracted each "vertex" by "This_number=vertices[0 to (length-1)]". The following runs in Web Console.

                    
                    model = Sketchup.active_model
                    entities = model.entities
                    selection = model.selection
                    
                    if model.selection.empty?
                    	entities = model.active_entities
                    else
                    	entities = model.selection
                    end
                    
                    def open_comp_inst_file(comp_inst_name,model)
                    	comp_inst_file_name=File.basename(model.path)
                    	path=File.dirname(model.path)+"\\"
                    	out_name=comp_inst_name+".txt"
                    	out_path=path+out_name
                    	$dxf_ci_file=File.open(out_path,"w")
                    end
                    
                    entities.each do |e|
                    	if e.is_a? Sketchup;;ComponentInstance
                    		puts("Component")
                    		comp_inst_name=e.definition.name
                    		comp_inst_collection=e.definition.entities
                    		#open text file for output
                    		#open_comp_inst_file(comp_inst_name,model)
                    		comp_inst_collection.each do |e|
                    			comp_inst_faces_collection=[]
                    			if e.is_a? Sketchup;;Face
                    				#make collection of faces
                    				comp_inst_faces_collection.push e
                    				vertices_collection=[]
                    				comp_inst_faces_collection.each do |e|
                    						if e.vertices
                    							#vertice collection
                    							vertices_collection.push e.vertices
                    							vertices_collection.each do |e|
                    								no_vert=e.length
                    								cnt_vert=no_vert
                    								puts("Vertices")
                    								no_vert.times do
                    									face_pts=(e[no_vert-cnt_vert])
                    									cnt_vert=cnt_vert-1
                    									puts("Vertex")
                    									puts(face_pts.position.to_a)
                    								end
                    							end
                    						end
                    				end #loop
                    			end #if
                    		end #loop
                    		#close text file
                    		#$dxf_ci_file.close
                    	end 
                    end
                    
                    

                    Here is some sample output:
                    %(#408000)[Start Component
                    Starts Vertices
                    Start Vertex
                    69.6952995222671
                    5.52489094225734
                    0.0
                    Start Vertex
                    26.421563780178
                    0.0
                    0.0
                    Start Vertex
                    0.0
                    34.7137089981752
                    0.0
                    Start Vertex
                    16.8521719619112
                    74.9523089386077
                    0.0
                    .
                    .]
                    Looks OK?

                    1 Reply Last reply Reply Quote 0
                    • J Offline
                      Jim
                      last edited by

                      @honoluludesktop said:

                      AGH!!!, Thats what happens when you don't really know what you are doing.

                      Well, what are you doing? Try to make a precise statement of the purpose of the routine. In
                      English first, then Ruby.

                      This prints a summary of faces and vertices in the Definitions.

                          model = Sketchup.active_model
                          entities = model.entities
                          selection = model.selection
                      
                          if model.selection.empty?
                              entities = model.active_entities
                          else
                              entities = model.selection
                          end
                      
                          instance_count = 0
                          entities.each do |e|
                              if e.is_a? Sketchup;;ComponentInstance
                                  instance_count += 1
                                  puts("Component; #{instance_count} #{e.definition.name}")
                                  face_count = 0
                                  e.definition.entities.each do |e|
                                      if e.is_a? Sketchup;;Face
                                          face_count += 1
                                          puts "  face; #{face_count}"
                                          vertex_count = 0
                                          e.vertices.each do |v|
                                              vertex_count += 1
                                              puts "    vertex #{vertex_count} id;#{v.object_id}  pos;#{v.position}"
                                          end
                                      end
                                  end
                              end
                          end
                      
                      

                      Note since some faces share vertices, and all vertices are listed, some vertives will be duplicated.

                      Component; 2 Component#2
                        face; 1
                          vertex 1 id;48589944  pos;(2.160711", 1.853015", 0")
                          vertex 2 id;48589932  pos;(0", 1.853015", 0")
                          vertex 3 id;48589920  pos;(0", 1.853015", 2.160338")
                          vertex 4 id;48589908  pos;(2.160711", 1.853015", 2.160338")
                        face; 2
                          vertex 1 id;48589944  pos;(2.160711", 1.853015", 0")
                          vertex 2 id;48589692  pos;(2.160711", 0", 0")
                          vertex 3 id;48589680  pos;(0", 0", 0")
                          vertex 4 id;48589932  pos;(0", 1.853015", 0")
                        face; 3
                          vertex 1 id;48589680  pos;(0", 0", 0")
                          vertex 2 id;48589692  pos;(2.160711", 0", 0")
                          vertex 3 id;48589464  pos;(2.160711", 0", 2.160338")
                          vertex 4 id;48589452  pos;(0", 0", 2.160338")
                        face; 4
                          vertex 1 id;48589932  pos;(0", 1.853015", 0")
                          vertex 2 id;48589680  pos;(0", 0", 0")
                          vertex 3 id;48589452  pos;(0", 0", 2.160338")
                          vertex 4 id;48589920  pos;(0", 1.853015", 2.160338")
                        face; 5
                          vertex 1 id;48589464  pos;(2.160711", 0", 2.160338")
                          vertex 2 id;48589908  pos;(2.160711", 1.853015", 2.160338")
                          vertex 3 id;48589920  pos;(0", 1.853015", 2.160338")
                          vertex 4 id;48589452  pos;(0", 0", 2.160338")
                        face; 6
                          vertex 1 id;48589692  pos;(2.160711", 0", 0")
                          vertex 2 id;48589944  pos;(2.160711", 1.853015", 0")
                          vertex 3 id;48589908  pos;(2.160711", 1.853015", 2.160338")
                          vertex 4 id;48589464  pos;(2.160711", 0", 2.160338")
                      
                      

                      Hi

                      1 Reply Last reply Reply Quote 0
                      • honoluludesktopH Offline
                        honoluludesktop
                        last edited by

                        WOW! very compact, and fast, I will take a hard look at your code, and learn from it. Lets see how far I can get before having to post for help πŸ™‚

                        Addenda: Well, I did have redundant code, and really need to learn how to format output. Would have never figured out Puts "#{e.position.x.to_f}" by myself.

                        1 Reply Last reply Reply Quote 0
                        • honoluludesktopH Offline
                          honoluludesktop
                          last edited by

                          Darn, I finished coding only to discover the "putdxf" I use for my CAD import has a bug that fails to locate multiple blocks correctly. I confirmed this by being unable to "putdxf" with the system's "getdxf". Will have to rewrite as a "command line" script. Thanks for everything, sorry I couldn't understand much of what you tried to explain to me. But, because of your help, I will get better in time πŸ™‚

                          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