ctioga2 0.4 → 0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. data/Changelog +16 -0
  2. data/lib/ctioga2/commands/arguments.rb +5 -2
  3. data/lib/ctioga2/commands/commands.rb +45 -13
  4. data/lib/ctioga2/commands/context.rb +9 -1
  5. data/lib/ctioga2/commands/doc/help.rb +2 -2
  6. data/lib/ctioga2/commands/doc/html.rb +8 -8
  7. data/lib/ctioga2/commands/doc/introspection.rb +7 -5
  8. data/lib/ctioga2/commands/parsers/file.rb +123 -120
  9. data/lib/ctioga2/commands/parsers/old-file.rb +191 -0
  10. data/lib/ctioga2/commands/strings.rb +2 -2
  11. data/lib/ctioga2/data/datacolumn.rb +5 -2
  12. data/lib/ctioga2/data/dataset.rb +3 -13
  13. data/lib/ctioga2/data/indexed-dtable.rb +43 -11
  14. data/lib/ctioga2/data/stack.rb +65 -8
  15. data/lib/ctioga2/graphics/elements.rb +2 -1
  16. data/lib/ctioga2/graphics/elements/containers.rb +22 -3
  17. data/lib/ctioga2/graphics/elements/primitive.rb +5 -5
  18. data/lib/ctioga2/graphics/elements/xyz-contour.rb +123 -0
  19. data/lib/ctioga2/graphics/generator.rb +31 -5
  20. data/lib/ctioga2/graphics/legends.rb +44 -3
  21. data/lib/ctioga2/graphics/legends/area.rb +28 -9
  22. data/lib/ctioga2/graphics/legends/items.rb +34 -23
  23. data/lib/ctioga2/graphics/legends/multicols.rb +132 -0
  24. data/lib/ctioga2/graphics/styles.rb +3 -1
  25. data/lib/ctioga2/graphics/styles/axes.rb +10 -4
  26. data/lib/ctioga2/graphics/styles/base.rb +65 -11
  27. data/lib/ctioga2/graphics/styles/colormap.rb +2 -1
  28. data/lib/ctioga2/graphics/styles/contour.rb +141 -0
  29. data/lib/ctioga2/graphics/styles/curve.rb +49 -67
  30. data/lib/ctioga2/graphics/styles/drawable.rb +17 -8
  31. data/lib/ctioga2/graphics/styles/factory.rb +79 -38
  32. data/lib/ctioga2/graphics/styles/legend.rb +49 -6
  33. data/lib/ctioga2/graphics/styles/plot.rb +10 -9
  34. data/lib/ctioga2/graphics/styles/sheet.rb +11 -11
  35. data/lib/ctioga2/graphics/styles/texts.rb +38 -9
  36. data/lib/ctioga2/graphics/types.rb +20 -1
  37. data/lib/ctioga2/graphics/types/dimensions.rb +7 -1
  38. data/lib/ctioga2/metabuilder/types/lists.rb +4 -4
  39. data/lib/ctioga2/metabuilder/types/numbers.rb +3 -3
  40. data/lib/ctioga2/metabuilder/types/styles.rb +2 -2
  41. data/lib/ctioga2/plotmaker.rb +12 -1
  42. data/lib/ctioga2/utils.rb +27 -3
  43. metadata +8 -4
@@ -22,6 +22,7 @@ require 'ctioga2/graphics/elements/gradient-region'
22
22
  require 'ctioga2/graphics/elements/curve2d'
23
23
  require 'ctioga2/graphics/elements/parametric2d'
24
24
  require 'ctioga2/graphics/elements/xyz-map'
25
+ require 'ctioga2/graphics/elements/xyz-contour'
25
26
  require 'ctioga2/graphics/elements/primitive'
26
27
 
27
28
  require 'ctioga2/graphics/elements/tangent'
@@ -29,7 +30,7 @@ require 'ctioga2/graphics/elements/contour'
29
30
 
30
31
  module CTioga2
31
32
 
32
- Version::register_svn_info('$Revision: 288 $', '$Date: 2011-02-22 21:12:58 +0100 (Tue, 22 Feb 2011) $')
33
+ Version::register_svn_info('$Revision: 405 $', '$Date: 2013-08-22 16:25:13 +0200 (Thu, 22 Aug 2013) $')
33
34
 
