gerbilcharts 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. data/History.txt +11 -0
  2. data/License.txt +21 -0
  3. data/Manifest.txt +75 -0
  4. data/PostInstall.txt +7 -0
  5. data/README.txt +174 -0
  6. data/Rakefile +4 -0
  7. data/lib/gerbilcharts.rb +18 -0
  8. data/lib/gerbilcharts/charts.rb +16 -0
  9. data/lib/gerbilcharts/charts/area_chart.rb +36 -0
  10. data/lib/gerbilcharts/charts/bar_chart.rb +33 -0
  11. data/lib/gerbilcharts/charts/bar_chart_compact.rb +26 -0
  12. data/lib/gerbilcharts/charts/chart_base.rb +123 -0
  13. data/lib/gerbilcharts/charts/impulse_chart.rb +30 -0
  14. data/lib/gerbilcharts/charts/line_chart.rb +35 -0
  15. data/lib/gerbilcharts/charts/stacked_area_chart.rb +31 -0
  16. data/lib/gerbilcharts/models.rb +19 -0
  17. data/lib/gerbilcharts/models/bucketized_timeseries_graph_model.rb +138 -0
  18. data/lib/gerbilcharts/models/discrete_time_range.rb +63 -0
  19. data/lib/gerbilcharts/models/graph_model.rb +89 -0
  20. data/lib/gerbilcharts/models/graph_model_group.rb +240 -0
  21. data/lib/gerbilcharts/models/monotonous_graph_model.rb +192 -0
  22. data/lib/gerbilcharts/models/presets.rb +94 -0
  23. data/lib/gerbilcharts/models/raw_range.rb +68 -0
  24. data/lib/gerbilcharts/models/round_range.rb +104 -0
  25. data/lib/gerbilcharts/models/round_time_range.rb +105 -0
  26. data/lib/gerbilcharts/models/sampled_timeseries_graph_model.rb +80 -0
  27. data/lib/gerbilcharts/models/simple_timeseries_model_group.rb +68 -0
  28. data/lib/gerbilcharts/models/time_series_graph_model.rb +34 -0
  29. data/lib/gerbilcharts/public/brushmetal.css +197 -0
  30. data/lib/gerbilcharts/public/gerbil.js +327 -0
  31. data/lib/gerbilcharts/surfaces.rb +32 -0
  32. data/lib/gerbilcharts/surfaces/area_surface.rb +46 -0
  33. data/lib/gerbilcharts/surfaces/axis.rb +31 -0
  34. data/lib/gerbilcharts/surfaces/bar_surface.rb +62 -0
  35. data/lib/gerbilcharts/surfaces/basic_grid.rb +17 -0
  36. data/lib/gerbilcharts/surfaces/chart.rb +132 -0
  37. data/lib/gerbilcharts/surfaces/graph_element.rb +170 -0
  38. data/lib/gerbilcharts/surfaces/grid.rb +38 -0
  39. data/lib/gerbilcharts/surfaces/horizontal_axis.rb +32 -0
  40. data/lib/gerbilcharts/surfaces/horizontal_name_axis.rb +28 -0
  41. data/lib/gerbilcharts/surfaces/horizontal_time_axis.rb +25 -0
  42. data/lib/gerbilcharts/surfaces/impulse_surface.rb +47 -0
  43. data/lib/gerbilcharts/surfaces/legend.rb +59 -0
  44. data/lib/gerbilcharts/surfaces/line_surface.rb +53 -0
  45. data/lib/gerbilcharts/surfaces/mark_band.rb +17 -0
  46. data/lib/gerbilcharts/surfaces/panel.rb +17 -0
  47. data/lib/gerbilcharts/surfaces/pie_surface.rb +16 -0
  48. data/lib/gerbilcharts/surfaces/rect.rb +86 -0
  49. data/lib/gerbilcharts/surfaces/stacked_area_surface.rb +66 -0
  50. data/lib/gerbilcharts/surfaces/stacked_grid.rb +15 -0
  51. data/lib/gerbilcharts/surfaces/surface.rb +20 -0
  52. data/lib/gerbilcharts/surfaces/surface_background.rb +13 -0
  53. data/lib/gerbilcharts/surfaces/title_panel.rb +44 -0
  54. data/lib/gerbilcharts/surfaces/tracker.rb +62 -0
  55. data/lib/gerbilcharts/surfaces/vertical_axis.rb +46 -0
  56. data/lib/gerbilcharts/svgdc.rb +22 -0
  57. data/lib/gerbilcharts/svgdc/filters.rb +40 -0
  58. data/lib/gerbilcharts/svgdc/presentation_attributes.rb +50 -0
  59. data/lib/gerbilcharts/svgdc/svg_circle.rb +22 -0
  60. data/lib/gerbilcharts/svgdc/svg_custom_win.rb +36 -0
  61. data/lib/gerbilcharts/svgdc/svg_element.rb +87 -0
  62. data/lib/gerbilcharts/svgdc/svg_line.rb +26 -0
  63. data/lib/gerbilcharts/svgdc/svg_polygon.rb +34 -0
  64. data/lib/gerbilcharts/svgdc/svg_polyline.rb +27 -0
  65. data/lib/gerbilcharts/svgdc/svg_rect.rb +29 -0
  66. data/lib/gerbilcharts/svgdc/svg_shape.rb +10 -0
  67. data/lib/gerbilcharts/svgdc/svg_text.rb +21 -0
  68. data/lib/gerbilcharts/svgdc/svg_win.rb +52 -0
  69. data/lib/gerbilcharts/svgdc/svgdc.rb +335 -0
  70. data/lib/gerbilcharts/svgdc/transformations.rb +66 -0
  71. data/lib/gerbilcharts/version.rb +9 -0
  72. data/setup.rb +1585 -0
  73. data/test/test_Scratch.rb +21 -0
  74. data/test/test_charts.rb +119 -0
  75. data/test/test_gerbilcharts.rb +11 -0
  76. data/test/test_helper.rb +2 -0
  77. data/test/test_models.rb +118 -0
  78. data/test/test_noob.rb +81 -0
  79. data/test/test_ranges.rb +135 -0
  80. data/test/test_svgdc.rb +221 -0
  81. data/test/trafgen.rb +25 -0
  82. metadata +156 -0
