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.
    • honoluludesktopH Offline
      honoluludesktop
      last edited by

      Help! How do I get a number that repersents the location of a face vertices? The following is setup for Web Console. When I output to UI.messagebox(e.vertices), I get:

      #Sketchup::Vertex:0xfc83800#Sketchup::Vertex:0xfc837e8#Sketchup::Vertex:0xfc837d0

      The main proc is at the bottom, and the methods are above it.

      
      model = Sketchup.active_model
      entities = model.active_entities
      selection = model.selection
      
      ### Test is selection made
      if model.selection.empty?
        entities = model.active_entities
      else
        entities = model.selection
      end
      
      ###create file ComponentName.txt
      def make_comp_face_file(the_name,faces,counter,model)
        the_line=the_name+" ",counter," faces"
        UI.messagebox(the_line)
        model_filename = File.basename(model.path)
        path=File.dirname(model.path)+"\\"
        out_name=the_name+".txt"
        out_path=path+out_name
      end
      
      ###make vertices collection of faces in component
      def add_face_vertices_collect(faces,points)
        faces.each do |e|
          points.push e.outer_loop
        end ### loop
      end
      
      ###make 3dpoint from vertex HELP HERE!!!! I think
      def print_vertices_collect(points)
        points.each do |e|
          UI.messagebox(e.vertices)       ###puts to test will be 
          ###$points_file.puts(e.vertices)###put here when works
        end
      end
      
      ###Get su;;component collection
      entities.each do |e|
        if e.is_a? Sketchup;;ComponentInstance
          the_name=e.definition.name
          stuff=e.definition.entities
          faces=[]
          counter=0
          ###Locate faces in each component and make faces collection
          stuff.each do |e|
      	if e.is_a? Sketchup;;Face
      	  counter=counter+1
      	  faces.push e
      	end ###if
          end ###loop
          make_comp_face_file(the_name,faces,counter,model)####Have to
          points=[]
          add_face_vertices_collect(faces,points)          ####nest these
          print_vertices_collect(points)                   ####later
          $points_file.close
        end ###if
      end ###loop
      
      
      1 Reply Last reply Reply Quote 0
      • 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