Class: Cosmos::StlReader
Constant Summary collapse
- @@files =
{}
Instance Attribute Summary collapse
-
#triangles ⇒ Object
Returns the value of attribute triangles.
-
#use_cache ⇒ Object
Returns the value of attribute use_cache.
Instance Method Summary collapse
- #build_triangles(filename, scaling_factor = 1.0) ⇒ Object
- #draw_triangles ⇒ Object
- #estimate_num_triangles(filename) ⇒ Object
-
#initialize ⇒ StlReader
constructor
A new instance of StlReader.
- #prep_vertex_arrays ⇒ Object
- #process(filename, scaling_factor = 1.0) ⇒ Object
- #process_with_progress(filename, scaling_factor = 1.0) ⇒ Object
- #reset ⇒ Object
Constructor Details
#initialize ⇒ StlReader
Returns a new instance of StlReader.
23 24 25 26 27 28 29 30 |
# File 'lib/cosmos/gui/opengl/stl_reader.rb', line 23 def initialize @triangles = [] @file = nil @is_ascii = nil @packet = nil @num_facets = nil @use_cache = true end |
Instance Attribute Details
#triangles ⇒ Object
Returns the value of attribute triangles.
18 19 20 |
# File 'lib/cosmos/gui/opengl/stl_reader.rb', line 18 def triangles @triangles end |
#use_cache ⇒ Object
Returns the value of attribute use_cache.
19 20 21 |
# File 'lib/cosmos/gui/opengl/stl_reader.rb', line 19 def use_cache @use_cache end |
Instance Method Details
#build_triangles(filename, scaling_factor = 1.0) ⇒ Object
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# File 'lib/cosmos/gui/opengl/stl_reader.rb', line 32 def build_triangles(filename, scaling_factor = 1.0) if @@files[filename].nil? or !@use_cache @triangles = [] @is_ascii = File.is_ascii?(filename) if @is_ascii @file = File.new(filename, 'r') else @file = File.new(filename, 'rb') end read_triangles(4000000000, scaling_factor) @file.close @file = nil @@files.delete_if {|key, stl_reader| stl_reader == self} @@files[filename] = self else @triangles = @@files[filename].triangles end end |
#draw_triangles ⇒ Object
66 67 68 69 70 71 72 73 74 |
# File 'lib/cosmos/gui/opengl/stl_reader.rb', line 66 def draw_triangles GL.EnableClientState(GL::NORMAL_ARRAY) GL.EnableClientState(GL::VERTEX_ARRAY) GL.NormalPointer(GL::FLOAT, 0, @normals_packed) GL.VertexPointer(3, GL::FLOAT, 0, @vertexes_packed) GL.DrawArrays(GL::TRIANGLES, 0, @triangles.length * 3) GL.DisableClientState(GL::NORMAL_ARRAY) GL.DisableClientState(GL::VERTEX_ARRAY) end |
#estimate_num_triangles(filename) ⇒ Object
112 113 114 115 116 117 118 119 120 |
# File 'lib/cosmos/gui/opengl/stl_reader.rb', line 112 def estimate_num_triangles(filename) @is_ascii = File.is_ascii?(filename) stat = File.stat(filename) if @is_ascii return (stat.size / 268).to_i + 1 else return (stat.size / 50).to_i + 1 end end |
#prep_vertex_arrays ⇒ Object
51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
# File 'lib/cosmos/gui/opengl/stl_reader.rb', line 51 def prep_vertex_arrays @normals = [] @vertexes = [] @triangles.each do |triangle| @normals.concat(triangle[0]) @normals.concat(triangle[0]) @normals.concat(triangle[0]) @vertexes.concat(triangle[1]) @vertexes.concat(triangle[2]) @vertexes.concat(triangle[3]) end @normals_packed = @normals.pack('f*') @vertexes_packed = @vertexes.pack('f*') end |
#process(filename, scaling_factor = 1.0) ⇒ Object
76 77 78 79 80 |
# File 'lib/cosmos/gui/opengl/stl_reader.rb', line 76 def process(filename, scaling_factor = 1.0) build_triangles(filename, scaling_factor) prep_vertex_arrays() draw_triangles() end |
#process_with_progress(filename, scaling_factor = 1.0) ⇒ Object
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
# File 'lib/cosmos/gui/opengl/stl_reader.rb', line 82 def process_with_progress(filename, scaling_factor = 1.0) num_read = 0 if @@files[filename].nil? or !@use_cache @is_ascii = File.is_ascii?(filename) if @file.nil? if @is_ascii @file = File.new(filename, 'r') else @file = File.new(filename, 'rb') end @triangles = [] end num_read = read_triangles(1000, scaling_factor) if num_read == 0 @file.close @file = nil prep_vertex_arrays() draw_triangles() @@files.delete_if {|key, stl_reader| stl_reader == self} @@files[filename] = self end else @triangles = @@files[filename].triangles prep_vertex_arrays() draw_triangles() end return num_read end |
#reset ⇒ Object
122 123 124 125 |
# File 'lib/cosmos/gui/opengl/stl_reader.rb', line 122 def reset @triangles = [] GC.start end |