ctioga2 0.10.1 → 0.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Changelog +18 -0
- data/bin/ctioga2 +28 -0
- data/lib/ctioga2/commands/commands.rb +1 -0
- data/lib/ctioga2/commands/doc/documentation-commands.rb +13 -0
- data/lib/ctioga2/commands/doc/help.rb +3 -2
- data/lib/ctioga2/commands/doc/html.rb +48 -0
- data/lib/ctioga2/commands/doc/introspection.rb +2 -2
- data/lib/ctioga2/commands/general-types.rb +10 -0
- data/lib/ctioga2/commands/parsers/file.rb +23 -2
- data/lib/ctioga2/data/backends/backends.rb +1 -2
- data/lib/ctioga2/data/backends/backends/smath.rb +129 -0
- data/lib/ctioga2/data/backends/backends/text.rb +1 -0
- data/lib/ctioga2/data/dataset.rb +1 -1
- data/lib/ctioga2/data/stack.rb +13 -3
- data/lib/ctioga2/graphics/elements.rb +2 -0
- data/lib/ctioga2/graphics/elements/containers.rb +3 -1
- data/lib/ctioga2/graphics/elements/element.rb +194 -5
- data/lib/ctioga2/graphics/elements/gradient-region.rb +5 -2
- data/lib/ctioga2/graphics/elements/histogram.rb +7 -2
- data/lib/ctioga2/graphics/elements/plot-elements.rb +88 -0
- data/lib/ctioga2/graphics/elements/primitive.rb +28 -12
- data/lib/ctioga2/graphics/elements/region.rb +6 -1
- data/lib/ctioga2/graphics/elements/style-lists.rb +2 -2
- data/lib/ctioga2/graphics/elements/subplot.rb +3 -3
- data/lib/ctioga2/graphics/elements/tangent.rb +5 -8
- data/lib/ctioga2/graphics/generator.rb +10 -0
- data/lib/ctioga2/graphics/geometry.rb +96 -0
- data/lib/ctioga2/graphics/legends.rb +4 -2
- data/lib/ctioga2/graphics/legends/area.rb +12 -4
- data/lib/ctioga2/graphics/root.rb +16 -14
- data/lib/ctioga2/graphics/styles.rb +5 -2
- data/lib/ctioga2/graphics/styles/arrows.rb +5 -0
- data/lib/ctioga2/graphics/styles/axes.rb +1 -1
- data/lib/ctioga2/graphics/styles/base.rb +95 -14
- data/lib/ctioga2/graphics/styles/curve.rb +8 -0
- data/lib/ctioga2/graphics/styles/drawable.rb +35 -48
- data/lib/ctioga2/graphics/styles/factory.rb +23 -23
- data/lib/ctioga2/graphics/styles/fill.rb +268 -0
- data/lib/ctioga2/graphics/styles/plot.rb +90 -46
- data/lib/ctioga2/graphics/styles/sets.rb +3 -0
- data/lib/ctioga2/graphics/styles/{sheet.rb → styles.rb} +70 -160
- data/lib/ctioga2/graphics/styles/stylesheet.rb +355 -0
- data/lib/ctioga2/graphics/styles/texts.rb +4 -2
- data/lib/ctioga2/graphics/styles/ticks.rb +44 -4
- data/lib/ctioga2/graphics/subplot-commands.rb +84 -9
- data/lib/ctioga2/graphics/types.rb +1 -1
- data/lib/ctioga2/graphics/types/dimensions.rb +40 -0
- data/lib/ctioga2/graphics/types/grid.rb +21 -5
- data/lib/ctioga2/graphics/types/point.rb +2 -1
- data/lib/ctioga2/log.rb +5 -1
- data/lib/ctioga2/metabuilder/types/styles.rb +11 -7
- data/lib/ctioga2/plotmaker.rb +2 -0
- data/lib/ctioga2/utils.rb +21 -6
- data/lib/ctioga2/version.rb +2 -2
- metadata +105 -108
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: cf1d83cc2f6ff4a0a56457aaf1343632316fc54c
|
4
|
+
data.tar.gz: de6664912ac0b52b32dd6dc90520556a8a3408e1
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 658b6530f9b7a6b05159f779b6e2b82df15e22b05e75e7c61404212193c46044b622d9a9e68980225a116012004a79f7c92b62445fd1e2ebbc8322f3b83658c3
|
7
|
+
data.tar.gz: 8f4d59ab2aa53836d4bd74f30696cfc2f3d4eaaff3c138d85878619f89304cad620093ba2ecd54dc240933ecc93526156fa1934138a07a6e768b0c4864077f54
|
data/Changelog
CHANGED
@@ -1,3 +1,21 @@
|
|
1
|
+
ctioga2 (0.11)
|
2
|
+
|
3
|
+
* Implemented patterned fills
|
4
|
+
* Implemented loops in command files
|
5
|
+
* Redesigned the styling system, with now fully-fledged CSS-like style
|
6
|
+
sheets
|
7
|
+
* A command to hide (and show again) elements (for step-by-step
|
8
|
+
construction of animations)
|
9
|
+
* A mathematical backend for 3D curves
|
10
|
+
* Multicolumn merge
|
11
|
+
* More flexibility in setting the frame margin
|
12
|
+
* Grid elements spanning several columns/rows
|
13
|
+
* An oriented-line primitive to draw a line of a given length in a
|
14
|
+
given direction
|
15
|
+
* Various bug-fixes and documentation updates
|
16
|
+
|
17
|
+
-- Vincent <vincent.fourmond@9online.fr> Thu 1 Jan 21:51:57 CET 2015
|
18
|
+
|
1
19
|
ctioga2 (0.10.1)
|
2
20
|
|
3
21
|
* Fix problems with Ruby1.8
|
data/bin/ctioga2
CHANGED
@@ -19,8 +19,36 @@ along with this program; if not, write to the Free Software
|
|
19
19
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
20
20
|
=end
|
21
21
|
|
22
|
+
# Coverage on demand
|
23
|
+
if ARGV[0] == '--coverage'
|
24
|
+
ARGV.shift
|
25
|
+
require 'simplecov'
|
26
|
+
nm = ARGV.shift
|
27
|
+
if nm =~ /%/ # Some formatting
|
28
|
+
id = begin
|
29
|
+
File.open(".cov") do |f|
|
30
|
+
f.read.to_i + 1
|
31
|
+
end
|
32
|
+
rescue
|
33
|
+
0
|
34
|
+
end
|
35
|
+
nm = nm % id
|
36
|
+
File.open('.cov', 'w') do |f|
|
37
|
+
f.puts id.to_s
|
38
|
+
end
|
39
|
+
end
|
40
|
+
SimpleCov.command_name nm
|
41
|
+
SimpleCov.start do
|
42
|
+
filters.clear
|
43
|
+
add_filter do |src|
|
44
|
+
!(src.filename =~ /ctioga2/)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
22
49
|
require 'ctioga2/plotmaker'
|
23
50
|
|
24
51
|
plot_maker = CTioga2::PlotMaker.new
|
52
|
+
|
25
53
|
plot_maker.run(ARGV)
|
26
54
|
|
@@ -89,6 +89,19 @@ EOH
|
|
89
89
|
Prints the HTML documentation for all types.
|
90
90
|
EOH
|
91
91
|
|
92
|
+
WriteHTMLStyles =
|
93
|
+
Cmd.new("write-html-styles", nil, "--write-html-styles",
|
94
|
+
[], WriteHTMLOptions) do |plotmaker, opts|
|
95
|
+
html = HTML.new(plotmaker.interpreter.doc)
|
96
|
+
html.write_styles(opts)
|
97
|
+
end
|
98
|
+
|
99
|
+
WriteHTMLStyles.describe("HTML documentation for styles",
|
100
|
+
<<EOH, DocumentationGenerationGroup)
|
101
|
+
Prints the HTML documentation for all styles.
|
102
|
+
EOH
|
103
|
+
|
104
|
+
|
92
105
|
WriteHTMLBackends =
|
93
106
|
Cmd.new("write-html-backends", nil, "--write-html-backends",
|
94
107
|
[], WriteHTMLOptions) do |plotmaker, opts|
|
@@ -81,13 +81,14 @@ module CTioga2
|
|
81
81
|
def print_commandline_options(cmds, groups)
|
82
82
|
@to_tty = false
|
83
83
|
if STDOUT.tty?
|
84
|
+
@to_tty = true
|
84
85
|
begin
|
85
86
|
require 'curses'
|
86
87
|
Curses.init_screen
|
87
88
|
@total_width = Curses.cols
|
88
89
|
Curses.close_screen
|
89
|
-
|
90
|
-
|
90
|
+
rescue LoadError => e
|
91
|
+
# We'll be missing the exact term size
|
91
92
|
end
|
92
93
|
end
|
93
94
|
@total_width ||= 80 # 80 by default
|
@@ -206,6 +206,54 @@ module CTioga2
|
|
206
206
|
end
|
207
207
|
end
|
208
208
|
end
|
209
|
+
|
210
|
+
# Write a summary list of all style items
|
211
|
+
def write_styles(opts, out = STDOUT)
|
212
|
+
|
213
|
+
styles = Graphics::Elements::TiogaElement::styled_classes
|
214
|
+
|
215
|
+
names = styles.keys.sort
|
216
|
+
|
217
|
+
write_page_menu(opts, out) do |out|
|
218
|
+
out.puts "<div class='quick-jump'>"
|
219
|
+
out.puts "<h3>Quick jump</h3>"
|
220
|
+
out.puts "<ul>\n"
|
221
|
+
for k in names
|
222
|
+
out.puts "<li><a href='#style-#{k}'>#{k}</a></li>\n"
|
223
|
+
end
|
224
|
+
out.puts "</ul>\n"
|
225
|
+
out.puts "</div>"
|
226
|
+
end
|
227
|
+
|
228
|
+
write_page(opts, out) do |out|
|
229
|
+
for n in names
|
230
|
+
out.puts "<h3 id='style-#{n}' class='style'><code>#{n}</code></h3>\n"
|
231
|
+
cls = styles[n].style_class
|
232
|
+
if cls
|
233
|
+
aliases = cls.defined_aliases
|
234
|
+
out.puts "<ul>\n"
|
235
|
+
|
236
|
+
opts = cls.options_hash
|
237
|
+
op_names = opts.keys.sort
|
238
|
+
for k in op_names
|
239
|
+
type = opts[k].type
|
240
|
+
extra = if aliases.key? k
|
241
|
+
" (alias for <code>#{cls.normalize_out(aliases[k])}</code>)"
|
242
|
+
else
|
243
|
+
""
|
244
|
+
end
|
245
|
+
|
246
|
+
puts "<li><code>#{cls.normalize_out(k)}</code>#{extra}: <a href='#{@types_url}#type-#{type.name}'>#{type.name}</a></li>\n"
|
247
|
+
end
|
248
|
+
out.puts "</ul>\n"
|
249
|
+
|
250
|
+
else
|
251
|
+
out.puts "No specific style information"
|
252
|
+
end
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
end
|
209
257
|
|
210
258
|
|
211
259
|
protected
|
@@ -135,7 +135,7 @@ module CTioga2
|
|
135
135
|
def list_styles
|
136
136
|
|
137
137
|
puts "Available color sets:"
|
138
|
-
sets = Graphics::Styles::CurveStyleFactory::parameters['
|
138
|
+
sets = Graphics::Styles::CurveStyleFactory::parameters['color'].sets
|
139
139
|
set_names = sets.keys.sort
|
140
140
|
|
141
141
|
sets_by_prefix = Utils.group_by_prefix(set_names, /(.*?)\d+$/)
|
@@ -147,7 +147,7 @@ module CTioga2
|
|
147
147
|
end
|
148
148
|
|
149
149
|
puts "\nAvailable marker sets:"
|
150
|
-
sets = Graphics::Styles::CurveStyleFactory::parameters['
|
150
|
+
sets = Graphics::Styles::CurveStyleFactory::parameters['marker'].sets
|
151
151
|
set_names = sets.keys.sort
|
152
152
|
|
153
153
|
sets_by_prefix = Utils.group_by_prefix(set_names, /(.*?)\d+$/)
|
@@ -80,6 +80,16 @@ EOD
|
|
80
80
|
|
81
81
|
IntegerType = CmdType.new('integer', :integer, <<EOD)
|
82
82
|
An integer.
|
83
|
+
EOD
|
84
|
+
|
85
|
+
IntegerList = CmdType.new('integer-list',
|
86
|
+
{
|
87
|
+
:type => :array,
|
88
|
+
:subtype => :integer,
|
89
|
+
:separator => /\s+|\s*,\s*/,
|
90
|
+
:separator_out => " "
|
91
|
+
}, <<EOD)
|
92
|
+
A list of space-separated or comma-separated integers
|
83
93
|
EOD
|
84
94
|
|
85
95
|
PartialFloatRangeType = CmdType.new('partial-float-range',
|
@@ -24,7 +24,8 @@ module CTioga2
|
|
24
24
|
|
25
25
|
module Parsers
|
26
26
|
|
27
|
-
# This class parses a "new style" command file, delegating
|
27
|
+
# This class parses a "new style" command file, delegating to
|
28
|
+
# the old parser if this looks like an old style command file.
|
28
29
|
class FileParser
|
29
30
|
|
30
31
|
include Log
|
@@ -75,7 +76,7 @@ module CTioga2
|
|
75
76
|
## @todo line counting ?
|
76
77
|
for l in lines
|
77
78
|
idx += 1
|
78
|
-
# If we find something that looks like
|
79
|
+
# If we find something that looks like an old command at the
|
79
80
|
# beginning of a line, we say this is an old style file.
|
80
81
|
|
81
82
|
## @todo Find a way to disable this compatibility stuff --
|
@@ -116,6 +117,9 @@ module CTioga2
|
|
116
117
|
# Now, we rearrange the lines...
|
117
118
|
idx = -1
|
118
119
|
ruby = false
|
120
|
+
|
121
|
+
# False, or a [var, values, code] triplet
|
122
|
+
loop = false
|
119
123
|
for l in parsed_lines
|
120
124
|
idx += 1
|
121
125
|
interpreter.context.parsing_file(nil, io, lines_indices[idx])
|
@@ -132,6 +136,23 @@ module CTioga2
|
|
132
136
|
else
|
133
137
|
ruby << l
|
134
138
|
end
|
139
|
+
elsif l =~ /^\s*for\s+(\w+)\s+in\s+(.*)/
|
140
|
+
v = $2
|
141
|
+
var = $1
|
142
|
+
v << "\n"
|
143
|
+
s = InterpreterString.parse_until_unquoted(StringIO.new(v),"\n")
|
144
|
+
vals = s.expand_and_split(/\s+/, interpreter)
|
145
|
+
loop = [var, vals, ""]
|
146
|
+
elsif loop
|
147
|
+
if l =~ /^\s*for\s+end\s*$/
|
148
|
+
for v in loop[1]
|
149
|
+
interpreter.variables.define_variable(loop[0], v)
|
150
|
+
run_commands(loop[2], interpreter)
|
151
|
+
end
|
152
|
+
loop = false
|
153
|
+
else
|
154
|
+
loop[2] << l
|
155
|
+
end
|
135
156
|
elsif l =~ /^\s*([a-zA-Z0-9_-]+)\s*(\??)(=|:=)\s*(.*)/
|
136
157
|
symbol = $1
|
137
158
|
value = InterpreterString.parse_until_unquoted(StringIO.new($4),"\n", false)
|
@@ -34,7 +34,6 @@ for file in files.uniq
|
|
34
34
|
begin
|
35
35
|
require "ctioga2/data/backends/backends/#{file}"
|
36
36
|
rescue Exception => e
|
37
|
-
CTioga2::Log::warn { "There was a problem trying to load 'ctioga2/data/backends/backends/#{file}'
|
38
|
-
CTioga2::Log::warn { "#{e.inspect}" }
|
37
|
+
CTioga2::Log::warn { "There was a problem trying to load 'ctioga2/data/backends/backends/#{file}':\n#{e.inspect}" }
|
39
38
|
end
|
40
39
|
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
# smath.rb :multi-dimensional math backend
|
2
|
+
# Copyright (C) 2014 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
|
+
|
19
|
+
require 'Dobjects/Dvector'
|
20
|
+
require 'Dobjects/Function'
|
21
|
+
|
22
|
+
module CTioga2
|
23
|
+
|
24
|
+
module Data
|
25
|
+
|
26
|
+
module Backends
|
27
|
+
|
28
|
+
class SMathBackend < Backend
|
29
|
+
|
30
|
+
include Dobjects
|
31
|
+
include Math
|
32
|
+
|
33
|
+
describe 'smath', 'Mathematical functions (multi-D)', <<EOD
|
34
|
+
This backends computes mathematical formulas of two or more variables
|
35
|
+
EOD
|
36
|
+
|
37
|
+
param_accessor :samples, 'samples', "Sample number", 'integer',
|
38
|
+
"Number of samples (default, overriden by variable-specific specs)"
|
39
|
+
|
40
|
+
|
41
|
+
param_accessor :u_range, 'urange', "U Range", 'float-range',
|
42
|
+
"U range (a:b)"
|
43
|
+
|
44
|
+
param_accessor :u_samples, 'usamples', "U samples", 'integer',
|
45
|
+
"Number of U samples"
|
46
|
+
|
47
|
+
param_accessor :v_range, 'vrange', "V Range", 'float-range',
|
48
|
+
"V range (a:b)"
|
49
|
+
|
50
|
+
param_accessor :v_samples, 'vsamples', "V samples", 'integer',
|
51
|
+
"Number of V samples"
|
52
|
+
|
53
|
+
def initialize
|
54
|
+
super()
|
55
|
+
@samples = 30
|
56
|
+
@u_range = -10.0..10.0
|
57
|
+
@v_range = -10.0..10.0
|
58
|
+
end
|
59
|
+
|
60
|
+
# This is called by the architecture to get the data. It first
|
61
|
+
# splits the set name into func@range.
|
62
|
+
def query_dataset(set)
|
63
|
+
name = "#{set}"
|
64
|
+
|
65
|
+
u_values = make_dvector(@u_range, @u_samples || @samples)
|
66
|
+
v_values = make_dvector(@v_range, @v_samples || @samples)
|
67
|
+
|
68
|
+
if ! (set.split_at_toplevel(/:/).size > 1)
|
69
|
+
set = "u:v:#{set}"
|
70
|
+
end
|
71
|
+
|
72
|
+
val_u = Dvector.new
|
73
|
+
val_v = Dvector.new
|
74
|
+
for u in u_values
|
75
|
+
for v in v_values
|
76
|
+
val_u << u
|
77
|
+
val_v << v
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
return Dataset.dataset_from_spec(name, set) do |b|
|
84
|
+
get_data_column(b, [val_u, val_v])
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
protected
|
90
|
+
|
91
|
+
# Turns a Range and a number of points into a Dvector
|
92
|
+
def make_dvector(range, nb_points, log = @log)
|
93
|
+
n = nb_points -1
|
94
|
+
a = Dvector.new(nb_points) { |i|
|
95
|
+
i.to_f/(n.to_f)
|
96
|
+
}
|
97
|
+
# a is in [0:1] inclusive...
|
98
|
+
if log
|
99
|
+
delta = range.last/range.first
|
100
|
+
# delta is positive necessarily
|
101
|
+
a *= delta.log
|
102
|
+
a.exp!
|
103
|
+
a *= range.first
|
104
|
+
else
|
105
|
+
delta = range.last - range.first
|
106
|
+
a *= delta
|
107
|
+
a += range.first
|
108
|
+
end
|
109
|
+
return a
|
110
|
+
end
|
111
|
+
|
112
|
+
# Uses compute_formula to get data from
|
113
|
+
def get_data_column(column, values)
|
114
|
+
column.gsub!(/\b(u|v)\b/) do
|
115
|
+
cl = if $1 == 'u'
|
116
|
+
0
|
117
|
+
else
|
118
|
+
1
|
119
|
+
end
|
120
|
+
"(column[#{cl}])"
|
121
|
+
end
|
122
|
+
return Ruby.compute_formula(column, values)
|
123
|
+
end
|
124
|
+
|
125
|
+
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
data/lib/ctioga2/data/dataset.rb
CHANGED
data/lib/ctioga2/data/stack.rb
CHANGED
@@ -463,12 +463,20 @@ EOH
|
|
463
463
|
[],
|
464
464
|
{
|
465
465
|
'number' => CmdArg.new('integer'),
|
466
|
-
'
|
466
|
+
'precision' => CmdArg.new('float'),
|
467
|
+
'which' => CmdArg.new('stored-dataset'),
|
468
|
+
'columns' => CmdArg.new('integer-list')
|
467
469
|
}
|
468
470
|
) do |plotmaker, opts|
|
469
471
|
stack = plotmaker.data_stack
|
472
|
+
cols = if opts.key? 'columns'
|
473
|
+
opts['columns'].map { |x| x - 1 }
|
474
|
+
else
|
475
|
+
[0]
|
476
|
+
end
|
470
477
|
datasets = stack.latest_datasets(opts)
|
471
|
-
plotmaker.data_stack.merge_datasets_into_last(datasets
|
478
|
+
plotmaker.data_stack.merge_datasets_into_last(datasets, cols,
|
479
|
+
opts['precision'])
|
472
480
|
end
|
473
481
|
|
474
482
|
MergeToLastCommand.describe("Merge datasets based on X column",
|
@@ -476,7 +484,9 @@ EOH
|
|
476
484
|
This commands merges data with matching X values from a dataset (by
|
477
485
|
default the one before the last) into the last one. Data points that
|
478
486
|
have no corresponding X value in the current dataset are simply
|
479
|
-
ignored.
|
487
|
+
ignored. If the @columns@ option is provided, the numbered columns are
|
488
|
+
use instead of the X columns (X is 1). More than one column can be
|
489
|
+
provided this way, in which case *all* values must match.
|
480
490
|
|
481
491
|
This can be used to build 3D datasets for {command: xyz-map} or
|
482
492
|
{command: xy-parametric}.
|