ctioga2 0.13.1 → 0.14
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Changelog +26 -0
- data/bin/ct2-make-movie +4 -1
- data/bin/ctioga2 +1 -1
- data/lib/ctioga2/commands/commands.rb +2 -0
- data/lib/ctioga2/commands/doc/doc.rb +1 -1
- data/lib/ctioga2/commands/doc/documentation-commands.rb +38 -0
- data/lib/ctioga2/commands/doc/html.rb +84 -0
- data/lib/ctioga2/commands/general-commands.rb +20 -1
- data/lib/ctioga2/commands/general-functions.rb +26 -0
- data/lib/ctioga2/commands/general-types.rb +1 -0
- data/lib/ctioga2/commands/instruction.rb +61 -0
- data/lib/ctioga2/commands/interpreter.rb +12 -2
- data/lib/ctioga2/data/datacolumn.rb +38 -0
- data/lib/ctioga2/data/dataset.rb +6 -5
- data/lib/ctioga2/data/filters.rb +12 -5
- data/lib/ctioga2/data/stack.rb +105 -22
- data/lib/ctioga2/graphics/elements.rb +1 -1
- data/lib/ctioga2/graphics/elements/curve2d.rb +1 -1
- data/lib/ctioga2/graphics/elements/element.rb +29 -10
- data/lib/ctioga2/graphics/elements/primitive.rb +26 -2
- data/lib/ctioga2/graphics/elements/subplot.rb +7 -1
- data/lib/ctioga2/graphics/generator.rb +1 -2
- data/lib/ctioga2/graphics/legends/area.rb +3 -0
- data/lib/ctioga2/graphics/root.rb +18 -2
- data/lib/ctioga2/graphics/styles/curve.rb +6 -0
- data/lib/ctioga2/graphics/styles/drawable.rb +4 -0
- data/lib/ctioga2/graphics/styles/factory.rb +4 -5
- data/lib/ctioga2/graphics/styles/plot-types.rb +22 -7
- data/lib/ctioga2/graphics/subplot-commands.rb +2 -4
- data/lib/ctioga2/graphics/types.rb +17 -0
- data/lib/ctioga2/graphics/types/boundaries.rb +10 -0
- data/lib/ctioga2/graphics/types/boxes.rb +18 -0
- data/lib/ctioga2/graphics/types/dimensions.rb +4 -0
- data/lib/ctioga2/graphics/types/grid.rb +98 -4
- data/lib/ctioga2/graphics/types/point.rb +9 -0
- data/lib/ctioga2/metabuilder/types/lists.rb +1 -1
- data/lib/ctioga2/metabuilder/types/styles.rb +5 -3
- data/lib/ctioga2/plotmaker.rb +28 -5
- data/lib/ctioga2/postprocess.rb +28 -0
- data/lib/ctioga2/ruby.rb +7 -0
- data/lib/ctioga2/utils.rb +45 -0
- data/lib/ctioga2/version.rb +2 -2
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6bef5792441b163c872287441af1c3875eb51ae2
|
4
|
+
data.tar.gz: dc7ffd6240a7309e651aba7bb7f45cf4e8f204f4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 87f0530a92f0cd9f5328d1d399325b35108bfafce596e12315181d430307eedcb36771e21fb6f68445c2ba6e5aa233d5faaafdba6aeabac7388a6662908e33e5
|
7
|
+
data.tar.gz: a521da3bd85d7a7c71e3e982f2d524501cd31c4ceee773f8256c2a3620619e923a632e399a84134b851d01a44044c30334a7fdaf1e6de1046f8471f1d1103b87
|
data/Changelog
CHANGED
@@ -1,3 +1,29 @@
|
|
1
|
+
ctioga2 (0.14)
|
2
|
+
|
3
|
+
* A --bin command to bin data columns
|
4
|
+
* A --hide command
|
5
|
+
* A --append command to load a dataset and append it to the previous one
|
6
|
+
* a --draw-legend-pictogram to draw the legend pictogram of a curve
|
7
|
+
* Selection of plot elements by class for commands that take several
|
8
|
+
elements (such as --hide)
|
9
|
+
* A series of command-file functions like $(xmax), $(yrange) and so on
|
10
|
+
to gather informations about datasets on the stack
|
11
|
+
* Can now select the line cap using the /line-cap option (or the
|
12
|
+
--line-cap command), especially useful for /path-style=impulses
|
13
|
+
* Can now select a dataset using its plot #id
|
14
|
+
* A grid:next specification to automatically switch to the next grid
|
15
|
+
element
|
16
|
+
* More informative error messages when encountering weird data such as
|
17
|
+
infinite numbers, see http://sourceforge.net/p/ctioga2/tickets/2/
|
18
|
+
* Automatic styles for even/odd rows/columns of grids
|
19
|
+
* Switch to YAML for debug output, greatly speeds up writing out debug
|
20
|
+
information
|
21
|
+
* Now, color mixing between sets occur with !! and not ! as before, not to
|
22
|
+
confuse with plain color mixing
|
23
|
+
* Quite a few minor improvements/bug fixes
|
24
|
+
|
25
|
+
-- Vincent Fourmond <vincent.fourmond@9online.fr> Thu 18 Feb 20:48:58 CET 2016
|
26
|
+
|
1
27
|
ctioga2 (0.13.1)
|
2
28
|
|
3
29
|
* Fix installation problems with recent ruby versions
|
data/bin/ct2-make-movie
CHANGED
@@ -281,7 +281,10 @@ for f in args
|
|
281
281
|
"--set", "index", "#{index}",
|
282
282
|
"-f", file, "--name", name, "-r", ct2_page_size]
|
283
283
|
puts "Running: #{ct2_cmdline.join(" ")}"
|
284
|
-
system(*ct2_cmdline)
|
284
|
+
if ! system(*ct2_cmdline)
|
285
|
+
puts " -> failed with error code #$?, aborting"
|
286
|
+
exit 1
|
287
|
+
end
|
285
288
|
|
286
289
|
b = nil
|
287
290
|
|
data/bin/ctioga2
CHANGED
@@ -293,6 +293,8 @@ module CTioga2
|
|
293
293
|
if compulsory_args.size != @arguments.size
|
294
294
|
raise ArgumentNumberMismatch, "Command #{@name} was called with #{args.size} arguments, but it takes #{@arguments.size}"
|
295
295
|
end
|
296
|
+
plotmaker_target.interpreter.
|
297
|
+
add_instruction(Instruction.new(self, compulsory_args, optional_args))
|
296
298
|
args += compulsory_args
|
297
299
|
if has_options?
|
298
300
|
if optional_args
|
@@ -113,7 +113,7 @@ module CTioga2
|
|
113
113
|
|
114
114
|
os = ""
|
115
115
|
for k,v in cmd.optional_arguments
|
116
|
-
os << " /#{k}=#{v.type.name}"
|
116
|
+
os << " /#{k.gsub(/_/,'-')}=#{v.type.name}"
|
117
117
|
end
|
118
118
|
s2 = WordWrapper.wrap(os, size-4) # 4 for the spaces
|
119
119
|
str << "\nOptions: #{s2.join("\n ")}"
|
@@ -102,6 +102,44 @@ EOH
|
|
102
102
|
Prints the HTML documentation for all styles.
|
103
103
|
EOH
|
104
104
|
|
105
|
+
HTMLColorsOptions = {
|
106
|
+
'columns' => CmdArg.new('integer'),
|
107
|
+
'class' => CmdArg.new('text'),
|
108
|
+
'div-class' => CmdArg.new('text'),
|
109
|
+
'rect-width' => CmdArg.new('integer'),
|
110
|
+
'rect-height' => CmdArg.new('integer')
|
111
|
+
}
|
112
|
+
|
113
|
+
|
114
|
+
WriteHTMLColors =
|
115
|
+
Cmd.new("write-html-colors", nil, "--write-html-colors",
|
116
|
+
[], HTMLColorsOptions) do |plotmaker, opts|
|
117
|
+
html = HTML.new(plotmaker.interpreter.doc)
|
118
|
+
html.write_colors(opts)
|
119
|
+
end
|
120
|
+
|
121
|
+
WriteHTMLColors.describe("HTML documentation for colors",
|
122
|
+
<<EOH, DocumentationGenerationGroup)
|
123
|
+
Prints the HTML documentation for the colors, i.e. a color list.
|
124
|
+
EOH
|
125
|
+
|
126
|
+
WriteHTMLColorSets =
|
127
|
+
Cmd.new("write-html-color-sets", nil, "--write-html-color-sets",
|
128
|
+
[], HTMLColorsOptions.
|
129
|
+
merge({
|
130
|
+
'include' => CmdArg.new('regexp'),
|
131
|
+
'exclude' => CmdArg.new('regexp')
|
132
|
+
})) do |plotmaker, opts|
|
133
|
+
html = HTML.new(plotmaker.interpreter.doc)
|
134
|
+
html.write_color_sets(opts)
|
135
|
+
end
|
136
|
+
|
137
|
+
WriteHTMLColorSets.describe("HTML documentation for color sets",
|
138
|
+
<<EOH, DocumentationGenerationGroup)
|
139
|
+
Prints the HTML documentation for the color sets, i.e. the list of
|
140
|
+
all the sets together with the corresponding colors
|
141
|
+
EOH
|
142
|
+
|
105
143
|
|
106
144
|
WriteHTMLBackends =
|
107
145
|
Cmd.new("write-html-backends", nil, "--write-html-backends",
|
@@ -279,7 +279,91 @@ module CTioga2
|
|
279
279
|
end
|
280
280
|
end
|
281
281
|
end
|
282
|
+
end
|
283
|
+
|
284
|
+
def write_color_list(colors, opts, out = STDOUT, color_names = nil)
|
285
|
+
columns = opts["columns"] || 5
|
286
|
+
cls = opts["class"] || "color-list"
|
287
|
+
div_cls = opts["div-class"]
|
288
|
+
rw = opts["rect-width"] || 80
|
289
|
+
rh = opts["rect-height"] || 40
|
290
|
+
|
291
|
+
div_common = (div_cls ? "class='#{div_cls}' style='" :
|
292
|
+
"style='width:#{rw};height:#{rh};")
|
293
|
+
|
294
|
+
out.puts "<table class='#{cls}'>"
|
295
|
+
|
296
|
+
idx = 0
|
297
|
+
for color in colors
|
298
|
+
if idx % columns == 0
|
299
|
+
if idx > 0
|
300
|
+
out.puts "</tr>"
|
301
|
+
end
|
302
|
+
out.puts "<tr>"
|
303
|
+
end
|
304
|
+
if color
|
305
|
+
|
306
|
+
cls = "##{Utils::color_to_html(color)}"
|
282
307
|
|
308
|
+
if color_names
|
309
|
+
c = color_names[idx]
|
310
|
+
else
|
311
|
+
c = Utils::color_name_by_value(color)
|
312
|
+
end
|
313
|
+
cb = if c
|
314
|
+
"#{c}<br/>"
|
315
|
+
else
|
316
|
+
""
|
317
|
+
end
|
318
|
+
|
319
|
+
out.puts "<td><div #{div_common}background-color: #{cls};color: #{cls};'>#{cb}</div>#{cb}#{cls}</td>"
|
320
|
+
else
|
321
|
+
out.puts "<td>no color</td>"
|
322
|
+
end
|
323
|
+
idx += 1
|
324
|
+
end
|
325
|
+
|
326
|
+
out.puts "</tr></table>"
|
327
|
+
|
328
|
+
end
|
329
|
+
|
330
|
+
# Writes out a list
|
331
|
+
#
|
332
|
+
#@todo Split that to just write an ordered list of colors (get
|
333
|
+
#their names ?)
|
334
|
+
def write_colors(opts, out = STDOUT)
|
335
|
+
clrs = Tioga::ColorConstants::constants.sort
|
336
|
+
colors = clrs.map do |c|
|
337
|
+
Tioga::ColorConstants::const_get(c)
|
338
|
+
end
|
339
|
+
color_names = clrs.map do |c|
|
340
|
+
c.to_s
|
341
|
+
end
|
342
|
+
|
343
|
+
write_color_list(colors, opts, out, color_names)
|
344
|
+
end
|
345
|
+
|
346
|
+
def write_color_sets(opts, out = STDOUT)
|
347
|
+
sets = Graphics::Styles::CurveStyleFactory::parameters['color'].sets
|
348
|
+
set_names = sets.keys.sort
|
349
|
+
|
350
|
+
if opts['include']
|
351
|
+
set_names = set_names.select do |x|
|
352
|
+
x =~ opts['include']
|
353
|
+
end
|
354
|
+
elsif opts['exclude']
|
355
|
+
set_names = set_names.select do |x|
|
356
|
+
x !~ opts['exclude']
|
357
|
+
end
|
358
|
+
end
|
359
|
+
|
360
|
+
set_names = sets.keys.sort
|
361
|
+
|
362
|
+
for s in set_names
|
363
|
+
out.puts "<h5>Color set: <code>#{s}</code></h5>"
|
364
|
+
colors = sets[s]
|
365
|
+
write_color_list(colors, opts, out)
|
366
|
+
end
|
283
367
|
end
|
284
368
|
|
285
369
|
|
@@ -169,9 +169,13 @@ EOH
|
|
169
169
|
With this on, ctioga2 writes a whole lot of debugging information. You
|
170
170
|
probably will not need that unless you intend to file a bug report or
|
171
171
|
to tackle a problem yourself.
|
172
|
+
|
173
|
+
Be warned that it *will* slow down very significantly the processing
|
174
|
+
of ctioga2 (up to hundreds of times slower), especially if you are not
|
175
|
+
redirecting the output to a file.
|
172
176
|
EOH
|
173
177
|
|
174
|
-
#
|
178
|
+
# Prints the command-line used
|
175
179
|
EchoCmd =
|
176
180
|
Cmd.new("echo", nil, "--echo", [ ]) do |plotmaker|
|
177
181
|
STDERR.puts "Command-line used: "
|
@@ -183,7 +187,22 @@ EOH
|
|
183
187
|
Writes the whole command-line used to standard error, quoted in such a
|
184
188
|
way that it should be usable directly for copy/paste.
|
185
189
|
EOH
|
190
|
+
|
191
|
+
# Writes down the list of instruction run so far
|
192
|
+
PrintInstructionsCmd =
|
193
|
+
Cmd.new("print-instructions", nil, "--print-instructions", [ ]) do |plotmaker|
|
194
|
+
for ins in plotmaker.interpreter.instructions
|
195
|
+
puts ins.to_s
|
196
|
+
end
|
197
|
+
end
|
186
198
|
|
199
|
+
PrintInstructionsCmd.describe("Prints the list of all the instructions run so far",
|
200
|
+
<<EOH, GeneralGroup)
|
201
|
+
Writes the list of all the instructions run so far.
|
202
|
+
|
203
|
+
This is not very helpful for now, possibly.
|
204
|
+
EOH
|
205
|
+
|
187
206
|
|
188
207
|
end
|
189
208
|
end
|
@@ -53,6 +53,8 @@ Running this will give the following syntax error:
|
|
53
53
|
Doing it right would require the use of a decent amount of quotes.
|
54
54
|
EOD
|
55
55
|
|
56
|
+
# dataset functions
|
57
|
+
|
56
58
|
FuncPoint = Function.new("point", "Get dataset point information") do |pm, what, spec, *rest|
|
57
59
|
dataset = if rest.first
|
58
60
|
pm.data_stack.stored_dataset(rest.first)
|
@@ -106,6 +108,30 @@ optional third. It is parsed as {type: stored-dataset}
|
|
106
108
|
|
107
109
|
EOD
|
108
110
|
|
111
|
+
Stats = []
|
112
|
+
[:x, :y, :z].each do |col|
|
113
|
+
[:min, :max, :range, :avg].each do |what|
|
114
|
+
name = "#{col}#{what}"
|
115
|
+
Stats << Function.new(name, "Gets the #{what} of the #{col} column") do |pm, ds, *rest|
|
116
|
+
dataset = pm.data_stack.stored_dataset(ds)
|
117
|
+
cln = dataset.send(col)
|
118
|
+
clv = cln.values
|
119
|
+
case what
|
120
|
+
when :range
|
121
|
+
"#{clv.min}:#{clv.max}"
|
122
|
+
when :avg
|
123
|
+
return clv.sum/clv.size
|
124
|
+
else
|
125
|
+
clv.send(what)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
Stats.last.describe <<EOD
|
129
|
+
This is replaced by the the value of '#{what}' from the column '#{col}',
|
130
|
+
applied to the dataset given.
|
131
|
+
EOD
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
109
135
|
|
110
136
|
|
111
137
|
end
|
@@ -159,6 +159,7 @@ A dataset that has already been loaded. It is either:
|
|
159
159
|
dataset), 1 the second, -1 the last one, -2 the one before the last
|
160
160
|
and so on. (it works just like Ruby's arrays).
|
161
161
|
* The name of a named dataset.
|
162
|
+
* @#@ followed by the id of a plot element
|
162
163
|
EOD
|
163
164
|
|
164
165
|
# Something meant to be fed to PlotStyle#get_axis_style
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# instruction.rb: an instruction
|
2
|
+
# copyright (c) 2015 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/commands/arguments'
|
16
|
+
require 'ctioga2/commands/groups'
|
17
|
+
|
18
|
+
module CTioga2
|
19
|
+
|
20
|
+
module Commands
|
21
|
+
|
22
|
+
|
23
|
+
# This class represents an instruction, i.e. the execution of one
|
24
|
+
# Command. It is different in Command in that, for most of them,
|
25
|
+
# there will be arguments
|
26
|
+
class Instruction
|
27
|
+
|
28
|
+
# The Command
|
29
|
+
attr_accessor :command
|
30
|
+
|
31
|
+
# The list of its arguments, already in the correct type.
|
32
|
+
attr_accessor :arguments
|
33
|
+
|
34
|
+
# The options, already in the correct type
|
35
|
+
attr_accessor :options
|
36
|
+
|
37
|
+
def initialize(cmd, args, opts)
|
38
|
+
if not cmd.respond_to?(:run_command)
|
39
|
+
c = Interpreter.command(cmd)
|
40
|
+
if ! c
|
41
|
+
raise "Invalid command #{cmd}"
|
42
|
+
end
|
43
|
+
cmd = c
|
44
|
+
end
|
45
|
+
@command = cmd
|
46
|
+
@arguments = args
|
47
|
+
@options = opts
|
48
|
+
end
|
49
|
+
|
50
|
+
# Runs this instruction again
|
51
|
+
def run(plotmaker_target)
|
52
|
+
@command.run_command(plotmaker_target, @arguments, @options)
|
53
|
+
end
|
54
|
+
|
55
|
+
def to_s
|
56
|
+
"#{@command.name} #{@arguments.inspect} #{@options.inspect}"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
@@ -13,6 +13,7 @@
|
|
13
13
|
|
14
14
|
require 'ctioga2/utils'
|
15
15
|
require 'ctioga2/commands/commands'
|
16
|
+
require 'ctioga2/commands/instruction'
|
16
17
|
require 'ctioga2/commands/context'
|
17
18
|
require 'ctioga2/commands/variables'
|
18
19
|
require 'ctioga2/commands/strings'
|
@@ -65,8 +66,6 @@ module CTioga2
|
|
65
66
|
# All types defined so fat
|
66
67
|
@@types = {}
|
67
68
|
|
68
|
-
|
69
|
-
|
70
69
|
# Registers a given command. This is called automatically from
|
71
70
|
# Command.new, so you should not have to do it yourself.
|
72
71
|
def self.register_command(command)
|
@@ -166,6 +165,9 @@ module CTioga2
|
|
166
165
|
# The current context
|
167
166
|
attr_accessor :context
|
168
167
|
|
168
|
+
# The list of Instruction that were run so far
|
169
|
+
attr_accessor :instructions
|
170
|
+
|
169
171
|
# Creates an Interpreter with _target_ as the PlotMaker target
|
170
172
|
# object.
|
171
173
|
#
|
@@ -192,7 +194,15 @@ module CTioga2
|
|
192
194
|
|
193
195
|
@file_parser = Parsers::FileParser.new
|
194
196
|
@context = ParsingContext.new
|
197
|
+
@instructions = []
|
198
|
+
end
|
199
|
+
|
200
|
+
# Adds the given instruction to the list of Instruction that
|
201
|
+
# were run so far.
|
202
|
+
def add_instruction(instruction)
|
203
|
+
@instructions << instruction
|
195
204
|
end
|
205
|
+
|
196
206
|
|
197
207
|
# Calls the given function and returns the result
|
198
208
|
def call_function(name, args)
|
@@ -291,6 +291,44 @@ module CTioga2
|
|
291
291
|
end
|
292
292
|
end
|
293
293
|
|
294
|
+
# Bins the values of the columns into nb bins between min and
|
295
|
+
# max. Values outside that range are not taken into account. If
|
296
|
+
# @a normalize is true, then each value is normalized by the
|
297
|
+
# total number of samples.
|
298
|
+
#
|
299
|
+
# It returns [xv, yv], where xv are the centers of the bins, and
|
300
|
+
# yv the counts
|
301
|
+
#
|
302
|
+
# Does not take into account the error columns.
|
303
|
+
def bin(min, max, nb, normalize = false)
|
304
|
+
total = @values.size*1.0
|
305
|
+
xv = Dobjects::Dvector.new(nb)
|
306
|
+
yv = Dobjects::Dvector.new(nb)
|
307
|
+
|
308
|
+
0.upto(nb-1) do |i|
|
309
|
+
xv[i] = min + (max-min)*(i+0.5)/nb
|
310
|
+
yv[i] = 0
|
311
|
+
end
|
312
|
+
|
313
|
+
for v in @values
|
314
|
+
idx = (v-min)/(max-min)
|
315
|
+
if idx > 1.0 or idx < 0
|
316
|
+
next
|
317
|
+
end
|
318
|
+
idx = (idx*nb).to_i
|
319
|
+
if idx == nb
|
320
|
+
idx = nb-1 # case v = max
|
321
|
+
end
|
322
|
+
yv[idx] += 1
|
323
|
+
end
|
324
|
+
|
325
|
+
if normalize
|
326
|
+
yv *= (1.0/total)
|
327
|
+
end
|
328
|
+
|
329
|
+
return [xv, yv]
|
330
|
+
end
|
331
|
+
|
294
332
|
# Averages over the given indices, and puts the result at the
|
295
333
|
# target index.
|
296
334
|
#
|