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
@@ -18,7 +18,7 @@ require 'ctioga2/graphics/styles'
18
18
 
19
19
  module CTioga2
20
20
 
21
- Version::register_svn_info('$Revision: 345 $', '$Date: 2012-12-24 10:43:37 +0100 (Mon, 24 Dec 2012) $')
21
+ Version::register_svn_info('$Revision: 386 $', '$Date: 2013-03-11 22:57:16 +0100 (Mon, 11 Mar 2013) $')
22
22
 
23
23
  module Graphics
24
24
 
@@ -64,8 +64,31 @@ module CTioga2
64
64
 
65
65
  # Returns the _y_ value for the baseline of the text in terms
66
66
  # of figure coordinates.
67
+ #
68
+ # This is plain wrong, I think...
67
69
  def get_baseline_y(t, legend_style, y)
68
- return y - Types::Dimension.new(:dy,1.0,:y).to_figure(t)
70
+ w , h = size(t, legend_style)
71
+ return y - h # This is wrong, but not as bad ;-)...
72
+ end
73
+
74
+ # Computes the text size
75
+ def text_size(t, legend_style)
76
+ height = legend_style.dy_to_figure(t)
77
+
78
+ width = 0.0
79
+
80
+ info = t.get_text_size(legend_name)
81
+
82
+ if info.key? 'width'
83
+ width += t.convert_output_to_figure_dx(10*info['width'])
84
+
85
+ h = t.convert_output_to_figure_dy(10*info['height'])
86
+ if h > height
87
+ height = h
88
+ end
89
+ end
90
+
91
+ return [ width, height ]
69
92
  end
70
93
 
71
94
 
@@ -98,17 +121,7 @@ module CTioga2
98
121
  # Computes the size of the line. Height should always be
99
122
  # accurate, but width can be 0 sometimes...
100
123
  def size(t, legend_style)
101
- height = legend_style.dy.to_figure(t)
102
-
103
- width = 0.0
104
-
105
- info = t.get_text_size(legend_name)
106
-
107
- if info.key? 'width'
108
- width += t.convert_output_to_figure_dx(10*info['width'])
109
- end
110
-
111
- return [ width, height ]
124
+ return text_size(t, legend_style)
112
125
  end
113
126
 
114
127
  end
@@ -155,23 +168,21 @@ module CTioga2
155
168
  legend_style.picto_to_text.to_figure(t),
156
169
  'y' => y, 'text' => @curve_style.legend,
157
170
  'measure' => legend_name,
158
- 'justification' => Tioga::FigureConstants::LEFT_JUSTIFIED)
171
+ 'justification' => Tioga::FigureConstants::LEFT_JUSTIFIED,
172
+ 'alignment' => Tioga::FigureConstants::ALIGNED_AT_BASELINE)
159
173
  end
160
174
 
161
175
  # Computes the size of the line. Height should always
162
176
  # be accurate, but width can be 0 sometimes...
163
177
  def size(t, legend_style)
164
- height = legend_style.dy.to_figure(t)
165
-
166
- width = legend_style.picto_width.to_figure(t) +
178
+ width, height = text_size(t, legend_style)
179
+ width += legend_style.picto_width.to_figure(t) +
167
180
  legend_style.picto_to_text.to_figure(t)
168
-
169
- info = t.get_text_size(legend_name)
170
-
171
- if info.key? 'width'
172
- width += t.convert_output_to_figure_dx(10*info['width'])
181
+ lh = Types::Dimension.new(:dy, 1, :y).to_figure(t,:y)
182
+ if lh > height
183
+ height = lh
173
184
  end
174
-
185
+
175
186
  return [ width, height ]
176
187
  end
177
188
 