34
35
  module Graphics
35
36
 
@@ -17,7 +17,7 @@ require 'ctioga2/log'
17
17
 
18
18
  module CTioga2
19
19
 
20
- Version::register_svn_info('$Revision: 155 $', '$Date: 2010-06-21 21:41:32 +0200 (Mon, 21 Jun 2010) $')
20
+ Version::register_svn_info('$Revision: 378 $', '$Date: 2013-03-04 22:42:54 +0100 (Mon, 04 Mar 2013) $')
21
21
 
22
22
  module Graphics
23
23
 
@@ -47,6 +47,10 @@ module CTioga2
47
47
  # object
48
48
  attr_accessor :legend_storage
49
49
 
50
+ # The current legend container to which legend items are added.
51
+ # Defaults to the #legend_storage, but it can be changed
52
+ attr_accessor :legend_item_target
53
+
50
54
  # Creates an empty new Container with the given _parent_.
51
55
  def initialize(parent = nil, root = nil)
52
56
  @parent = parent
@@ -60,6 +64,8 @@ module CTioga2
60
64
  @root_object = root
61
65
 
62
66
  @legend_storage = Legends::LegendStorage.new
67
+
68
+ @legend_item_target = @legend_storage
63
69
 
64
70
  # By default, don't display legends.
65
71
  @legend_area = nil
@@ -98,9 +104,22 @@ module CTioga2
98
104
  end
99
105
 
100
106
 
101
- # Adds a legend item to the #associated_legend_storage
107
+ # Adds a legend item to the current storage
102
108
  def add_legend_item(item)
103
- @legend_storage.add_item(item)
109
+ @legend_item_target.add_item(item)
110
+ end
111
+
112
+ # Adds a legend item to the current storage and make that item
113
+ # the next target for legend items.
114
+ #
115
+ # If @a sub is nil, then switch back to the top
116
+ def enter_legend_subcontainer(sub)
117
+ if sub
118
+ add_legend_item(sub)
119
+ @legend_item_target = sub
120
+ else
121
+ @legend_item_target = @legend_storage
122
+ end
104
123
  end
105
124
 
106
125
  # \todo provide coordinate conversion facilities...
@@ -22,7 +22,7 @@ require 'shellwords'
22
22
  # This module contains all the classes used by ctioga
23
23
  module CTioga2
24
24
 
25
- Version::register_svn_info('$Revision: 370 $', '$Date: 2012-12-28 17:40:18 +0100 (Fri, 28 Dec 2012) $')
25
+ Version::register_svn_info('$Revision: 391 $', '$Date: 2013-03-14 11:04:36 +0100 (Thu, 14 Mar 2013) $')
26
26
 
27
27
  module Graphics
28
28
 
@@ -231,8 +231,8 @@ EOD
231
231
  [ 'point', 'point' ],
232
232
  Styles::ArrowStyle,
233
233
  'arrow') do |t, tail, head, style, options|
234
- style.draw_arrow(t, *tail.to_figure_xy(t),
235
- *head.to_figure_xy(t))
234
+ style.draw_arrow(t, *( tail.to_figure_xy(t) +
235
+ head.to_figure_xy(t) ))
236
236
  end
237
237
 
238
238
  styled_primitive("line", "line",
@@ -240,8 +240,8 @@ EOD
240
240
  Styles::StrokeStyle,
241
241
  'line'
242
242
  ) do |t, tail, head, style, options|
243
- style.draw_line(t, *(tail.to_figure_xy(t)),
244
- *(head.to_figure_xy(t)))
243
+ style.draw_line(t, *( tail.to_figure_xy(t) +
244
+ head.to_figure_xy(t) ))
245
245
  end
246
246
 
247
247
  # Here, we need to add deprecated options for backward
