ctioga 1.11.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. data/COPYING +340 -0
  2. data/ctioga/bin/ctable +28 -0
  3. data/ctioga/bin/ctioga +37 -0
  4. data/ctioga/doc/ctable.1 +156 -0
  5. data/ctioga/doc/ctioga.1 +2363 -0
  6. data/ctioga/examples/README +46 -0
  7. data/ctioga/examples/ctioga.gnuplot +4 -0
  8. data/ctioga/examples/ctioga_within_tioga.rb +53 -0
  9. data/ctioga/examples/ctiogarc.rb +24 -0
  10. data/ctioga/examples/include_1.rb +15 -0
  11. data/ctioga/examples/noise.dat +100 -0
  12. data/ctioga/examples/noise.rb +13 -0
  13. data/ctioga/examples/trig.csv +100 -0
  14. data/ctioga/examples/trig.dat +100 -0
  15. data/ctioga/examples/trig.rb +14 -0
  16. data/ctioga/examples/trigh.dat +100 -0
  17. data/ctioga/examples/trigh.rb +10 -0
  18. data/ctioga/examples/tutorial +763 -0
  19. data/ctioga/examples/tutorial.sh +269 -0
  20. data/ctioga/tests/README +14 -0
  21. data/ctioga/tests/axes.sh +40 -0
  22. data/ctioga/tests/basic.sh +11 -0
  23. data/ctioga/tests/draw.sh +24 -0
  24. data/ctioga/tests/histograms.sh +14 -0
  25. data/ctioga/tests/insets.sh +41 -0
  26. data/ctioga/tests/layouts.sh +29 -0
  27. data/ctioga/tests/legends.sh +113 -0
  28. data/ctioga/tests/styles.sh +43 -0
  29. data/ctioga/tests/test_style.sh +8 -0
  30. data/ctioga/tests/tests.sh +24 -0
  31. data/ctioga/tests/text_backend.sh +83 -0
  32. data/ctioga/tests/tioga_defaults.rb +18 -0
  33. data/lib/CTioga/axes.rb +904 -0
  34. data/lib/CTioga/backends.rb +88 -0
  35. data/lib/CTioga/boundaries.rb +224 -0
  36. data/lib/CTioga/ctable.rb +134 -0
  37. data/lib/CTioga/curve_style.rb +246 -0
  38. data/lib/CTioga/debug.rb +199 -0
  39. data/lib/CTioga/dimension.rb +133 -0
  40. data/lib/CTioga/elements.rb +17 -0
  41. data/lib/CTioga/elements/base.rb +84 -0
  42. data/lib/CTioga/elements/containers.rb +578 -0
  43. data/lib/CTioga/elements/curves.rb +368 -0
  44. data/lib/CTioga/elements/tioga_primitives.rb +440 -0
  45. data/lib/CTioga/layout.rb +595 -0
  46. data/lib/CTioga/legends.rb +29 -0
  47. data/lib/CTioga/legends/cmdline.rb +187 -0
  48. data/lib/CTioga/legends/item.rb +164 -0
  49. data/lib/CTioga/legends/style.rb +257 -0
  50. data/lib/CTioga/log.rb +73 -0
  51. data/lib/CTioga/movingarrays.rb +131 -0
  52. data/lib/CTioga/partition.rb +271 -0
  53. data/lib/CTioga/plot_style.rb +230 -0
  54. data/lib/CTioga/plotmaker.rb +1677 -0
  55. data/lib/CTioga/shortcuts.rb +69 -0
  56. data/lib/CTioga/structures.rb +82 -0
  57. data/lib/CTioga/styles.rb +140 -0
  58. data/lib/CTioga/themes.rb +581 -0
  59. data/lib/CTioga/themes/classical.rb +82 -0
  60. data/lib/CTioga/themes/demo.rb +63 -0
  61. data/lib/CTioga/themes/fits.rb +91 -0
  62. data/lib/CTioga/themes/mono.rb +33 -0
  63. data/lib/CTioga/tioga.rb +32 -0
  64. data/lib/CTioga/utils.rb +173 -0
  65. data/lib/MetaBuilder/Parameters/dates.rb +38 -0
  66. data/lib/MetaBuilder/Parameters/lists.rb +132 -0
  67. data/lib/MetaBuilder/Parameters/numbers.rb +69 -0
  68. data/lib/MetaBuilder/Parameters/strings.rb +86 -0
  69. data/lib/MetaBuilder/Parameters/styles.rb +75 -0
  70. data/lib/MetaBuilder/Qt4/Parameters/dates.rb +51 -0
  71. data/lib/MetaBuilder/Qt4/Parameters/numbers.rb +65 -0
  72. data/lib/MetaBuilder/Qt4/Parameters/strings.rb +106 -0
  73. data/lib/MetaBuilder/Qt4/parameter.rb +172 -0
  74. data/lib/MetaBuilder/Qt4/parameters.rb +9 -0
  75. data/lib/MetaBuilder/descriptions.rb +603 -0
  76. data/lib/MetaBuilder/factory.rb +101 -0
  77. data/lib/MetaBuilder/group.rb +57 -0
  78. data/lib/MetaBuilder/metabuilder.rb +10 -0
  79. data/lib/MetaBuilder/parameter.rb +374 -0
  80. data/lib/MetaBuilder/parameters.rb +11 -0
  81. data/lib/MetaBuilder/qt4.rb +8 -0
  82. data/lib/SciYAG/Backends/backend.rb +379 -0
  83. data/lib/SciYAG/Backends/binner.rb +168 -0
  84. data/lib/SciYAG/Backends/cache.rb +102 -0
  85. data/lib/SciYAG/Backends/dataset.rb +158 -0
  86. data/lib/SciYAG/Backends/descriptions.rb +469 -0
  87. data/lib/SciYAG/Backends/filters.rb +25 -0
  88. data/lib/SciYAG/Backends/filters/average.rb +134 -0
  89. data/lib/SciYAG/Backends/filters/cumulate.rb +37 -0
  90. data/lib/SciYAG/Backends/filters/filter.rb +70 -0
  91. data/lib/SciYAG/Backends/filters/norm.rb +39 -0
  92. data/lib/SciYAG/Backends/filters/smooth.rb +63 -0
  93. data/lib/SciYAG/Backends/filters/sort.rb +43 -0
  94. data/lib/SciYAG/Backends/filters/strip.rb +34 -0
  95. data/lib/SciYAG/Backends/filters/trim.rb +64 -0
  96. data/lib/SciYAG/Backends/gnuplot.rb +131 -0
  97. data/lib/SciYAG/Backends/math.rb +108 -0
  98. data/lib/SciYAG/Backends/mdb.rb +462 -0
  99. data/lib/SciYAG/Backends/multitext.rb +96 -0
  100. data/lib/SciYAG/Backends/source.rb +64 -0
  101. data/lib/SciYAG/Backends/text.rb +339 -0
  102. data/lib/SciYAG/backends.rb +16 -0
  103. metadata +191 -0
