class GraphImageDrawerRmagick

Public Instance Methods

axis(x_array, y_array, _options = { :color => 'black', :width => 1 }, render_labels = false, x_labels = [], y_labels = []) click to toggle source

Draw both array axis

# File lib/technical_graph/graph_image_drawer_rmagick.rb, line 86
def axis(x_array, y_array, _options = { :color => 'black', :width => 1 }, render_labels = false, x_labels = [], y_labels = [])
  # for single axis
  x_array = [x_array] if not x_array.kind_of? Array
  y_array = [y_array] if not y_array.kind_of? Array

  plot_axis = axis_draw_object
  plot_axis.stroke(_options[:color])
  plot_axis.stroke_width(_options[:width])
  plot_axis_text = layer_no_stroke(plot_axis)
  plot_axis_text.fill(_options[:color])

  x_array.each_with_index do |x, i|
    plot_axis.line(x, 0, x, height)

    # labels
    label = x_labels[i]
    if render_labels and not label.nil?
      label = "#{truncate_string % label}"
      plot_axis_text.text(x + 15, height - 15, label)
    end
  end

  y_array.each_with_index do |y, i|
    plot_axis.line(0, y, width, y)

    # labels
    label = y_labels[i]
    if render_labels and not label.nil?
      label = "#{truncate_string % label}"
      plot_axis_text.text(15, y + 15, label)
    end
  end

  plot_axis.draw(@image)
  plot_axis_text.draw(@image)
end
axis_draw_object() click to toggle source

Layer used for drawing axis

# File lib/technical_graph/graph_image_drawer_rmagick.rb, line 23
def axis_draw_object
  plot_axis = Magick::Draw.new

  plot_axis.stroke_antialias(options[:antialias])
  plot_axis.text_antialias(options[:antialias])
  plot_axis.fill_opacity(1.0)
  plot_axis.stroke(options[:axis_color])
  plot_axis.stroke_opacity(1.0)
  plot_axis.stroke_width(1.0)
  plot_axis.stroke_linecap('square')
  plot_axis.stroke_linejoin('miter')

  plot_axis.pointsize(options[:axis_font_size])
  plot_axis.font_family('helvetica')
  plot_axis.font_style(Magick::NormalStyle)
  plot_axis.text_align(Magick::LeftAlign)
  plot_axis.text_undercolor(options[:background_color])

  return plot_axis
end
axis_labels(parameter_label, value_label, _options = { :color => 'black', :width => 1, :size => 20 }) click to toggle source

Label for parameters and values

# File lib/technical_graph/graph_image_drawer_rmagick.rb, line 124
def axis_labels(parameter_label, value_label, _options = { :color => 'black', :width => 1, :size => 20 })
  if options[:x_axis_label].to_s.size > 0
    plot = axis_labels_draw_object
    plot.stroke(_options[:color])
    plot.stroke_width(0.0)
    plot.fill_opacity(1.0)
    plot.stroke_opacity(0.0)

    plot.text(
      (width / 2).to_i,
      height - 40,
      options[:x_axis_label].to_s
    )
    plot.draw(@image)
  end


  if options[:y_axis_label].to_s.size > 0
    plot = axis_labels_draw_object
    plot.stroke(_options[:color])
    plot.stroke_width(0.0)
    plot.fill_opacity(1.0)
    plot.stroke_opacity(0.0)
    plot = plot.rotate(90)

    plot.text(
      (height / 2).to_i,
      -40,
      options[:y_axis_label].to_s
    )
    plot.draw(@image)
  end
end
axis_labels_draw_object() click to toggle source

Layer used for drawing main labels (parameter, value)

# File lib/technical_graph/graph_image_drawer_rmagick.rb, line 45
def axis_labels_draw_object
  draw = axis_draw_object
  draw.pointsize(options[:axis_label_font_size])
  draw.font_style(Magick::NormalStyle)
  draw.text_align(Magick::CenterAlign)

  return draw
end
close() click to toggle source
# File lib/technical_graph/graph_image_drawer_rmagick.rb, line 212
def close
  # only for compatibility
  @closed = true