@@ -0,0 +1,123 @@
1
+ # xyz-contour.rb: contour plot of a xyz set of data
2
+ # copyright (c) 2013 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$', '$Date$')
23
+
24
+ module Graphics
25
+
26
+ module Elements
27
+
28
+ # This class displays a XYZ element using contour lines.
29
+ class XYZContour < TiogaElement
30
+
31
+ include Log
32
+ include Dobjects
33
+
34
+ # The Data::Dataset object that should get plotted.
35
+ attr_accessor :dataset
36
+
37
+ # A Styles::CurveStyle object saying how the curve should be
38
+ # drawn.
39
+ #
40
+ # Some of the elements will be overridden.
41
+ attr_accessor :curve_style
42
+
43
+ # The IndexedTable object representing the underlying data
44
+ attr_accessor :table
45
+
46
+
47
+ undef :location=, :location
48
+
49
+ # Creates a new XYZContour object with the given _dataset_ and
50
+ # _style_.
51
+ #
52
+ # Lots of code in common with XYZMap
53
+ def initialize(dataset, style = nil)
54
+ @dataset = dataset
55
+ @curve_style = style
56
+ prepare_data
57
+ end
58
+
59
+ # Prepares the internal storage of the data, from the @dataset
60
+ def prepare_data
61
+ @table = @dataset.indexed_table
62
+ end
63
+
64
+ protected :prepare_data
65
+
66
+ # Returns the LocationStyle object of the curve. Returns the
67
+ # one from #curve_style.
68
+ def location
69
+ return @curve_style.location
70
+ end
71
+
72
+ # Returns the Types::Boundaries of this curve.
73
+ def get_boundaries
74
+ return @table.xy_boundaries
75
+ end
76
+
77
+
78
+ ## Actually draws the curve
79
+ def real_do(t)
80
+ debug { "Plotting curve #{inspect}" }
81
+ t.context do
82
+ # Of course, there are still quite a few things to do
83
+ # ;-)...
84
+
85
+ # Ideas: for leaving things out, I may have to use min_gt
86
+ # along with masking.
87
+
88
+ ## @todo handle non-homogeneous XY maps.
89
+
90
+ @curve_style.color_map ||=
91
+ Styles::ColorMap.from_text("Red--Green")
92
+
93
+ if @curve_style.zaxis
94
+ begin
95
+ @parent.style.get_axis_style(@curve_style.zaxis).
96
+ set_color_map(@curve_style.color_map,
97
+ @table.table.min,
98
+ @table.table.max)
99
+ rescue
100
+ error { "Could not set Z info to non-existent axis #{@curve_style.zaxis}" }
101
+ end
102
+ end
103
+
104
+ # Computation of equally spaced level lines
105
+ nb = 20
106
+
107
+ zmin = @table.table.min
108
+ zmax = @table.table.max
109
+
110
+ t.context do
111
+ @curve_style.line.set_stroke_style(t)
112
+ @curve_style.contour.plot_contours(t, table,
113
+ zmin, zmax,
114
+ @curve_style.color_map)
115
+ end
116
+
117
+ end
118
+ end
119
+
120
+ end
121
+ end
122
+ end
123
+ end
@@ -18,7 +18,7 @@ require 'ctioga2/graphics/coordinates'
18
18
 
19
19
  module CTioga2
20
20
 
21
- Version::register_svn_info('$Revision: 311 $', '$Date: 2012-04-16 22:51:59 +0200 (Mon, 16 Apr 2012) $')
21
+ Version::register_svn_info('$Revision: 412 $', '$Date: 2013-08-22 23:04:59 +0200 (Thu, 22 Aug 2013) $')
22
22
 
23
23
  module Graphics
24
24
 
@@ -73,13 +73,17 @@ module CTioga2
73
73
  CurveStyleFactory::PlotCommandOptions.key?(k)
74
74
  }
75
75
 
76
-
77
- return send(@current_curves, plot, dataset, options)
76
+ curve = send(@current_curves, plot, dataset, options)
77
+ curve.curve_style.target = curve
78
+ return curve
78
79
  end
79
80
 
80
81
  private
81
82
 
82
83
  ## \name Available kinds of curves
84
+ ##
85
+ ## @todo All these are completely identical, there probably
86
+ ## isn't need for separate code ?
83
87
  #
84
88
  # @{
85
89
  #
@@ -98,11 +102,11 @@ module CTioga2
98
102
  def xy_parametric(plot, dataset, options = {})
99
103
  legend = @legend_provider.dataset_legend(dataset)
100
104
  style = @style_factory.next(options)
101
- style.legend = false
102
105
  style.legend ||= legend # The legend specified as option to
103
106
  # the --plot command has precedence
104
107
  # over the one specified by --legend.
105
108
  curve = Graphics::Elements::Parametric2D.new(dataset, style)
109
+ style
106
110
  return curve
107
111
  end
108
112
 
