lib/cosmos/gui/opengl/stl_shape.rb in cosmos-3.5.1 vs lib/cosmos/gui/opengl/stl_shape.rb in cosmos-3.5.2

- old
+ new

@@ -1,124 +1,124 @@ -# encoding: ascii-8bit - -# Copyright 2014 Ball Aerospace & Technologies Corp. -# All Rights Reserved. -# -# This program is free software; you can modify and/or redistribute it -# under the terms of the GNU General Public License -# as published by the Free Software Foundation; version 3 with -# attribution addendums as found in the LICENSE.txt - -require 'cosmos/gui/opengl/gl_shape' -require 'cosmos/gui/opengl/stl_reader' -require 'cosmos/gui/dialogs/progress_dialog' - -module Cosmos - - class StlShape < GlShape - @@splash = nil - - attr_accessor :stl_file - attr_accessor :stl_scaling_factor - attr_accessor :show_load_progress - attr_accessor :window - - def initialize(x, y, z) - super(x, y, z) - @mystl = StlReader.new - @show_load_progress = false - @stl_scaling_factor = 1.0 - @stl_file = nil - @progress_dialog = nil - end - - def load_stl - if @show_load_progress - load_setup() - estimate = @mystl.estimate_num_triangles(@stl_file) - total_read = 0 - num_read = 1 - while num_read > 0 - num_read = @mystl.process_with_progress(@stl_file, @stl_scaling_factor) - total_read += num_read - progress = total_read.to_f / estimate.to_f - if @@splash - @@splash.progress = progress - else - @progress_dialog.set_overall_progress(progress) - end - end - @progress_dialog.dispose if @progress_dialog - @progress_dialog = nil - else - @mystl.process(@stl_file, @stl_scaling_factor) - end - end - - # Draw the StlShape - def drawshape(viewer) - @viewer = viewer - - GL.PushMatrix - GL.Enable(GL::BLEND) - GL.BlendFunc(GL::SRC_ALPHA, GL::ONE_MINUS_SRC_ALPHA) - GL.Color4f(@color[0], @color[1], @color[2], @color[3]) - GL.Rotate(@rotation_x, 1.0, 0.0, 0.0) if @rotation_x - GL.Rotate(@rotation_y, 0.0, 1.0, 0.0) if @rotation_y - GL.Rotate(@rotation_z, 0.0, 0.0, 1.0) if @rotation_z - GL.Material(GL::FRONT_AND_BACK, GL::AMBIENT_AND_DIFFUSE, @color) - draw_stl() - GL.Disable(GL::BLEND) - GL.PopMatrix - end - - def export - string = "STL_FILE \"#{@stl_file}\" #{@stl_scaling_factor}\n" - string << " TIP_TEXT \"#{@tipText}\"\n" if @tipText - string << " COLOR #{color[0]} #{color[1]} #{color[2]} #{color[3]}\n" - string << " POSITION #{self.position[0]} #{self.position[1]} #{self.position[2]}\n" - string << " ROTATION_X #{@rotation_x}\n" if @rotation_x - string << " ROTATION_Y #{@rotation_y}\n" if @rotation_y - string << " ROTATION_Z #{@rotation_z}\n" if @rotation_z - return string - end - - def self.splash=(splash) - @@splash = splash - end - - protected - - def load_setup - @box = nil - @bar = nil - - unless @@splash - @progress_dialog = ProgressDialog.new(Qt::CoreApplication.instance.activeWindow, "Loading STL File", 500, 300, true, false, true, false, false) - @progress_dialog.show - @progress_dialog.raise - @progress_dialog.append_text("Loading #{@stl_file}") - @progress_dialog.set_overall_progress(0.0) - else - @@splash.message = "Loading #{@stl_file}" - @@splash.progress = 0.0 - end - end - - def draw_stl - GL.PushMatrix - GL.Material(GL::FRONT_AND_BACK, GL::SPECULAR, [1.0, 1.0, 1.0]) - GL.Material(GL::FRONT_AND_BACK, GL::SHININESS, [100.0]) - if @mystl.triangles.empty? - load_stl - else - @mystl.draw_triangles() - end - GL.PopMatrix - - # Set Pixel Storage Size - GL.PixelStorei(GL::UNPACK_ALIGNMENT, 1) - end - - end # StlShape - -end # module Cosmos +# encoding: ascii-8bit + +# Copyright 2014 Ball Aerospace & Technologies Corp. +# All Rights Reserved. +# +# This program is free software; you can modify and/or redistribute it +# under the terms of the GNU General Public License +# as published by the Free Software Foundation; version 3 with +# attribution addendums as found in the LICENSE.txt + +require 'cosmos/gui/opengl/gl_shape' +require 'cosmos/gui/opengl/stl_reader' +require 'cosmos/gui/dialogs/progress_dialog' + +module Cosmos + + class StlShape < GlShape + @@splash = nil + + attr_accessor :stl_file + attr_accessor :stl_scaling_factor + attr_accessor :show_load_progress + attr_accessor :window + + def initialize(x, y, z) + super(x, y, z) + @mystl = StlReader.new + @show_load_progress = false + @stl_scaling_factor = 1.0 + @stl_file = nil + @progress_dialog = nil + end + + def load_stl + if @show_load_progress + load_setup() + estimate = @mystl.estimate_num_triangles(@stl_file) + total_read = 0 + num_read = 1 + while num_read > 0 + num_read = @mystl.process_with_progress(@stl_file, @stl_scaling_factor) + total_read += num_read + progress = total_read.to_f / estimate.to_f + if @@splash + @@splash.progress = progress + else + @progress_dialog.set_overall_progress(progress) + end + end + @progress_dialog.dispose if @progress_dialog + @progress_dialog = nil + else + @mystl.process(@stl_file, @stl_scaling_factor) + end + end + + # Draw the StlShape + def drawshape(viewer) + @viewer = viewer + + GL.PushMatrix + GL.Enable(GL::BLEND) + GL.BlendFunc(GL::SRC_ALPHA, GL::ONE_MINUS_SRC_ALPHA) + GL.Color4f(@color[0], @color[1], @color[2], @color[3]) + GL.Rotate(@rotation_x, 1.0, 0.0, 0.0) if @rotation_x + GL.Rotate(@rotation_y, 0.0, 1.0, 0.0) if @rotation_y + GL.Rotate(@rotation_z, 0.0, 0.0, 1.0) if @rotation_z + GL.Material(GL::FRONT_AND_BACK, GL::AMBIENT_AND_DIFFUSE, @color) + draw_stl() + GL.Disable(GL::BLEND) + GL.PopMatrix + end + + def export + string = "STL_FILE \"#{@stl_file}\" #{@stl_scaling_factor}\n" + string << " TIP_TEXT \"#{@tipText}\"\n" if @tipText + string << " COLOR #{color[0]} #{color[1]} #{color[2]} #{color[3]}\n" + string << " POSITION #{self.position[0]} #{self.position[1]} #{self.position[2]}\n" + string << " ROTATION_X #{@rotation_x}\n" if @rotation_x + string << " ROTATION_Y #{@rotation_y}\n" if @rotation_y + string << " ROTATION_Z #{@rotation_z}\n" if @rotation_z + return string + end + + def self.splash=(splash) + @@splash = splash + end + + protected + + def load_setup + @box = nil + @bar = nil + + unless @@splash + @progress_dialog = ProgressDialog.new(Qt::CoreApplication.instance.activeWindow, "Loading STL File", 500, 300, true, false, true, false, false) + @progress_dialog.show + @progress_dialog.raise + @progress_dialog.append_text("Loading #{@stl_file}") + @progress_dialog.set_overall_progress(0.0) + else + @@splash.message = "Loading #{@stl_file}" + @@splash.progress = 0.0 + end + end + + def draw_stl + GL.PushMatrix + GL.Material(GL::FRONT_AND_BACK, GL::SPECULAR, [1.0, 1.0, 1.0]) + GL.Material(GL::FRONT_AND_BACK, GL::SHININESS, [100.0]) + if @mystl.triangles.empty? + load_stl + else + @mystl.draw_triangles() + end + GL.PopMatrix + + # Set Pixel Storage Size + GL.PixelStorei(GL::UNPACK_ALIGNMENT, 1) + end + + end # StlShape + +end # module Cosmos