This is an old revision of the document!
Sketchup DXF Export plugin
The current settings on the wiki do not allow the plugin to be uploaded. Alice has it available at a dropbox link.
If that list no longer works, below is the contents of the plugin. Copy 'n paste them to the file skp_to_dxf.rb and save it in your Sketchup plugins folder1)2).
# SketchUp to DXF STL Converter # Last edited: February 18, 2011 # Authors: Nathan Bromham, Konrad Shroeder # Download from: http://www.guitar-list.com/download-software/convert-sketchup-skp-files-dxf-or-stl require 'sketchup.rb' def dxf_export_mesh_file model = Sketchup.active_model model_filename = File.basename(model.path) if( model_filename == "" ) model_filename = "model" end ss = model.selection $stl_conv = 1.0 $group_count = 0 $component_count = 0 $face_count = 0 $line_count = 0 entities = model.entities if (Sketchup.version_number < 7) model.start_operation("export_dxf_mesh") else model.start_operation("export_dxf_mesh",true) end if ss.empty? answer = UI.messagebox("No objects selected. Export entire model?", MB_YESNOCANCEL) if( answer == 6 ) export_ents = model.entities else export_ents = ss end else export_ents = Sketchup.active_model.selection end if (export_ents.length > 0) #get units for export dxf_dxf_units_dialog #get DXF export option dxf_option = dxf_dxf_options_dialog if (dxf_option =="stl") file_type="stl" else file_type="dxf" end #exported file name out_name = UI.savepanel( file_type+" file location", "." , "#{File.basename(model.path).split(".")[0]}." +file_type ) $mesh_file = File.new( out_name , "w" ) model_name = model_filename.split(".")[0] dxf_header(dxf_option,model_name) # Recursively export faces and edges, exploding groups as we go. #Count "other" objects we can't parse. others = dxf_find_faces(0, export_ents, Geom::Transformation.new(), model.active_layer.name,dxf_option) dxf_end(dxf_option,model_name) UI.messagebox( $face_count.to_s + " faces exported " + $line_count.to_s + " lines exported\n" + others.to_s + " objects ignored" ) end model.commit_operation end def dxf_find_faces(others, entities, tform, layername,dxf_option) entities.each do |entity| #Face entity if( entity.typename == "Face") case dxf_option when "polylines" dxf_write_polyline(entity,tform,layername) when "polyface mesh" dxf_write_polyface(entity,tform,layername) when "triangular mesh" dxf_write_face(entity,tform,layername) when "stl" dxf_write_stl(entity,tform) end #Edge entity elsif( entity.typename == "Edge") and((dxf_option=="lines")or(entity.faces.length==0 and dxf_option!="stl")) dxf_write_edge(entity, tform, layername) #Group entity elsif( entity.typename == "Group") if entity.name=="" entity.name="GROUP"+$group_count.to_s $group_count+=1 end others = dxf_find_faces(others, entity.entities, tform * entity.transformation, entity.name,dxf_option) #Componentinstance entity elsif( entity.typename == "ComponentInstance") if entity.name=="" entity.name="COMPONENT"+$component_count.to_s $component_count+=1 end others = dxf_find_faces(others, entity.definition.entities, tform * entity.transformation, entity.name,dxf_option) else others = others + 1 end end others end def dxf_transform_edge(edge, tform) points=[] points.push(dxf_transform_vertex(edge.start, tform)) points.push(dxf_transform_vertex(edge.end, tform)) points end def dxf_transform_vertex(vertex, tform) point = Geom::Point3d.new(vertex.position.x, vertex.position.y, vertex.position.z) point.transform! tform point end def dxf_write_edge(edge, tform, layername) points = dxf_transform_edge(edge, tform) $mesh_file.puts( " 0\nLINE\n 8\n"+layername+"\n") for j in 0..1 do $mesh_file.puts((10+j).to_s+"\n"+(points[j].x.to_f * $stl_conv).to_s)#x $mesh_file.puts((20+j).to_s+"\n"+(points[j].y.to_f * $stl_conv).to_s)#y $mesh_file.puts((30+j).to_s+"\n"+(points[j].z.to_f * $stl_conv).to_s)#z end $line_count+=1 end def dxf_write_polyline(face, tform,layername) face.loops.each do |aloop| $mesh_file.puts(" 0\nPOLYLINE\n 8\n"+layername+"\n 66\n 1") $mesh_file.puts("70\n 8\n 10\n0.0\n 20\n 0.0\n 30\n0.0") for j in 0..aloop.vertices.length do if (j==aloop.vertices.length) count = 0 else count = j end point = dxf_transform_vertex(aloop.vertices[count],tform) $mesh_file.puts( " 0\nVERTEX\n 8\nMY3DLAYER") $mesh_file.puts("10\n"+(point.x.to_f * $stl_conv).to_s) $mesh_file.puts("20\n"+(point.y.to_f * $stl_conv).to_s) $mesh_file.puts("30\n"+(point.z.to_f * $stl_conv).to_s) $mesh_file.puts( " 70\n 32") end if (aloop.vertices.length > 0) $mesh_file.puts( " 0\nSEQEND") end end $face_count+=1 end def dxf_write_face(face,tform, layername) mesh = face.mesh 0 mesh.transform! tform polygons = mesh.polygons polygons.each do |polygon| if (polygon.length > 2) flags = 0 $mesh_file.puts( " 0\n3DFACE\n 8\n"+layername) for j in 0..polygon.length do if (j==polygon.length) count = polygon.length-1 else count = j end #check edge visibility if ((polygon[count]<0)) flags+=2**j end $mesh_file.puts((10+j).to_s+"\n"+(mesh.point_at(polygon[count].abs).x.to_f * $stl_conv).to_s) $mesh_file.puts((20+j).to_s+"\n"+(mesh.point_at(polygon[count].abs).y.to_f * $stl_conv).to_s) $mesh_file.puts((30+j).to_s+"\n"+(mesh.point_at(polygon[count].abs).z.to_f * $stl_conv).to_s) end #edge visibiliy flags $mesh_file.puts("70\n"+flags.to_s) end end $face_count+=1 end def dxf_write_stl(face,tform) mesh = face.mesh 7 mesh.transform! tform polygons = mesh.polygons polygons.each do |polygon| if (polygon.length == 3) $mesh_file.puts( "facet normal " + mesh.normal_at(polygon[0].abs).x.to_s + " " + mesh.normal_at(polygon[0].abs).y.to_s + " " + mesh.normal_at(polygon[0].abs).z.to_s) $mesh_file.puts( "outer loop") for j in 0..2 do $mesh_file.puts("vertex " + (mesh.point_at(polygon[j].abs).x.to_f * $stl_conv).to_s + " " + (mesh.point_at(polygon[j].abs).y.to_f * $stl_conv).to_s + " " + (mesh.point_at(polygon[j].abs).z.to_f * $stl_conv).to_s) end $mesh_file.puts( "endloop\nendfacet") end end $face_count+=1 end def dxf_write_polyface(face,tform,layername) mesh = face.mesh 0 mesh.transform! tform polygons = mesh.polygons points = mesh.points $mesh_file.puts(" 0\nPOLYLINE\n 8\n"+layername+"\n 66\n 1") $mesh_file.puts("10\n0.0\n 20\n 0.0\n 30\n0.0\n") $mesh_file.puts("70\n 64\n") #flag for 3D polyface $mesh_file.puts("71\n"+mesh.count_points.to_s) $mesh_file.puts("72\n 1") #points points.each do |point| $mesh_file.puts( " 0\nVERTEX\n 8\n"+layername) $mesh_file.puts("10\n"+(point.x.to_f * $stl_conv).to_s) $mesh_file.puts("20\n"+(point.y.to_f * $stl_conv).to_s) $mesh_file.puts("30\n"+(point.z.to_f * $stl_conv).to_s) $mesh_file.puts( " 70\n 192") end #polygons polygons.each do |polygon| $mesh_file.puts( " 0\nVERTEX\n 8\n"+layername) $mesh_file.puts("10\n0.0\n 20\n 0.0\n 30\n0.0\n") $mesh_file.puts( " 70\n 128") $mesh_file.puts( " 71\n"+polygon[0].to_s) $mesh_file.puts( " 72\n"+polygon[1].to_s) $mesh_file.puts( " 73\n"+polygon[2].to_s) if (polygon.length==4) $mesh_file.puts( " 74\n"+polygon[3]..abs.to_s) end end $mesh_file.puts( " 0\nSEQEND") $face_count+=1 end def dxf_dxf_options_dialog options_list=["polyface mesh","polylines","triangular mesh","lines","stl"].join("|") prompts=["Export to DXF options"] enums=[options_list] values=["polyface mesh"] results = inputbox prompts, values, enums, "Choose which entities to export" return if not results results[0] end def dxf_dxf_units_dialog cu=Sketchup.active_model.options[0]["LengthUnit"] case cu when 4 current_unit= "Meters" when 3 current_unit= "Centimeters" when 2 current_unit= "Millimeters" when 1 current_unit= "Feet" when 0 current_unit= "Inches" end units_list=["Meters","Centimeters","Millimeters","Inches","Feet"].join("|") prompts=["Export unit: "] enums=[units_list] values=[current_unit] results = inputbox prompts, values, enums, "Export units" return if not results case results[0] when "Meters" $stl_conv=0.0254 when "Centimeters" $stl_conv=2.54 when "Millimeters" $stl_conv=25.4 when "Feet" $stl_conv=0.0833333333333333 when "Inches" $stl_conv=1 end end def dxf_header(dxf_option,model_name) if (dxf_option=="stl") $mesh_file.puts( "solid " + model_name) else $mesh_file.puts( " 0\nSECTION\n 2\nENTITIES") end end def dxf_end(dxf_option,model_name) if (dxf_option=="stl") $mesh_file.puts( "endsolid " + model_name) else $mesh_file.puts( " 0\nENDSEC\n 0\nEOF") end $mesh_file.close end if( not file_loaded?("skp_to_dxf.rb") ) add_separator_to_menu("Tools") UI.menu("Tools").add_item("Export to DXF or STL") { dxf_export_mesh_file } end file_loaded("skp_to_dxf.rb")