ctioga2 0.11 → 0.12
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Changelog +17 -0
- data/lib/ctioga2/commands/commands.rb +2 -1
- data/lib/ctioga2/commands/doc/documentation-commands.rb +2 -1
- data/lib/ctioga2/commands/doc/html.rb +27 -0
- data/lib/ctioga2/commands/general-commands.rb +13 -0
- data/lib/ctioga2/commands/type.rb +1 -1
- data/lib/ctioga2/data/dataset.rb +210 -0
- data/lib/ctioga2/data/stack.rb +1 -1
- data/lib/ctioga2/graphics/elements/primitive.rb +8 -6
- data/lib/ctioga2/graphics/elements/subplot.rb +0 -7
- data/lib/ctioga2/graphics/elements/tangent.rb +3 -1
- data/lib/ctioga2/graphics/elements/xyz-map.rb +47 -28
- data/lib/ctioga2/graphics/styles.rb +1 -0
- data/lib/ctioga2/graphics/styles/arrows.rb +141 -1
- data/lib/ctioga2/graphics/styles/axes.rb +18 -1
- data/lib/ctioga2/graphics/styles/base.rb +41 -2
- data/lib/ctioga2/graphics/styles/box.rb +1 -1
- data/lib/ctioga2/graphics/styles/drawable.rb +60 -54
- data/lib/ctioga2/graphics/styles/errorbar.rb +10 -3
- data/lib/ctioga2/graphics/styles/factory.rb +80 -9
- data/lib/ctioga2/graphics/styles/plot.rb +1 -1
- data/lib/ctioga2/graphics/styles/scope.rb +72 -0
- data/lib/ctioga2/graphics/styles/sets.rb +2 -1
- data/lib/ctioga2/graphics/types.rb +1 -1
- data/lib/ctioga2/graphics/types/dimensions.rb +48 -0
- data/lib/ctioga2/log.rb +12 -0
- data/lib/ctioga2/metabuilder/type.rb +32 -20
- data/lib/ctioga2/metabuilder/types/strings.rb +2 -2
- data/lib/ctioga2/plotmaker.rb +14 -0
- data/lib/ctioga2/utils.rb +51 -3
- data/lib/ctioga2/version.rb +2 -2
- metadata +5 -3
@@ -35,7 +35,12 @@ module CTioga2
|
|
35
35
|
typed_attribute "#{e}_color".to_sym, 'color'
|
36
36
|
end
|
37
37
|
|
38
|
-
|
38
|
+
TiogaDefaults = {
|
39
|
+
'head_marker' => Tioga::MarkerConstants::Arrowhead,
|
40
|
+
'tail_marker' => Tioga::MarkerConstants::BarThin
|
41
|
+
}
|
42
|
+
|
43
|
+
def old_draw_arrow(t, x1, y1, x2, y2)
|
39
44
|
dict = self.to_hash
|
40
45
|
dict.rename_key('width', 'line_width')
|
41
46
|
dict.rename_key('style', 'line_style')
|
@@ -49,7 +54,142 @@ module CTioga2
|
|
49
54
|
t.show_arrow(dict)
|
50
55
|
end
|
51
56
|
|
57
|
+
|
58
|
+
# Draws an arrow.
|
59
|
+
def draw_arrow(t, x1, y1, x2, y2)
|
60
|
+
dx = x2 - x1
|
61
|
+
dy = y2 - y1
|
62
|
+
|
63
|
+
angle = Types::Dimension.get_angle(t, dx, dy)
|
64
|
+
|
65
|
+
len = Types::Dimension.get_distance(t, dx, dy)
|
66
|
+
|
67
|
+
rs = symbol_size(t, "head")
|
68
|
+
ls = symbol_size(t, "tail")
|
69
|
+
|
70
|
+
x1n, y1n, x2n, y2n = *Types::Dimension::adjust_line(t, x1, y1, x2, y2, -ls, -rs)
|
71
|
+
|
72
|
+
# Must shorten the path first...
|
73
|
+
sv = t.line_cap
|
74
|
+
|
75
|
+
# This has for effect to disable changing the line cap when
|
76
|
+
# there are now arrows to draw.
|
77
|
+
if ! (has_marker?('head') || has_marker?('tail'))
|
78
|
+
sv = Tioga::FigureConstants::LINE_CAP_BUTT
|
79
|
+
end
|
80
|
+
if sv != Tioga::FigureConstants::LINE_CAP_BUTT
|
81
|
+
t.line_cap = Tioga::FigureConstants::LINE_CAP_BUTT
|
82
|
+
end
|
83
|
+
draw_line(t, x1n, y1n, x2n, y2n)
|
84
|
+
if sv != Tioga::FigureConstants::LINE_CAP_BUTT
|
85
|
+
t.line_cap = sv
|
86
|
+
end
|
87
|
+
|
88
|
+
# Then, draw the arrow heads/tails
|
89
|
+
draw_symbol(t, 'head', angle, x2, y2)
|
90
|
+
draw_symbol(t, 'tail', angle - 180, x1, y1)
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
protected
|
95
|
+
|
96
|
+
# Return the dimension of the arrow size
|
97
|
+
def symbol_size(t, name)
|
98
|
+
sz = Types::Dimension.new(:dy,self.send("#{name}_scale") || 1.0)
|
99
|
+
sz.value *= case just(name)
|
100
|
+
when Tioga::FigureConstants::CENTERED
|
101
|
+
0
|
102
|
+
when Tioga::FigureConstants::RIGHT_JUSTIFIED
|
103
|
+
0.5
|
104
|
+
end
|
105
|
+
return sz
|
106
|
+
end
|
107
|
+
|
108
|
+
def just(name)
|
109
|
+
mkr = self.send("#{name}_marker")
|
110
|
+
if mkr == Tioga::MarkerConstants::Arrowhead or
|
111
|
+
mkr == Tioga::MarkerConstants::ArrowheadOpen
|
112
|
+
Tioga::FigureConstants::RIGHT_JUSTIFIED
|
113
|
+
else
|
114
|
+
Tioga::FigureConstants::CENTERED
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def has_marker?(name)
|
119
|
+
mkr = self.send("#{name}_marker")
|
120
|
+
if ! mkr or mkr == 'None'
|
121
|
+
return false
|
122
|
+
else
|
123
|
+
return true
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
# Draw the arrow symbol for the given name (head or tail),
|
128
|
+
# with the given base angle and at the given position
|
129
|
+
def draw_symbol(t, name, angle, x, y)
|
130
|
+
hsh = {}
|
131
|
+
for k in %w(marker scale color angle)
|
132
|
+
tmp = self.send("#{name}_#{k}")
|
133
|
+
if tmp
|
134
|
+
hsh[k] = tmp
|
135
|
+
end
|
136
|
+
end
|
137
|
+
mkr = hsh['marker']
|
138
|
+
if ! mkr or mkr == 'None'
|
139
|
+
return
|
140
|
+
end
|
141
|
+
|
142
|
+
hsh['angle'] ||= 0
|
143
|
+
hsh['angle'] += angle
|
144
|
+
|
145
|
+
hsh['x'] = x
|
146
|
+
hsh['y'] = y
|
147
|
+
|
148
|
+
# Color defaults to line color
|
149
|
+
if @color and !hsh.key?('color')
|
150
|
+
hsh['color'] = @color
|
151
|
+
end
|
152
|
+
|
153
|
+
hsh['justification'] = just(name)
|
154
|
+
t.show_marker(hsh)
|
155
|
+
end
|
156
|
+
|
52
157
|
end
|
158
|
+
|
159
|
+
# This class represents all the stylistic information necessary
|
160
|
+
# to draw a line parallel to a certain direction, indicated by
|
161
|
+
# an angle (default to horizontal)
|
162
|
+
class OrientedLineStyle < ArrowStyle
|
163
|
+
# The angle, in degrees.
|
164
|
+
typed_attribute :angle, 'float'
|
165
|
+
|
166
|
+
# The alignment of the line with respect to the point given.
|
167
|
+
typed_attribute :origin, 'justification'
|
168
|
+
|
169
|
+
# len is a dimension
|
170
|
+
def draw_oriented_arrow(t, xo, yo, len)
|
171
|
+
|
172
|
+
angle = @angle || 0.0
|
173
|
+
|
174
|
+
dx,dy = *len.to_figure(t, angle)
|
175
|
+
|
176
|
+
case @origin || Tioga::FigureConstants::LEFT_JUSTIFIED
|
177
|
+
when Tioga::FigureConstants::LEFT_JUSTIFIED
|
178
|
+
x1, y1 = xo, yo
|
179
|
+
x2, y2 = xo + dx, yo + dy
|
180
|
+
when Tioga::FigureConstants::CENTERED
|
181
|
+
x1, y1 = xo - 0.5 * dx, yo - 0.5 * dy
|
182
|
+
x2, y2 = xo + 0.5 * dx, yo + 0.5 * dy
|
183
|
+
when Tioga::FigureConstants::RIGHT_JUSTIFIED
|
184
|
+
x1, y1 = xo - dx, yo - dy
|
185
|
+
x2, y2 = xo, yo
|
186
|
+
end
|
187
|
+
|
188
|
+
draw_arrow(t, x1, y1, x2, y2)
|
189
|
+
end
|
190
|
+
|
191
|
+
end
|
192
|
+
|
53
193
|
end
|
54
194
|
end
|
55
195
|
end
|
@@ -67,6 +67,12 @@ module CTioga2
|
|
67
67
|
# The color of the stroke for the lines of the axis
|
68
68
|
typed_attribute :stroke_color, 'color'
|
69
69
|
|
70
|
+
# The line width
|
71
|
+
typed_attribute :line_width, 'float'
|
72
|
+
|
73
|
+
# The line style
|
74
|
+
# typed_attribute :line_style,
|
75
|
+
|
70
76
|
typed_attribute :major_tick_length, 'float'
|
71
77
|
typed_attribute :major_tick_width, 'float'
|
72
78
|
|
@@ -144,7 +150,18 @@ minor_tick_length minor_tick_width)
|
|
144
150
|
else
|
145
151
|
spec['type']
|
146
152
|
end
|
147
|
-
t.
|
153
|
+
t.context do
|
154
|
+
if @line_width
|
155
|
+
# Holy gods, there is no way in Tioga to choose the line
|
156
|
+
# width.
|
157
|
+
#
|
158
|
+
# Here is essentially the proof that I must reimplement
|
159
|
+
# the axes.
|
160
|
+
t.xaxis_line_width = @line_width
|
161
|
+
t.yaxis_line_width = @line_width
|
162
|
+
end
|
163
|
+
t.show_axis(spec)
|
164
|
+
end
|
148
165
|
# Now, we draw axis ticks
|
149
166
|
if (type == Tioga::FigureConstants::AXIS_WITH_MAJOR_TICKS_AND_NUMERIC_LABELS) || (type == Tioga::FigureConstants::AXIS_WITH_TICKS_AND_NUMERIC_LABELS)
|
150
167
|
|
@@ -216,7 +216,7 @@ module CTioga2
|
|
216
216
|
ret[key % k] = v
|
217
217
|
end
|
218
218
|
end
|
219
|
-
|
219
|
+
|
220
220
|
if @sub_styles # Not always present too
|
221
221
|
for sub in @sub_styles
|
222
222
|
sym, cls, fmt, fc = *sub
|
@@ -239,7 +239,18 @@ module CTioga2
|
|
239
239
|
end
|
240
240
|
|
241
241
|
def self.sub_styles
|
242
|
-
|
242
|
+
# p [:ss, self]
|
243
|
+
rv = if self.superclass.respond_to?(:sub_styles)
|
244
|
+
self.superclass.sub_styles
|
245
|
+
else
|
246
|
+
[]
|
247
|
+
end
|
248
|
+
# p [:sparents, self, rv]
|
249
|
+
if @sub_styles
|
250
|
+
rv += @sub_styles
|
251
|
+
end
|
252
|
+
# p [:sparents_own, self, rv]
|
253
|
+
return rv
|
243
254
|
end
|
244
255
|
|
245
256
|
# Sets the values of the attributes from the given
|
@@ -275,7 +286,9 @@ module CTioga2
|
|
275
286
|
cur_var = cls.new
|
276
287
|
set_after = true
|
277
288
|
end
|
289
|
+
# p :bef, fmt
|
278
290
|
fmt = name % fmt
|
291
|
+
# p :aft, fmt
|
279
292
|
nb = cur_var.set_from_hash(hash, fmt)
|
280
293
|
|
281
294
|
# Here, this means that missing attributes do not get
|
@@ -325,6 +338,18 @@ module CTioga2
|
|
325
338
|
end
|
326
339
|
end
|
327
340
|
end
|
341
|
+
|
342
|
+
# Now, substyles
|
343
|
+
for sb in self.class.sub_styles
|
344
|
+
symb, cls, fmt, fc = *sb
|
345
|
+
if instance_variable_defined?("@#{symb.to_s}")
|
346
|
+
sub = instance_variable_get("@#{symb.to_s}")
|
347
|
+
fmt = name % fmt
|
348
|
+
if ! sub.nil?
|
349
|
+
retval.update(sub.to_hash(fmt))
|
350
|
+
end
|
351
|
+
end
|
352
|
+
end
|
328
353
|
return retval
|
329
354
|
end
|
330
355
|
|
@@ -333,6 +358,20 @@ module CTioga2
|
|
333
358
|
set_from_hash(other_object.to_hash)
|
334
359
|
end
|
335
360
|
|
361
|
+
# Sets the style from the given hash or other object, if the
|
362
|
+
# style is not present yet.
|
363
|
+
def use_defaults_from(hsh)
|
364
|
+
if hsh.is_a? BasicStyle
|
365
|
+
hsh = hsh.to_hash
|
366
|
+
end
|
367
|
+
at = self.class.attribute_types
|
368
|
+
for k, v in hsh
|
369
|
+
if at.key?(k.to_sym) and ! instance_variable_defined?("@#{k}".to_sym)
|
370
|
+
self.send("#{k}=", v)
|
371
|
+
end
|
372
|
+
end
|
373
|
+
end
|
374
|
+
|
336
375
|
# Converts a hash in text format into a format suitable for
|
337
376
|
# feeding to #set_from_hash. Only relevant keys are
|
338
377
|
# converted. Keys that exist in the options hash but are not
|
@@ -59,39 +59,6 @@ module CTioga2
|
|
59
59
|
|
60
60
|
end
|
61
61
|
|
62
|
-
# This class represents all the stylistic information necessary
|
63
|
-
# to draw a line parallel to a certain direction, indicated by
|
64
|
-
# an angle (default to horizontal)
|
65
|
-
class OrientedLineStyle < StrokeStyle
|
66
|
-
# The angle, in degrees.
|
67
|
-
typed_attribute :angle, 'float'
|
68
|
-
|
69
|
-
# The alignment of the line with respect to the point given.
|
70
|
-
typed_attribute :origin, 'justification'
|
71
|
-
|
72
|
-
# len is a dimension
|
73
|
-
def draw_oriented_line(t, xo, yo, len)
|
74
|
-
|
75
|
-
angle = @angle || 0.0
|
76
|
-
|
77
|
-
dx,dy = *len.to_figure(t, angle)
|
78
|
-
|
79
|
-
case @origin || Tioga::FigureConstants::LEFT_JUSTIFIED
|
80
|
-
when Tioga::FigureConstants::LEFT_JUSTIFIED
|
81
|
-
x1, y1 = xo, yo
|
82
|
-
x2, y2 = xo + dx, yo + dy
|
83
|
-
when Tioga::FigureConstants::CENTERED
|
84
|
-
x1, y1 = xo - 0.5 * dx, yo - 0.5 * dy
|
85
|
-
x2, y2 = xo + 0.5 * dx, yo + 0.5 * dy
|
86
|
-
when Tioga::FigureConstants::RIGHT_JUSTIFIED
|
87
|
-
x1, y1 = xo - dx, yo - dy
|
88
|
-
x2, y2 = xo, yo
|
89
|
-
end
|
90
|
-
|
91
|
-
draw_line(t, x1, y1, x2, y2)
|
92
|
-
end
|
93
|
-
|
94
|
-
end
|
95
62
|
|
96
63
|
# This class represents all the stylistic information to draw a
|
97
64
|
# Marker.
|
@@ -102,42 +69,81 @@ module CTioga2
|
|
102
69
|
# be handled directly in the marker specification...
|
103
70
|
class MarkerStyle < BasicStyle
|
104
71
|
|
105
|
-
# The color
|
106
|
-
typed_attribute :color, 'color'
|
107
|
-
|
108
72
|
# The marker
|
109
73
|
typed_attribute :marker, 'marker'
|
110
74
|
|
111
75
|
# The marker scale
|
112
76
|
typed_attribute :scale, 'float'
|
113
77
|
|
78
|
+
# The angle
|
79
|
+
typed_attribute :angle, 'float'
|
80
|
+
|
81
|
+
# The default for color
|
82
|
+
typed_attribute :color, 'color-or-false'
|
83
|
+
|
84
|
+
# The stroke color
|
85
|
+
typed_attribute :line_color, 'color-or-false'
|
86
|
+
|
87
|
+
# The fill color
|
88
|
+
typed_attribute :fill_color, 'color-or-false'
|
89
|
+
|
90
|
+
# The stroke width
|
91
|
+
typed_attribute :line_width, 'float'
|
92
|
+
|
114
93
|
# Shows the marker at a given location/set of locations.
|
115
94
|
#
|
116
95
|
# \p override is a hash that can override part of the
|
117
96
|
# dictionnary specification.
|
118
97
|
def draw_markers_at(t, x, y, override = nil)
|
119
98
|
return if (! @marker || @marker == 'None')
|
99
|
+
|
100
|
+
dict = {
|
101
|
+
'marker' => @marker
|
102
|
+
}
|
103
|
+
if @line_width
|
104
|
+
dict['stroke_width'] = @line_width
|
105
|
+
end
|
106
|
+
if !(@fill_color.nil?) || !(@line_color.nil?)
|
107
|
+
dict['fill_color'] = @fill_color.nil? ? @color : @fill_color
|
108
|
+
dict['stroke_color'] = @line_color.nil? ? @color : @line_color
|
109
|
+
dict['rendering_mode'] =
|
110
|
+
if dict['fill_color']
|
111
|
+
if dict['stroke_color']
|
112
|
+
Tioga::FigureConstants::FILL_AND_STROKE
|
113
|
+
else
|
114
|
+
Tioga::FigureConstants::FILL
|
115
|
+
end
|
116
|
+
else
|
117
|
+
Tioga::FigureConstants::STROKE
|
118
|
+
end
|
119
|
+
dict.strip_if_false!(%w{fill_color stroke_color})
|
120
|
+
else
|
121
|
+
dict['color'] = @color
|
122
|
+
if ! @color
|
123
|
+
return # Nothing to do !
|
124
|
+
end
|
125
|
+
end
|
126
|
+
if @angle
|
127
|
+
dict['angle'] = @angle
|
128
|
+
end
|
129
|
+
|
130
|
+
if x.is_a? Numeric
|
131
|
+
dict['x'] = x
|
132
|
+
dict['y'] = y
|
133
|
+
else
|
134
|
+
dict['Xs'] = x
|
135
|
+
dict['Ys'] = y
|
136
|
+
end
|
137
|
+
|
138
|
+
if @scale
|
139
|
+
dict['scale'] = @scale
|
140
|
+
end
|
141
|
+
if override
|
142
|
+
dict.merge!(override)
|
143
|
+
end
|
120
144
|
t.context do
|
121
145
|
## \todo allow custom line types for markers ?
|
122
146
|
t.line_type = LineStyles::Solid
|
123
|
-
dict = {
|
124
|
-
'marker' => @marker,
|
125
|
-
'color' => @color
|
126
|
-
}
|
127
|
-
if x.is_a? Numeric
|
128
|
-
dict['x'] = x
|
129
|
-
dict['y'] = y
|
130
|
-
else
|
131
|
-
dict['Xs'] = x
|
132
|
-
dict['Ys'] = y
|
133
|
-
end
|
134
|
-
|
135
|
-
if @scale
|
136
|
-
dict['scale'] = @scale
|
137
|
-
end
|
138
|
-
if override
|
139
|
-
dict.merge!(override)
|
140
|
-
end
|
141
147
|
t.show_marker(dict)
|
142
148
|
end
|
143
149
|
end
|
@@ -26,7 +26,12 @@ module CTioga2
|
|
26
26
|
# This class represents the stylistic information necessary to
|
27
27
|
# draw an error bar. It derives from StrokeStyle, as it is
|
28
28
|
# essentially a stroke.
|
29
|
-
class ErrorBarStyle <
|
29
|
+
class ErrorBarStyle < BasicStyle
|
30
|
+
|
31
|
+
# The style of the line that is drawn, as a StrokeStyle.
|
32
|
+
sub_style :line, StrokeStyle
|
33
|
+
|
34
|
+
alias_for :color, :line_color
|
30
35
|
|
31
36
|
# The error bar style. For now, not much here.
|
32
37
|
attr_accessor :style
|
@@ -42,8 +47,8 @@ module CTioga2
|
|
42
47
|
def show_error_bar(t, x, xmin, xmax, y, ymin, ymax)
|
43
48
|
d = { 'x' => x,
|
44
49
|
'y' => y,
|
45
|
-
'color' => @color || Tioga::ColorConstants::Black,
|
46
|
-
'line_width' => @width || 1.0,
|
50
|
+
'color' => @line.color || Tioga::ColorConstants::Black,
|
51
|
+
'line_width' => @line.width || 1.0,
|
47
52
|
}
|
48
53
|
has = false
|
49
54
|
if (xmin && xmax && (xmax - xmin != 0))
|
@@ -60,6 +65,8 @@ module CTioga2
|
|
60
65
|
# We won't draw something when there isn't anything to draw
|
61
66
|
# !
|
62
67
|
if(has)
|
68
|
+
# We should stop relying on Tioga for that.
|
69
|
+
# Probably this is the place to reimplement that ?
|
63
70
|
t.show_error_bars(d)
|
64
71
|
end
|
65
72
|
end
|