@@ -0,0 +1,69 @@
1
+ # log.rb, copyright (c) 2006 by Vincent Fourmond:
2
+ # The general logging functions for Ctioga
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
+ module CTioga
15
+
16
+ Version::register_svn_info('$Revision: 778 $', '$Date: 2008-03-09 03:44:48 +0100 (Sun, 09 Mar 2008) $')
17
+
18
+ # A class implementing small shortcuts, that is a set of command-line
19
+ # arguments.
20
+ class Shortcut
21
+
22
+ @@shortcut_list = {}
23
+
24
+ # The name of the shortcut
25
+ attr_accessor :name
26
+
27
+ # Its arguments
28
+ attr_accessor :arguments
29
+
30
+ def initialize(name, *args)
31
+ @name = name
32
+ @arguments = args
33
+ @@shortcut_list[name] = self
34
+ end
35
+
36
+ def self.list
37
+ return @@shortcut_list.keys
38
+ end
39
+
40
+ def self.has?(name)
41
+ return @@shortcut_list.key?(name)
42
+ end
43
+
44
+ def self.args(name)
45
+ return @@shortcut_list[name].arguments
46
+ end
47
+
48
+ def self.pretty_print
49
+ for key in @@shortcut_list.keys.sort
50
+ val = @@shortcut_list[key]
51
+ puts "#{key}\t#{val.arguments.join(' ')}"
52
+ end
53
+ end
54
+ end
55
+
56
+ Shortcut.new('cloud', '--marker', 'auto', '--marker-scale', '0.2',
57
+ '--line-style', 'no')
58
+
59
+ Shortcut.new('filled', '--fill', 'y_axis', '--fill-transparency', '0.7')
60
+
61
+ Shortcut.new('csv', '--text-separator', '/[;,]/')
62
+
63
+ Shortcut.new('semilog', '--math-log', '--xlog')
64
+
65
+ Shortcut.new('fulllog', '--math-log', '--xlog', '--ylog')
66
+
67
+ Shortcut.new('axis-grid', '--lines-color', 'xaxis', 'Silver',
68
+ '--lines-color', 'yaxis', 'Silver')
69
+ end
@@ -0,0 +1,82 @@
1
+ # structures.rb, copyright (c) 2006 by Vincent Fourmond:
2
+ # The code file for fancy structural elements.
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 'Dobjects/Dvector'
15
+ require 'CTioga/debug'
16
+ require 'CTioga/log'
17
+
18
+ require 'CTioga/elements'
19
+
20
+ module CTioga
21
+
22
+ Version::register_svn_info('$Revision: 653 $', '$Date: 2007-11-15 21:58:42 +0100 (Thu, 15 Nov 2007) $')
23
+
24
+ # A subplot class for handling plot with alternative axes.
25
+ class SharedAxisPlot < SubPlot
26
+
27
+ # The positions concerned by the axis type in the
28
+ # arrays returned by get_boundaries and the like.
29
+ BoundaryPositions = {
30
+ :y => [2,3],
31
+ :x => [0,1]
32
+ }
33
+
34
+ # Some pseudo-accessors:
35
+ def shared_axis
36
+ if @axis == :y
37
+ :x
38
+ else
39
+ :y
40
+ end
41
+ end
42
+
43
+ def private_axis
44
+ @axis
45
+ end
46
+
47
+ # Creates a subplot of _parent_ which will use alternative
48
+ # axes for _axis_. _axis_ is the axis which is *not* shared !
49
+ def initialize(axis = :y, parent = nil)
50
+ super(:subplot, parent)
51
+ @axis = axis
52
+ # We forward all legend information to the parent
53
+ @accept_legend = false
54
+ end
55
+
56
+ # Report appropriate values for the axes to the parent
57
+ # plot.
58
+ def get_boundaries
59
+ bounds = internal_get_boundaries
60
+ for i in BoundaryPositions[private_axis]
61
+ bounds[i] = 0.0/0.0 # NaN is ignored
62
+ end
63
+ return bounds
64
+ end
65
+
66
+ # We use the parents boundary for the shared axis.
67
+ def compute_boundaries
68
+ # First, we compute the boundaries using the standard
69
+ # Subplot function
70
+ bounds = super
71
+
72
+ # Then we override the shared values using the parents:
73
+ parents = parent.compute_boundaries
74
+ for i in BoundaryPositions[shared_axis]
75
+ bounds[i] = parents[i] # We use the parents boundaries.
76
+ end
77
+ return bounds
78
+ end
79
+
80
+ end
81
+
82
+ end
@@ -0,0 +1,140 @@
1
+ # styles.rb : style-related codes
2
+ # Copyright (C) 2007, 2008 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.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program; if not, write to the Free Software
16
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17
+
18
+ require 'MetaBuilder/parameters'
19
+ require 'Tioga/tioga'
20
+ require 'CTioga/utils'
21
+
22
+ module CTioga
23
+
24
+ Version::register_svn_info('$Revision: 874 $', '$Date: 2009-02-11 14:14:30 +0100 (Wed, 11 Feb 2009) $')
25
+
26
+ # This module holds a lot of constants for styles.
27
+ module Styles
28
+ include Tioga::FigureConstants
29
+
30
+ COLORS = {
31
+ "standard" =>
32
+ [Red, Green, Blue, Cyan, Magenta, Orange],
33
+ "pastel1" =>
34
+ [MediumSeaGreen, RoyalBlue, Pumpkin, DarkChocolate, Lilac, Crimson],
35
+ "colorblind" =>
36
+ [BrightBlue, Goldenrod, Coral, Lilac, FireBrick, RoyalPurple],
37
+ }
38
+
39
+ # The sets of markers.
40
+ MARKERS = {
41
+ "standard" =>
42
+ [Bullet, TriangleUp, Square, Plus, Times],
43
+ "open" =>
44
+ [BulletOpen, TriangleUpOpen, SquareOpen, PlusOpen, TimesOpen],
45
+ }
46
+
47
+ Line_Type_Dash_Dot_Dot = [[5,2,1,2,1,2],0]
48
+ Line_Type_Small_Dots = [[0.5,1],0]
49
+
50
+
51
+ # Linestyles.
52
+ LINES = {
53
+ "standard" =>
54
+ [Line_Type_Solid,
55
+ Line_Type_Dots,
56
+ Line_Type_Dashes,
57
+ Line_Type_Small_Dots,
58
+ Line_Type_Dot_Long_Dash,
59
+ Line_Type_Dash_Dot_Dot
60
+ ],
61
+ }
62
+
63
+ # Shortcut for line styles:
64
+ Solid = Line_Type_Solid
65
+ Dots = Line_Type_Dots
66
+ Dashes = Line_Type_Dashes
67
+ Small_Dots = Line_Type_Small_Dots
68
+ Dot_Long_Dash = Line_Type_Dot_Long_Dash
69
+ Dash_Dot_Dot = Line_Type_Dash_Dot_Dot
70
+
71
+ # Now, a series of ParameterType objects that help parsing
72
+ # a string into a style object
73
+
74
+ # A CTioga color
75
+ class CTiogaColorParameter < MetaBuilder::ParameterType
76
+ type_name :color, 'color'
77
+
78
+ def string_to_type_internal(str)
79
+ return CTioga.get_tioga_color(str)
80
+ end
81
+
82
+ def type_to_string_internal(val)
83
+ return val.map {|i| i.to_s}.join(',')
84
+ end
85
+ end
86
+
87
+ # A CTioga marker
88
+ class CTiogaMarkerParameter < MetaBuilder::ParameterType
89
+ type_name :marker, 'marker'
90
+
91
+ def string_to_type_internal(str)
92
+ if str =~ /(\d+)\s*,\s*(\d+)(?:\s*,\s*([\d.e+-]+))?/
93
+ ar = [$1.to_i, $2.to_i]
94
+ if $3
95
+ ar << $3.to_f
96
+ end
97
+ return ar
98
+ else
99
+ begin
100
+ return Tioga::MarkerConstants.const_get(str)
101
+ rescue
102
+ raise IncorrectInput, "'#{str}' is not a valid marker"
103
+ end
104
+ end
105
+ end
106
+
107
+ def type_to_string_internal(val)
108
+ return val.map {|i| i.to_s}.join(',')
109
+ end
110
+ end
111
+
112
+ class CTiogaLineStyleParameter < MetaBuilder::ParameterType
113
+ type_name :line_style, 'linestyle'
114
+
115
+ def string_to_type_internal(str)
116
+ if str =~ /(:?\d+\s*,)+/
117
+ ar = str.split(/\s*,\s*/).map{|v| v.to_f}
118
+ if ar.size % 2 == 0
119
+ return [ar, 0]
120
+ else
121
+ last = ar.pop
122
+ return [ar, last]
123
+ end
124
+ elsif Tioga::FigureConstants.const_defined?(str)
125
+ return Tioga::FigureConstants.const_get(str)
126
+ elsif Styles.const_defined?(str)
127
+ return Styles.const_get(str)
128
+ else
129
+ raise IncorrectInput, "'#{str}' is not a valid line type"
130
+ end
131
+ end
132
+
133
+ def type_to_string_internal(val)
134
+ return val.flatten.map {|i| i.to_s}.join(',')
135
+ end
136
+ end
137
+
138
+
139
+ end
140
+ end
@@ -0,0 +1,581 @@
1
+ # themes.rb, copyright (c) 2007 by Vincent Fourmond:
2
+ # The main support for themes in ctioga
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 'CTioga/log'
15
+ require 'CTioga/utils'
16
+ require 'CTioga/shortcuts'
17
+
18
+
19
+ module CTioga
20
+
21
+ Version::register_svn_info('$Revision: 869 $', '$Date: 2009-01-13 17:56:12 +0100 (Tue, 13 Jan 2009) $')
22
+
23
+ # The namespace for themes. Supposedly, all themes should end up
24
+ # here.
25
+ module Themes
26
+
27
+ class BaseTheme
28
+
29
+ THEMES = {}
30
+
31
+ # Basic initialization. Cannot take any compulsory parameter
32
+ def initialize
33
+ end
34
+
35
+ # Returns an object appropriate to describe the
36
+ # style of the next curve. It must return all information
37
+ # as appropriate, in the form of a CurveStyle object.
38
+ # It takes the _name_ of the next set.
39
+ def next_curve_style(name)
40
+ end
41
+
42
+ # A hook to be run at the beginning of the drawing.
43
+ # _t_ is the FigureMaker object.
44
+ def bod_hook(t)
45
+ # Does nothing by default.
46
+ end
47
+
48
+ # returns extra arguments to be pushed onto the
49
+ # cmdline. Can come in useful if you don't want to
50
+ # play with ctiog's internals
51
+ def cmdline_extra_args
52
+ return []
53
+ end
54
+
55
+ # A function to be reimplemented by children to handle color_
56
+ def choose_set(type,set)
57
+ warn "Theme #{self.class.name} does not support sets"
58
+ end
59
+
60
+ # A callback to register themes.
61
+ def self.inherited(cls)
62
+ # THEMES[cls.name] = cls # Probably too long to be useful.
63
+ THEMES[cls.name.split(/::/).last.gsub(/Theme/,"")] = cls
64
+ THEMES[cls.name.split(/::/).last.gsub(/Theme/,"").downcase] = cls
65
+ end
66
+
67
+ end
68
+
69
+
70
+ # Now, some code to be used as an inclusion directly.
71
+
72
+ attr_accessor :override_style
73
+ attr_accessor :histogram
74
+
75
+ # Resets the override_style to default:
76
+
77
+ def reset_override_style
78
+ @override_style = CurveStyle.new
79
+
80
+ # To reproduce old ctioga behavior, we manually set
81
+ # :marker to false
82
+ @override_style[:marker] = false
83
+ end
84
+
85
+ def initialize_themes
86
+ # Initialize override_style
87
+ reset_override_style
88
+
89
+ # Start with an inexistant style to restore
90
+ @restored_style = nil
91
+
92
+ # The style stack; every single style used is pushed there
93
+ @style_stack = []
94
+
95
+ # The hash used for named saves
96
+ @saved_styles = {}
97
+
98
+ # And for saved overrides
99
+ @saved_overrides = {}
100
+
101
+
102
+ # We look for themes in the themes subdirectory of the directory
103
+ # where this file is found and in the $HOME/.ctioga/themes
104
+ for f in Dir.glob(File.dirname(__FILE__) + "/themes/*") +
105
+ Dir.glob("#{ENV['HOME']}/.ctioga/themes/*")
106
+ begin
107
+ require f
108
+ info "Successfully loaded theme file #{f}"
109
+ rescue Exception => e
110
+ warn "Failed to load theme file #{f}, ignoring"
111
+ debug "Failed to load theme #{f} with #{e.inspect}"
112
+ end
113
+ end
114
+
115
+ # The current theme:
116
+ choose_theme(BaseTheme::THEMES.keys.first) unless
117
+ choose_theme('Classical')
118
+ end
119
+
120
+ # Selects the current theme:
121
+ def choose_theme(theme_name)
122
+ if BaseTheme::THEMES.key?(theme_name)
123
+ @theme_name = theme_name
124
+ @theme = BaseTheme::THEMES[theme_name].new
125
+ info "Selecting theme #{theme_name}"
126
+ args = @theme.cmdline_extra_args
127
+ debug "Theme #{theme_name} pushes #{args.join ' '} onto the "+
128
+ "command line"
129
+ unshift_cmdline_args(*args)
130
+ return true
131
+ else
132
+ warn "Theme #{theme_name} doesn't exist, ignoring"
133
+ return false
134
+ end
135
+ end
136
+
137
+ DisableRe = /no(ne)?|off/i
138
+
139
+ # Processes a style argument.
140
+
141
+ # A correspondance style_element -> style type
142
+ StyleTypes = {
143
+ :color => :color,
144
+ :colors => :color,
145
+ :marker => :marker,
146
+ :markers => :marker,
147
+ :marker_color => :color,
148
+ :markers_colors => :color,
149
+ :line_style => :line_style,
150
+ :linestyle => :line_style,
151
+ :linewidth => :float,
152
+ :error_bar_color => :color,
153
+ :marker_scale => :float,
154
+ }
155
+
156
+ # Parses a style argument, in three different ways:
157
+ # * an 'auto' will remove the override
158
+ # * something matching DisableRe will turn it false
159
+ # * anything else will be converted using the appropriate
160
+ # type found in StyleTypes or using the block given
161
+ def style_argument(style_element, value)
162
+ if value =~ /auto/i
163
+ override_style.delete(style_element)
164
+ debug "Deleting override #{style_element}"
165
+ return
166
+ elsif value =~ DisableRe or not value
167
+ override_style[style_element] = false
168
+ else
169
+ override_style[style_element] =
170
+ if block_given?
171
+ yield(value)
172
+ else
173
+ begin
174
+ MetaBuilder::ParameterType.from_string(StyleTypes[style_element],
175
+ value)
176
+ rescue Exception => e
177
+ if e.is_a? MetaBuilder::ParameterType::IncorrectInput
178
+ warn "The argument for #{style_element} was not recognized:"
179
+ warn e.message
180
+ warn "Expect problems later"
181
+ end
182
+ value
183
+ end
184
+ end
185
+ end
186
+ debug "Setting override #{style_element} to " +
187
+ "#{override_style[style_element].inspect}"
188
+ end
189
+
190
+
191
+ def theme_prepare_parser(parser)
192
+ parser.separator "\nStyle and themes options"
193
+ parser.on("-c", "--[no-]color COLOR",
194
+ "Sets the color for drawing the curves.",
195
+ "Use 'auto' to leave the decision to ",
196
+ "the themes, and 'no' to get no lines.") do |val|
197
+ style_argument(:color, val)
198
+ end
199
+
200
+ parser.on("-m", "--[no-]marker [MARKER]",
201
+ "Sets the markers for drawing data points",
202
+ "Use 'auto' to get automatic markers,",
203
+ "and 'no' to get no marker (the default)") do |val|
204
+ style_argument(:marker, val)
205
+ end
206
+
207
+ parser.on("--marker-color COLOR",
208
+ "Sets the markers' color. See also --color") do |val|
209
+ style_argument(:marker_color, val)
210
+ end
211
+
212
+ parser.on("--[no-]line-style STYLE",
213
+ "Sets the line style") do |val|
214
+ style_argument(:line_style, val)
215
+ end
216
+
217
+ parser.on("--line-width WIDTH",
218
+ "Sets the line width") do |w|
219
+ style_argument(:linewidth, w) do |val|
220
+ Float(val)
221
+ end
222
+ end
223
+
224
+ parser.on("--[no-]interpolate",
225
+ "If set, the points will be joined", "by a nice "+
226
+ "interpolated curve") do |w|
227
+ override_style.interpolate = w
228
+ end
229
+
230
+ parser.on("--marker-scale SCALE",
231
+ "The scale of the markers used for curves.",
232
+ "Defaults to 0.5"
233
+ ) do |w|
234
+ style_argument(:marker_scale, w)
235
+ end
236
+
237
+ parser.on("--error-bar-color COLOR",
238
+ "Sets the error bars' color. See also --color") do |val|
239
+ style_argument(:error_bar_color, val)
240
+ end
241
+
242
+ parser.on("--drawing-order ORDER",
243
+ "Sets the order for drawing curve elements") do |val|
244
+ begin
245
+ style_argument(:drawing_order, val) do |v|
246
+ i = Integer(v)
247
+ CurveStyle::DrawingOrder.fetch(i) # To raise an
248
+ # exception in case i is not valid
249
+ i
250
+ end
251
+ rescue
252
+ puts "Invalid drawing order #{val}. Valid ones are the " +
253
+ "following integers"
254
+ CurveStyle::DrawingOrder.each_with_index do |vals, i|
255
+ puts "#{i} -> #{vals.map {|s| s.to_s}.join(', ')}"
256
+ end
257
+ end
258
+ end
259
+
260
+ parser.separator 'Transparency options'
261
+ parser.on("--transparency T",
262
+ "Sets the transparency for lines.") do |val|
263
+ style_argument(:transparency, val) do |v|
264
+ begin
265
+ Float(v)
266
+ rescue
267
+ false
268
+ end
269
+ end
270
+ end
271
+
272
+ parser.on("--marker-transparency T",
273
+ "Sets the transparency for markers.") do |val|
274
+ style_argument(:marker_transparency, val) do |v|
275
+ begin
276
+ Float(v)
277
+ rescue
278
+ false
279
+ end
280
+ end
281
+ end
282
+
283
+ parser.on("--error-bar-transparency T",
284
+ "Sets the transparency for error bars.") do |val|
285
+ style_argument(:error_bars_transparency, val) do |v|
286
+ begin
287
+ Float(v)
288
+ rescue
289
+ false
290
+ end
291
+ end
292
+ end
293
+
294
+
295
+ parser.separator 'Filled curves'
296
+ parser.on("--fill TYPE",
297
+ "Set the filling type for curves to TYPE") do |val|
298
+ style_argument(:fill_type, val) do |v|
299
+ Utils.interpret_arg(v, CurveStyle::FillTypeArguments)
300
+ end
301
+ end
302
+
303
+ parser.on("--fill-color COLOR",
304
+ "Set the fill color") do |val|
305
+ style_argument(:fill_color, val) do |v|
306
+ CTioga.get_tioga_color(v)
307
+ end
308
+ end
309
+
310
+ parser.on("--fill-transparency T",
311
+ "Set the fill color") do |val|
312
+ style_argument(:fill_transparency, val) do |v|
313
+ begin
314
+ Float(v)
315
+ rescue
316
+ false
317
+ end
318
+ end
319
+ end
320
+
321
+ parser.separator 'Histograms'
322
+ parser.on("--[no-]histogram",
323
+ "All the next curves will be drawn",
324
+ "as histograms. Deprecated.",
325
+ "Please use the --hist option") do |w|
326
+ @histogram = w
327
+ style_argument(:hist_type, false)
328
+ end
329
+ parser.on("--hist TYPE",
330
+ "Makes histograms from the next curves.",
331
+ "TYPE specifies where the step should start from,",
332
+ "See --fill-type for that") do |w|
333
+ w = false if w =~ DisableRe
334
+ if w
335
+ @histogram = true
336
+ style_argument(:hist_type, w) do |v|
337
+ Utils.interpret_arg(v, CurveStyle::FillTypeArguments)
338
+ end
339
+ else
340
+ @histogram = false
341
+ end
342
+ end
343
+
344
+ parser.on("--no-hist",
345
+ "Stop making histograms") do
346
+ @histogram = false
347
+ end
348
+
349
+ parser.on("--hist-width WIDTH",
350
+ "The ratio of the width drawn over the ",
351
+ "total width") do |w|
352
+ a = Float(w)
353
+ style_argument(:hist_left, (1 - a)/2)
354
+ style_argument(:hist_right, (1 + a)/2)
355
+ end
356
+
357
+ parser.on("--hist-left LEFT",
358
+ "The position of the left side of the step",
359
+ "relative to the total step") do |val|
360
+ style_argument(:hist_left, val) do |v|
361
+ begin
362
+ Float(v)
363
+ rescue
364
+ false
365
+ end
366
+ end
367
+ end
368
+ parser.on("--hist-right RIGHT",
369
+ "Pendant of --hist-left for the right") do |val|
370
+ style_argument(:hist_right, val) do |v|
371
+ begin
372
+ Float(v)
373
+ rescue
374
+ false
375
+ end
376
+ end
377
+ end
378
+
379
+
380
+ parser.separator 'Themes and sets'
381
+ parser.on("--theme THEME",
382
+ "Chooses the current theme. See --theme-list for ",
383
+ "a list of current valid themes"
384
+ ) do |w|
385
+ choose_theme(w)
386
+ end
387
+
388
+ parser.on("--theme-list",
389
+ "Lists available themes.") do
390
+ puts
391
+ puts "Currently available themes are"
392
+ puts
393
+ puts BaseTheme::THEMES.keys.map {|i| i.downcase}.uniq.join(" ")
394
+ end
395
+
396
+ parser.on("--reset-theme",
397
+ "Resets theme defaults.") do
398
+ choose_theme(@theme_name)
399
+ end
400
+
401
+
402
+ parser.on("--mono",
403
+ "Compatibility option for --theme mono") do |w|
404
+ choose_theme('mono')
405
+ end
406
+
407
+ # TODO: there is no reason why sets should be restricted
408
+ # to the following things. All style things should
409
+ # potentially have a corresponding style-set.
410
+ #
411
+ # In short, all styles things should be converted to something
412
+ # more in the spirit of Parameter and the like...
413
+
414
+ # Sets:
415
+ # Note that, due to scoping side-effects, one has to use the
416
+ # block form of the iteration, else type gets overwritten
417
+ # and we end up writing only to the last possibility.
418
+ #
419
+ # In addition to (and taking over) specifying named sets,
420
+ # it is possible to provide:
421
+ # * a single style element, in which case the set becomes the
422
+ # new element
423
+ # * a |-separated list of elements, in which case the set
424
+ # becomes the given elements
425
+ {
426
+ :colors => "color",
427
+ :markers => "marker",
428
+ :markers_colors => "marker-color",
429
+ :linestyle => "line-style"
430
+ }.each do |type, name|
431
+ parser.on("--#{name}-set SET",
432
+ "Choose the current set for #{name} ",
433
+ "(#{@theme.sets[type].available_sets.join(' ')})") do |set|
434
+ debug "Using set '#{set}' for #{type} on theme " +
435
+ "#{current_theme.class}"
436
+ if target_set = current_theme.sets[type]
437
+ begin
438
+ # If there is one '|', we split the
439
+ if ! target_set.valid_set?(set)
440
+ debug "#{set} is not a named set for #{type}, " +
441
+ "trying other interpretations"
442
+
443
+ if set =~ /\|/
444
+ set = SpecialArray.new(set.split(/\|/).map do |x|
445
+ MetaBuilder::ParameterType.
446
+ from_string(StyleTypes[type], x)
447
+ end)
448
+ info "Setting set #{name} to objects #{set.inspect}"
449
+ else
450
+ set = MetaBuilder::ParameterType.
451
+ from_string(StyleTypes[type], set)
452
+ info "Setting set #{name} to single-value object #{set.inspect}"
453
+ end
454
+ end
455
+ current_theme.choose_set(type, set)
456
+ rescue Exception => e
457
+ error "Set #{set} was not understood for #{name}, ignoring"
458
+ debug "Exception raised on set interpretation code: #{e.inspect}"
459
+ end
460
+ else
461
+ warn "Theme #{current_theme.class} does not appear to have " +
462
+ "sets for #{type}, ignoring"
463
+ end
464
+ end
465
+ end
466
+
467
+ parser.separator 'Style manipulations'
468
+
469
+ parser.on("--skip-style",
470
+ "Skips the next style" ) do
471
+ @theme.next_curve_style("useless")
472
+ end
473
+
474
+ parser.on("-s", "--same-style",
475
+ "Uses the same style as last curve as a base ",
476
+ "for next curve") do
477
+ @restored_style = @style_stack.last
478
+ end
479
+
480
+ parser.on("--save-style NAME",
481
+ "Saves the style of the last curve for later use") do |n|
482
+ @saved_styles[n] = @style_stack.last
483
+ end
484
+ parser.on("--use-style NAME",
485
+ "Uses the style named NAME for the next curve",
486
+ "If NAME does not exist, it will be interpreted as",
487
+ "the 0-numbered style starting from the first") do |n|
488
+ if @saved_styles.key?(n)
489
+ @restored_style = @saved_styles[n]
490
+ else
491
+ @restored_style = @style_stack[n.to_i]
492
+ end
493
+ end
494
+
495
+ parser.on("--reset-override",
496
+ "Resets style override") do
497
+ reset_override_style
498
+ end
499
+
500
+ parser.on("--save-override NAME",
501
+ "Saves the current override") do |n|
502
+ @saved_overrides[n] = @override_style.dup
503
+ # But we don't save the legend !!!
504
+ @saved_overrides[n].delete(:legend)
505
+ end
506
+ parser.on("--use-override NAME",
507
+ "Uses the override named NAME from now on") do |n|
508
+ if @saved_overrides.key?(n)
509
+ legend = @override_style.legend
510
+ @override_style = @saved_overrides[n].dup
511
+ if legend
512
+ @override_style[:legend] = legend
513
+ end
514
+ else
515
+ warn "Saved override #{n} does not exist"
516
+ end
517
+ end
518
+
519
+ parser.separator 'Shortcuts'
520
+ parser.on("--short SHORTCUT",
521
+ "Use given shortcut") do |name|
522
+ if Shortcut.has? name
523
+ # Function from Plotmaker:
524
+ unshift_cmdline_args(*Shortcut.args(name))
525
+ else
526
+ warn "Shortcut #{name} was not found"
527
+ end
528
+ end
529
+
530
+ parser.on("--short-list",
531
+ "Lists available shortcuts") do
532
+ puts "Available shortcuts:"
533
+ Shortcut.pretty_print
534
+ end
535
+
536
+
537
+
538
+ end
539
+
540
+ # The current theme:
541
+ def current_theme
542
+ return @theme
543
+ end
544
+
545
+
546
+ # Returns the current style and resets all pending elements.
547
+ def get_current_style(set)
548
+ debug "Legend: #{override_style.legend}"
549
+
550
+ # We look in @restored_style first.
551
+ style = @restored_style ||
552
+ @theme.next_curve_style(tex_quote_text(set))
553
+ @restored_style = nil # Canceled everytime.
554
+
555
+ style = style.dup # To make sure we don't overwrite anything.
556
+ if @autolegends
557
+ style.legend = tex_quote_text(set)
558
+ else
559
+ style.legend = false
560
+ end
561
+ debug "Override is #{override_style.inspect}"
562
+ style.override!(override_style)
563
+
564
+ # We remove the legend information, that it doesn't get used
565
+ # again.
566
+ override_style.delete(:legend)
567
+ debug "Style: #{style.inspect}"
568
+
569
+ # We push the last used style on the stack
570
+ @style_stack << style
571
+ return style
572
+ end
573
+
574
+ # Run the hook at beginning of the drawing:
575
+ def theme_bod_hook(t)
576
+ current_theme.bod_hook(t)
577
+ end
578
+
579
+ end
580
+
581
+ end