How to use Ruby API
-
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 ###loopMethod 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 endMethod 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 endAm writing with the Web Console, and having some problems. Saving seems to drop characters, and the indents are gone. Any ideas?
-
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 ###loopAdds 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 consolepoints.each do |e| puts(e.x.to_s) puts(e.y.to_s) puts(e.z.to_s) end ###loopTo 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 ###loopDoes
$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.closeperhaps it's still open and so a second [separate] attempt to write to it fails...
-
@thomthom said:
Normal convention is to type constants in all caps.
Oh yeah! I rarely intialize them. Thanks Thom,
Chris
-
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.
-
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
-
"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

-
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 -
The Vertex entity has a position.
point = vertex.positionThe position will be relative to parent container, and not relative the SketchUp axes.
-
### 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 -
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 -
Edges, Loops, Curves, Faces, etc have
verticesand thoseverticeshave a positionvertices.position(i.e. a point)
points have x/y/z valuesvertices.position.x
DON'T muddle them up!
-
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?
-
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` -
@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 runvertices=face.verticesyou 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... -
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 endHere 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? -
@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 endNote 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") -
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.
-
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

Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better π
Register LoginAdvertisement