@@ -0,0 +1,30 @@
1
+ module GerbilCharts::Charts
2
+
3
+ # =Impulse Chart
4
+ #
5
+ # Each data point is represented by a thin line whose height is proportional to the value.
6
+ class ImpulseChart < ChartBase
7
+
8
+ def initialize(opt={})
9
+ super(opt)
10
+ end
11
+
12
+ def create_chart_elements
13
+
14
+ # other elements
15
+ @thechart.add_child(GerbilCharts::Surfaces::SurfaceBackground.new(:orient => ORIENT_OVERLAY))
16
+ @thechart.add_child(GerbilCharts::Surfaces::BasicGrid.new(:orient => ORIENT_OVERLAY))
17
+ @thechart.add_child(GerbilCharts::Surfaces::TitlePanel.new(:orient => ORIENT_OVERLAY, :dim => 30))
18
+ @thechart.add_child(GerbilCharts::Surfaces::ImpulseSurface.new(:orient => ORIENT_OVERLAY),:anchor => true)
19
+ @thechart.add_child(GerbilCharts::Surfaces::Legend.new(:orient=> ORIENT_OVERLAY, :dim => 100))
20
+ @thechart.add_child(GerbilCharts::Surfaces::VerticalAxis.new(:orient => ORIENT_WEST, :dim => 40 ))
21
+ @thechart.add_child(GerbilCharts::Surfaces::HorizontalTimeAxis.new(:orient => ORIENT_SOUTH, :dim => 25 ))
22
+
23
+ # optional features
24
+ if @feature_timetracker
25
+ @thechart.add_child(GerbilCharts::Surfaces::Tracker.new(:orient => ORIENT_SOUTH, :dim => 10 ))
26
+ end
27
+ end
28
+ end
29
+
30
+ end
@@ -0,0 +1,35 @@
1
+ module GerbilCharts::Charts
2
+
3
+ # =Line Chart
4
+ # Each model is a separate line.
5
+ #
6
+ # options
7
+ #
8
+ # [+width+] Width of the chart (pixels)
9
+ # [+height+] Width of the chart (pixels)
10
+ # [+style+] Stylesheet file to be applied
11
+ #
12
+ # global visual options
13
+ # [+circle_data_points] draw a solid circle around each data point
14
+ #
15
+ class LineChart < ChartBase
16
+
17
+
18
+ def initialize(opt={})
19
+ super(opt)
20
+ end
21
+
22
+ def create_chart_elements
23
+
24
+ # other elements
25
+ @thechart.add_child(GerbilCharts::Surfaces::SurfaceBackground.new(:orient => ORIENT_OVERLAY))
26
+ @thechart.add_child(GerbilCharts::Surfaces::BasicGrid.new(:orient => ORIENT_OVERLAY))
27
+ @thechart.add_child(GerbilCharts::Surfaces::TitlePanel.new(:orient => ORIENT_OVERLAY, :dim => 30))
28
+ @thechart.add_child(GerbilCharts::Surfaces::LineSurface.new(:orient => ORIENT_OVERLAY),:anchor => true)
29
+ @thechart.add_child(GerbilCharts::Surfaces::Legend.new(:orient=> ORIENT_OVERLAY, :dim => 100))
30
+ @thechart.add_child(GerbilCharts::Surfaces::VerticalAxis.new(:orient => ORIENT_WEST, :dim => 30 ))
31
+ @thechart.add_child(GerbilCharts::Surfaces::HorizontalTimeAxis.new(:orient => ORIENT_SOUTH, :dim => 25 ))
32
+ end
33
+ end
34
+
35
+ end
@@ -0,0 +1,31 @@
1
+ module GerbilCharts::Charts
2
+
3
+ # = StackedAreaChart
4
+ # The models are stacked on top of each other !
5
+ #
6
+ class StackedAreaChart < ChartBase
7
+
8
+ def initialize(opt={})
9
+ super(opt)
10
+ end
11
+
12
+ def create_chart_elements
13
+
14
+ # other elements
15
+ @thechart.add_child(GerbilCharts::Surfaces::SurfaceBackground.new(:orient => ORIENT_OVERLAY))
16
+ @thechart.add_child(GerbilCharts::Surfaces::StackedGrid.new(:orient => ORIENT_OVERLAY))
17
+ @thechart.add_child(GerbilCharts::Surfaces::TitlePanel.new(:orient => ORIENT_OVERLAY, :dim => 30))
18
+ @thechart.add_child(GerbilCharts::Surfaces::StackedAreaSurface.new(:orient => ORIENT_OVERLAY),:anchor => true)
19
+ @thechart.add_child(GerbilCharts::Surfaces::Legend.new(:orient=> ORIENT_OVERLAY, :dim => 100))
20
+ @thechart.add_child(GerbilCharts::Surfaces::VerticalAxis.new(:orient => ORIENT_WEST, :dim => 40 , :cumulative => true ))
21
+ @thechart.add_child(GerbilCharts::Surfaces::HorizontalTimeAxis.new(:orient => ORIENT_SOUTH, :dim => 25 ))
22
+
23
+ # optional features
24
+ if @feature_timetracker
25
+ @thechart.add_child(GerbilCharts::Surfaces::Tracker.new(:orient => ORIENT_SOUTH, :dim => 10 ))
26
+ end
27
+ end
28
+ end
29
+
30
+ end
31
+
@@ -0,0 +1,19 @@
1
+ # == GerbilCharts data models
2
+ #
3
+ # Models feeds your gerbil charts with data
4
+ #
5
+
6
+ module GerbilCharts::Models; end;
7
+
8
+ require 'gerbilcharts/models/presets'
9
+ require 'gerbilcharts/models/raw_range'
10
+ require 'gerbilcharts/models/round_range'
11
+ require 'gerbilcharts/models/round_time_range'
12
+ require 'gerbilcharts/models/discrete_time_range'
13
+ require 'gerbilcharts/models/graph_model'
14
+ require 'gerbilcharts/models/graph_model_group'
15
+ require 'gerbilcharts/models/monotonous_graph_model'
16
+ require 'gerbilcharts/models/time_series_graph_model'
17
+ require 'gerbilcharts/models/bucketized_timeseries_graph_model'
18
+ require 'gerbilcharts/models/sampled_timeseries_graph_model'
19
+ require 'gerbilcharts/models/simple_timeseries_model_group'
@@ -0,0 +1,138 @@
1
+ module GerbilCharts::Models
2
+
3
+ # == BucketizedTimeSeriedGraphMode
4
+ #
5
+ # Automatically bucketizes incoming timeseries data into predefined buckets
6
+ #
7
+ # [+name+] Name of the model
8
+ # [+bucketsec+] Bucket size in seconds
9
+ # [+opts+] Model options hash
10
+ #
11
+ class BucketizedTimeSeriesGraphModel < TimeSeriesGraphModel
12
+
13
+ attr_reader :bucket_size_secs # current bucket size
14
+ attr_reader :behavior # :average or :max
15
+ attr_reader :last_sweep_pos # :nodoc:
16
+
17
+ def initialize(name,bucketsec, opt={})
18
+ super(name,opt)
19
+ @bucket_size_secs=bucketsec
20
+ @samp_count =0
21
+ @behavior = :average
22
+ @last_sweep_pos=0
23
+ end
24
+
25
+ def sweep_interval
26
+ return @bucket_size_secs
27
+ end
28
+
29
+ # add
30
+ # [+x_val+] A Time object
31
+ # [+y_val+] Value
32
+ #
33
+ # This will be bucketized by the model automatically
34
+ #
35
+ def add(x_tm,y_val)
36
+ buckettm_in = to_buckettime(x_tm)
37
+
38
+ # first time
39
+ if @xarr.length==0
40
+ super(buckettm_in,y_val)
41
+ @samp_count=1
42
+ return
43
+ end
44
+
45
+
46
+ # subsequent times
47
+ if buckettm_in== latest_x
48
+ ynew = bucketize(y_val)
49
+ else
50
+ npad = bucket_diff(latest_x,buckettm_in)
51
+ if (npad > 1)
52
+ pad_empty_buckets(latest_x,npad-1)
53
+ end
54
+ super(buckettm_in,y_val)
55
+ @samp_count=1
56
+ end
57
+ end
58
+
59
+ # to_buckettime
60
+ #
61
+ # [+tv+] A Time object
62
+ #
63
+ # returns the time floor of the bucket this belongs to
64
+ # example 8:06 AM will belong to the 8:05AM bucket if bucketsize = 5 min
65
+ #
66
+ def to_buckettime(tv)
67
+ exp=tv.tv_sec.divmod(@bucket_size_secs)
68
+
69
+ if exp[1] >= @bucket_size_secs/2
70
+ return Time.at(exp[0]*@bucket_size_secs + @bucket_size_secs)
71
+ else
72
+ return Time.at(exp[0]*@bucket_size_secs)
73
+ end
74
+ end
75
+
76
+ # how many buckets separate the two buckettimes
77
+ def bucket_diff(tv1,tv2)
78
+ return (tv2-tv1).abs / @bucket_size_secs
79
+ end
80
+
81
+ # insert zero values to represent missing time buckets
82
+ def pad_empty_buckets(tv_first,count)
83
+ for i in (1..count)
84
+ @yarr << 0
85
+ @xarr << tv_first + i*@bucket_size_secs
86
+ end
87
+ end
88
+
89
+ # accumulate last item
90
+ def bucketize(val)
91
+
92
+ if @behavior == :average
93
+ cval = @yarr.last
94
+ cval = (cval * @samp_count) + val
95
+ cval /= (@samp_count+1)
96
+ @yarr[@yarr.length-1]=cval
97
+ @samp_count += 1
98
+ elsif @behavior == :maxima
99
+ cval = @yarr.last
100
+ @yarr[@yarr.length-1]=max(cval,val)
101
+ end
102
+ return @yarr.last
103
+
104
+ end
105
+
106
+ # begin a sweep session
107
+ def begin_sweep
108
+ @last_sweep_pos=0
109
+ end
110
+
111
+ # sweep this bucket
112
+ def sweep(tval)
113
+
114
+ return 0 if @xarr.length == 0
115
+ return 0 if @last_sweep_pos >= @xarr.length
116
+
117
+
118
+ xv=@xarr[@last_sweep_pos]
119
+ if tval < xv
120
+ return 0
121
+ elsif tval == xv
122
+ @last_sweep_pos+=1
123
+ rval = @yarr[@last_sweep_pos-1]
124
+ else
125
+ nBucks=bucket_diff(xv,tval)
126
+ @last_sweep_pos+= nBucks
127
+ end
128
+ return rval.nil? ? 0:rval
129
+
130
+ end
131
+
132
+
133
+ end
134
+
135
+
136
+ end
137
+
138
+
@@ -0,0 +1,63 @@
1
+ module GerbilCharts::Models
2
+
3
+ # =DiscreteTimeRange
4
+ # The range is exactly as specified by individual values.
5
+ # The labels are simply those values formatted based on overall time window
6
+ #
7
+ class DiscreteTimeRange
8
+
9
+ attr_reader :points #discrete points
10
+
11
+ def initialize(points_arr=[])
12
+ @points=points_arr
13
+ end
14
+
15
+ # provide labels
16
+ # Yields two items (value - seconds since Jan 1 1970, string label)
17
+ def each_label
18
+ @points.each do |t|
19
+ yield t, format_value(t)
20
+ end
21
+ end
22
+
23
+ # provide ticks (per label interval)
24
+ def each_tick(tpl)
25
+ @points.each do |t|
26
+ yield v
27
+ end
28
+ end
29
+
30
+ # format min value completely
31
+ def format_min_value
32
+ return format_value(@points.first)
33
+ end
34
+
35
+
36
+ # scales a value with respect to the range
37
+ def scale_factor(val)
38
+ df = val - @points.first
39
+ rg = @points.last - @points.first
40
+ return 0 if rg==0.0
41
+ return df/rg
42
+ end
43
+
44
+
45
+ # format the discrete time value
46
+ def format_value(val)
47
+ df = @points.last - @points.first
48
+
49
+ if df > 2*24*30 # > 2months get monthly labels
50
+ val.strftime("%b")
51
+ elsif df > 1*24*30 # 1-2 months get days
52
+ val.strftime("%b %d")
53
+ elsif df > 1*24*7 # > 1 week get days
54
+ val.strftime("%a")
55
+ else
56
+ val.to_s
57
+ end
58
+ end
59
+
60
+
61
+ end
62
+
63
+ end
@@ -0,0 +1,89 @@
1
+ module GerbilCharts::Models
2
+
3
+ # GraphModel - Basic interface to a model in GerbilCharts
4
+ #
5
+ # You can create your own model as long as all the methods here are implemented
6
+ # or you can use one of the predefined graph models.
7
+ #
8
+ #
9
+ class GraphModel
10
+
11
+ attr_accessor :name # name of the model (eg, "backup_server")
12
+ attr_accessor :altname # alternate name
13
+ attr_reader :href # href for interactive use
14
+ attr_reader :userdata # any user object
15
+ attr_reader :userlabel1 # map to tooltip 1
16
+ attr_reader :userlabel2 # map to tooltip 2
17
+ attr_reader :transformer # value transformer (a lambda function)
18
+
19
+ def initialize(n="Untitled")
20
+ @name=n
21
+ @transformer = nil
22
+ end
23
+
24
+ def min_max_x
25
+ yield 0,0
26
+ end
27
+
28
+ def min_max_y
29
+ yield 0,0
30
+ end
31
+
32
+ def each_value_pair
33
+ yield 0,0
34
+ end
35
+
36
+ def count
37
+ 0
38
+ end
39
+
40
+ # clean up the href (todo: improve this)
41
+ def setHref(h)
42
+ h1=h.gsub("{","%7B")
43
+ @href=h1.gsub("}","%7D")
44
+ end
45
+
46
+ def hasHref?
47
+ return @href != nil
48
+ end
49
+
50
+ def setUserData(d)
51
+ @userdata=d
52
+ end
53
+
54
+ def hasUserData?
55
+ return @userdata != nil
56
+ end
57
+
58
+ def hasUserTips?
59
+ return @userlabel1 != nil
60
+ end
61
+
62
+ def setUserTip1(t)
63
+ @userlabel1=t
64
+ @userlabel2="" if @userlabel2.nil?
65
+ end
66
+
67
+ def setUserTip2(t)
68
+ @userlabel2=t
69
+ @userlabel1="" if @userlabel1.nil?
70
+ end
71
+
72
+ def updateOptions(opts)
73
+ @name = opts[:name] if opts[:name]
74
+ end
75
+
76
+ def recreate
77
+ # no op (override this)
78
+ end
79
+
80
+ def transformer=(trlambda)
81
+ @transformer = trlambda
82
+ end
83
+
84
+ def is_timeseries?
85
+ return false
86
+ end
87
+ end
88
+
89
+ end
@@ -0,0 +1,240 @@
1
+ module GerbilCharts::Models
2
+
3
+ # GraphModelGroup - a bunch of related models that are targeted at a
4
+ # single output surface
5
+ #
6
+ class GraphModelGroup
7
+
8
+ attr_accessor :models
9
+ attr_accessor :name
10
+ attr_accessor :href
11
+ attr_accessor :emptycaption
12
+ attr_accessor :units
13
+
14
+ def initialize(n="Untitled-Group")
15
+ @models=[]
16
+ @name=n
17
+ @units=""
18
+ end
19
+
20
+ def <<(m)
21
+ @models << m
22
+ end
23
+
24
+ def add(m)
25
+ @models << m
26
+ end
27
+
28
+ def delete(m)
29
+ @models.delete(m)
30
+ end
31
+
32
+ def delete_by_index(i)
33
+ @models.delete_at(i)
34
+ end
35
+
36
+ def set_null(i)
37
+ @models[i]=nil
38
+ end
39
+
40
+ def compact_models
41
+ @models.compact!
42
+ end
43
+
44
+ def count
45
+ return @models.size
46
+ end
47
+
48
+ def each_model
49
+ @models.each do |m|
50
+ yield m
51
+ end
52
+ end
53
+
54
+ def clear_models
55
+ @models.clear
56
+ end
57
+
58
+ # sort options
59
+ # :dir => (:ascending or :descending)
60
+ # :mode => (:latest, :total )
61
+ def sort(opts={})
62
+
63
+ raise "Missing sort direction" if not defined? opts[:dir]
64
+ raise "Missing sort mode" if not defined? opts[:mode]
65
+
66
+ @models.sort! { |m1,m2| m1.latest_val <=> m2.latest_val }
67
+
68
+ @models.reverse! if opts[:dir] == :descending
69
+
70
+ end
71
+
72
+ # each model, index over code block
73
+ def each_model_with_index
74
+ @models.each_with_index do |m,i|
75
+ yield m,i
76
+ end
77
+ end
78
+
79
+ # each user data over code block
80
+ def each_user_data
81
+ each_model do |mod|
82
+ yield mod.userdata if mod.hasUserData?
83
+ end
84
+ end
85
+
86
+ def effective_round_range
87
+
88
+ if @models.length==0
89
+ return 0,0
90
+ end
91
+
92
+ reffx = RawRange.new
93
+ reffy = RawRange.new
94
+ @models.each do |m|
95
+ reffx.update_r(m.xrange)
96
+ reffy.update_r(m.yrange)
97
+ end
98
+
99
+ return models[0].rounderx.round_given(reffx), models[0].roundery.round_given(reffy)
100
+
101
+ end
102
+
103
+ def effective_round_range_x
104
+
105
+ reffx = RawRange.new
106
+ @models.each do |m|
107
+ reffx.update_r(m.xrange)
108
+ end
109
+
110
+ return models[0].round_given_x(reffx)
111
+ end
112
+
113
+ def effective_round_range_y0
114
+ reffy = RawRange.new
115
+ reffy.zeromin
116
+ @models.each do |m|
117
+ reffy.update_r(m.yrange)
118
+ end
119
+
120
+ return @models[0].round_given_y(reffy)
121
+ end
122
+
123
+ def sweep_interval
124
+ return @models[0].sweep_interval
125
+ end
126
+
127
+ # sum of model ranges
128
+ def cumulative_round_range_y0
129
+ reffy = RawRange.new
130
+ reffy.update(0)
131
+ @models.each do |m|
132
+ reffy.update(m.yrange.rmax+reffy.rmax)
133
+ end
134
+
135
+ return models[0].round_given_y(reffy)
136
+ end
137
+
138
+ # sweep for an interval with max
139
+ def cumulative_sweep_round_range_y0
140
+
141
+ rx = effective_round_range_x
142
+ reffy = RawRange.new
143
+ reffy.zeromin
144
+
145
+ # prepare models for sweeping
146
+ sweep_pos= rx.rmin
147
+ sweep_to = rx.rmax
148
+
149
+ @models.each do | mod|
150
+ mod.begin_sweep
151
+ end
152
+
153
+ # perform the sweep
154
+ while (sweep_pos<=sweep_to)
155
+ acc_y = 0
156
+ @models.each do | mod, i|
157
+ acc_y += mod.sweep(sweep_pos)
158
+ end
159
+ sweep_pos += sweep_interval
160
+ reffy.update(acc_y)
161
+ end
162
+
163
+ return models[0].round_given_y(reffy)
164
+
165
+ end
166
+
167
+ def cumulative_round_range
168
+
169
+ if @models.length==0
170
+ return 0,0
171
+ end
172
+
173
+ reffx = RawRange.new
174
+ reffy = RawRange.new
175
+ @models.each do |m|
176
+ reffx.update_r(m.xrange)
177
+ reffy.update(m.yrange.rmax+reffy.rmax)
178
+ end
179
+
180
+ return models[0].rounderx.round_given(reffx), models[0].roundery.round_given(reffy)
181
+
182
+ end
183
+
184
+ def models_digest
185
+ mnames = ""
186
+ @models.each do |m|
187
+ mnames << m.name
188
+ end
189
+ dig=Digest::MD5.hexdigest(mnames)
190
+ return dig
191
+ end
192
+
193
+ def setSessionKey(k)
194
+ @sessionKey=k
195
+ end
196
+
197
+ def contentKey(sessid,extension)
198
+ return sessid + @sessionKey + "." + extension
199
+ end
200
+
201
+ def setHref(h)
202
+ h1=h.gsub("{","%7B")
203
+ @href=h1.gsub("}","%7D")
204
+ end
205
+
206
+ def hasHref?
207
+ return @href != nil
208
+ end
209
+
210
+ def randomizeModels(mode=:latest_value)
211
+ @models.each do |m|
212
+ if mode==:latest_value
213
+ m.randomizeLastValue
214
+ end
215
+ end
216
+ end
217
+
218
+ # recreate all models with new params
219
+ def recreateModels(new_opts)
220
+ @models.each do |m|
221
+ m.updateOptions(new_opts)
222
+ m.recreate
223
+ end
224
+
225
+ end
226
+
227
+ # empty ?
228
+ def empty?
229
+ return @models.empty?
230
+ end
231
+
232
+ # empty string
233
+ def empty_caption
234
+ return "No activity" if @emptycaption.nil?
235
+ return @emptycaption
236
+ end
237
+ end
238
+
239
+ end
240
+