ctioga2 0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. data/COPYING +339 -0
  2. data/Changelog +6 -0
  3. data/bin/ctioga2 +26 -0
  4. data/lib/ctioga2/commands/arguments.rb +58 -0
  5. data/lib/ctioga2/commands/commands.rb +258 -0
  6. data/lib/ctioga2/commands/doc/doc.rb +118 -0
  7. data/lib/ctioga2/commands/doc/documentation-commands.rb +119 -0
  8. data/lib/ctioga2/commands/doc/help.rb +95 -0
  9. data/lib/ctioga2/commands/doc/html.rb +230 -0
  10. data/lib/ctioga2/commands/doc/introspection.rb +211 -0
  11. data/lib/ctioga2/commands/doc/man.rb +279 -0
  12. data/lib/ctioga2/commands/doc/markup.rb +359 -0
  13. data/lib/ctioga2/commands/general-commands.rb +119 -0
  14. data/lib/ctioga2/commands/general-types.rb +118 -0
  15. data/lib/ctioga2/commands/groups.rb +73 -0
  16. data/lib/ctioga2/commands/interpreter.rb +257 -0
  17. data/lib/ctioga2/commands/parsers/command-line.rb +187 -0
  18. data/lib/ctioga2/commands/parsers/file.rb +186 -0
  19. data/lib/ctioga2/commands/strings.rb +303 -0
  20. data/lib/ctioga2/commands/type.rb +100 -0
  21. data/lib/ctioga2/commands/variables.rb +101 -0
  22. data/lib/ctioga2/data/backends/backend.rb +260 -0
  23. data/lib/ctioga2/data/backends/backends.rb +39 -0
  24. data/lib/ctioga2/data/backends/backends/gnuplot.rb +140 -0
  25. data/lib/ctioga2/data/backends/backends/math.rb +121 -0
  26. data/lib/ctioga2/data/backends/backends/text.rb +335 -0
  27. data/lib/ctioga2/data/backends/description.rb +405 -0
  28. data/lib/ctioga2/data/backends/factory.rb +73 -0
  29. data/lib/ctioga2/data/backends/parameter.rb +109 -0
  30. data/lib/ctioga2/data/datacolumn.rb +245 -0
  31. data/lib/ctioga2/data/dataset.rb +233 -0
  32. data/lib/ctioga2/data/filters.rb +131 -0
  33. data/lib/ctioga2/data/merge.rb +43 -0
  34. data/lib/ctioga2/data/point.rb +72 -0
  35. data/lib/ctioga2/data/stack.rb +294 -0
  36. data/lib/ctioga2/graphics/coordinates.rb +73 -0
  37. data/lib/ctioga2/graphics/elements.rb +111 -0
  38. data/lib/ctioga2/graphics/elements/containers.rb +111 -0
  39. data/lib/ctioga2/graphics/elements/curve2d.rb +155 -0
  40. data/lib/ctioga2/graphics/elements/element.rb +90 -0
  41. data/lib/ctioga2/graphics/elements/primitive.rb +256 -0
  42. data/lib/ctioga2/graphics/elements/subplot.rb +140 -0
  43. data/lib/ctioga2/graphics/generator.rb +68 -0
  44. data/lib/ctioga2/graphics/legends.rb +108 -0
  45. data/lib/ctioga2/graphics/legends/area.rb +199 -0
  46. data/lib/ctioga2/graphics/legends/items.rb +183 -0
  47. data/lib/ctioga2/graphics/legends/provider.rb +58 -0
  48. data/lib/ctioga2/graphics/legends/storage.rb +65 -0
  49. data/lib/ctioga2/graphics/root.rb +209 -0
  50. data/lib/ctioga2/graphics/styles.rb +30 -0
  51. data/lib/ctioga2/graphics/styles/axes.rb +247 -0
  52. data/lib/ctioga2/graphics/styles/background.rb +122 -0
  53. data/lib/ctioga2/graphics/styles/base.rb +115 -0
  54. data/lib/ctioga2/graphics/styles/carrays.rb +53 -0
  55. data/lib/ctioga2/graphics/styles/curve.rb +101 -0
  56. data/lib/ctioga2/graphics/styles/drawable.rb +87 -0
  57. data/lib/ctioga2/graphics/styles/factory.rb +351 -0
  58. data/lib/ctioga2/graphics/styles/legend.rb +63 -0
  59. data/lib/ctioga2/graphics/styles/plot.rb +410 -0
  60. data/lib/ctioga2/graphics/styles/sets.rb +64 -0
  61. data/lib/ctioga2/graphics/styles/texts.rb +277 -0
  62. data/lib/ctioga2/graphics/subplot-commands.rb +141 -0
  63. data/lib/ctioga2/graphics/types.rb +188 -0
  64. data/lib/ctioga2/graphics/types/bijection.rb +79 -0
  65. data/lib/ctioga2/graphics/types/boundaries.rb +170 -0
  66. data/lib/ctioga2/graphics/types/boxes.rb +157 -0
  67. data/lib/ctioga2/graphics/types/dimensions.rb +157 -0
  68. data/lib/ctioga2/graphics/types/point.rb +247 -0
  69. data/lib/ctioga2/log.rb +97 -0
  70. data/lib/ctioga2/metabuilder/type.rb +316 -0
  71. data/lib/ctioga2/metabuilder/types.rb +39 -0
  72. data/lib/ctioga2/metabuilder/types/coordinates.rb +124 -0
  73. data/lib/ctioga2/metabuilder/types/dates.rb +43 -0
  74. data/lib/ctioga2/metabuilder/types/lists.rb +188 -0
  75. data/lib/ctioga2/metabuilder/types/numbers.rb +97 -0
  76. data/lib/ctioga2/metabuilder/types/strings.rb +93 -0
  77. data/lib/ctioga2/metabuilder/types/styles.rb +178 -0
  78. data/lib/ctioga2/plotmaker.rb +677 -0
  79. data/lib/ctioga2/postprocess.rb +115 -0
  80. data/lib/ctioga2/utils.rb +120 -0
  81. data/setup.rb +1586 -0
  82. metadata +144 -0