@@ -0,0 +1,132 @@
1
+ # items.rb: individual legend items
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 'ctioga2/graphics/styles'
18
+
19
+ module CTioga2
20
+
21
+ Version::register_svn_info('$Revision$', '$Date$')
22
+
23
+ module Graphics
24
+
25
+ module Legends
26
+
27
+ # This class is an item that holds other items, and displays
28
+ # them in columns.
29
+ #
30
+ # @todo Add support for tiling on lines too ;-)...
31
+ #
32
+ # @todo Add support for filling up to some width/height.
33
+ #
34
+ # @todo Choose the order (vert first or horiz first)
35
+ class MultiColumnLegend < LegendItem
36
+
37
+ # The underlying storage
38
+ attr_accessor :storage
39
+
40
+ # The style
41
+ attr_accessor :style
42
+
43
+ def initialize(cols = 2)
44
+ super()
45
+ @storage = LegendStorage.new
46
+ @style = Styles::MultiColumnLegendStyle.new
47
+ end
48
+
49
+ # Adds an item to the underlying storage.
50
+ def add_item(item)
51
+ @storage.add_item(item)
52
+ end
53
+
54
+ # Draws all the legends
55
+ def draw(t, legend_style, x, y)
56
+ items = storage.harvest_contents()
57
+ size(t, legend_style)
58
+
59
+ index = 0
60
+
61
+ dy = 0
62
+ dx = 0
63
+ cur_height = legend_style.dy_to_figure(t)
64
+
65
+ for it in items
66
+ w, h = it.size(t, legend_style)
67
+ col = index % @style.columns
68
+
69
+ # Flush
70
+ if col == 0
71
+ dy -= cur_height unless index == 0
72
+ dx = 0
73
+ cur_height = h
74
+ else
75
+ dx += @column_widths[col - 1]
76
+ end
77
+
78
+
79
+ if cur_height < h
80
+ cur_height = h
81
+ end
82
+
83
+ it.draw(t, legend_style, x + dx, y + dy)
84
+ index += 1
85
+ end
86
+
87
+ end
88
+
89
+ # Computes the size of all the legends, and also update the
90
+ # @column_widths array.
91
+ def size(t, legend_style)
92
+ items = storage.harvest_contents()
93
+
94
+ # Always that much !
95
+ cur_height = legend_style.dy_to_figure(t)
96
+ widths = [0] * @style.columns
97
+ height = 0
98
+ index = 0
99
+ for it in items
100
+ w,h = it.size(t, legend_style)
101
+ col = index % @style.columns
102
+
103
+ # Flush
104
+ if col == 0
105
+ height += cur_height unless index == 0
106
+ cur_height = h
107
+ end
108
+ if widths[col] < w
109
+ widths[col] = w
110
+ end
111
+ if cur_height < h
112
+ cur_height = h
113
+ end
114
+ index += 1
115
+ end
116
+
117
+ height += cur_height
118
+ # Now add padding to the columns widths:
119
+ (widths.size()-1).times do |i|
120
+ widths[i] += @style.dx.to_figure(t, :x)
121
+ end
122
+
123
+ @column_widths = widths
124
+ width = widths.reduce(:+) # Do padding !
125
+ return [width, height]
126
+ end
127
+
128
+ end
129
+ end
130
+
131
+ end
132
+ end
@@ -19,10 +19,10 @@ require 'ctioga2/graphics/styles/box'
19
19
  require 'ctioga2/graphics/styles/location'
20
20
  require 'ctioga2/graphics/styles/texts'
21
21
  require 'ctioga2/graphics/styles/carrays'
22
- require 'ctioga2/graphics/styles/curve'
23
22
 
24
23
  require 'ctioga2/graphics/styles/gradients'
25
24
  require 'ctioga2/graphics/styles/colormap'
25
+ require 'ctioga2/graphics/styles/contour'
26
26
 
27
27
 
28
28
  require 'ctioga2/graphics/styles/errorbar'
@@ -37,6 +37,8 @@ require 'ctioga2/graphics/styles/plot'
37
37
  require 'ctioga2/graphics/styles/legend'
38
38
 
39
39
 
40
+ require 'ctioga2/graphics/styles/curve'
41
+
40
42
  require 'ctioga2/graphics/styles/factory'
41
43
 
42
44
  # Style sheets
@@ -17,7 +17,7 @@ require 'ctioga2/log'
17
17
  # This module contains all the classes used by ctioga
18
18
  module CTioga2
19
19
 
20
- Version::register_svn_info('$Revision: 357 $', '$Date: 2012-12-26 00:49:11 +0100 (Wed, 26 Dec 2012) $')
20
+ Version::register_svn_info('$Revision: 435 $', '$Date: 2013-08-26 22:03:19 +0200 (Mon, 26 Aug 2013) $')
21
21
 
22
22
  module Graphics
23
23
 
@@ -72,6 +72,8 @@ module CTioga2
72
72
  typed_attribute :minor_tick_length, 'float'