end
closed?() click to toggle source
# File lib/technical_graph/graph_image_drawer_rmagick.rb, line 217
def closed?
  @closed
end
create_blank_image() click to toggle source
# File lib/technical_graph/graph_image_drawer_rmagick.rb, line 8
def create_blank_image
  @image = Magick::ImageList.new
  @image.new_image(
    width,
    height,
    Magick::HatchFill.new(
      options[:background_color],
      options[:background_hatch_color]
    )
  )

  return @image
end
layer_draw_object(layer) click to toggle source

Layer used for drawing chart, lines and dots

# File lib/technical_graph/graph_image_drawer_rmagick.rb, line 62
def layer_draw_object(layer)
  draw = axis_draw_object
  draw.fill(layer.color)
  draw.stroke(layer.color)
  return draw
end
layer_no_fill(_draw) click to toggle source

Create no-fill draw object

# File lib/technical_graph/graph_image_drawer_rmagick.rb, line 78
def layer_no_fill(_draw)
  draw = _draw.clone
  draw.fill_opacity(0.0)
  return draw
end
layer_no_stroke(_draw) click to toggle source

Create no-stroke draw object

# File lib/technical_graph/graph_image_drawer_rmagick.rb, line 70
def layer_no_stroke(_draw)
  draw = _draw.clone
  draw.stroke_opacity(0.0)
  draw.stroke_width(0.0)
  return draw
end
layer_value_labels_draw_object(layer) click to toggle source

Layer used for drawing value labels

# File lib/technical_graph/graph_image_drawer_rmagick.rb, line 55
def layer_value_labels_draw_object(layer)
  draw = axis_draw_object
  draw.pointsize(options[:layers_font_size])
  return draw
end
legend(legend_data) click to toggle source
# File lib/technical_graph/graph_image_drawer_rmagick.rb, line 192
def legend(legend_data)
  legend_text_offset = (options[:legend_font_size] / 2.0).round - 4

  legend_data.each do |l|
    plot = axis_draw_object
    plot_text = layer_no_stroke(plot)

    plot.fill(l[:color])
    plot.stroke(l[:color])
    plot_text.fill(l[:color])
    plot_text.pointsize(options[:legend_font_size])

    plot.circle(l[:x], l[:y], l[:x] + 2, l[:y])
    plot_text.text(l[:x] + 5, l[:y] + legend_text_offset, l[:label])

    plot.draw(@image)
    plot_text.draw(@image)
  end
end
render_data_layer(l, coords) click to toggle source
# File lib/technical_graph/graph_image_drawer_rmagick.rb, line 158
def render_data_layer(l, coords)
  # value labels
  if l.value_labels
    plot = layer_no_stroke(layer_value_labels_draw_object(l))
    coords.each do |c|
      string_label = "#{truncate_string % c[:dy]}"
      plot.text(
        c[:ax] + 5, c[:ay],
        string_label
      )
    end
    plot.draw(@image)
  end

  # lines and dots
  plot = layer_draw_object(l)
  coords.each do |c|
    # additional circle
    plot.circle(c[:ax], c[:ay], c[:ax] + 2, c[:ay])
    plot.circle(c[:bx], c[:by], c[:bx] + 2, c[:by])

    # line
    plot.line(
      c[:ax], c[:ay],
      c[:bx], c[:by]
    )

    drawer.post_dot_drawn(c[:ax], c[:ay])
    drawer.post_dot_drawn(c[:bx], c[:by])
  end
  plot.draw(@image)
end
save(file) click to toggle source

Save output to file

# File lib/technical_graph/graph_image_drawer_rmagick.rb, line 222
def save(file)
  t = Time.now

  @image.write(file)

  logger.debug "saving image"
  logger.debug " TIME COST #{Time.now - t}"
end
to_format(format) click to toggle source

Export image

# File lib/technical_graph/graph_image_drawer_rmagick.rb, line 232
def to_format(format)
  t = Time.now
  i = @image.flatten_images
  i.format = format
  blob = i.to_blob

  logger.debug "exporting image as string"
  logger.debug " TIME COST #{Time.now - t}"

  return blob
end