@@ -110,14 +114,26 @@ module CTioga2
110
114
  def xyz_map(plot, dataset, options = {})
111
115
  legend = @legend_provider.dataset_legend(dataset)
112
116
  style = @style_factory.next(options)
113
- style.legend = false
114
117
  style.legend ||= legend # The legend specified as option to
115
118
  # the --plot command has precedence
116
119
  # over the one specified by --legend.
120
+ style.legend = false # No legend for XYZ maps
117
121
  curve = Graphics::Elements::XYZMap.new(dataset, style)
118
122
  return curve
119
123
  end
120
124
 
125
+ # XYZ maps
126
+ def xyz_contour(plot, dataset, options = {})
127
+ legend = @legend_provider.dataset_legend(dataset)
128
+ style = @style_factory.next(options)
129
+ style.legend ||= legend # The legend specified as option to
130
+ # the --plot command has precedence
131
+ # over the one specified by --legend.
132
+ style.legend = false # No legend for XYZ maps
133
+ curve = Graphics::Elements::XYZContour.new(dataset, style)
134
+ return curve
135
+ end
136
+
121
137
 
122
138
  ## @}
123
139
 
@@ -141,6 +157,16 @@ module CTioga2
141
157
  Switch to XY parametric plots, that is standard XY plots whose appearance
142
158
  (such as color, marker color, and, potentially, marker kinds and more)
143
159
  are governed by one (or more ?) Z values.
160
+ EOH
161
+
162
+ ContourPlotCommand =
163
+ Cmd.new("contour",nil,"--contour") do |plotmaker|
164
+ plotmaker.curve_generator.current_curves = :xyz_contour
165
+ end
166
+
167
+ ContourPlotCommand.describe('select contour plots',
168
+ <<EOH, PlotTypesGroup)
169
+ ...
144
170
  EOH
145
171
 
146
172
  XYPlotCommand =
@@ -16,10 +16,11 @@ require 'ctioga2/graphics/legends/items'
16
16
  require 'ctioga2/graphics/legends/area'
17
17
  require 'ctioga2/graphics/legends/storage'
18
18
  require 'ctioga2/graphics/legends/provider'
19
+ require 'ctioga2/graphics/legends/multicols'
19
20
 
20
21
  module CTioga2
21
22
 
22
- Version::register_svn_info('$Revision: 357 $', '$Date: 2012-12-26 00:49:11 +0100 (Wed, 26 Dec 2012) $')
23
+ Version::register_svn_info('$Revision: 432 $', '$Date: 2013-08-23 19:06:36 +0200 (Fri, 23 Aug 2013) $')
23
24
 
24
25
  module Graphics
25
26
 
@@ -52,6 +53,9 @@ EOH
52
53
  LegendLineCommand.describe("Adds a pure text line to the legend",
53
54
  <<EOH, LegendGroup)
54
55
  Adds a line of text unrelated to any curve to the legend.
56
+
57
+ The options controlling the aspect of the legend are documented in the
58
+ {command: define-text-style} command.
55
59
  EOH
56
60
 
57
61
 
@@ -82,9 +86,16 @@ EOH
82
86
  <<EOH, LegendGroup)
83
87
  Sets the various aspects of the style of the legends throught
84
88
  its options:
85
- * @dy@: the spacing between consecutive lines
89
+ * @dy@: the spacing between the baseline of consecutive lines;
90
+ it is deprecated now in favor of @vpadding@;
91
+ * @vpadding@: the space left between the bottom of a line and the top of
92
+ the next one;
86
93
  * @scale@: the overall scale of the legends
87
- * @text_scale@: the scale of the text (and the markers) inside the legends
94
+ * @text-scale@: the scale of the text (and the markers) inside the legends
95
+
96
+ The @frame-@ options control the drawing of a frame around the legend;
97
+ they have the same meaning as corresponding ones of
98
+ {command: define-box-style} with the @frame-@ bit dropped.
88
99
  EOH
89
100
 
90
101
  LegendInsideCommand =
@@ -107,5 +118,35 @@ As a shortcut, {command: legend-inside} also takes all the options that
107
118
  EOH
108
119
 
109
120
 
