Class: DataPoint

Inherits:
Object
  • Object
show all
Defined in:
lib/SVG/Graph/DataPoint.rb

Overview

Allows to customize datapoint shapes

Constant Summary collapse

OVERLAY =
"OVERLAY"
DEFAULT_SHAPE =
lambda{|x,y,line| ["circle", {
    "cx" => x,
    "cy" => y,
    "r" => "2.5",
    "class" => "dataPoint#{line}"
  }]
}
CRITERIA =
[]

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(x, y, line) ⇒ DataPoint

creates a new DataPoint

Parameters:

  • x (Numeric)

    x coordinates of the point

  • y (Numeric)

    y coordinates of the point

  • line (Fixnum)

    line index of the current dataset (e.g. when multiple times Graph.add_data()), can be used to reference to the correct css class



41
42
43
44
45
# File 'lib/SVG/Graph/DataPoint.rb', line 41

def initialize(x, y, line)
  @x = x
  @y = y
  @line = line
end

Class Method Details

.configure_shape_criteria(*matchers) ⇒ Object

matchers are class scope. Once configured, each DataPoint instance will have access to the same matchers

Examples:

DataPoint.configure_shape_criteria(
  [/.*/, lambda{|x,y,line| ['polygon', {
    "points" => "#{x-1.5},#{y+2.5} #{x+1.5},#{y+2.5} #{x+1.5},#{y-2.5} #{x-1.5},#{y-2.5}",
    "class" => "dataPoint#{line}"
    }]
  }]
)

Parameters:

  • matchers (Array)

    multiple arrays of the following form: [ regex ,

    lambda taking three arguments (x,y, line_number for css)
      -> return value of the lambda must be an array: [svg tag name,  Hash with attributes for the svg tag, e.g. "points" and "class"]
    

    ]



28
29
30
# File 'lib/SVG/Graph/DataPoint.rb', line 28

def DataPoint.configure_shape_criteria(*matchers)
  CRITERIA.push(*matchers)
end

.reset_shape_criteriaObject



33
34
35
# File 'lib/SVG/Graph/DataPoint.rb', line 33

def DataPoint.reset_shape_criteria
  CRITERIA.clear
end

Instance Method Details

#shape(description = nil) ⇒ Array<Array>

Returns see example.

Examples:

Return value

# two dimensional array, the splatted (*) inner array can be used as argument to REXML::add_element
[["svgtag",  {"points" => "", "class"=> "dataPoint#{line}" } ], ["svgtag", {"points"=>"", "class"=> ""}], ...]

Returns:

  • (Array<Array>)

    see example



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/SVG/Graph/DataPoint.rb', line 56

def shape(description=nil)
  # select all criteria with size 2, and collect rendered lambdas in an array 
  shapes = CRITERIA.select {|criteria|
    criteria.size == 2
  }.collect {|regexp, proc|
    proc.call(@x, @y, @line) if description =~ regexp
  }.compact
  # if above did not render anything use the defalt shape
  shapes = [DEFAULT_SHAPE.call(@x, @y, @line)] if shapes.empty?

  overlays = CRITERIA.select { |criteria|
    criteria.last == OVERLAY
  }.collect { |regexp, proc|
    proc.call(@x, @y, @line) if description =~ regexp
  }.compact

  return shapes + overlays
end