@@ -0,0 +1,90 @@
1
+ # element.rb: base class of all drawable elements
2
+ # copyright (c) 2006, 2007, 2008, 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/utils'
16
+ require 'ctioga2/log'
17
+
18
+ # This module contains all the classes used by ctioga
19
+ module CTioga2
20
+
21
+ Version::register_svn_info('$Revision: 54 $', '$Date: 2009-05-20 20:21:11 +0200 (Wed, 20 May 2009) $')
22
+
23
+ # This module contains all graphical elements of CTioga2
24
+ module Graphics
25
+
26
+ # All elements that can be drawn onto a FigureMaker object
27
+ module Elements
28
+
29
+ # The base class for every single object that is drawn on
30
+ # Tioga's output.
31
+ class TiogaElement
32
+ include Log
33
+
34
+ # The parent Container.
35
+ attr_accessor :parent
36
+
37
+ # This function must be called with a FigureMaker object to
38
+ # draw the contents of the TiogaElement onto it. It calls
39
+ # #real_do, which should be redefined by the children. You can
40
+ # redefine _do_ too if you need another debugging output.
41
+ def do(f)
42
+ debug "plotting #{self.inspect}"
43
+ real_do(f)
44
+ end
45
+
46
+ # We plot everything but parent. If a prefix is given, it is prepended
47
+ # to all lines but the first (for indentation)
48
+ def inspect(prefix="")
49
+ ret = "#<#{self.class.name}:\n"
50
+ for i in instance_variables
51
+ next if i == "@parent"
52
+ var = instance_variable_get(i)
53
+ ret += "#{prefix} - #{i} -> "
54
+ if var.is_a? TiogaElement
55
+ ret += "#{var.inspect("#{prefix} ")}\n"
56
+ else
57
+ ret += "#{var.inspect}\n"
58
+ end
59
+ end
60
+ ret += "#{prefix}>"
61
+ return ret
62
+ end
63
+
64
+ protected
65
+
66
+ def real_do(t)
67
+ raise "Should be reimplemented by children"
68
+ end
69
+ end
70
+
71
+
72
+ # # A unique method call to a FigureMaker object.
73
+ # class TiogaFuncall < TiogaElement
74
+
75
+ # # _symbol_ is the symbol to be called, and the remainder will
76
+ # # be used as arguments for the call.
77
+ # def initialize(symbol, *args)
78
+ # @symbol = symbol
79
+ # @args = args
80
+ # end
81
+
82
+ # protected
83
+
84
+ # def real_do(f)
85
+ # f.send(@symbol, *@args)
86
+ # end
87
+ # end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,256 @@
1
+ # primitive.rb: direct use of graphics primitives for tioga
2
+ # copyright (c) 2006, 2007, 2008, 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/utils'
16
+ require 'ctioga2/log'
17
+
18
+ require 'ctioga2/graphics/types'
19
+ require 'shellwords'
20
+
21
+ # This module contains all the classes used by ctioga
22
+ module CTioga2
23
+
24
+ Version::register_svn_info('$Revision: 101 $', '$Date: 2009-07-21 23:29:59 +0200 (Tue, 21 Jul 2009) $')
25
+
26
+ module Graphics
27
+
28
+ module Elements
29
+
30
+ # A TiogaElement that represents a graphics primitive.
31
+ class TiogaPrimitiveCall < TiogaElement
32
+
33
+ # Some kind of reimplementation of Command for graphics
34
+ # primitives
35
+ class TiogaPrimitive
36
+
37
+ # A name (not very useful, but, well, we never know)
38
+ attr_accessor :name
39
+
40
+ # An array of compulsory arguments (type specifications)
41
+ attr_accessor :compulsory_arguments
42
+
43
+ # A hash of optional arguments
44
+ attr_accessor :optional_arguments
45
+
46
+ # A block that will receive a FigureMaker object, the
47
+ # compulsory arguments and a hash containing optional ones.
48
+ attr_accessor :funcall
49
+
50
+ # Creates a TiogaPrimitive object
51
+ def initialize(name, comp, opts = {}, &code)
52
+ @name = name
53
+ @compulsory_arguments = comp
54
+ @optional_arguments = opts
55
+ @funcall = code
56
+ end
57
+ end
58
+
59
+ # A TiogaPrimitive object describing the current primitive
60
+ attr_accessor :primitive
61
+
62
+ # An array containing the values of the compulsory arguments
63
+ attr_accessor :arguments
64
+
65
+ # A hash containing the values of the optional arguments
66
+ attr_accessor :options
67
+
68
+
69
+ # Creates a new TiogaPrimitiveCall object.
70
+ def initialize(primitive, arguments, options)
71
+ @primitive = primitive
72
+ @arguments = arguments
73
+ @options = options
74
+ end
75
+
76
+ @known_primitives = {}
77
+
78
+ PrimitiveCommands = {}
79
+
80
+ PrimitiveGroup = CmdGroup.new('tioga-primitives',
81
+ "Graphics primitives",
82
+ "Tioga graphics primitives", 3)
83
+
84
+ # Creates a new primitive with the given parameters, and makes
85
+ # it immediately available as a command.
86
+ def self.primitive(name, long_name, comp, opts = {}, &code)
87
+ primitive = TiogaPrimitive.new(name, comp, opts, &code)
88
+ @known_primitives[name] = primitive
89
+
90
+ # Now, create the command
91
+ cmd_args = comp.map do |x|
92
+ CmdArg.new(x)
93
+ end
94
+
95
+ cmd_opts = {}
96
+ for k,v in opts
97
+ cmd_opts[k] = CmdArg.new(v)
98
+ end
99
+
100
+ cmd = Cmd.new("draw-#{name}",nil,"--draw-#{name}",
101
+ cmd_args, cmd_opts) do |plotmaker, *rest|
102
+ options = rest.pop
103
+ call = Elements::
104
+ TiogaPrimitiveCall.new(primitive,
105
+ rest, options)
106
+ plotmaker.root_object.current_plot.
107
+ add_element(call)
108
+ end
109
+ cmd.describe("Draws #{long_name}",
110
+ "Directly draws #{long_name} on the current plot", PrimitiveGroup)
111
+
112
+ PrimitiveCommands[name] = cmd
113
+ end
114
+
115
+
116
+ # Returns a pair primitive/primitive command for the named
117
+ # primitive, or [ _nil_, _nil_ ]
118
+ def self.get_primitive(name)
119
+ return [@known_primitives[name], PrimitiveCommands[name]]
120
+ end
121
+
122
+ # Now, a list of primitives, along with their code.
123
+
124
+ primitive("text", "text", [ 'point', 'text' ],
125
+ {
126
+ 'color' => 'color',
127
+ 'scale' => 'float',
128
+ 'angle' => 'float',
129
+ 'justification' => 'justification',
130
+ 'alignment' => 'alignment',
131
+ }
132
+ ) do |t, point, string, options|
133
+ # TODO: add a way to specify fonts ???
134
+ options ||= {}
135
+ options['text'] = string
136
+ options['at'] = point.to_figure_xy(t)
137
+ t.show_text(options)
138
+ end
139
+
140
+ # TODO: add rendering mode !!
141
+ MarkerOptions = {
142
+ 'color' => 'color',
143
+ 'stroke_color' => 'color',
144
+ 'fill_color' => 'color',
145
+ 'scale' => 'float',
146
+ 'horizontal_scale' => 'float',
147
+ 'vertical_scale' => 'float',
148
+ 'angle' => 'float',
149
+ 'justification' => 'justification',
150
+ 'alignment' => 'alignment',
151
+ }
152
+
153
+ primitive("marker", "marker", [ 'point', 'marker' ],
154
+ MarkerOptions) do |t, point, marker, options|
155
+ # TODO: add a way to specify fonts ???
156
+ options ||= {}
157
+ options['marker'] = marker
158
+ options['at'] = point.to_figure_xy(t)
159
+ t.show_marker(options)
160
+ end
161
+
162
+ primitive("string-marker", "marker", [ 'point', 'text' ],
163
+ {'font' => 'pdf-font' }.update(MarkerOptions)
164
+ ) do |t, point, string, options|
165
+ # TODO: add a way to specify fonts ???
166
+ options ||= {}
167
+ options['text'] = string
168
+ options['at'] = point.to_figure_xy(t)
169
+ t.show_marker(options)
170
+ end
171
+
172
+ primitive("arrow", "arrow", [ 'point', 'point' ],
173
+ {
174
+ 'color' => 'color',
175
+ 'head_scale' => 'float',
176
+ 'head_marker' => 'marker',
177
+ 'head_color' => 'color',
178
+ 'tail_scale' => 'float',
179
+ 'tail_marker' => 'marker',
180
+ 'tail_color' => 'color',
181
+ 'line_width' => 'float',
182
+ 'line_style' => 'line-style',
183
+ }
184
+ ) do |t, tail,head, options|
185
+ options ||= {}
186
+ options['head'] = head.to_figure_xy(t)
187
+ options['tail'] = tail.to_figure_xy(t)
188
+ t.show_arrow(options)
189
+ end
190
+
191
+ primitive("line", "line", [ 'point', 'point' ],
192
+ {
193
+ 'color' => 'color',
194
+ 'line_width' => 'float',
195
+ 'line_style' => 'line-style',
196
+ }
197
+ ) do |t, tail,head, options|
198
+ options ||= {}
199
+ for a in ['head', 'tail']
200
+ options["#{a}_marker"] = "None"
201
+ end
202
+ options['head'] = head.to_figure_xy(t)
203
+ options['tail'] = tail.to_figure_xy(t)
204
+ t.show_arrow(options)
205
+ end
206
+
207
+
208
+ protected
209
+
210
+ # Draws the primitive
211
+ def real_do(t)
212
+ args = @arguments + [@options]
213
+ primitive.funcall.call(t, *args)
214
+ end
215
+
216
+ DrawingSpecType =
217
+ CmdType.new('drawing-spec', :string, <<EOD)
218
+ A ctioga 1 --draw specification.
219
+ EOD
220
+
221
+
222
+
223
+ # An emulation of the old ctioga behavior
224
+ CmdDraw = Cmd.new('draw', nil, '--draw',
225
+ [CmdArg.new('drawing-spec')]) do |plotmaker, spec|
226
+ spec =~ /^([^:]+):(.*)/
227
+ name = $1
228
+ args = Shellwords.shellwords($2)
229
+ primitive, cmd = TiogaPrimitiveCall.get_primitive(name)
230
+ if primitive
231
+ # We build the arguments based on the number of compulsory ones
232
+ comp = args.slice!(0,primitive.compulsory_arguments.size)
233
+ opts = {}
234
+ for a in args
235
+ if a =~ /^\s*([^=]+)=(.*)/
236
+ opts[$1] = $2
237
+ else
238
+ plotmaker.error "Argument found where a option= was expected: #{a}"
239
+ end
240
+ end
241
+ plotmaker.interpreter.run_command(cmd, comp, opts)
242
+ else
243
+ plotmaker.error "Unkown graphics primitive: #{name}"
244
+ end
245
+ end
246
+
247
+ CmdDraw.describe("Draws graphics primitives",
248
+ <<EOH, PrimitiveGroup)
249
+ Tries to emulate the old --draw behavior of ctioga. Don't use it for new things.
250
+ EOH
251
+
252
+
253
+ end
254
+ end
255
+ end
256
+ end
@@ -0,0 +1,140 @@
1
+ # subplot.rb: a subplot
2
+ # copyright (c) 2006, 2007, 2008, 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,
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
+ require 'ctioga2/utils'
15
+ require 'ctioga2/log'
16
+
17
+ module CTioga2
18
+
19
+ Version::register_svn_info('$Revision: 95 $', '$Date: 2009-06-25 23:52:42 +0200 (Thu, 25 Jun 2009) $')
20
+
21
+ module Graphics
22
+
23
+ module Elements
24
+
25
+ # A subplot. It features:
26
+ # * inclusion of curves
27
+ # * legends
28
+ # * a way to set/get its figure boundaries.
29
+ class Subplot < Container
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
+ # Various stylistic aspects of the plot, as a
41
+ # Styles::PlotStyle object.
42
+ attr_accessor :style
43
+
44
+ # Whether or not the parent object should take the boundaries
45
+ # into account or not for its own internal boundaries.
46
+ attr_accessor :count_boundaries
47
+
48
+ def initialize(parent, root, style)
49
+ super(parent, root)
50
+
51
+ @user_boundaries = Types::Boundaries.new(nil, nil, nil, nil)
52
+ @real_boundaries = nil
53
+
54
+ @subframe = Types::MarginsBox.new("2.8dy", "2.8dy",
55
+ "2.8dy", "2.8dy")
56
+
57
+ @subframe = nil # Automatic by default.
58
+
59
+ @style = style || Styles::PlotStyle.new
60
+
61
+ # By default, boundaries do not count for the parent
62
+ @count_boundaries = false
63
+ end
64
+
65
+ # Returns the boundaries of the SubPlot.
66
+ def get_boundaries
67
+ # raw boundaries
68
+ bounds = get_elements_boundaries
69
+ if @style.plot_margin
70
+ bounds.apply_margin!(@style.plot_margin)
71
+ end
72
+ bounds.override_boundaries(@user_boundaries)
73
+ return bounds
74
+ end
75
+
76
+ protected
77
+
78
+ # Plots all the objects inside the plot.
79
+ def real_do(t)
80
+ # First thing, we setup the boundaries
81
+
82
+ @real_boundaries = get_boundaries
83
+
84
+ frames = @subframe || @style.estimate_margins(t)
85
+
86
+ # We wrap the call within a subplot
87
+ t.subplot(frames.to_frame_margins(t)) do
88
+
89
+ # Setup various aspects of the figure maker object.
90
+ @style.setup_figure_maker(t)
91
+
92
+ # Manually creating the plot:
93
+ t.set_bounds(@real_boundaries.to_a)
94
+
95
+ # Drawing the background elements:
96
+ t.context do
97
+ t.clip_to_frame
98
+
99
+ @style.background.draw_background(t)
100
+
101
+ @style.draw_all_background_lines(t)
102
+ i = 0
103
+ for element in @elements
104
+ element.do(t)
105
+ i += 1
106
+ end
107
+ end
108
+ @style.draw_all_axes(t)
109
+
110
+ # Now drawing legends:
111
+ if @legend_area
112
+ a, b = @legend_area.partition_frame(t, self)
113
+ t.context do
114
+ t.set_subframe(b)
115
+ @legend_area.display_legend(t, self)
116
+ end
117
+ end
118
+ end
119
+ end
120
+
121
+
122
+ # Returns the boundaries of all the elements of this plot.
123
+ def get_elements_boundaries
124
+ elements_bounds = []
125
+ for el in @elements
126
+ if el.respond_to? :get_boundaries
127
+ if el.respond_to?(:count_boundaries) && ! (el.count_boundaries)
128
+ # Ignoring
129
+ else
130
+ elements_bounds << el.get_boundaries
131
+ end
132
+ end
133
+ end
134
+ return Types::Boundaries.overall_bounds(elements_bounds)
135
+ end
136
+
137
+ end
138
+ end
139
+ end
140
+ end