ctioga2 0.0 → 0.1
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.
- data/Changelog +25 -1
- data/lib/ctioga2/commands/commands.rb +13 -2
- data/lib/ctioga2/commands/doc/doc.rb +13 -17
- data/lib/ctioga2/commands/doc/documentation-commands.rb +14 -1
- data/lib/ctioga2/commands/doc/help.rb +136 -25
- data/lib/ctioga2/commands/doc/html.rb +56 -4
- data/lib/ctioga2/commands/doc/introspection.rb +45 -9
- data/lib/ctioga2/commands/doc/man.rb +7 -5
- data/lib/ctioga2/commands/doc/markup.rb +39 -12
- data/lib/ctioga2/commands/doc/wordwrap.rb +70 -0
- data/lib/ctioga2/commands/general-commands.rb +7 -4
- data/lib/ctioga2/commands/general-types.rb +27 -12
- data/lib/ctioga2/commands/interpreter.rb +2 -2
- data/lib/ctioga2/commands/parsers/command-line.rb +9 -5
- data/lib/ctioga2/commands/parsers/file.rb +5 -3
- data/lib/ctioga2/commands/type.rb +10 -3
- data/lib/ctioga2/commands/variables.rb +2 -2
- data/lib/ctioga2/data/backends/backend.rb +17 -15
- data/lib/ctioga2/data/backends/backends.rb +2 -2
- data/lib/ctioga2/data/backends/backends/gnuplot.rb +20 -5
- data/lib/ctioga2/data/backends/backends/math.rb +2 -2
- data/lib/ctioga2/data/backends/backends/text.rb +112 -17
- data/lib/ctioga2/data/backends/description.rb +10 -11
- data/lib/ctioga2/data/datacolumn.rb +73 -14
- data/lib/ctioga2/data/dataset.rb +305 -9
- data/lib/ctioga2/data/filters.rb +49 -1
- data/lib/ctioga2/data/indexed-dtable.rb +137 -0
- data/lib/ctioga2/data/point.rb +98 -7
- data/lib/ctioga2/data/stack.rb +98 -21
- data/lib/ctioga2/graphics/coordinates.rb +19 -2
- data/lib/ctioga2/graphics/elements.rb +12 -2
- data/lib/ctioga2/graphics/elements/containers.rb +14 -2
- data/lib/ctioga2/graphics/elements/contour.rb +67 -0
- data/lib/ctioga2/graphics/elements/curve2d.rb +103 -42
- data/lib/ctioga2/graphics/elements/element.rb +12 -2
- data/lib/ctioga2/graphics/elements/gradient-region.rb +94 -0
- data/lib/ctioga2/graphics/elements/parametric2d.rb +172 -0
- data/lib/ctioga2/graphics/elements/primitive.rb +37 -21
- data/lib/ctioga2/graphics/elements/region.rb +143 -0
- data/lib/ctioga2/graphics/elements/subplot.rb +92 -32
- data/lib/ctioga2/graphics/elements/tangent.rb +99 -0
- data/lib/ctioga2/graphics/elements/xyz-map.rb +126 -0
- data/lib/ctioga2/graphics/generator.rb +91 -6
- data/lib/ctioga2/graphics/legends.rb +26 -21
- data/lib/ctioga2/graphics/legends/area.rb +8 -8
- data/lib/ctioga2/graphics/legends/items.rb +5 -5
- data/lib/ctioga2/graphics/legends/storage.rb +4 -2
- data/lib/ctioga2/graphics/root.rb +24 -2
- data/lib/ctioga2/graphics/styles.rb +8 -0
- data/lib/ctioga2/graphics/styles/axes.rb +49 -23
- data/lib/ctioga2/graphics/styles/base.rb +2 -2
- data/lib/ctioga2/graphics/styles/carrays.rb +9 -2
- data/lib/ctioga2/graphics/styles/colormap.rb +272 -0
- data/lib/ctioga2/graphics/styles/curve.rb +64 -4
- data/lib/ctioga2/graphics/styles/drawable.rb +68 -9
- data/lib/ctioga2/graphics/styles/errorbar.rb +73 -0
- data/lib/ctioga2/graphics/styles/factory.rb +133 -17
- data/lib/ctioga2/graphics/styles/gradients.rb +60 -0
- data/lib/ctioga2/graphics/styles/location.rb +64 -0
- data/lib/ctioga2/graphics/styles/map-axes.rb +164 -0
- data/lib/ctioga2/graphics/styles/plot.rb +165 -62
- data/lib/ctioga2/graphics/styles/sets.rb +14 -1
- data/lib/ctioga2/graphics/styles/texts.rb +44 -34
- data/lib/ctioga2/graphics/subplot-commands.rb +94 -6
- data/lib/ctioga2/graphics/types.rb +113 -35
- data/lib/ctioga2/graphics/types/bijection.rb +3 -3
- data/lib/ctioga2/graphics/types/boundaries.rb +120 -1
- data/lib/ctioga2/graphics/types/dimensions.rb +8 -1
- data/lib/ctioga2/graphics/types/grid.rb +196 -0
- data/lib/ctioga2/graphics/types/location.rb +228 -0
- data/lib/ctioga2/graphics/types/point.rb +2 -2
- data/lib/ctioga2/log.rb +18 -18
- data/lib/ctioga2/metabuilder/type.rb +15 -3
- data/lib/ctioga2/metabuilder/types.rb +2 -2
- data/lib/ctioga2/metabuilder/types/coordinates.rb +13 -1
- data/lib/ctioga2/metabuilder/types/data.rb +50 -0
- data/lib/ctioga2/metabuilder/types/generic.rb +60 -0
- data/lib/ctioga2/metabuilder/types/lists.rb +53 -16
- data/lib/ctioga2/metabuilder/types/styles.rb +26 -45
- data/lib/ctioga2/plotmaker.rb +91 -20
- data/lib/ctioga2/postprocess.rb +8 -8
- data/lib/ctioga2/utils.rb +23 -4
- metadata +107 -75
- data/lib/ctioga2/data/merge.rb +0 -43
|
@@ -16,7 +16,7 @@ require 'ctioga2/log'
|
|
|
16
16
|
|
|
17
17
|
module CTioga2
|
|
18
18
|
|
|
19
|
-
Version::register_svn_info('$Revision:
|
|
19
|
+
Version::register_svn_info('$Revision: 196 $', '$Date: 2010-11-25 20:15:32 +0100 (Thu, 25 Nov 2010) $')
|
|
20
20
|
|
|
21
21
|
module Graphics
|
|
22
22
|
|
|
@@ -28,29 +28,22 @@ module CTioga2
|
|
|
28
28
|
# * a way to set/get its figure boundaries.
|
|
29
29
|
class Subplot < Container
|
|
30
30
|
|
|
31
|
-
# A Boundaries object representing the boundaries imposed by
|
|
32
|
-
# the user.
|
|
33
|
-
attr_accessor :user_boundaries
|
|
34
|
-
|
|
35
|
-
# A Boundaries object representing the boundaries in
|
|
36
|
-
# effect. Only filled with meaningful values from within the
|
|
37
|
-
# real_do function.
|
|
38
|
-
attr_accessor :real_boundaries
|
|
39
|
-
|
|
40
31
|
# Various stylistic aspects of the plot, as a
|
|
41
32
|
# Styles::PlotStyle object.
|
|
42
33
|
attr_accessor :style
|
|
43
34
|
|
|
44
|
-
#
|
|
45
|
-
#
|
|
46
|
-
attr_accessor :
|
|
47
|
-
|
|
35
|
+
# User-specified boundaries. It is a hash axis -> SimpleRange,
|
|
36
|
+
# where the axis is a valid return value of PlotStyle#get_axis_key
|
|
37
|
+
attr_accessor :user_boundaries
|
|
38
|
+
|
|
39
|
+
# Computed boundaries. It also is a hash axis -> SimpleRange,
|
|
40
|
+
# just as #user_boundaries. Its value is not defined as long
|
|
41
|
+
# as #real_do hasn't been entered into.
|
|
42
|
+
attr_accessor :computed_boundaries
|
|
43
|
+
|
|
48
44
|
def initialize(parent, root, style)
|
|
49
45
|
super(parent, root)
|
|
50
46
|
|
|
51
|
-
@user_boundaries = Types::Boundaries.new(nil, nil, nil, nil)
|
|
52
|
-
@real_boundaries = nil
|
|
53
|
-
|
|
54
47
|
@subframe = Types::MarginsBox.new("2.8dy", "2.8dy",
|
|
55
48
|
"2.8dy", "2.8dy")
|
|
56
49
|
|
|
@@ -58,30 +51,83 @@ module CTioga2
|
|
|
58
51
|
|
|
59
52
|
@style = style || Styles::PlotStyle.new
|
|
60
53
|
|
|
61
|
-
|
|
62
|
-
|
|
54
|
+
@user_boundaries = {}
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Returns the boundaries that apply for the given _curve_ --
|
|
58
|
+
# it reads the curve's axes. #compute_boundaries must have
|
|
59
|
+
# been called beforehand, which means that it will only work
|
|
60
|
+
# from within #real_do.
|
|
61
|
+
#
|
|
62
|
+
# \todo This should not only apply to curves, but to any
|
|
63
|
+
# object. That also means that there should be a way to
|
|
64
|
+
# specify axes for them too.
|
|
65
|
+
def get_el_boundaries(el)
|
|
66
|
+
return get_given_boundaries(* el.location.get_axis_keys(style))
|
|
63
67
|
end
|
|
64
68
|
|
|
65
|
-
# Returns the boundaries of the
|
|
69
|
+
# Returns the boundaries of the *default* axes. Plotting
|
|
70
|
+
# functions may safely assume that they are drawn using these
|
|
71
|
+
# boundaries, unless they asked for being drawn onto different
|
|
72
|
+
# axes.
|
|
66
73
|
def get_boundaries
|
|
74
|
+
return get_given_boundaries(style.xaxis_location,
|
|
75
|
+
style.yaxis_location)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Sets the user boundaries for the given (named) axis:
|
|
79
|
+
def set_user_boundaries(axis, bounds)
|
|
80
|
+
key = @style.get_axis_key(axis)
|
|
81
|
+
@user_boundaries[key] = Types::SimpleRange.new(bounds)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def actual_subframe(t)
|
|
85
|
+
return @subframe || @style.estimate_margins(t)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# In general, subplot's boundaries do not count for the parent
|
|
89
|
+
# plot.
|
|
90
|
+
def count_boundaries?
|
|
91
|
+
return false
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
protected
|
|
95
|
+
|
|
96
|
+
# Makes up a Boundaries object from two axes keys
|
|
97
|
+
def get_given_boundaries(horiz, vert)
|
|
98
|
+
if @computed_boundaries
|
|
99
|
+
return Types::Boundaries.from_ranges(@computed_boundaries[horiz],
|
|
100
|
+
@computed_boundaries[vert])
|
|
101
|
+
else
|
|
102
|
+
return nil
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def compute_boundaries
|
|
67
107
|
# raw boundaries
|
|
68
108
|
bounds = get_elements_boundaries
|
|
69
109
|
if @style.plot_margin
|
|
70
|
-
bounds
|
|
110
|
+
for k,b in bounds
|
|
111
|
+
b.apply_margin!(@style.plot_margin)
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
for k,b in @user_boundaries
|
|
115
|
+
bounds[k] ||= Types::SimpleRange.new(nil,nil)
|
|
116
|
+
bounds[k].override(b)
|
|
71
117
|
end
|
|
72
|
-
bounds.override_boundaries(@user_boundaries)
|
|
73
118
|
return bounds
|
|
74
119
|
end
|
|
75
120
|
|
|
76
|
-
|
|
121
|
+
|
|
77
122
|
|
|
78
123
|
# Plots all the objects inside the plot.
|
|
79
124
|
def real_do(t)
|
|
80
125
|
# First thing, we setup the boundaries
|
|
126
|
+
@computed_boundaries = compute_boundaries
|
|
81
127
|
|
|
82
|
-
|
|
128
|
+
real_boundaries = get_boundaries
|
|
83
129
|
|
|
84
|
-
frames =
|
|
130
|
+
frames = actual_subframe(t)
|
|
85
131
|
|
|
86
132
|
# We wrap the call within a subplot
|
|
87
133
|
t.subplot(frames.to_frame_margins(t)) do
|
|
@@ -90,7 +136,7 @@ module CTioga2
|
|
|
90
136
|
@style.setup_figure_maker(t)
|
|
91
137
|
|
|
92
138
|
# Manually creating the plot:
|
|
93
|
-
t.set_bounds(
|
|
139
|
+
t.set_bounds(real_boundaries.to_a)
|
|
94
140
|
|
|
95
141
|
# Drawing the background elements:
|
|
96
142
|
t.context do
|
|
@@ -101,11 +147,14 @@ module CTioga2
|
|
|
101
147
|
@style.draw_all_background_lines(t)
|
|
102
148
|
i = 0
|
|
103
149
|
for element in @elements
|
|
104
|
-
|
|
150
|
+
t.context do
|
|
151
|
+
t.set_bounds(get_el_boundaries(element).to_a)
|
|
152
|
+
element.do(t)
|
|
153
|
+
end
|
|
105
154
|
i += 1
|
|
106
155
|
end
|
|
107
156
|
end
|
|
108
|
-
@style.draw_all_axes(t)
|
|
157
|
+
@style.draw_all_axes(t, @computed_boundaries)
|
|
109
158
|
|
|
110
159
|
# Now drawing legends:
|
|
111
160
|
if @legend_area
|
|
@@ -121,17 +170,28 @@ module CTioga2
|
|
|
121
170
|
|
|
122
171
|
# Returns the boundaries of all the elements of this plot.
|
|
123
172
|
def get_elements_boundaries
|
|
124
|
-
|
|
173
|
+
boundaries = {}
|
|
125
174
|
for el in @elements
|
|
126
175
|
if el.respond_to? :get_boundaries
|
|
127
|
-
if el.respond_to?(:count_boundaries) && ! (el.count_boundaries)
|
|
176
|
+
if el.respond_to?(:count_boundaries?) && ! (el.count_boundaries?)
|
|
128
177
|
# Ignoring
|
|
129
178
|
else
|
|
130
|
-
|
|
179
|
+
bounds = el.get_boundaries
|
|
180
|
+
xaxis, yaxis = *el.location.get_axis_keys(style)
|
|
181
|
+
if bounds.is_a? Hash
|
|
182
|
+
## \todo see if there will ever be a need for a hash
|
|
183
|
+
## ?
|
|
184
|
+
raise "Not done yet"
|
|
185
|
+
else
|
|
186
|
+
boundaries[xaxis] ||= Types::SimpleRange.new(nil,nil)
|
|
187
|
+
boundaries[xaxis].extend(bounds.horizontal)
|
|
188
|
+
boundaries[yaxis] ||= Types::SimpleRange.new(nil,nil)
|
|
189
|
+
boundaries[yaxis].extend(bounds.vertical)
|
|
190
|
+
end
|
|
131
191
|
end
|
|
132
192
|
end
|
|
133
193
|
end
|
|
134
|
-
return
|
|
194
|
+
return boundaries
|
|
135
195
|
end
|
|
136
196
|
|
|
137
197
|
end
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# tangent.rb: code for drawing tangents
|
|
2
|
+
# copyright (c) 2009 by Vincent Fourmond
|
|
3
|
+
|
|
4
|
+
# This program is free software; you can redistribute it and/or modify
|
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
|
6
|
+
# the Free Software Foundation; either version 2 of the License, or
|
|
7
|
+
# (at your option) any later version.
|
|
8
|
+
|
|
9
|
+
# This program is distributed in the hope that it will be useful, but
|
|
10
|
+
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
12
|
+
# General Public License for more details (in the COPYING file).
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
require 'ctioga2/graphics/elements/primitive'
|
|
16
|
+
|
|
17
|
+
# This module contains all the classes used by ctioga
|
|
18
|
+
module CTioga2
|
|
19
|
+
|
|
20
|
+
Version::register_svn_info('$Revision: 171 $', '$Date: 2010-10-22 17:07:52 +0200 (Fri, 22 Oct 2010) $')
|
|
21
|
+
|
|
22
|
+
module Graphics
|
|
23
|
+
|
|
24
|
+
module Elements
|
|
25
|
+
|
|
26
|
+
module Tangents
|
|
27
|
+
|
|
28
|
+
TangentOptions = {
|
|
29
|
+
'xfrom' => 'float',
|
|
30
|
+
'xto' => 'float',
|
|
31
|
+
'yfrom' => 'float',
|
|
32
|
+
'yto' => 'float',
|
|
33
|
+
'xextent' => 'float',
|
|
34
|
+
'yextent' => 'float',
|
|
35
|
+
'nbavg' => 'integer'
|
|
36
|
+
}.update(TiogaPrimitiveCall::ArrowOptions)
|
|
37
|
+
|
|
38
|
+
TiogaPrimitiveCall.
|
|
39
|
+
primitive("tangent", "tangent", [ 'data-point'],
|
|
40
|
+
TangentOptions) do |t, point,options|
|
|
41
|
+
options ||= {}
|
|
42
|
+
nb = options['nbavg'] || 7
|
|
43
|
+
x = point.x_val(nb)
|
|
44
|
+
y = point.y_val(nb)
|
|
45
|
+
slope = point.slope(nb)
|
|
46
|
+
|
|
47
|
+
# Now, we parse the head/tail spec.
|
|
48
|
+
if d = options['xextent']
|
|
49
|
+
options['tail'] = [x, y]
|
|
50
|
+
options['head'] = [x+d, y + d*slope]
|
|
51
|
+
elsif d = options['yextent']
|
|
52
|
+
options['tail'] = [x, y]
|
|
53
|
+
options['head'] = [x+d/slope, y + d]
|
|
54
|
+
elsif options['xfrom'] || options['yfrom'] ||
|
|
55
|
+
options['xto'] || options['yto']
|
|
56
|
+
if xf = options['xfrom']
|
|
57
|
+
options['tail'] = [xf, y - (x - xf)*slope]
|
|
58
|
+
elsif yf = options['yfrom']
|
|
59
|
+
options['tail'] = [x - (y-yf)/slope, yf]
|
|
60
|
+
else
|
|
61
|
+
options['tail'] = [x,y]
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
if xt = options['xto']
|
|
65
|
+
options['head'] = [xt, y - (x - xt)*slope]
|
|
66
|
+
elsif yt = options['yto']
|
|
67
|
+
options['head'] = [x - (y-yt)/slope, yt]
|
|
68
|
+
else
|
|
69
|
+
options['head'] = [x,y]
|
|
70
|
+
end
|
|
71
|
+
else
|
|
72
|
+
# We don't bother too much about the head/tail
|
|
73
|
+
options['head'] = [x, y]
|
|
74
|
+
dx = point.dx(nb) * 10
|
|
75
|
+
options['tail'] = [x-dx, y - dx*slope]
|
|
76
|
+
options['line_width'] = 0
|
|
77
|
+
options['tail_marker'] = "None"
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# We look for any color argument:
|
|
81
|
+
if ! (options['color'] || options['tail_color'] ||
|
|
82
|
+
options['head_color'])
|
|
83
|
+
options['color'] = $last_curve_style.line.color
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Now, we delete elements from the hash that don't have
|
|
87
|
+
# anything to do there:
|
|
88
|
+
for k in TangentOptions.keys -
|
|
89
|
+
TiogaPrimitiveCall::ArrowOptions.keys
|
|
90
|
+
options.delete k
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
t.show_arrow(options)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# parametric2d.rb: a 2D curve whose parameters depend on Z values
|
|
2
|
+
# copyright (c) 2006, 2007, 2008, 2009, 2010 by Vincent Fourmond
|
|
3
|
+
|
|
4
|
+
# This program is free software; you can redistribute it and/or modify
|
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
|
6
|
+
# the Free Software Foundation; either version 2 of the License, or
|
|
7
|
+
# (at your option) any later version.
|
|
8
|
+
|
|
9
|
+
# This program is distributed in the hope that it will be useful, but
|
|
10
|
+
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
12
|
+
# General Public License for more details (in the COPYING file).
|
|
13
|
+
|
|
14
|
+
require 'ctioga2/utils'
|
|
15
|
+
require 'ctioga2/log'
|
|
16
|
+
|
|
17
|
+
require 'Dobjects/Function'
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
module CTioga2
|
|
21
|
+
|
|
22
|
+
Version::register_svn_info('$Revision: 198 $', '$Date: 2010-11-30 00:48:23 +0100 (Tue, 30 Nov 2010) $')
|
|
23
|
+
|
|
24
|
+
module Graphics
|
|
25
|
+
|
|
26
|
+
module Elements
|
|
27
|
+
|
|
28
|
+
# This class represents a XY map of Z values, ie something that
|
|
29
|
+
# is represented using an image
|
|
30
|
+
#
|
|
31
|
+
# @todo There should be a way to automatically display level
|
|
32
|
+
# lines, and possibly only that.
|
|
33
|
+
class XYZMap < TiogaElement
|
|
34
|
+
|
|
35
|
+
include Log
|
|
36
|
+
include Dobjects
|
|
37
|
+
|
|
38
|
+
# The Data::Dataset object that should get plotted.
|
|
39
|
+
attr_accessor :dataset
|
|
40
|
+
|
|
41
|
+
# A Styles::CurveStyle object saying how the curve should be
|
|
42
|
+
# drawn.
|
|
43
|
+
#
|
|
44
|
+
# Some of the elements will be overridden.
|
|
45
|
+
attr_accessor :curve_style
|
|
46
|
+
|
|
47
|
+
# The IndexedTable object representing the underlying data
|
|
48
|
+
attr_accessor :table
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
undef :location=, :location
|
|
52
|
+
|
|
53
|
+
# Creates a new XYZMap object with the given _dataset_ and
|
|
54
|
+
# _style_.
|
|
55
|
+
def initialize(dataset, style = nil)
|
|
56
|
+
@dataset = dataset
|
|
57
|
+
@curve_style = style
|
|
58
|
+
prepare_data
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Prepares the internal storage of the data, from the @dataset
|
|
62
|
+
def prepare_data
|
|
63
|
+
@table = @dataset.indexed_table
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
protected :prepare_data
|
|
67
|
+
|
|
68
|
+
# Returns the LocationStyle object of the curve. Returns the
|
|
69
|
+
# one from #curve_style.
|
|
70
|
+
def location
|
|
71
|
+
return @curve_style.location
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Returns the Types::Boundaries of this curve.
|
|
75
|
+
def get_boundaries
|
|
76
|
+
return @table.xy_boundaries
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
## Actually draws the curve
|
|
81
|
+
def real_do(t)
|
|
82
|
+
debug { "Plotting curve #{inspect}" }
|
|
83
|
+
t.context do
|
|
84
|
+
# Of course, there are still quite a few things to do
|
|
85
|
+
# ;-)...
|
|
86
|
+
|
|
87
|
+
# Ideas: for leaving things out, I may have to use min_gt
|
|
88
|
+
# along with masking.
|
|
89
|
+
|
|
90
|
+
## @todo handle non-homogeneous XY maps.
|
|
91
|
+
|
|
92
|
+
@curve_style.color_map ||=
|
|
93
|
+
Styles::ColorMap.from_text("Red--Green")
|
|
94
|
+
|
|
95
|
+
dict = @curve_style.color_map.
|
|
96
|
+
prepare_data_display(t,@table.table,
|
|
97
|
+
@table.table.min,
|
|
98
|
+
@table.table.max)
|
|
99
|
+
if @curve_style.zaxis
|
|
100
|
+
begin
|
|
101
|
+
@parent.style.get_axis_style(@curve_style.zaxis).
|
|
102
|
+
set_color_map(@curve_style.color_map,
|
|
103
|
+
@table.table.min,
|
|
104
|
+
@table.table.max)
|
|
105
|
+
rescue
|
|
106
|
+
error { "Could not set Z info to non-existent axis #{@curve_style.zaxis}" }
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
dict.update(@table.corner_positions)
|
|
111
|
+
dict.update('width' => @table.width,
|
|
112
|
+
'height' => @table.height)
|
|
113
|
+
dict.update('interpolate' => false)
|
|
114
|
+
if (! @curve_style.fill.transparency) ||
|
|
115
|
+
(@curve_style.fill.transparency < 0.99)
|
|
116
|
+
t.show_image(dict)
|
|
117
|
+
else
|
|
118
|
+
info { 'Not showing map as transparency is over 0.99' }
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
@@ -18,7 +18,7 @@ require 'ctioga2/graphics/coordinates'
|
|
|
18
18
|
|
|
19
19
|
module CTioga2
|
|
20
20
|
|
|
21
|
-
Version::register_svn_info('$Revision:
|
|
21
|
+
Version::register_svn_info('$Revision: 244 $', '$Date: 2011-01-23 23:36:02 +0100 (Sun, 23 Jan 2011) $')
|
|
22
22
|
|
|
23
23
|
module Graphics
|
|
24
24
|
|
|
@@ -36,33 +36,118 @@ module CTioga2
|
|
|
36
36
|
# object.
|
|
37
37
|
attr_accessor :legend_provider
|
|
38
38
|
|
|
39
|
+
# The current kind of generated. It is a symbol
|
|
40
|
+
attr_accessor :current_curves
|
|
41
|
+
|
|
39
42
|
# Creates a CurveGenerator object.
|
|
40
43
|
def initialize
|
|
41
44
|
@legend_provider = Legends::LegendProvider.new
|
|
42
45
|
@style_factory = Styles::CurveStyleFactory.new
|
|
46
|
+
@current_curves = :xy_plot
|
|
43
47
|
end
|
|
44
48
|
|
|
45
49
|
# Creates a Elements::TiogaElement representing the _dataset_
|
|
46
50
|
# and returns it.
|
|
47
51
|
#
|
|
48
|
-
#
|
|
49
|
-
# * coordinate transformations
|
|
52
|
+
# \todo
|
|
53
|
+
# * (other kinds of) coordinate transformations
|
|
50
54
|
# * other kinds of curves (pseudo-3D, surfaces, histograms...)
|
|
51
55
|
def curve_from_dataset(plot, dataset, options = {})
|
|
56
|
+
# Does coordinate transforms first ?
|
|
57
|
+
# \todo copy datasets here rather than overwriting them !
|
|
58
|
+
plot.style.transforms.transform_2d!(dataset)
|
|
59
|
+
|
|
60
|
+
return send(@current_curves, plot, dataset, options)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
private
|
|
64
|
+
|
|
65
|
+
## \name Available kinds of curves
|
|
66
|
+
#
|
|
67
|
+
# @{
|
|
68
|
+
#
|
|
69
|
+
# The "classical" 2D plots.
|
|
70
|
+
def xy_plot(plot, dataset, options = {})
|
|
52
71
|
legend = @legend_provider.dataset_legend(dataset)
|
|
53
72
|
style = @style_factory.next(options)
|
|
54
73
|
style.legend ||= legend # The legend specified as option to
|
|
55
74
|
# the --plot command has precedence
|
|
56
75
|
# over the one specified by --legend.
|
|
57
|
-
|
|
58
|
-
# TODO: copy datasets here !
|
|
59
|
-
plot.style.transforms.transform_2d!(dataset)
|
|
60
76
|
curve = Graphics::Elements::Curve2D.new(dataset, style)
|
|
61
77
|
return curve
|
|
62
78
|
end
|
|
79
|
+
|
|
80
|
+
# XYZ plots formerly known as "parametric plots"
|
|
81
|
+
def xy_parametric(plot, dataset, options = {})
|
|
82
|
+
legend = @legend_provider.dataset_legend(dataset)
|
|
83
|
+
style = @style_factory.next(options)
|
|
84
|
+
style.legend = false
|
|
85
|
+
style.legend ||= legend # The legend specified as option to
|
|
86
|
+
# the --plot command has precedence
|
|
87
|
+
# over the one specified by --legend.
|
|
88
|
+
curve = Graphics::Elements::Parametric2D.new(dataset, style)
|
|
89
|
+
return curve
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# XYZ maps
|
|
93
|
+
def xyz_map(plot, dataset, options = {})
|
|
94
|
+
legend = @legend_provider.dataset_legend(dataset)
|
|
95
|
+
style = @style_factory.next(options)
|
|
96
|
+
style.legend = false
|
|
97
|
+
style.legend ||= legend # The legend specified as option to
|
|
98
|
+
# the --plot command has precedence
|
|
99
|
+
# over the one specified by --legend.
|
|
100
|
+
curve = Graphics::Elements::XYZMap.new(dataset, style)
|
|
101
|
+
return curve
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
## @}
|
|
63
106
|
|
|
64
107
|
end
|
|
65
108
|
|
|
109
|
+
|
|
110
|
+
# The group for chosing plot types.
|
|
111
|
+
PlotTypesGroup =
|
|
112
|
+
CmdGroup.new('plot-types',
|
|
113
|
+
"Switch between different kinds of plots",
|
|
114
|
+
"How to switch between different kinds of plot types", 01)
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
XYParametricPlotCommand =
|
|
118
|
+
Cmd.new("xy-parametric",nil,"--xy-parametric") do |plotmaker|
|
|
119
|
+
plotmaker.curve_generator.current_curves = :xy_parametric
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
XYParametricPlotCommand.describe('select XY parametric plots',
|
|
123
|
+
<<EOH, PlotTypesGroup)
|
|
124
|
+
Switch to XY parametric plots, that is standard XY plots whose appearance
|
|
125
|
+
(such as color, marker color, and, potentially, marker kinds and more)
|
|
126
|
+
are governed by one (or more ?) Z values.
|
|
127
|
+
EOH
|
|
128
|
+
|
|
129
|
+
XYPlotCommand =
|
|
130
|
+
Cmd.new("xy-plot",nil,"--xy-plot") do |plotmaker|
|
|
131
|
+
plotmaker.curve_generator.current_curves = :xy_plot
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
XYPlotCommand.describe('select XY plots',
|
|
135
|
+
<<EOH, PlotTypesGroup)
|
|
136
|
+
Switch (back) to standard XY plots (ctioga\'s default)
|
|
137
|
+
EOH
|
|
138
|
+
|
|
139
|
+
XYZMapCommand =
|
|
140
|
+
Cmd.new("xyz-map",nil,"--xyz-map") do |plotmaker|
|
|
141
|
+
plotmaker.curve_generator.current_curves = :xyz_map
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
XYZMapCommand.describe('select XYZ maps',
|
|
145
|
+
<<EOH, PlotTypesGroup)
|
|
146
|
+
Switch to XYZ maps, ie plots where the color at a XY location is given by
|
|
147
|
+
its Z value.
|
|
148
|
+
EOH
|
|
149
|
+
|
|
150
|
+
|
|
66
151
|
end
|
|
67
152
|
end
|
|
68
153
|
|