73
73
  typed_attribute :minor_tick_width, 'float'
74
74
 
75
+ typed_attribute :ticks_side, 'ticks-side'
76
+
75
77
 
76
78
  # Creates a new AxisStyle object at the given location with
77
79
  # the given style.
@@ -80,8 +82,10 @@ module CTioga2
80
82
  @decoration = decoration
81
83
 
82
84
  @tick_label_style = FullTextStyle.new
85
+ @tick_label_style.scale = Types::Dimension.new(:dy, 0.8)
83
86
  @axis_label = TextLabel.new(label)
84
87
  @log = false
88
+ @ticks_side = {}
85
89
  end
86
90
 
87
91
  # Draws the axis within the current plot. Boundaries are the
@@ -96,7 +100,7 @@ module CTioga2
96
100
  def draw_axis(t)
97
101
  spec = get_axis_specification(t)
98
102
  # Add tick label style:
99
- spec.merge!(@tick_label_style.to_hash)
103
+ spec.merge!(@tick_label_style.hash_for_tioga(t))
100
104
 
101
105
  # Direct copy of attributes
102
106
  for key in %w(stroke_color major_tick_length major_tick_width
@@ -106,6 +110,8 @@ minor_tick_length minor_tick_width)
106
110
  spec[key] = val
107
111
  end
108
112
  end
113
+
114
+ spec.update(@ticks_side)
109
115
  t.show_axis(spec)
110
116
  @axis_label.loc = @location
111
117
  default = vertical? ? 'ylabel' : 'xlabel'
@@ -213,8 +219,8 @@ minor_tick_length minor_tick_width)
213
219
  def get_ticks_parameters(t)
214
220
  i = t.axis_information({'location' => @location.tioga_location})
215
221
  retval = []
216
- retval << (@tick_label_style.shift || i['shift'])
217
- retval << (@tick_label_style.scale || i['scale'])
222
+ retval << (@tick_label_style.shift_dy(t) || i['shift'])
223
+ retval << (@tick_label_style.scale_dy(t) || i['scale'])
218
224
 
219
225
  retval[0] += 1
220
226
  return retval
@@ -16,7 +16,7 @@ require 'ctioga2/log'
16
16
  # This module contains all the classes used by ctioga
17
17
  module CTioga2
18
18
 
19
- Version::register_svn_info('$Revision: 370 $', '$Date: 2012-12-28 17:40:18 +0100 (Fri, 28 Dec 2012) $')
19
+ Version::register_svn_info('$Revision: 433 $', '$Date: 2013-08-26 22:03:14 +0200 (Mon, 26 Aug 2013) $')
20
20
 
21
21
  module Graphics
22
22
 
@@ -30,6 +30,12 @@ module CTioga2
30
30
 
31
31
  OldAttrAccessor = method(:attr_accessor)
32
32
 
33
+ AllStyles = []
34
+
35
+ def self.inherited(cls)
36
+ AllStyles << cls
37
+ end
38
+
33
39
  # This redefinition of attr_accessor allows to track for the
34
40
  # names of the attributes, while still showing them up
35
41
  # properly documented in rdoc.
@@ -37,10 +43,6 @@ module CTioga2
37
43
  @attributes ||= []
38
44
  @attributes << symbol
39
45
  OldAttrAccessor.call(symbol)
40
- # cl = caller()
41
- # if not cl[0] =~ /typed_attribute/
42
- # puts "old-style attribute: #{cl[0]}"
43
- # end
44
46
  end
45
47
 
46
48
  # Returns the list of attributes.
@@ -53,6 +55,19 @@ module CTioga2
53
55
  end
54
56
  end
55
57
 
58
+ # Returns the type of all attributes (chaining to the parent
59
+ # when applicable)
60
+ def self.attribute_types
61
+ return ( @attribute_types || {} ).
62
+ merge(
63
+ if superclass.respond_to?(:attribute_types)
64
+ superclass.attribute_types
65
+ else
66
+ {}
67
+ end
68
+ )
69
+ end
70
+
56
71
  # This function should be the main way now of declaring
57
72
  # attributes, as it allows one to automatically generate an
58
73
  # options hash for Command
@@ -70,21 +85,57 @@ module CTioga2
70
85
  type = CmdArg.new(type) unless type.respond_to? :string_to_type