121
+ LegendMulticolOptions = Styles::MultiColumnLegendStyle.options_hash()
122
+
123
+ LegendMultiColCommand =
124
+ Cmd.new("legend-multicol", nil, "--legend-multicol",
125
+ [], LegendMulticolOptions) do |plotmaker, options|
126
+ multicol = Legends::MultiColumnLegend.new
127
+ multicol.style.set_from_hash(options)
128
+ plotmaker.root_object.current_plot.
129
+ enter_legend_subcontainer(multicol)
130
+ end
131
+
132
+ LegendMultiColCommand.describe("Lay out legends in several columns",
133
+ <<EOH, LegendGroup)
134
+ Following legends will be layed out in multiple columns, until a call
135
+ to {command: legend-multicol-end}.
136
+ EOH
137
+
138
+ LegendMultiColEndCommand =
139
+ Cmd.new("legend-multicol-end", nil, "--legend-multicol-end",
140
+ [], {}) do |plotmaker, options|
141
+ plotmaker.root_object.current_plot.
142
+ enter_legend_subcontainer(nil)
143
+ end
144
+
145
+ LegendMultiColEndCommand.describe("End of multicolumn legends",
146
+ <<EOH, LegendGroup)
147
+ Stop layout out legends in several columns
148
+ EOH
149
+
150
+
110
151
  end
111
152
  end
@@ -16,7 +16,7 @@ require 'ctioga2/log'
16
16
 
17
17
  module CTioga2
18
18
 
19
- Version::register_svn_info('$Revision: 359 $', '$Date: 2012-12-26 10:45:35 +0100 (Wed, 26 Dec 2012) $')
19
+ Version::register_svn_info('$Revision: 386 $', '$Date: 2013-03-11 22:57:16 +0100 (Mon, 11 Mar 2013) $')
20
20
 
21
21
  module Graphics
22
22
 
@@ -74,6 +74,8 @@ module CTioga2
74
74
  def display_legend(t, container)
75
75
  items = container.legend_storage.harvest_contents
76
76
  t.context do
77
+
78
+ ## @todo These two commands should join LegendStyle
77
79
  t.rescale(@legend_style.scale)
78
80
  t.rescale_text(@legend_style.text_scale)
79
81
 
@@ -82,8 +84,9 @@ module CTioga2
82
84
  ## \todo customize this !
83
85
  x, y = initial_xy(t, container)
84
86
 
85
- w,h = *size(t, container)
86
- h /= @legend_style.scale * @legend_style.text_scale
87
+ w,h = *size(t, container, false)
88
+
89
+
87
90
  @legend_style.frame.
88
91
  draw_box_around(t, x, y,
89
92
  x + w, y - h, @legend_style.frame_padding)
@@ -91,8 +94,9 @@ module CTioga2
91
94
  for item in items
92
95
  ## \todo transform the 0.0 for x into a negative
93
96
  # user-specifiable stuff.
97
+ iw, ih = *item.size(t, @legend_style)
94
98
  item.draw(t, @legend_style, x , y)
95
- y -= @legend_style.dy.to_figure(t,:y)
99
+ y -= ih
96
100
  end
97
101
  end
98
102
  end
@@ -100,19 +104,34 @@ module CTioga2
100
104
  # Returns the total size of the legend as a
101
105
  # [ width, height ]
102
106
  # array in figure coordinates.
103
- def size(t, container)
107
+ #
108
+ # It assumes that the scales are not setup yet, unless
109
+ # _resize_ is set to false.
110
+ def size(t, container, resize = true)
104
111
  items = container.legend_storage.harvest_contents
105
112
  width, height = 0,0
113
+
114
+ # We apparently can't use context here, for a reason that fails me...
115
+ if resize
116
+ t.rescale(@legend_style.scale)
117
+ t.rescale_text(@legend_style.text_scale)
118
+ end
119
+
106
120
  for item in items
107
121
  w,h = item.size(t, @legend_style)
122
+
108
123
  if w > width
109
124
  width = w
110
125
  end
111
- # Hmmm... this is plain wrong...
112
- # height += h
113
- height += @legend_style.dy.to_figure(t,:y) *
114
- @legend_style.scale * @legend_style.text_scale
126
+
127
+ height += h
115
128
  end
129
+
130
+ if resize
131
+ t.rescale(1/@legend_style.scale)
132
+ t.rescale_text(1/@legend_style.text_scale)
133
+ end
134
+
116
135
  return [ width, height ]
117
136
  end
118
137