# Copyright 2005, Didier Bur # Permission to use, copy, modify, and distribute this software for # any purpose and without fee is hereby granted, provided that the above # copyright notice appear in all copies. # 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. # Name : su2stl.rb 1.0 # Description : Exports selection or whole model to STL format external file # Author : Didier Bur # Usage : Select objects exports the selection, no selection exports whole # model. Select Plugins/Export to STL. Groups and components not supported. # # Date : 27.June.2005 # Type : Exporter # History: 1.0 (27.June.2005) - first version # 1.1 (29.June.2005) - Bugs fixed, new messages. #--------------------------------------------------------------------------------- def export_model_to_stl #Init model = Sketchup.active_model ss = Sketchup.active_model.selection model.start_operation "Export to STL" faces_array = [] entities = model.entities # Selection checking if ss.empty? answer = UI.messagebox("Nothing selected. Export whole model ?", MB_YESNOCANCEL) else entities_to_export = Sketchup.active_model.selection end if( answer == 6 ) entities_to_export = model.entities end if( answer == 6 ) or (not ss.empty?) # Delete any previously created STL triangles (delete_stl_triangles) # Output file out_name = UI.openpanel( "Select file to export to", "." , "*.stl" ) export_file = File.new( out_name , "w" ) # Error checking, put valid elements in faces_array others = 0 i = 0 0.upto(entities_to_export.length - 1) do |something| element = entities_to_export[i] if( element.typename != "Face") others = others + 1 else faces_array.push element end i = i + 1 end #of upto # Layer management model.layers.add("STL_triangles") model.active_layer = ("STL_triangles") #Triangulation faces_array.each do |face| mesh=face.mesh(7) normal = mesh.normal_at 1 Sketchup.active_model.entities.add_faces_from_mesh mesh, 9 end #Collect triangles and export (collect_stl_triangles) (export_stl_triangles export_file) #Report message UI.messagebox( faces_array.length.to_s + " faces to export.\n" + others.to_s + " objects ignored.\n" + $triangles_array.length.to_s + " triangles exported to STL solid.") $triangles_array = [] end #of if( answer == 6) # Undo model.commit_operation end def collect_stl_triangles model = Sketchup.active_model $triangles_array = [] entities = model.entities i = 0 entities.each do |that| element = entities[i] if(element.typename == "Face" and element.layer.name == "STL_triangles") $triangles_array.push element end i = i + 1 end end def delete_stl_triangles model = Sketchup.active_model ent_arr=[] model.entities.each do |element| if(element.layer.name == "STL_triangles") ent_arr.push element end end ent_arr.each {|e| e.erase! if not e.deleted?} end def export_stl_triangles( export_file ) model = Sketchup.active_model #File Header model_filename = File.basename(model.path) if( model_filename == "" ) model_filename = "no_name" end model_name = model_filename.split(".")[0] export_file.puts( "solid " + model_name) i = 0 $triangles_array.each do |tri| normal = tri.normal vertices = tri.vertices export_file.puts( "facet normal " + tri.normal[0].to_s + " " + tri.normal[1].to_s + " " + tri.normal[2].to_s) export_file.puts( " outer loop") export_file.puts( " vertex " + vertices[0].position.x.to_f.to_s + " " + vertices[0].position.y.to_f.to_s + " " + vertices[0].position.z.to_f.to_s) export_file.puts( " vertex " + vertices[1].position.x.to_f.to_s + " " + vertices[1].position.y.to_f.to_s + " " + vertices[1].position.z.to_f.to_s) export_file.puts( " vertex " + vertices[2].position.x.to_f.to_s + " " + vertices[2].position.y.to_f.to_s + " " + vertices[2].position.z.to_f.to_s) export_file.puts( " endloop") export_file.puts( "endfacet") i = i + 1 done = ((i * 100.0) / $triangles_array.length).to_i Sketchup.set_status_text("Exporting triangles: " + done.to_s + "%") end export_file.puts( "endsolid " + model_name) # Close the export file: export_file.close end #--------------------------------------------------------------------------------- # Menu items if( not file_loaded?("su2stl.rb") ) add_separator_to_menu("Plugins") UI.menu("Plugins").add_item("Export to STL") { export_model_to_stl } end #----------------------------------------------------------------------------- file_loaded("su2stl.rb")