ctioga 1.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/COPYING +340 -0
- data/ctioga/bin/ctable +28 -0
- data/ctioga/bin/ctioga +37 -0
- data/ctioga/doc/ctable.1 +156 -0
- data/ctioga/doc/ctioga.1 +2363 -0
- data/ctioga/examples/README +46 -0
- data/ctioga/examples/ctioga.gnuplot +4 -0
- data/ctioga/examples/ctioga_within_tioga.rb +53 -0
- data/ctioga/examples/ctiogarc.rb +24 -0
- data/ctioga/examples/include_1.rb +15 -0
- data/ctioga/examples/noise.dat +100 -0
- data/ctioga/examples/noise.rb +13 -0
- data/ctioga/examples/trig.csv +100 -0
- data/ctioga/examples/trig.dat +100 -0
- data/ctioga/examples/trig.rb +14 -0
- data/ctioga/examples/trigh.dat +100 -0
- data/ctioga/examples/trigh.rb +10 -0
- data/ctioga/examples/tutorial +763 -0
- data/ctioga/examples/tutorial.sh +269 -0
- data/ctioga/tests/README +14 -0
- data/ctioga/tests/axes.sh +40 -0
- data/ctioga/tests/basic.sh +11 -0
- data/ctioga/tests/draw.sh +24 -0
- data/ctioga/tests/histograms.sh +14 -0
- data/ctioga/tests/insets.sh +41 -0
- data/ctioga/tests/layouts.sh +29 -0
- data/ctioga/tests/legends.sh +113 -0
- data/ctioga/tests/styles.sh +43 -0
- data/ctioga/tests/test_style.sh +8 -0
- data/ctioga/tests/tests.sh +24 -0
- data/ctioga/tests/text_backend.sh +83 -0
- data/ctioga/tests/tioga_defaults.rb +18 -0
- data/lib/CTioga/axes.rb +904 -0
- data/lib/CTioga/backends.rb +88 -0
- data/lib/CTioga/boundaries.rb +224 -0
- data/lib/CTioga/ctable.rb +134 -0
- data/lib/CTioga/curve_style.rb +246 -0
- data/lib/CTioga/debug.rb +199 -0
- data/lib/CTioga/dimension.rb +133 -0
- data/lib/CTioga/elements.rb +17 -0
- data/lib/CTioga/elements/base.rb +84 -0
- data/lib/CTioga/elements/containers.rb +578 -0
- data/lib/CTioga/elements/curves.rb +368 -0
- data/lib/CTioga/elements/tioga_primitives.rb +440 -0
- data/lib/CTioga/layout.rb +595 -0
- data/lib/CTioga/legends.rb +29 -0
- data/lib/CTioga/legends/cmdline.rb +187 -0
- data/lib/CTioga/legends/item.rb +164 -0
- data/lib/CTioga/legends/style.rb +257 -0
- data/lib/CTioga/log.rb +73 -0
- data/lib/CTioga/movingarrays.rb +131 -0
- data/lib/CTioga/partition.rb +271 -0
- data/lib/CTioga/plot_style.rb +230 -0
- data/lib/CTioga/plotmaker.rb +1677 -0
- data/lib/CTioga/shortcuts.rb +69 -0
- data/lib/CTioga/structures.rb +82 -0
- data/lib/CTioga/styles.rb +140 -0
- data/lib/CTioga/themes.rb +581 -0
- data/lib/CTioga/themes/classical.rb +82 -0
- data/lib/CTioga/themes/demo.rb +63 -0
- data/lib/CTioga/themes/fits.rb +91 -0
- data/lib/CTioga/themes/mono.rb +33 -0
- data/lib/CTioga/tioga.rb +32 -0
- data/lib/CTioga/utils.rb +173 -0
- data/lib/MetaBuilder/Parameters/dates.rb +38 -0
- data/lib/MetaBuilder/Parameters/lists.rb +132 -0
- data/lib/MetaBuilder/Parameters/numbers.rb +69 -0
- data/lib/MetaBuilder/Parameters/strings.rb +86 -0
- data/lib/MetaBuilder/Parameters/styles.rb +75 -0
- data/lib/MetaBuilder/Qt4/Parameters/dates.rb +51 -0
- data/lib/MetaBuilder/Qt4/Parameters/numbers.rb +65 -0
- data/lib/MetaBuilder/Qt4/Parameters/strings.rb +106 -0
- data/lib/MetaBuilder/Qt4/parameter.rb +172 -0
- data/lib/MetaBuilder/Qt4/parameters.rb +9 -0
- data/lib/MetaBuilder/descriptions.rb +603 -0
- data/lib/MetaBuilder/factory.rb +101 -0
- data/lib/MetaBuilder/group.rb +57 -0
- data/lib/MetaBuilder/metabuilder.rb +10 -0
- data/lib/MetaBuilder/parameter.rb +374 -0
- data/lib/MetaBuilder/parameters.rb +11 -0
- data/lib/MetaBuilder/qt4.rb +8 -0
- data/lib/SciYAG/Backends/backend.rb +379 -0
- data/lib/SciYAG/Backends/binner.rb +168 -0
- data/lib/SciYAG/Backends/cache.rb +102 -0
- data/lib/SciYAG/Backends/dataset.rb +158 -0
- data/lib/SciYAG/Backends/descriptions.rb +469 -0
- data/lib/SciYAG/Backends/filters.rb +25 -0
- data/lib/SciYAG/Backends/filters/average.rb +134 -0
- data/lib/SciYAG/Backends/filters/cumulate.rb +37 -0
- data/lib/SciYAG/Backends/filters/filter.rb +70 -0
- data/lib/SciYAG/Backends/filters/norm.rb +39 -0
- data/lib/SciYAG/Backends/filters/smooth.rb +63 -0
- data/lib/SciYAG/Backends/filters/sort.rb +43 -0
- data/lib/SciYAG/Backends/filters/strip.rb +34 -0
- data/lib/SciYAG/Backends/filters/trim.rb +64 -0
- data/lib/SciYAG/Backends/gnuplot.rb +131 -0
- data/lib/SciYAG/Backends/math.rb +108 -0
- data/lib/SciYAG/Backends/mdb.rb +462 -0
- data/lib/SciYAG/Backends/multitext.rb +96 -0
- data/lib/SciYAG/Backends/source.rb +64 -0
- data/lib/SciYAG/Backends/text.rb +339 -0
- data/lib/SciYAG/backends.rb +16 -0
- metadata +191 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# backends.rb, copyright (c) 2006 by Vincent Fourmond:
|
|
2
|
+
# The module handling the communication with backends.
|
|
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
|
+
# The backend structure...
|
|
15
|
+
require 'SciYAG/backends'
|
|
16
|
+
require 'MetaBuilder/factory'
|
|
17
|
+
require 'CTioga/utils'
|
|
18
|
+
|
|
19
|
+
module CTioga
|
|
20
|
+
|
|
21
|
+
Version::register_svn_info('$Revision: 696 $', '$Date: 2007-12-06 20:59:20 +0100 (Thu, 06 Dec 2007) $')
|
|
22
|
+
|
|
23
|
+
# This module handles all manipulations of backends.
|
|
24
|
+
module Backends
|
|
25
|
+
|
|
26
|
+
include SciYAG
|
|
27
|
+
|
|
28
|
+
# Initializes the backend structure.
|
|
29
|
+
def init_backend_structure
|
|
30
|
+
@backend_factory =
|
|
31
|
+
MetaBuilder::Factories::UniqueFactory.new(SciYAG::Backends::Backend,
|
|
32
|
+
'text')
|
|
33
|
+
SciYAG::Backends::Backend.logger = self.logger
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def backend
|
|
37
|
+
@backend_factory.current
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def backends
|
|
41
|
+
@backend_factory.instances
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def set_backend(str)
|
|
45
|
+
@backend_factory.current = str
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
# Push a filter onto the current backend
|
|
50
|
+
def current_push_filter(filter)
|
|
51
|
+
backend.push_xy_filter(filter)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Fills an OptionParser with the apppropriate stuff to
|
|
55
|
+
# deal with backends:
|
|
56
|
+
def prepare_backend_options(op)
|
|
57
|
+
op.separator "\nHow to select backends, and their options:"
|
|
58
|
+
@backend_factory.option_parser_factory(op)
|
|
59
|
+
|
|
60
|
+
op.separator "\nFilters to apply onto data:"
|
|
61
|
+
for filter_desc in SciYAG::Backends::Filter.description_list
|
|
62
|
+
filter_desc.parser_instantiate_option(op,
|
|
63
|
+
self,
|
|
64
|
+
:current_push_filter)
|
|
65
|
+
end
|
|
66
|
+
op.on("--filter-pop", "Removes the last filter pushed " +
|
|
67
|
+
"onto the current backend") do
|
|
68
|
+
backend.pop_xy_filter
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
op.on("--filter-clear", "Removes all filters applying " +
|
|
72
|
+
"to the current backend") do
|
|
73
|
+
backend.clear_xy_filters
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Interprets the +set+ with the current backend and returns the data
|
|
78
|
+
def xy_data_set(set)
|
|
79
|
+
return backend.xy_data(set)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# Expands the current set according to the current's backend rules
|
|
83
|
+
def expand_spec(spec)
|
|
84
|
+
backend.expand_sets(spec)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
end
|
|
88
|
+
end
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
# boundaries.rb: Small class for manipulating boundaries
|
|
2
|
+
# Copyright (c) 2008 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 'CTioga/utils'
|
|
15
|
+
|
|
16
|
+
# A small add-on to the Array class, to make it easy to convert to
|
|
17
|
+
# frame specifications.
|
|
18
|
+
class Array
|
|
19
|
+
|
|
20
|
+
def to_frame(spec = "%s")
|
|
21
|
+
i = 0
|
|
22
|
+
h = {}
|
|
23
|
+
for side in %w(left right top bottom)
|
|
24
|
+
h[ spec % side] = self[i]
|
|
25
|
+
i += 1
|
|
26
|
+
end
|
|
27
|
+
return h
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
module CTioga
|
|
34
|
+
|
|
35
|
+
Version::register_svn_info('$Revision: 825 $', '$Date: 2008-07-23 14:36:18 +0200 (Wed, 23 Jul 2008) $')
|
|
36
|
+
|
|
37
|
+
module Utils
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# Converting a boundary hash to an array
|
|
41
|
+
def self.frame_to_array(hash, format = '%s')
|
|
42
|
+
return %w(left right top bottom).map {|x| sprintf(format,x) }.map do |f|
|
|
43
|
+
hash[f]
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Compose two margins (in the form of arrays): you get the m2 expressed
|
|
48
|
+
# in the same frame as m1, but taken relative to m1.
|
|
49
|
+
def self.compose_margins(m1, m2)
|
|
50
|
+
width = 1 - m1[0] - m1[1]
|
|
51
|
+
height = 1 - m1[2] - m1[3]
|
|
52
|
+
|
|
53
|
+
return [ m1[0] + m2[0] * width,
|
|
54
|
+
m1[1] + m2[1] * width,
|
|
55
|
+
m1[2] + m2[2] * height,
|
|
56
|
+
m1[3] + m2[3] * height
|
|
57
|
+
]
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
# A small class to handle boundaries
|
|
62
|
+
class Boundaries
|
|
63
|
+
|
|
64
|
+
attr_accessor :left, :right, :top, :bottom
|
|
65
|
+
|
|
66
|
+
def initialize(*args)
|
|
67
|
+
args.flatten!
|
|
68
|
+
|
|
69
|
+
@left = args[0]
|
|
70
|
+
@right = args[1]
|
|
71
|
+
@top = args[2]
|
|
72
|
+
@bottom = args[3]
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def xmin
|
|
76
|
+
if @left <= @right
|
|
77
|
+
return @left
|
|
78
|
+
else
|
|
79
|
+
return @right
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def xmax
|
|
84
|
+
if @left <= @right
|
|
85
|
+
return @right
|
|
86
|
+
else
|
|
87
|
+
return @left
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def ymin
|
|
92
|
+
if @top <= @bottom
|
|
93
|
+
return @top
|
|
94
|
+
else
|
|
95
|
+
return @bottom
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def ymax
|
|
100
|
+
if @top <= @bottom
|
|
101
|
+
return @bottom
|
|
102
|
+
else
|
|
103
|
+
return @top
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Returns [xmin, xmax, ymin, ymax]. Useful, for instance,
|
|
108
|
+
# for Function#bound_values
|
|
109
|
+
def real_bounds
|
|
110
|
+
return [xmin, xmax, ymin, ymax]
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def to_a
|
|
114
|
+
return [@left, @right, @top, @bottom]
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# Returns a 'left' => ..., 'right' => .... hash containg the
|
|
118
|
+
# boundaries.
|
|
119
|
+
def to_hash
|
|
120
|
+
return {
|
|
121
|
+
'left' => @left,
|
|
122
|
+
'right' => @right,
|
|
123
|
+
'top' => @top,
|
|
124
|
+
'bottom' => @bottom
|
|
125
|
+
}
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# Returns true if the given X coordinate is within the bounds
|
|
129
|
+
def x_inside?(x)
|
|
130
|
+
return (x >= xmin && x <= xmax)
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# Returns true if the given Y coordinate is within the bounds
|
|
134
|
+
def y_inside?(y)
|
|
135
|
+
return (y >= ymin && y <= ymax)
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
# The position of the given X coordinate with respect to the
|
|
139
|
+
# boundaries. Returns either :inside, :left or :right
|
|
140
|
+
def where_x?(x)
|
|
141
|
+
if x_inside?(x)
|
|
142
|
+
return :inside
|
|
143
|
+
elsif @left <= @right
|
|
144
|
+
if x < @left
|
|
145
|
+
return :left
|
|
146
|
+
else
|
|
147
|
+
return :right
|
|
148
|
+
end
|
|
149
|
+
else # Right-to-left order
|
|
150
|
+
if x < @right
|
|
151
|
+
return :right
|
|
152
|
+
else
|
|
153
|
+
return :left
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
# The position of the given Y coordinate with respect to the
|
|
159
|
+
# boundaries. Returns either :inside, :top or :bottom
|
|
160
|
+
def where_y?(y)
|
|
161
|
+
if y_inside?(y)
|
|
162
|
+
return :inside
|
|
163
|
+
elsif @top <= @bottom
|
|
164
|
+
if y < @top
|
|
165
|
+
return :top
|
|
166
|
+
else
|
|
167
|
+
return :bottom
|
|
168
|
+
end
|
|
169
|
+
else
|
|
170
|
+
if y < @top
|
|
171
|
+
return :bottom
|
|
172
|
+
else
|
|
173
|
+
return :top
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
# A function that transforms an inset/legend specification into
|
|
181
|
+
# margins. Specifications understood are:
|
|
182
|
+
# * x,y:w(xh) : box centered on x,y of size w x h (or w x w if
|
|
183
|
+
# h is omitted)
|
|
184
|
+
# * x1,y1;x2,y2 : the exact box
|
|
185
|
+
def self.inset_margins(spec)
|
|
186
|
+
case spec
|
|
187
|
+
when /(.*),(.*):([^x]*)(?:x(.*))?/
|
|
188
|
+
x = $1.to_f; y = $2.to_f; w = $3.to_f
|
|
189
|
+
h = ($4 || $3).to_f
|
|
190
|
+
margins = [x - w/2, 1 - (x + w/2), 1 - (y+h/2), y - h/2]
|
|
191
|
+
when /(.*),(.*);(.*),(.*)/
|
|
192
|
+
x1 = $1.to_f; y1 = $2.to_f;
|
|
193
|
+
x2 = $3.to_f; y2 = $4.to_f;
|
|
194
|
+
left = [x1, x2].min
|
|
195
|
+
right = [x1, x2].max
|
|
196
|
+
top = [y1, y2].max
|
|
197
|
+
bottom = [y1, y2].min
|
|
198
|
+
margins = [left, 1 - right, 1 - top, bottom]
|
|
199
|
+
when /(.*)x(.*)([+-])(.*)([+-])(.*)/ # X geometry-like specification
|
|
200
|
+
w = $1.to_f; h = $2.to_f
|
|
201
|
+
if $3 == '+' # Left
|
|
202
|
+
left = $4.to_f
|
|
203
|
+
right = left + w
|
|
204
|
+
else # Right
|
|
205
|
+
right = $4.to_f
|
|
206
|
+
left = right - w
|
|
207
|
+
end
|
|
208
|
+
if $5 == '+' # Top
|
|
209
|
+
top = $6.to_f
|
|
210
|
+
bottom = top - h
|
|
211
|
+
else # Bottom
|
|
212
|
+
bottom = $6.to_f
|
|
213
|
+
top = bottom + h
|
|
214
|
+
end
|
|
215
|
+
margins = [left, 1 - right, 1 - top, bottom]
|
|
216
|
+
else
|
|
217
|
+
raise "Incorrect inset specification #{spec}"
|
|
218
|
+
end
|
|
219
|
+
return margins
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
end
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
=begin rdoc
|
|
2
|
+
|
|
3
|
+
This program is copyright 2006 by Vincent Fourmond.
|
|
4
|
+
|
|
5
|
+
This program is free software; you can redistribute it and/or modify
|
|
6
|
+
it under the terms of the GNU General Public License as published by
|
|
7
|
+
the Free Software Foundation; either version 2 of the License, or
|
|
8
|
+
(at your option) any later version.
|
|
9
|
+
|
|
10
|
+
This program is distributed in the hope that it will be useful,
|
|
11
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
+
GNU General Public License for more details.
|
|
14
|
+
|
|
15
|
+
You should have received a copy of the GNU General Public License
|
|
16
|
+
along with this program; if not, write to the Free Software
|
|
17
|
+
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
18
|
+
=end
|
|
19
|
+
|
|
20
|
+
# This program enables one to print out as text the data read by the
|
|
21
|
+
# backends. Can come in dead useful for debugging, or if you intend to plot
|
|
22
|
+
# with another data
|
|
23
|
+
|
|
24
|
+
require 'Dobjects/Dvector'
|
|
25
|
+
require 'CTioga/backends'
|
|
26
|
+
require 'CTioga/log'
|
|
27
|
+
require 'optparse'
|
|
28
|
+
|
|
29
|
+
module CTioga
|
|
30
|
+
|
|
31
|
+
Version::register_svn_info('$Revision: 753 $', '$Date: 2008-02-26 15:03:52 +0100 (Tue, 26 Feb 2008) $')
|
|
32
|
+
|
|
33
|
+
class CTable
|
|
34
|
+
include Log
|
|
35
|
+
include Backends
|
|
36
|
+
|
|
37
|
+
attr_accessor :block
|
|
38
|
+
attr_accessor :args
|
|
39
|
+
attr_accessor :print_banner
|
|
40
|
+
|
|
41
|
+
# This can be used by various scripts to add hooks on the parser.
|
|
42
|
+
# You can alternatively use your own parser beforehand, but you lose
|
|
43
|
+
# the benefits of the online help.
|
|
44
|
+
attr_accessor :parser
|
|
45
|
+
|
|
46
|
+
def initialize
|
|
47
|
+
init_logger
|
|
48
|
+
init_backend_structure
|
|
49
|
+
@args = []
|
|
50
|
+
@block = proc { |set,data,*a|
|
|
51
|
+
puts "# #{set}"
|
|
52
|
+
data.each do |x,y|
|
|
53
|
+
puts "#{x}\t#{y}"
|
|
54
|
+
end
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
@print_banner = true
|
|
58
|
+
|
|
59
|
+
@parser = OptionParser.new
|
|
60
|
+
prepare_backend_options(@parser)
|
|
61
|
+
|
|
62
|
+
@parser.separator ""
|
|
63
|
+
@parser.separator "Code execution"
|
|
64
|
+
|
|
65
|
+
@parser.on("-e", "--execute BLOCK",
|
|
66
|
+
"Executes the given ruby code for each set, " ,
|
|
67
|
+
"yielding the set name and its data for each." ,
|
|
68
|
+
"Use 'set' to refer to the set's name, and 'data' " ,
|
|
69
|
+
"for it's data"
|
|
70
|
+
) do |code|
|
|
71
|
+
self.block = eval "proc { |set,data,*args| #{code}}"
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
@parser.on("-f", "--file FILE",
|
|
75
|
+
"Same as -e except it's specifying a file which is ",
|
|
76
|
+
"read an executed with the same parameters as the BLOCK"
|
|
77
|
+
) do |file|
|
|
78
|
+
self.block = eval "proc { |set,data,*args| #{IO.readlines(file).join}}"
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
@parser.on("-r", "--require FILE",
|
|
82
|
+
"Ask ruby to require the file before data processing.",
|
|
83
|
+
"You can use it to declare some external functions."
|
|
84
|
+
) do |file|
|
|
85
|
+
require file
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
@parser.on("-a", "--arg a",
|
|
89
|
+
"Provides additionnal arguments to your code") do |arg|
|
|
90
|
+
@args << arg
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def process_data_set(set)
|
|
96
|
+
data = xy_data_set(set)
|
|
97
|
+
@block.call(set,data,*@args)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Runs the program with the given command-line arguments. If a block
|
|
101
|
+
# is given, use this block rather than the default one. Be careful,
|
|
102
|
+
# though, as command-line arguments can still override this.
|
|
103
|
+
def run(cmd_line_args,*extra_args, &a)
|
|
104
|
+
$stderr.puts <<"EOBANNER" if @print_banner
|
|
105
|
+
This is ctable version #{Version.version},
|
|
106
|
+
copyright (C) 2006-2007 Vincent Fourmond.
|
|
107
|
+
ctable comes with absolutely NO WARRANTY. This is free software, you are
|
|
108
|
+
welcome to redistribute it under certain conditions. See the COPYING file
|
|
109
|
+
in the original tarball for details. You are also welcome to contribute if
|
|
110
|
+
you like it, see in the manual page where to ask.
|
|
111
|
+
EOBANNER
|
|
112
|
+
|
|
113
|
+
# Use the user-given block
|
|
114
|
+
if block_given?
|
|
115
|
+
@block = a
|
|
116
|
+
end
|
|
117
|
+
@args = extra_args
|
|
118
|
+
|
|
119
|
+
@parser.order(cmd_line_args) do |spec|
|
|
120
|
+
# We use Backend#expand to leave room for the backend to
|
|
121
|
+
# interpret the text as many different sets.
|
|
122
|
+
expand_spec(spec).each do |set|
|
|
123
|
+
process_data_set(set)
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# A simple convenience function.
|
|
129
|
+
def self.run(args, &a)
|
|
130
|
+
self.new.run(args,&a)
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
end
|
|
134
|
+
end
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
# curves.rb, copyright (c) 2006 by Vincent Fourmond:
|
|
2
|
+
# The class describing a curve to be plotted.
|
|
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/elements'
|
|
15
|
+
require 'CTioga/utils'
|
|
16
|
+
require 'CTioga/boundaries'
|
|
17
|
+
|
|
18
|
+
module CTioga
|
|
19
|
+
|
|
20
|
+
Version::register_svn_info('$Revision: 873 $', '$Date: 2009-01-20 17:07:00 +0100 (Tue, 20 Jan 2009) $')
|
|
21
|
+
|
|
22
|
+
# This structure holds the different properties to be transmitted to
|
|
23
|
+
# a Curve object for appropriate drawing.
|
|
24
|
+
|
|
25
|
+
# TODO: create StrokeStyle and a FillStyle objects that would handle every
|
|
26
|
+
# place where there are fills and strokes (background, grids,
|
|
27
|
+
# legend frame and of course curves) !!!
|
|
28
|
+
|
|
29
|
+
class CurveStyle
|
|
30
|
+
ELEMENTS = [
|
|
31
|
+
:color, :marker, :marker_color,
|
|
32
|
+
:line_style, :legend, :linewidth,
|
|
33
|
+
:interpolate, :marker_scale,
|
|
34
|
+
:error_bar_color, :drawing_order,
|
|
35
|
+
:transparency, # Stroke transparency
|
|
36
|
+
:marker_transparency,
|
|
37
|
+
:error_bars_transparency,
|
|
38
|
+
# Now, fill information
|
|
39
|
+
:fill_type, # not false/nil => there will be
|
|
40
|
+
# some filling. See Curve2D#draw_fill for more info
|
|
41
|
+
:fill_color, :fill_transparency,
|
|
42
|
+
:hist_type, # See below
|
|
43
|
+
:hist_left, # the position of the left part of the step
|
|
44
|
+
:hist_right, # the position of the right part of the step
|
|
45
|
+
]
|
|
46
|
+
attr_writer *ELEMENTS
|
|
47
|
+
|
|
48
|
+
# Special accessors: they implement the :"=>stuff" redirection. Beware
|
|
49
|
+
# of circular redirections !!!
|
|
50
|
+
for el in ELEMENTS
|
|
51
|
+
eval <<"EOE"
|
|
52
|
+
def #{el.to_s}
|
|
53
|
+
if @#{el.to_s}.is_a?(Symbol) && @#{el.to_s}.to_s =~ /^=>(.*)/
|
|
54
|
+
new_sym = $1.to_sym
|
|
55
|
+
if new_sym == :#{el.to_s}
|
|
56
|
+
return nil
|
|
57
|
+
end
|
|
58
|
+
return self[new_sym]
|
|
59
|
+
else
|
|
60
|
+
return @#{el.to_s}
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
EOE
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# The order of the plotting operations. Default is 0
|
|
67
|
+
# (path then markers then error_bars)
|
|
68
|
+
DrawingOrder = [
|
|
69
|
+
[:path, :markers, :error_bars],
|
|
70
|
+
[:path, :error_bars, :markers],
|
|
71
|
+
[:markers, :path, :error_bars],
|
|
72
|
+
[:markers, :error_bars, :path ],
|
|
73
|
+
[:error_bars, :path, :markers],
|
|
74
|
+
[:error_bars, :markers, :path]
|
|
75
|
+
]
|
|
76
|
+
|
|
77
|
+
Defaults = {
|
|
78
|
+
:marker_scale => 0.5,
|
|
79
|
+
:error_bar_color => :'=>color', # Defaults to the same as color
|
|
80
|
+
:drawing_order => 0,
|
|
81
|
+
:transparency => false,
|
|
82
|
+
:fill_type => false, # No fill by default.
|
|
83
|
+
:fill_color => :'=>color', # Defaults to the same as color
|
|
84
|
+
:hist_type => false, # old style by default...
|
|
85
|
+
:hist_left => 0.0, # joint lines by default
|
|
86
|
+
:hist_right => 1.0, # joint lines by default
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
# A hash to deal with fill types, to be used as an argument for
|
|
90
|
+
# the Utils::interpret_arg function.
|
|
91
|
+
FillTypeArguments = {
|
|
92
|
+
/no(ne)?/ => false,
|
|
93
|
+
/y[_-]ax(is)?/ => :to_y_axis,
|
|
94
|
+
/bottom/ => :to_bottom,
|
|
95
|
+
/top/ => :to_top,
|
|
96
|
+
/old-styke/ => :old_style, # essentially for histograms
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
# Creates a CurveStyle element. There are several ways to
|
|
100
|
+
# initialize:
|
|
101
|
+
# * no arguments (_args_ empty): a CurveStyle object is created
|
|
102
|
+
# with all its values set to nil
|
|
103
|
+
# * at least one argument: arguments are taken as values in the
|
|
104
|
+
# order given by the ELEMENTS array. In this case, arguments
|
|
105
|
+
# not present default to the value given in the Defaults
|
|
106
|
+
# hash. This behaviour is mainly to keep old things working.
|
|
107
|
+
# * The new and best way to do it is to feed it a hash, in which
|
|
108
|
+
# case elements not present in the hash get the values in
|
|
109
|
+
# Default.
|
|
110
|
+
def initialize(*args)
|
|
111
|
+
if args.length == 0
|
|
112
|
+
return # We don't set anything in this case
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
if (h = args[0]).is_a? Hash
|
|
116
|
+
for el in ELEMENTS
|
|
117
|
+
if h.key?(el)
|
|
118
|
+
self[el] = h[el]
|
|
119
|
+
elsif Defaults.key?(el)
|
|
120
|
+
self[el] = Defaults[el]
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
else
|
|
124
|
+
# If there is at least one argument, we consider them as
|
|
125
|
+
# values in the order of ELEMENTS
|
|
126
|
+
for el in ELEMENTS
|
|
127
|
+
if args.length > 0
|
|
128
|
+
self[el] = args.shift
|
|
129
|
+
else
|
|
130
|
+
if Defaults.key?(el)
|
|
131
|
+
self[el] = Defaults[el]
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# This is not the place where to do this. It should be implemented
|
|
138
|
+
# as part of the attribute accessors.
|
|
139
|
+
# # Now, if there is any entry with a value of a symbol starting with
|
|
140
|
+
# # => , its value is replaced by the value for the pointed elements.
|
|
141
|
+
# # That is =>color means 'replace by the color'. Be careful however
|
|
142
|
+
# # with circular dependencies !!!
|
|
143
|
+
# for el in ELEMENTS
|
|
144
|
+
# if self[el].is_a?(Symbol) && self[el].to_s =~ /^=>(.*)/
|
|
145
|
+
# self[el] = self[$1.to_sym]
|
|
146
|
+
# end
|
|
147
|
+
# end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# Overrides the style entries with the ones found in _other_.
|
|
151
|
+
def override!(other)
|
|
152
|
+
for iv in ELEMENTS
|
|
153
|
+
if other.instance_variables.include?("@" + iv.to_s)
|
|
154
|
+
# We use instance_variables.include? rather
|
|
155
|
+
# than instance_variable_defined?, as the latter
|
|
156
|
+
# is present only in recent versions of Ruby 1.8
|
|
157
|
+
send(iv.to_s + "=", other.send(iv))
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
# Returns a hash suitable to pass on to save_legend_info, or return
|
|
163
|
+
# false if there was no legend specified in the style.
|
|
164
|
+
def legend_info
|
|
165
|
+
if legend
|
|
166
|
+
legend_info = {
|
|
167
|
+
'text' => legend,
|
|
168
|
+
'marker' => marker,
|
|
169
|
+
'marker_color' => marker_color,
|
|
170
|
+
'marker_scale' => marker_scale,
|
|
171
|
+
}
|
|
172
|
+
if color && line_style
|
|
173
|
+
legend_info['line_color'] = color
|
|
174
|
+
legend_info['line_type'] = line_style
|
|
175
|
+
else # Line drawing is disabled.
|
|
176
|
+
legend_info["line_width"] = -1
|
|
177
|
+
end
|
|
178
|
+
return legend_info
|
|
179
|
+
else
|
|
180
|
+
return false
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
# Returns true if the style element actually carries a legend
|
|
185
|
+
def has_legend?
|
|
186
|
+
return legend ? true : false
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
# Remove attributes. Can be used to 'unset' current default.
|
|
191
|
+
def delete(*vars)
|
|
192
|
+
for iv in vars
|
|
193
|
+
begin
|
|
194
|
+
remove_instance_variable('@' + iv.to_s)
|
|
195
|
+
rescue NameError
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
# Hash-like accessor:
|
|
201
|
+
def [](elem)
|
|
202
|
+
if ELEMENTS.include?(elem)
|
|
203
|
+
return self.send(elem)
|
|
204
|
+
else
|
|
205
|
+
raise NameError, "Unkown element of CurveStyle: #{elem}"
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
def []=(elem, value)
|
|
210
|
+
if ELEMENTS.include?(elem)
|
|
211
|
+
self.send(elem.to_s + '=', value)
|
|
212
|
+
else
|
|
213
|
+
raise NameError, "Unkown element of CurveStyle: #{elem}"
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
# A function to be used to output legend pictograms separately.
|
|
218
|
+
# It takes all the place available in the current context of the
|
|
219
|
+
# FigureMaker object _t_.
|
|
220
|
+
def output_legend_pictogram(t)
|
|
221
|
+
t.context do
|
|
222
|
+
# output line
|
|
223
|
+
if color && line_style
|
|
224
|
+
t.line_color = color
|
|
225
|
+
t.line_width = linewidth if linewidth
|
|
226
|
+
# t.line_cap = dict['line_cap']
|
|
227
|
+
t.line_type = line_style
|
|
228
|
+
t.stroke_line(0.0, 0.5, 1.0, 0.5)
|
|
229
|
+
end
|
|
230
|
+
if marker
|
|
231
|
+
t.line_type = Tioga::FigureConstants::Line_Type_Solid
|
|
232
|
+
t.show_marker( 'x' => 0.5,
|
|
233
|
+
'y' => 0.5,
|
|
234
|
+
'marker' => marker,
|
|
235
|
+
'color' => marker_color,
|
|
236
|
+
'scale' => marker_scale,
|
|
237
|
+
'alignment' => Tioga::FigureConstants::ALIGNED_AT_MIDHEIGHT,
|
|
238
|
+
'justification' => Tioga::FigureConstants::CENTERED
|
|
239
|
+
)
|
|
240
|
+
end
|
|
241
|
+
end
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
end
|