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,157 @@
1
+ # dimensions.rb: various ways to represent a dimension in Tioga
2
+ # copyright (c) 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: 92 $', '$Date: 2009-06-24 01:17:46 +0200 (Wed, 24 Jun 2009) $')
20
+
21
+ module Graphics
22
+
23
+ module Types
24
+
25
+ # A Dimension is an object that represents a dimension in the
26
+ # different ways understood by Tioga:
27
+ # * an "absolute" dimension, ie, in real units (postscript points)
28
+ # * a "text" dimension, in units of the height of the current
29
+ # text object
30
+ # * a frame/page/figure dimension, in units of the *current*
31
+ # frame/page/figure coordinates
32
+ class Dimension
33
+
34
+ include Tioga::Utils
35
+
36
+ # What is the underlying representation of the dimension ?
37
+ # * :bp in postscript points
38
+ # * :dy in text height units
39
+ # * :frame in frame coordinates
40
+ # * :page in page coordinates
41
+ # * :figure in figure coordinates
42
+ attr_accessor :type
43
+
44
+ # The orientation of the dimension: vertical (:y) or
45
+ # horizontal (:x) ?
46
+ attr_accessor :orientation
47
+
48
+ # The actual dimension. The interpretation depends on the
49
+ # value of #type.
50
+ attr_accessor :value
51
+
52
+ # Creates a Dimension object of the given _type_, the given
53
+ # _value_ oriented along the given _orientation_
54
+ def initialize(type, value, orientation = :x)
55
+ @type = type
56
+ @value = value
57
+ @orientation = orientation
58
+ end
59
+
60
+ # Converts the Dimension to the *figure* coordinates of the
61
+ # *current* figure in _t_.
62
+ def to_figure(t, orientation = nil)
63
+ orientation ||= @orientation
64
+ case @type
65
+ when :bp
66
+ return t.send("convert_output_to_figure_d#{orientation}", @value) * 10
67
+ when :dy
68
+ return t.send("default_text_height_d#{orientation}") * @value
69
+ when :frame
70
+ return t.send("convert_frame_to_figure_d#{orientation}", @value)
71
+ when :page
72
+ return t.send("convert_page_to_figure_d#{orientation}", @value)
73
+ when :figure
74
+ return @value
75
+ else
76
+ raise "Invalid type for Dimension: #{@type}"
77
+ end
78
+ end
79
+
80
+ # Converts the Dimension to the *frame* coordinates of the
81
+ # *current* frame in _t_.
82
+ def to_frame(t, orientation = nil)
83
+ orientation ||= @orientation
84
+ return t.send("convert_figure_to_frame_d#{orientation}",
85
+ to_figure(t, orientation))
86
+ end
87
+
88
+ # Replace this Dimension by _dimension_ if the latter is
89
+ # bigger. Conserves the current orientation.
90
+ def replace_if_bigger(t, dimension)
91
+ if self.to_figure(t) < dimension.to_figure(t, @orientation)
92
+ @type = dimension.type
93
+ @value = dimension.value
94
+ end
95
+ end
96
+
97
+ # Dimension conversion constants taken straight from the
98
+ # TeXbook
99
+ DimensionConversion = {
100
+ "pt" => (72.0/72.27),
101
+ "bp" => 1.0,
102
+ "in" => 72.0,
103
+ "cm" => (72.0/2.54),
104
+ "mm" => (72.0/25.4),
105
+ }
106
+
107
+ # A regular expression that matches all dimensions.
108
+ DimensionRegexp = /^\s*([+-]?\s*[\d.eE+-]+)\s*([a-zA-Z]+)?\s*$/
109
+
110
+
111
+ # Creates a Dimension object from a _text_ specification. The
112
+ # text should be in the forms
113
+ #
114
+ # value unit
115
+ #
116
+ # where unit is one of bp, pt, in, mm, cm, dy (the latter
117
+ # being one unit of height) f|figure, F|Frame|frame,
118
+ # p|page. It can be ommitted, in which case it defaults to the
119
+ # _default_ parameter.
120
+ def self.from_text(text, orientation, default = :figure)
121
+ # Absolute or :dy dimension
122
+ if text =~ DimensionRegexp
123
+ value = Float($1)
124
+ unit = $2
125
+ if ! unit
126
+ unit = default
127
+ elsif DimensionConversion.key?(unit.downcase)
128
+ value *= DimensionConversion[unit.downcase]
129
+ unit = :bp
130
+ else
131
+ case unit
132
+ when /^dy$/i
133
+ unit = :dy
134
+ when /^F|(?i:frame)$/
135
+ unit = :frame
136
+ when /^f|(?i:figure)$/
137
+ unit = :figure
138
+ when /^p|(?i:page)$/
139
+ unit = :page
140
+ else
141
+ raise "Unkown dimension unit: #{unit}"
142
+ end
143
+ end
144
+ return Dimension.new(unit, value, orientation)
145
+ else
146
+ raise "Unkown Dimension specification: '#{text}'"
147
+ end
148
+ end
149
+
150
+ end
151
+
152
+ end
153
+
154
+ end
155
+
156
+ end
157
+
@@ -0,0 +1,247 @@
1
+ # point.rb: various ways to represent a position in Tioga
2
+ # copyright (c) 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
+ require 'ctioga2/utils'
15
+ require 'ctioga2/log'
16
+
17
+ module CTioga2
18
+
19
+ Version::register_svn_info('$Revision: 53 $', '$Date: 2009-05-20 01:05:32 +0200 (Wed, 20 May 2009) $')
20
+
21
+ module Graphics
22
+
23
+ module Types
24
+
25
+ # This class performs the same function as Dimension, except
26
+ # that it represents a *coordinate*. As such, its #value only
27
+ # makes sense as a page, frame or figure coordinate
28
+ class BaseCoordinate < Dimension
29
+
30
+ # Creates a BaseCoordinate object of the given _type_, the
31
+ # given _value_ and oriented along the given _orientation_
32
+ def initialize(type, value, orientation)
33
+ super
34
+ end
35
+
36
+ # Converts the Dimension to the *figure* coordinates of the
37
+ # *current* figure in _t_.
38
+ def to_figure(t, orientation = nil)
39
+ orientation ||= @orientation
40
+ case @type
41
+ when :frame
42
+ return t.send("convert_frame_to_figure_#{orientation}", @value)
43
+ when :page
44
+ return t.send("convert_page_to_figure_#{orientation}", @value)
45
+ when :figure
46
+ return @value
47
+ else
48
+ raise "Invalid type for BaseCoordinate: #{@type}"
49
+ end
50
+ end
51
+
52
+ # Converts the Dimension to the *frame* coordinates of the
53
+ # *current* frame in _t_.
54
+ def to_frame(t, orientation = nil)
55
+ orientation ||= @orientation
56
+ return t.send("convert_figure_to_frame_#{orientation}",
57
+ to_figure(t, orientation))
58
+ end
59
+
60
+ # Creates a BaseCoordinate object from a text
61
+ # specification. Takes the same argument as
62
+ # Dimension.from_text, except that purely dimension #type
63
+ # won't be accepted.
64
+ def self.from_text(text, orientation, default = :figure)
65
+ dim = Dimension.from_text(text, orientation, default)
66
+ if dim.type == :bp or dim.type == :dy
67
+ raise "Does not accept dimensions only for coordinates"
68
+ end
69
+ return BaseCoordinate.new(dim.type, dim.value, dim.orientation)
70
+ end
71
+
72
+ end
73
+
74
+
75
+ # Represents a given Point for Tioga. Its coordinates are
76
+ # BaseCoordinate objects.
77
+ class Point
78
+
79
+ # The X coordinate, a BaseCoordinate object
80
+ attr_accessor :x
81
+
82
+ # The Y coordinate, a BaseCoordinate object
83
+ attr_accessor :y
84
+
85
+ # Creates a Point with the given coordinates (of type _type_,
86
+ # see BaseCoordinate for more information).
87
+ def initialize(x = nil, y = nil, type = :figure)
88
+ if x && y
89
+ @x = BaseCoordinate.new(type, x, :x)
90
+ @y = BaseCoordinate.new(type, y, :y)
91
+ end
92
+ end
93
+
94
+ # Converts the point to figure coordinates.
95
+ def to_figure_xy(t)
96
+ return [@x.to_figure(t), @y.to_figure(t)]
97
+ end
98
+
99
+ # Converts the points to frame coordinates.
100
+ def to_frame_xy(t)
101
+ return [@x.to_frame(t), @y.to_frame(t)]
102
+ end
103
+
104
+ # Creates a Point object from a text specification. Splits up
105
+ # the text at a comma and
106
+ def self.from_text(text, default = :figure)
107
+ vals = text.split(/\s*,\s*/)
108
+ if vals.size != 2
109
+ raise "Should really have two values: #{text}"
110
+ end
111
+ coord = Point.new
112
+ coord.x = BaseCoordinate.from_text(vals[0], :x, default)
113
+ coord.y = BaseCoordinate.from_text(vals[1], :y, default)
114
+ return coord
115
+ end
116
+ end
117
+
118
+ # A Point, but with alignment facilities.
119
+ class AlignedPoint < Point
120
+ # Vertical alignement (:top, :center, :bottom)
121
+ attr_accessor :valign
122
+
123
+ # Horizontal alignment (:left, :center, :right)
124
+ attr_accessor :halign
125
+
126
+ # Creates a AlignedPoint
127
+ def initialize(x = nil, y = nil, type = :figure,
128
+ halign = :center, valign = :center)
129
+ super(x,y,type)
130
+ @halign = halign
131
+ @valign = valign
132
+ end
133
+
134
+ # Returns frame coordinates corresponding to the point, the
135
+ # alignment and the given size in figure coordinates
136
+ def to_frame_coordinates(t, width, height)
137
+ dx = t.convert_figure_to_frame_dx(width).abs
138
+ dy = t.convert_figure_to_frame_dy(height).abs
139
+ x,y = self.to_frame_xy(t)
140
+
141
+ case @valign
142
+ when :top
143
+ yt = y
144
+ yb = y - dy
145
+ when :bottom
146
+ yt = y + dy
147
+ yb = y
148
+ when :center
149
+ yt = y + dy/2
150
+ yb = y - dy/2
151
+ else
152
+ raise "Unknown vertical alignment: #{@valign}"
153
+ end
154
+
155
+ case @halign
156
+ when :right
157
+ xl = x - dx
158
+ xr = x
159
+ when :left
160
+ xl = x
161
+ xr = x + dx
162
+ when :center
163
+ xl = x - dx/2
164
+ xr = x + dx/2
165
+ else
166
+ raise "Unknown horizontal alignment: #{@halign}"
167
+ end
168
+ return [xl, yt, xr, yb]
169
+ end
170
+
171
+ # Returns a frame_margin corresponding to the point, the
172
+ # alignment and the given size in figure coordinates.
173
+ #
174
+ # See #to_frame_coordinates
175
+ def to_frame_margins(t, width, height)
176
+ xl, yt, xr, yb = to_frame_coordinates(t, width, height)
177
+ return [xl,1 - xr, 1 - yt, yb]
178
+ end
179
+
180
+ AlignmentSpecification = {
181
+ 'r' => :right,
182
+ 'c' => :center,
183
+ 'l' => :left,
184
+ 't' => :top,
185
+ 'b' => :bottom
186
+ }
187
+
188
+
189
+ # Creates an AlignedPoint object from a text
190
+ # specification. Splits up the text at a comma and
191
+ def self.from_text(text, default = :figure)
192
+ if not text =~ /^\s*([btlrc]{2})(?::([^,]+),\s*(.*))?\s*$/
193
+ return "Invalid format for #{text}"
194
+ end
195
+
196
+ specs = $1
197
+ specs = specs.chars.map {|x|
198
+ AlignmentSpecification.fetch(x.downcase)
199
+ }
200
+ coord = AlignedPoint.new
201
+ if specs[0] == :center
202
+ specs.reverse!
203
+ end
204
+ case specs[0]
205
+ when :center
206
+ coord.halign = :center
207
+ coord.valign = :center
208
+ when :left, :right
209
+ coord.halign = specs[0]
210
+ coord.valign = specs[1]
211
+ when :top, :bottom
212
+ coord.valign = specs[0]
213
+ coord.halign = specs[1]
214
+ end
215
+
216
+ if $2
217
+ x_spec,y_spec = $2,$3
218
+ coord.x = BaseCoordinate.from_text(x_spec, :x, default)
219
+ coord.y = BaseCoordinate.from_text(y_spec, :y, default)
220
+ else
221
+ case coord.halign
222
+ when :center
223
+ coord.x = BaseCoordinate.new(:frame, 0.5, :x)
224
+ when :left
225
+ coord.x = BaseCoordinate.new(:frame, 0.05, :x)
226
+ when :right
227
+ coord.x = BaseCoordinate.new(:frame, 0.95, :x)
228
+ end
229
+
230
+ case coord.valign
231
+ when :center
232
+ coord.y = BaseCoordinate.new(:frame, 0.5, :y)
233
+ when :bottom
234
+ coord.y = BaseCoordinate.new(:frame, 0.05, :y)
235
+ when :top
236
+ coord.y = BaseCoordinate.new(:frame, 0.95, :y)
237
+ end
238
+ end
239
+ return coord
240
+ end
241
+ end
242
+ end
243
+
244
+ end
245
+
246
+ end
247
+
@@ -0,0 +1,97 @@
1
+ # log.rb, copyright (c) 2006, 2007, 2009 by Vincent Fourmond:
2
+ # The general logging functions for ctioga2
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 'logger'
16
+
17
+ module CTioga2
18
+
19
+ Version::register_svn_info('$Revision: 90 $', '$Date: 2009-06-22 23:28:01 +0200 (Mon, 22 Jun 2009) $')
20
+
21
+ # This module should be included (or extended) by every class that
22
+ # need logging/debugging facilities.
23
+ module Log
24
+
25
+ # Prints a debug message, on channel _channel_. Channel handling
26
+ # is not implemented yet.
27
+ def debug(message, channel = nil)
28
+ @@logger.debug(message)
29
+ end
30
+
31
+ # Prints a warning message
32
+ def warn(message)
33
+ @@logger.warn(message)
34
+ end
35
+
36
+ # Prints an informational message
37
+ def info(message)
38
+ @@logger.info(message)
39
+ end
40
+
41
+ # Prints an error message
42
+ def error(message)
43
+ @@logger.error(message)
44
+ end
45
+
46
+ # Prints a fatal error message and initiates program termination.
47
+ def fatal(message)
48
+ @@logger.fatal(message)
49
+ exit 1 # Fatal error.
50
+ end
51
+
52
+ # These are module functions:
53
+ module_function :error, :debug, :warn, :info, :fatal
54
+
55
+ # Format an exception for displaying
56
+ def format_exception(e)
57
+ return "#{e.class}: #{e.message}\n\t#{e.backtrace.join("\n\t")}"
58
+ end
59
+
60
+ def self.init_logger(stream = STDERR)
61
+ Logger::Formatter::Format.replace("[%4$s] %6$s\n")
62
+ @@logger = Logger.new(stream)
63
+ @@logger.level = Logger::WARN # Warnings and more only by default
64
+ end
65
+
66
+ # Simple accessor for the @@log class variable.
67
+ def self.logger
68
+ return @@logger
69
+ end
70
+
71
+ # Sets the logging level.
72
+ def self.set_level(level = Logger::WARN)
73
+ @@logger.level = level
74
+ end
75
+
76
+ # A logged replacement for system
77
+ def spawn(cmd, priority = :info)
78
+ retval = system(cmd)
79
+ self.send(priority, "Spawned #{cmd} -> " +
80
+ if retval
81
+ "success"
82
+ else
83
+ "failure"
84
+ end
85
+ )
86
+ return retval
87
+ end
88
+
89
+ # Returns a string suitable for identification of an object, a bit
90
+ # in the spirit of #inspect, but without displaying instance
91
+ # variables.
92
+ def identify(obj)
93
+ return "#<%s 0x%x>" % [obj.class, obj.object_id]
94
+ end
95
+
96
+ end
97
+ end