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
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# -*- coding: undecided -*-
|
|
2
|
+
# parametric2d.rb: a 2D curve whose parameters depend on Z values
|
|
3
|
+
# copyright (c) 2006, 2007, 2008, 2009, 2010 by Vincent Fourmond
|
|
4
|
+
|
|
5
|
+
# This program is free software; you can redistribute it and/or modify
|
|
6
|
+
# it under the terms of the GNU General Public License as published by
|
|
7
|
+
# the Free Software Foundation; either version 2 of the License, or
|
|
8
|
+
# (at your option) any later version.
|
|
9
|
+
|
|
10
|
+
# This program is distributed in the hope that it will be useful, but
|
|
11
|
+
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
13
|
+
# General Public License for more details (in the COPYING file).
|
|
14
|
+
|
|
15
|
+
require 'ctioga2/utils'
|
|
16
|
+
require 'ctioga2/log'
|
|
17
|
+
|
|
18
|
+
require 'Dobjects/Function'
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
module CTioga2
|
|
22
|
+
|
|
23
|
+
Version::register_svn_info('$Revision: 229 $', '$Date: 2011-01-17 17:34:57 +0100 (Mon, 17 Jan 2011) $')
|
|
24
|
+
|
|
25
|
+
module Graphics
|
|
26
|
+
|
|
27
|
+
module Elements
|
|
28
|
+
|
|
29
|
+
# This class represents a 3D (or more, to be seen later) dataset
|
|
30
|
+
# as markers with various parameters parametrized (color,
|
|
31
|
+
# transparency, marker scale, marker type (discrete), possibly
|
|
32
|
+
# stroke and fill colors ?
|
|
33
|
+
#
|
|
34
|
+
# @todo What would be interesting here would be to have indexed
|
|
35
|
+
# plots, ie draw one curve for each value of Z, with a color
|
|
36
|
+
# indexed by Z.
|
|
37
|
+
class Parametric2D < TiogaElement
|
|
38
|
+
|
|
39
|
+
include Log
|
|
40
|
+
include Dobjects
|
|
41
|
+
|
|
42
|
+
# The Data::Dataset object that should get plotted.
|
|
43
|
+
attr_accessor :dataset
|
|
44
|
+
|
|
45
|
+
# A Styles::CurveStyle object saying how the curve should be
|
|
46
|
+
# drawn.
|
|
47
|
+
#
|
|
48
|
+
# Some of the elements will be overridden.
|
|
49
|
+
attr_accessor :curve_style
|
|
50
|
+
|
|
51
|
+
# For convenience only: xy functions
|
|
52
|
+
attr_accessor :function
|
|
53
|
+
|
|
54
|
+
# A hash Z value -> corresponding XY functions.
|
|
55
|
+
attr_accessor :planes
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
undef :location=, :location
|
|
60
|
+
|
|
61
|
+
# Creates a new Curve2D object with the given _dataset_ and
|
|
62
|
+
# _style_.
|
|
63
|
+
def initialize(dataset, style = nil)
|
|
64
|
+
@dataset = dataset
|
|
65
|
+
@curve_style = style
|
|
66
|
+
prepare_data
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Prepares the internal storage of the data, from the @dataset
|
|
70
|
+
def prepare_data
|
|
71
|
+
@function = Function.new(@dataset.x.values.dup,
|
|
72
|
+
@dataset.y.values.dup)
|
|
73
|
+
|
|
74
|
+
## @todo this should eventually use Dataset::index_on_cols.
|
|
75
|
+
@planes = {}
|
|
76
|
+
@dataset.each_values do |i, x,y,*zs|
|
|
77
|
+
@planes[zs[0]] ||= Function.new(Dvector.new, Dvector.new)
|
|
78
|
+
@planes[zs[0]].x << x
|
|
79
|
+
@planes[zs[0]].y << y
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
protected :prepare_data
|
|
84
|
+
|
|
85
|
+
# Returns the LocationStyle object of the curve. Returns the
|
|
86
|
+
# one from #curve_style.
|
|
87
|
+
def location
|
|
88
|
+
return @curve_style.location
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Returns the Types::Boundaries of this curve.
|
|
92
|
+
def get_boundaries
|
|
93
|
+
return Types::Boundaries.bounds(@function.x, @function.y)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Draws the markers, if applicable.
|
|
97
|
+
def draw_path(t)
|
|
98
|
+
min = @dataset.z.values.min
|
|
99
|
+
max = @dataset.z.values.max
|
|
100
|
+
if @curve_style.has_line?
|
|
101
|
+
# We use a default color map for the lines
|
|
102
|
+
@curve_style.color_map ||=
|
|
103
|
+
Styles::ColorMap.from_text("Red--Green")
|
|
104
|
+
cmap = @curve_style.color_map
|
|
105
|
+
|
|
106
|
+
for zs in @planes.keys.sort ## \todo have the sort
|
|
107
|
+
## direction configurable.
|
|
108
|
+
f = @planes[zs]
|
|
109
|
+
color = cmap.z_color(zs, min, max)
|
|
110
|
+
t.context do
|
|
111
|
+
@curve_style.line.set_stroke_style(t)
|
|
112
|
+
t.stroke_color = color
|
|
113
|
+
t.show_polyline(f.x, f.y)
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
# Draws the markers, if applicable.
|
|
121
|
+
def draw_markers(t)
|
|
122
|
+
min = @dataset.z.values.min
|
|
123
|
+
max = @dataset.z.values.max
|
|
124
|
+
if @curve_style.has_marker?
|
|
125
|
+
# We use a default color map for the markers
|
|
126
|
+
@curve_style.marker_color_map ||=
|
|
127
|
+
Styles::ColorMap.from_text("Red--Green")
|
|
128
|
+
cmap = @curve_style.marker_color_map
|
|
129
|
+
for zs in @planes.keys.sort ## \todo have the sort
|
|
130
|
+
## direction configurable.
|
|
131
|
+
f = @planes[zs]
|
|
132
|
+
color = cmap.z_color(zs, min, max)
|
|
133
|
+
@curve_style.marker.draw_markers_at(t, f.x, f.y,
|
|
134
|
+
{ 'color' => color})
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
## Actually draws the curve
|
|
140
|
+
def real_do(t)
|
|
141
|
+
debug { "Plotting curve #{inspect}" }
|
|
142
|
+
t.context do
|
|
143
|
+
## \todo allow customization of the order of drawing,
|
|
144
|
+
## using a simple user-specificable array of path,
|
|
145
|
+
## markers... and use the corresponding #draw_path or
|
|
146
|
+
## #draw_markers... Ideally, any string could be used, and
|
|
147
|
+
## warnings should be issued on missing symbols.
|
|
148
|
+
|
|
149
|
+
# draw_fill(t)
|
|
150
|
+
# draw_errorbars(t)
|
|
151
|
+
draw_path(t)
|
|
152
|
+
draw_markers(t)
|
|
153
|
+
|
|
154
|
+
if @curve_style.zaxis
|
|
155
|
+
begin
|
|
156
|
+
@parent.style.get_axis_style(@curve_style.zaxis).
|
|
157
|
+
set_color_map(@curve_style.marker_color_map,
|
|
158
|
+
@dataset.z.values.min,
|
|
159
|
+
@dataset.z.values.max)
|
|
160
|
+
rescue
|
|
161
|
+
error { "Could not set Z info to non-existent axis #{@curve_style.zaxis}" }
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
# draw_error_bars(t) ??
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
end
|
|
@@ -21,7 +21,7 @@ require 'shellwords'
|
|
|
21
21
|
# This module contains all the classes used by ctioga
|
|
22
22
|
module CTioga2
|
|
23
23
|
|
|
24
|
-
Version::register_svn_info('$Revision:
|
|
24
|
+
Version::register_svn_info('$Revision: 151 $', '$Date: 2010-06-19 23:45:20 +0200 (Sat, 19 Jun 2010) $')
|
|
25
25
|
|
|
26
26
|
module Graphics
|
|
27
27
|
|
|
@@ -54,6 +54,7 @@ module CTioga2
|
|
|
54
54
|
@optional_arguments = opts
|
|
55
55
|
@funcall = code
|
|
56
56
|
end
|
|
57
|
+
|
|
57
58
|
end
|
|
58
59
|
|
|
59
60
|
# A TiogaPrimitive object describing the current primitive
|
|
@@ -65,6 +66,9 @@ module CTioga2
|
|
|
65
66
|
# A hash containing the values of the optional arguments
|
|
66
67
|
attr_accessor :options
|
|
67
68
|
|
|
69
|
+
# The last curve's style...
|
|
70
|
+
attr_accessor :last_curve_style
|
|
71
|
+
|
|
68
72
|
|
|
69
73
|
# Creates a new TiogaPrimitiveCall object.
|
|
70
74
|
def initialize(primitive, arguments, options)
|
|
@@ -103,6 +107,7 @@ module CTioga2
|
|
|
103
107
|
call = Elements::
|
|
104
108
|
TiogaPrimitiveCall.new(primitive,
|
|
105
109
|
rest, options)
|
|
110
|
+
call.last_curve_style = plotmaker.curve_style_stack.last
|
|
106
111
|
plotmaker.root_object.current_plot.
|
|
107
112
|
add_element(call)
|
|
108
113
|
end
|
|
@@ -128,16 +133,21 @@ module CTioga2
|
|
|
128
133
|
'angle' => 'float',
|
|
129
134
|
'justification' => 'justification',
|
|
130
135
|
'alignment' => 'alignment',
|
|
136
|
+
'font' => 'latex-font',
|
|
131
137
|
}
|
|
132
138
|
) do |t, point, string, options|
|
|
133
|
-
#
|
|
139
|
+
# @todo add a way to specify fonts ???
|
|
134
140
|
options ||= {}
|
|
141
|
+
if options['font']
|
|
142
|
+
string = options['font'].fontify(string)
|
|
143
|
+
options.delete('font')
|
|
144
|
+
end
|
|
135
145
|
options['text'] = string
|
|
136
146
|
options['at'] = point.to_figure_xy(t)
|
|
137
147
|
t.show_text(options)
|
|
138
148
|
end
|
|
139
149
|
|
|
140
|
-
#
|
|
150
|
+
# @todo add rendering mode !!
|
|
141
151
|
MarkerOptions = {
|
|
142
152
|
'color' => 'color',
|
|
143
153
|
'stroke_color' => 'color',
|
|
@@ -152,7 +162,7 @@ module CTioga2
|
|
|
152
162
|
|
|
153
163
|
primitive("marker", "marker", [ 'point', 'marker' ],
|
|
154
164
|
MarkerOptions) do |t, point, marker, options|
|
|
155
|
-
|
|
165
|
+
## \todo add a way to specify fonts ???
|
|
156
166
|
options ||= {}
|
|
157
167
|
options['marker'] = marker
|
|
158
168
|
options['at'] = point.to_figure_xy(t)
|
|
@@ -162,26 +172,30 @@ module CTioga2
|
|
|
162
172
|
primitive("string-marker", "marker", [ 'point', 'text' ],
|
|
163
173
|
{'font' => 'pdf-font' }.update(MarkerOptions)
|
|
164
174
|
) do |t, point, string, options|
|
|
165
|
-
|
|
175
|
+
## \todo add a way to specify fonts ???
|
|
166
176
|
options ||= {}
|
|
167
177
|
options['text'] = string
|
|
168
178
|
options['at'] = point.to_figure_xy(t)
|
|
169
179
|
t.show_marker(options)
|
|
170
180
|
end
|
|
171
181
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
182
|
+
# options for arrows (and therefore tangents)
|
|
183
|
+
ArrowOptions = {
|
|
184
|
+
'color' => 'color',
|
|
185
|
+
'head_scale' => 'float',
|
|
186
|
+
'head_marker' => 'marker',
|
|
187
|
+
'head_color' => 'color',
|
|
188
|
+
'tail_scale' => 'float',
|
|
189
|
+
'tail_marker' => 'marker',
|
|
190
|
+
'tail_color' => 'color',
|
|
191
|
+
'line_width' => 'float',
|
|
192
|
+
'line_style' => 'line-style',
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
primitive("arrow", "arrow", [ 'point', 'point' ],
|
|
196
|
+
ArrowOptions) do |t, tail,head, options|
|
|
197
|
+
## \todo a scale or marker_scale option that sets the scale
|
|
198
|
+
## of both head and tail
|
|
185
199
|
options ||= {}
|
|
186
200
|
options['head'] = head.to_figure_xy(t)
|
|
187
201
|
options['tail'] = tail.to_figure_xy(t)
|
|
@@ -210,6 +224,9 @@ module CTioga2
|
|
|
210
224
|
# Draws the primitive
|
|
211
225
|
def real_do(t)
|
|
212
226
|
args = @arguments + [@options]
|
|
227
|
+
## @todo this is a really ugly hack for passing
|
|
228
|
+
## last_curve_style around
|
|
229
|
+
$last_curve_style = @last_curve_style
|
|
213
230
|
primitive.funcall.call(t, *args)
|
|
214
231
|
end
|
|
215
232
|
|
|
@@ -219,7 +236,6 @@ A ctioga 1 --draw specification.
|
|
|
219
236
|
EOD
|
|
220
237
|
|
|
221
238
|
|
|
222
|
-
|
|
223
239
|
# An emulation of the old ctioga behavior
|
|
224
240
|
CmdDraw = Cmd.new('draw', nil, '--draw',
|
|
225
241
|
[CmdArg.new('drawing-spec')]) do |plotmaker, spec|
|
|
@@ -235,12 +251,12 @@ EOD
|
|
|
235
251
|
if a =~ /^\s*([^=]+)=(.*)/
|
|
236
252
|
opts[$1] = $2
|
|
237
253
|
else
|
|
238
|
-
plotmaker.error "Argument found where a option= was expected: #{a}"
|
|
254
|
+
plotmaker.error { "Argument found where a option= was expected: #{a}" }
|
|
239
255
|
end
|
|
240
256
|
end
|
|
241
257
|
plotmaker.interpreter.run_command(cmd, comp, opts)
|
|
242
258
|
else
|
|
243
|
-
plotmaker.error "Unkown graphics primitive: #{name}"
|
|
259
|
+
plotmaker.error { "Unkown graphics primitive: #{name}" }
|
|
244
260
|
end
|
|
245
261
|
end
|
|
246
262
|
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# region.rb: draw curves-delimited fills
|
|
2
|
+
# copyright (c) 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,
|
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
12
|
+
# GNU General Public License for more details (in the COPYING file).
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
require 'ctioga2/utils'
|
|
16
|
+
require 'ctioga2/log'
|
|
17
|
+
|
|
18
|
+
module CTioga2
|
|
19
|
+
|
|
20
|
+
Version::register_svn_info('$Revision: 139 $', '$Date: 2010-01-22 00:12:17 +0100 (Fri, 22 Jan 2010) $')
|
|
21
|
+
|
|
22
|
+
module Graphics
|
|
23
|
+
|
|
24
|
+
module Elements
|
|
25
|
+
|
|
26
|
+
# A Region is an object that draws filled regions among its
|
|
27
|
+
# "elements". It is a fake container in the sense that all the
|
|
28
|
+
# elements are actually forwarded to the parent.
|
|
29
|
+
class Region < Container
|
|
30
|
+
|
|
31
|
+
undef :elements
|
|
32
|
+
undef :subframe
|
|
33
|
+
|
|
34
|
+
# The curves which delimit the region
|
|
35
|
+
attr_accessor :curves
|
|
36
|
+
|
|
37
|
+
# The fill style
|
|
38
|
+
attr_accessor :fill_style
|
|
39
|
+
|
|
40
|
+
# The fill style for reversed polarity
|
|
41
|
+
attr_accessor :reversed_fill_style
|
|
42
|
+
|
|
43
|
+
# Creates a new empty region
|
|
44
|
+
def initialize(parent = nil, root = nil)
|
|
45
|
+
@parent = parent
|
|
46
|
+
|
|
47
|
+
# elements to be given to tioga
|
|
48
|
+
@curves = []
|
|
49
|
+
|
|
50
|
+
@root_object = root
|
|
51
|
+
|
|
52
|
+
@legend_area = nil
|
|
53
|
+
|
|
54
|
+
@fill_style = Styles::FillStyle.new
|
|
55
|
+
@fill_style.color = [0.7,0.7,0.7]
|
|
56
|
+
|
|
57
|
+
# For reversed polarity
|
|
58
|
+
@reversed_fill_style = Styles::FillStyle.new
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Adds an element. Actually forwards it to the parent.
|
|
62
|
+
def add_element(element)
|
|
63
|
+
parent.add_element(element)
|
|
64
|
+
if element.respond_to?(:curve_style) &&
|
|
65
|
+
element.curve_style.region_position
|
|
66
|
+
@curves << element
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Sets the various things from hash.
|
|
71
|
+
def set_from_hash(hash)
|
|
72
|
+
@fill_style.set_from_hash(hash)
|
|
73
|
+
# Reversed isn't what I want...
|
|
74
|
+
@reversed_fill_style.set_from_hash(hash, 'reversed_%s')
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Redirects to the parent's style
|
|
78
|
+
def style(*a)
|
|
79
|
+
return parent.style(*a)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
protected
|
|
83
|
+
|
|
84
|
+
# Creates the appropriate subfigure and draws all its elements
|
|
85
|
+
# within.
|
|
86
|
+
#
|
|
87
|
+
# \todo: attempt to work fine while mixing curves with
|
|
88
|
+
# different axes. That won't be easy.
|
|
89
|
+
#
|
|
90
|
+
# \todo: enable to do positive and negative. The only thing to
|
|
91
|
+
# do is to swap above for below and call again.
|
|
92
|
+
def real_do(t)
|
|
93
|
+
# This function will be called with the proper figure
|
|
94
|
+
# coordinates.
|
|
95
|
+
|
|
96
|
+
if @fill_style.color
|
|
97
|
+
t.context do
|
|
98
|
+
@fill_style.setup_fill(t)
|
|
99
|
+
prepare_path(t)
|
|
100
|
+
@fill_style.do_fill(t)
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
if @reversed_fill_style.color
|
|
105
|
+
t.context do
|
|
106
|
+
@reversed_fill_style.setup_fill(t)
|
|
107
|
+
prepare_path(t, :reversed)
|
|
108
|
+
@reversed_fill_style.do_fill(t)
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Prepares the path that will be filled, according to the
|
|
115
|
+
# given polarity.
|
|
116
|
+
def prepare_path(t, polarity = :normal)
|
|
117
|
+
# We clip the path for the given
|
|
118
|
+
case polarity
|
|
119
|
+
when :normal
|
|
120
|
+
conversion = {
|
|
121
|
+
:above => :bottom,
|
|
122
|
+
:below => :top
|
|
123
|
+
}
|
|
124
|
+
when :reversed
|
|
125
|
+
conversion = {
|
|
126
|
+
:above => :top,
|
|
127
|
+
:below => :bottom
|
|
128
|
+
}
|
|
129
|
+
end
|
|
130
|
+
# We clip for the first ones...
|
|
131
|
+
for c in @curves[0..-2]
|
|
132
|
+
c.make_closed_path(t, conversion[c.curve_style.region_position])
|
|
133
|
+
t.clip
|
|
134
|
+
end
|
|
135
|
+
# We don't clip on the last one !
|
|
136
|
+
c = @curves.last
|
|
137
|
+
c.make_closed_path(t, conversion[c.curve_style.region_position])
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
end
|