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

      Thanks guys. Will work on this later tonight after I get home. About the lowercase, if the def is inside a module, will it make a difference?

      This runs ok on my system:

      
      require 'sketchup.rb'
       
      module WMY_putdxf
       
        def WMY_putdxf.main
       
          model = Sketchup.active_model # make db of active model
      	entities = model.active_entities
          selection = model.selection # make db of selections
      	
         if model.selection.empty? 
             entities = model.active_entities    
         else 
            entities = model.selection    
         end
      	 
       	# test if selection made
          entities.each do |e| # do loop through database and place entities in type array
      	    if e.is_a? Sketchup;;ComponentInstance
      			#comp_file_name=e.definition.name
      			name=e.definition.name#e.typename
      			faces=e.definition.entities
      			WMY_putdxf.get_faces(name,faces)
      		end
      	end
       
        end # .main method
        
        def WMY_putdxf.get_faces(name,faces)# procedure or method
      
      	faces.each do |e|
      	   info = e.typename
      	   if e.is_a? Sketchup;;Face
      			UI.messagebox(name+"; "+info)
      	   end #ednif
      	end #end do
          
        end
           
      end # WMY_putdxf module
        
      #----------------menu------------------
      if !file_loaded?(__FILE__) #_FILE_  permits renaming the file
        UI.menu("Plugins").add_item("Yet Another Test") { WMY_putdxf.main }
      end
       
      file_loaded(__FILE__)
      

      But with WMY_ as wmy_ this error message:

      Error Loading File yet_another_script.rb
      C:/PROGRA~1/Google/GO2494~1/Plugins/yet_another_script.rb:3: class/module name must be CONSTANT

      Sorry for the uneven indenting, when I copy from notepad++ and paste, the indent spacing changes.

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

        module names always must start with a capital letter. methods do not start with a cap. Classes start with a cap. That is the basic rule. Constants are variables that start with a capital letter, and should remain constant - like Pi.

        Chris

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

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

          @chris fullmer said:

          module names always must start with a capital letter. methods do not start with a cap. Classes start with a cap. That is the basic rule. Constants are variables that start with a capital letter, and should remain constant - like Pi.

          Chris

          Normal convention is to type constants in all caps.

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

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

            Sorry for the confusion 😳 - I didn't realise there was an enclosing module / class. They need initial CAPITAL letter; whereas defs and variables need lowercase. Consonants ion caps e.g. ORIGIN...

            TIG

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

              OK I am stuck again. Problem is with the last box of code below:

              This is the main proc, methods below are at the bottom of the code in this section:

              
              model = Sketchup.active_model
              entities = model.active_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
                  the_name=e.definition.name
                  stuff=e.definition.entities
                  counter=0
                  faces=[]
                  stuff.each do |e|
                    if e.is_a? Sketchup;;Face
                      counter=counter+1
                      faces.push e
                    end ###if
                  end ###loop
                  points=[]
                  add_face_vert_to_file(faces,points)
                  make_comp_face_file(the_name,faces,counter,model,points)
                end ###if
              end ###loop
              
              

              Method to make a collection of face.vertices

              
              ###make vertices file of faces in component
              def add_face_vert_to_file(faces,points)
                faces.each do |e|
                  points.push e.vertices
                end ###end loop
              end
              
              

              Method to make empty text file, then (where I fail) to take the face.vertices and copy them as string to the text file.

              
              ###create file ComponentName.txt
              def make_comp_face_file(the_name,faces,counter,model,points)
                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
                $mesh_file=File.new(out_path,"w")
              
                #HERE is problem code. How do I take the collection
                #of face.vertices and copy as strings to the text file.
                points.each do |e|
                  $mesh_file.puts(e.x.to_s)
                  $mesh_file.puts(e.y.to_s)
                  $mesh_file.puts(e.z.to_s)
                end ###loop
              end
              
              

              Am writing with the Web Console, and having some problems. Saving seems to drop characters, and the indents are gone. Any ideas?

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

                
                points.each do |e|
                    $mesh_file.puts(e.x.to_s)
                    $mesh_file.puts(e.y.to_s)
                    $mesh_file.puts(e.z.to_s)
                end ###loop
                
                

                Adds x/y/z into file on separate lines...
                to test if it's at least getting the points values use plain puts so it appears in the console

                
                points.each do |e|
                    puts(e.x.to_s)
                    puts(e.y.to_s)
                    puts(e.z.to_s)
                end ###loop
                
                

                To write an xyz line use

                
                points.each do |e|
                    $mesh_file.puts(e.x.to_s+","+e.y.to_s+","+e.z.to_s)
                end ###loop
                
                

                Does

                $mesh_file=File.new(out_path,"w")
                

                actually make the file ?
                You need to open the file for writing AND then close it after you are done writing to it.

                $mesh_file.close
                

                perhaps it's still open and so a second [separate] attempt to write to it fails...

                TIG

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

                  @thomthom said:

                  Normal convention is to type constants in all caps.

                  Oh yeah! I rarely intialize them. Thanks Thom,

                  Chris

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

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

                    TIG, Just got up, and finished reading at your post. Thanks I think I understand, and have a lot to work with.

                    $mesh_file=File.new(out_path,"w")

                    Made a 0 byte file that I can see in "My Computer". I assumed it was open, guess it wasn't:-). Looks like a lot of stuff to work on later today. Good advice about using "puts" to check output. I use the messagebox a lot but that is slow.

                    puts(e.x.to_s) prints Sketchup::Vertex:0xea24668 ?-(, Crossed this bridge once before, but don't recall how to get output as a number.

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

                      puts(e.x.to_s) should return a numerical "x" position if e is a Point3d object. if e is a vertex, it should return an error. If e is a vertex, you can do e.position.x and that will return the x position of the vertex.

                      That sounded confusing to me. A few more lines of your code and I could give a slightly more complete example.

                      Great job so far!

                      Chris

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

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

                        "oops: - I" πŸ™‚ A little slow this morning, didn't get it until now. Thanks guys, lets see how far I can get with what I have before I, OOPS:-(, need help getting off the floor. Might not take too long.

                        Tig, I can now open, write to, and close files:-)

                        Chris above here is where I stumbled on the code.

                        It occurred to me that a "method", a "function" in other languages (I missed this one), was in my day know as a "procedure", having evolved from a "[C}all". Before this I did a Basic "sub routine", itself born out of "jump xxxx:xxxx, where xxxx:xxxx began a set of instruction that ended in "return". Before "Buddha" it was all 1111's and 0000's πŸ™‚

                        1 Reply Last reply Reply Quote 0
                        • 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
                                            • 1
                                            • 2
                                            • 1 / 2
                                            • First post
                                              Last post
                                            Buy SketchPlus
                                            Buy SUbD
                                            Buy WrapR
                                            Buy eBook
                                            Buy Modelur
                                            Buy Vertex Tools
                                            Buy SketchCuisine
                                            Buy FormFonts

                                            Advertisement