71
86
  @attribute_types ||= {}
72
87
  @attribute_types[sym] = type
88
+ return type
89
+ end
90
+
91
+ # Returns the type of an attribute, or _nil_ if there is no
92
+ # attribute of that name. Handles sub-styles correctly.
93
+ def self.attribute_type(symbol, fmt = "%s")
94
+ name = symbol.to_s
95
+
96
+ for k,v in attribute_types
97
+ if (fmt % k.to_s) == name
98
+ if v.respond_to? :type
99
+ return v.type
100
+ else
101
+ return v
102
+ end
103
+ end
104
+ end
105
+
106
+ if @sub_styles # Not always present too
107
+ for sub in @sub_styles
108
+ sym, cls, fmt2, fc = *sub
109
+ f = fmt % fmt2
110
+ ret = cls.attribute_type(symbol, f)
111
+ return ret if ret
112
+ end
113
+ end
114
+ return nil
115
+ end
116
+
117
+ # Adds a deprecated typed attribute
118
+ def self.deprecated_attribute(symbol, type, message = true)
119
+ type = self.typed_attribute(symbol, type)
120
+ type.option_deprecated = message
73
121
  end
74
122
 
75
123
  # Defines an accessor for an attribute which is a BasicStyle
76
124
  # subclass in itself.
77
125
  #
78
- # _format_ is the thing fed to the subclass for the
126
+ # _fmt_ is the thing fed to the subclass for the
79
127
  # _from_hash_ function.
80
- def self.sub_style(symbol, cls, fmt = nil)
128
+ #
129
+ # if _force_create_ is on, then the corresponding sub-object
130
+ # is created even if no property we set within.
131
+ def self.sub_style(symbol, cls, fmt = nil, force_create = false)
81
132
  @sub_styles ||= [] # A list of [symbol, cls, fmt]
82
133
 
83
134
  if ! fmt
84
135
  fmt = "#{symbol.to_s}_%s"
85
136
  end
86
137
 
87
- @sub_styles << [symbol, cls, fmt]
138
+ @sub_styles << [symbol, cls, fmt, force_create]
88
139
  # Define the accessor
89
140
  OldAttrAccessor.call(symbol)
90
141
  end
@@ -107,7 +158,7 @@ module CTioga2
107
158
 
108
159
  if @sub_styles # Not always present too
109
160
  for sub in @sub_styles
110
- sym, cls, fmt = *sub
161
+ sym, cls, fmt, fc = *sub
111
162
  fmt = key % fmt
112
163
  ret.merge!(cls.options_hash(fmt))
113
164
  end
@@ -146,7 +197,7 @@ module CTioga2
146
197
 
147
198
  if self.class.sub_styles
148
199
  for sub in self.class.sub_styles
149
- sym, cls, fmt = *sub
200
+ sym, cls, fmt, fc = *sub
150
201
  cur_var = self.send(sym)
151
202
  if ! cur_var # Create if not present
152
203
  cur_var = cls.new
@@ -154,7 +205,10 @@ module CTioga2
154
205
  end
155
206
  fmt = name % fmt
156
207
  nb = cur_var.set_from_hash(hash, fmt)
157
- if nb > 0 and set_after
208
+
209
+ # Here, this means that missing attributes do not get
210
+ # created.
211
+ if (nb > 0 or fc) and set_after
158
212
  self.send("#{sym}=", cur_var)
159
213
  end
160
214
  nb_set += nb
@@ -17,7 +17,7 @@ require 'ctioga2/log'
17
17
  # This module contains all the classes used by ctioga
18
18
  module CTioga2
19
19
 
20
- Version::register_svn_info('$Revision: 199 $', '$Date: 2010-11-30 00:48:26 +0100 (Tue, 30 Nov 2010) $')
20
+ Version::register_svn_info('$Revision: 377 $', '$Date: 2013-02-01 12:10:20 +0100 (Fri, 01 Feb 2013) $')
21
21
 
22
22
  module Graphics
23
23
 
@@ -226,6 +226,7 @@ module CTioga2
226
226
  return [t.create_colormap(dict), zvs.first, zvs.last]
227
227
  end
228
228
 
229
+
229
230
  protected
230
231
 
231
232
  # Returns a Dvector holding z values corresponding to each of