ctioga2 0.6.1 → 0.7
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/Changelog +12 -0
- data/lib/ctioga2/commands/commands.rb +2 -1
- data/lib/ctioga2/commands/doc/help.rb +17 -7
- data/lib/ctioga2/commands/general-types.rb +8 -1
- data/lib/ctioga2/commands/interpreter.rb +3 -2
- data/lib/ctioga2/data/backends/backends/text.rb +13 -3
- data/lib/ctioga2/data/stack.rb +17 -2
- data/lib/ctioga2/graphics/elements/containers.rb +2 -1
- data/lib/ctioga2/graphics/elements/curve2d.rb +13 -19
- data/lib/ctioga2/graphics/elements/element.rb +51 -16
- data/lib/ctioga2/graphics/elements/parametric2d.rb +25 -31
- data/lib/ctioga2/graphics/elements/primitive.rb +20 -2
- data/lib/ctioga2/graphics/elements/subplot.rb +47 -9
- data/lib/ctioga2/graphics/elements/xyz-contour.rb +1 -10
- data/lib/ctioga2/graphics/elements/xyz-map.rb +2 -19
- data/lib/ctioga2/graphics/generator.rb +21 -4
- data/lib/ctioga2/graphics/styles/box.rb +63 -2
- data/lib/ctioga2/graphics/styles/colormap.rb +2 -2
- data/lib/ctioga2/graphics/styles/curve.rb +17 -1
- data/lib/ctioga2/graphics/styles/factory.rb +9 -2
- data/lib/ctioga2/graphics/styles/plot-types.rb +123 -0
- data/lib/ctioga2/graphics/styles/plot.rb +22 -4
- data/lib/ctioga2/graphics/types.rb +4 -2
- data/lib/ctioga2/log.rb +5 -2
- data/lib/ctioga2/metabuilder/type.rb +33 -9
- data/lib/ctioga2/plotmaker.rb +8 -2
- data/lib/ctioga2/postprocess.rb +39 -8
- data/lib/ctioga2/utils.rb +93 -3
- metadata +3 -2
data/Changelog
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
ctioga2 (0.7)
|
2
|
+
|
3
|
+
* It is now possible to index marker size index on Z values for
|
4
|
+
parametric plots
|
5
|
+
* --csv shortcut to read CSV files
|
6
|
+
* Round boxes (for the draw-box command and for the legends too)
|
7
|
+
* Make -X smarter about which viewer to use
|
8
|
+
* Unclipped plot elements + full control of depth
|
9
|
+
* Small bug fixes
|
10
|
+
|
11
|
+
-- Vincent <vincent.fourmond@9online.fr> Thu 3 Oct 22:53:25 CEST 2013
|
12
|
+
|
1
13
|
ctioga2 (0.6.1)
|
2
14
|
|
3
15
|
* Fix crash when a curve has no points within the plot boundaries
|
@@ -17,7 +17,7 @@ require 'ctioga2/commands/groups'
|
|
17
17
|
|
18
18
|
module CTioga2
|
19
19
|
|
20
|
-
Version::register_svn_info('$Revision:
|
20
|
+
Version::register_svn_info('$Revision: 518 $', '$Date: 2013-09-19 21:43:58 +0200 (Thu, 19 Sep 2013) $')
|
21
21
|
|
22
22
|
module Commands
|
23
23
|
|
@@ -143,6 +143,7 @@ module CTioga2
|
|
143
143
|
@short_description = short
|
144
144
|
@long_description = long || short
|
145
145
|
if(group)
|
146
|
+
group = Interpreter::group(group) if group.is_a? String
|
146
147
|
@group = group
|
147
148
|
group.commands << self
|
148
149
|
end
|
@@ -18,7 +18,7 @@ require 'ctioga2/commands/doc/wordwrap'
|
|
18
18
|
|
19
19
|
module CTioga2
|
20
20
|
|
21
|
-
Version::register_svn_info('$Revision:
|
21
|
+
Version::register_svn_info('$Revision: 532 $', '$Date: 2013-09-29 12:13:33 +0200 (Sun, 29 Sep 2013) $')
|
22
22
|
|
23
23
|
module Commands
|
24
24
|
|
@@ -99,14 +99,24 @@ module CTioga2
|
|
99
99
|
@color = false
|
100
100
|
end
|
101
101
|
|
102
|
+
should_close = false
|
103
|
+
output = $stdout
|
104
|
+
|
102
105
|
if @to_tty and @to_pager
|
103
106
|
# We pass -R as default value...
|
104
107
|
ENV['LESS'] = 'R'
|
105
|
-
|
106
|
-
pager
|
107
|
-
|
108
|
-
|
109
|
-
|
108
|
+
pager = 'pager'
|
109
|
+
for w in [ENV['PAGER'], 'less', 'pager' ]
|
110
|
+
if Utils::which(w)
|
111
|
+
pager = w
|
112
|
+
break
|
113
|
+
end
|
114
|
+
end
|
115
|
+
begin
|
116
|
+
output = IO::popen(pager, "w")
|
117
|
+
should_close = true
|
118
|
+
rescue
|
119
|
+
end
|
110
120
|
end
|
111
121
|
|
112
122
|
for group in groups
|
@@ -123,7 +133,7 @@ module CTioga2
|
|
123
133
|
output.puts format_one_entry(cmd)
|
124
134
|
end
|
125
135
|
end
|
126
|
-
output.close
|
136
|
+
output.close if should_close
|
127
137
|
end
|
128
138
|
|
129
139
|
protected
|
@@ -15,7 +15,7 @@ require 'ctioga2/utils'
|
|
15
15
|
|
16
16
|
module CTioga2
|
17
17
|
|
18
|
-
Version::register_svn_info('$Revision:
|
18
|
+
Version::register_svn_info('$Revision: 517 $', '$Date: 2013-09-19 18:28:15 +0200 (Thu, 19 Sep 2013) $')
|
19
19
|
|
20
20
|
module Commands
|
21
21
|
|
@@ -50,6 +50,13 @@ EOD
|
|
50
50
|
A floating-point number.
|
51
51
|
EOD
|
52
52
|
|
53
|
+
FloatOrFalseType = CmdType.new('float-or-false', {
|
54
|
+
:type => :float,
|
55
|
+
:shortcuts => {'none' => false }},
|
56
|
+
<<EOD)
|
57
|
+
A floating-point number, or @none@.
|
58
|
+
EOD
|
59
|
+
|
53
60
|
|
54
61
|
FloatList = CmdType.new('float-list',
|
55
62
|
{
|
@@ -21,7 +21,7 @@ require 'ctioga2/commands/doc/doc'
|
|
21
21
|
|
22
22
|
module CTioga2
|
23
23
|
|
24
|
-
Version::register_svn_info('$Revision:
|
24
|
+
Version::register_svn_info('$Revision: 512 $', '$Date: 2013-09-11 13:20:24 +0200 (Wed, 11 Sep 2013) $')
|
25
25
|
|
26
26
|
# This module contains the real core of ctioga2: a set of classes
|
27
27
|
# that implement the concept of commands. Each command translates
|
@@ -208,7 +208,8 @@ module CTioga2
|
|
208
208
|
# specified.
|
209
209
|
def run_command_file(file)
|
210
210
|
if ! @plotmaker_target.figure_name
|
211
|
-
@plotmaker_target.figure_name = file.gsub(/\.[^.]+$/,'')
|
211
|
+
@plotmaker_target.figure_name = file.gsub(/\.[^.]+$/,'').
|
212
|
+
gsub(/%/, '%%')
|
212
213
|
end
|
213
214
|
|
214
215
|
dir = File::dirname(file)
|
@@ -25,7 +25,7 @@ require 'stringio'
|
|
25
25
|
|
26
26
|
module CTioga2
|
27
27
|
|
28
|
-
Version::register_svn_info('$Revision:
|
28
|
+
Version::register_svn_info('$Revision: 524 $', '$Date: 2013-09-22 16:18:39 +0200 (Sun, 22 Sep 2013) $')
|
29
29
|
|
30
30
|
|
31
31
|
module Data
|
@@ -150,7 +150,12 @@ EOD
|
|
150
150
|
end
|
151
151
|
return ret
|
152
152
|
else
|
153
|
-
|
153
|
+
m = Dir::glob(spec)
|
154
|
+
if m.size > 0
|
155
|
+
return m
|
156
|
+
else
|
157
|
+
return super
|
158
|
+
end
|
154
159
|
end
|
155
160
|
end
|
156
161
|
|
@@ -380,7 +385,11 @@ EOD
|
|
380
385
|
@current_data,
|
381
386
|
@included_modules)
|
382
387
|
else
|
383
|
-
|
388
|
+
if @current_data[column.to_i]
|
389
|
+
return @current_data[column.to_i].dup
|
390
|
+
else
|
391
|
+
raise "Cannot find column number #{column.to_i} -- maybe you got the column separator wrong ?"
|
392
|
+
end
|
384
393
|
end
|
385
394
|
end
|
386
395
|
|
@@ -425,6 +434,7 @@ EOD
|
|
425
434
|
# end
|
426
435
|
|
427
436
|
end
|
437
|
+
|
428
438
|
|
429
439
|
end
|
430
440
|
|
data/lib/ctioga2/data/stack.rb
CHANGED
@@ -25,7 +25,7 @@ require 'ctioga2/data/filters'
|
|
25
25
|
# This module contains all the classes used by ctioga
|
26
26
|
module CTioga2
|
27
27
|
|
28
|
-
Version::register_svn_info('$Revision:
|
28
|
+
Version::register_svn_info('$Revision: 518 $', '$Date: 2013-09-19 21:43:58 +0200 (Thu, 19 Sep 2013) $')
|
29
29
|
|
30
30
|
|
31
31
|
module Data
|
@@ -72,6 +72,20 @@ module CTioga2
|
|
72
72
|
|
73
73
|
# Defaults to the 'text' backend
|
74
74
|
@backend_factory = Data::Backends::BackendFactory.new('text')
|
75
|
+
|
76
|
+
# Probably a bit out of place...
|
77
|
+
csv =
|
78
|
+
Cmd.new('csv', nil, '--csv', []) do |plotmaker|
|
79
|
+
plotmaker.interpreter.
|
80
|
+
run_commands("text /separator=/[,;]/")
|
81
|
+
end
|
82
|
+
|
83
|
+
csv.describe("reads CSV files",
|
84
|
+
<<"EOH", "backend-text")
|
85
|
+
Now parse the following data files as CSV.
|
86
|
+
|
87
|
+
# text /separator=/[,;]/
|
88
|
+
EOH
|
75
89
|
end
|
76
90
|
|
77
91
|
# Performs expansion on the given _set_ with the current
|
@@ -547,7 +561,8 @@ EOH
|
|
547
561
|
Adds the given commands to the dataset hook. See {command: dataset-hook}
|
548
562
|
for more information about the dataset hook.
|
549
563
|
EOH
|
550
|
-
|
564
|
+
|
565
|
+
|
551
566
|
end
|
552
567
|
|
553
568
|
end
|
@@ -17,7 +17,7 @@ require 'ctioga2/log'
|
|
17
17
|
|
18
18
|
module CTioga2
|
19
19
|
|
20
|
-
Version::register_svn_info('$Revision:
|
20
|
+
Version::register_svn_info('$Revision: 529 $', '$Date: 2013-09-25 18:23:27 +0200 (Wed, 25 Sep 2013) $')
|
21
21
|
|
22
22
|
module Graphics
|
23
23
|
|
@@ -53,6 +53,7 @@ module CTioga2
|
|
53
53
|
|
54
54
|
# Creates an empty new Container with the given _parent_.
|
55
55
|
def initialize(parent = nil, root = nil)
|
56
|
+
super()
|
56
57
|
@parent = parent
|
57
58
|
|
58
59
|
# elements to be given to tioga
|
@@ -19,7 +19,7 @@ require 'Dobjects/Function'
|
|
19
19
|
|
20
20
|
module CTioga2
|
21
21
|
|
22
|
-
Version::register_svn_info('$Revision:
|
22
|
+
Version::register_svn_info('$Revision: 535 $', '$Date: 2013-10-02 20:31:21 +0200 (Wed, 02 Oct 2013) $')
|
23
23
|
|
24
24
|
module Graphics
|
25
25
|
|
@@ -33,7 +33,7 @@ module CTioga2
|
|
33
33
|
#
|
34
34
|
# * transparency
|
35
35
|
# * drawing order
|
36
|
-
class Curve2D <
|
36
|
+
class Curve2D < PlotBasedElement
|
37
37
|
|
38
38
|
include Log
|
39
39
|
include Dobjects
|
@@ -45,18 +45,11 @@ module CTioga2
|
|
45
45
|
# Elements of the path, when there are more than one:
|
46
46
|
attr_accessor :path_elements
|
47
47
|
|
48
|
-
# The Data::Dataset object that should get plotted.
|
49
|
-
attr_accessor :dataset
|
50
48
|
|
51
|
-
# A Styles::CurveStyle object saying how the curve should be
|
52
|
-
# drawn.
|
53
|
-
attr_accessor :curve_style
|
54
|
-
|
55
|
-
undef :location=, :location
|
56
|
-
|
57
49
|
# Creates a new Curve2D object with the given _dataset_ and
|
58
50
|
# _style_.
|
59
51
|
def initialize(dataset, style = nil)
|
52
|
+
super()
|
60
53
|
@dataset = dataset
|
61
54
|
if @dataset.size > 2
|
62
55
|
warn { "Columns Y2 and further were ignored for set #{dataset.name}" }
|
@@ -78,12 +71,6 @@ module CTioga2
|
|
78
71
|
|
79
72
|
end
|
80
73
|
|
81
|
-
# Returns the LocationStyle object of the curve. Returns the
|
82
|
-
# one from #curve_style.
|
83
|
-
def location
|
84
|
-
return @curve_style.location
|
85
|
-
end
|
86
|
-
|
87
74
|
# Returns the Types::Boundaries of this curve.
|
88
75
|
def get_boundaries
|
89
76
|
return Types::Boundaries.bounds(@function.x, @function.y)
|
@@ -101,7 +88,11 @@ module CTioga2
|
|
101
88
|
case @curve_style.path_style
|
102
89
|
when /^splines/
|
103
90
|
for f in func.split_monotonic
|
104
|
-
new_f =
|
91
|
+
new_f = if @curve_style.clipped
|
92
|
+
f.bound_values(*bnds.extrema)
|
93
|
+
else
|
94
|
+
f.dup
|
95
|
+
end
|
105
96
|
t.append_interpolant_to_path(new_f.make_interpolant)
|
106
97
|
end
|
107
98
|
when /^impulses/
|
@@ -114,8 +105,11 @@ module CTioga2
|
|
114
105
|
|
115
106
|
# Hmmmm. This may get the wrong thing if you happen to
|
116
107
|
# draw something completely outside.
|
117
|
-
|
118
|
-
|
108
|
+
if @curve_style.clipped
|
109
|
+
f = func.bound_values(*bnds.extrema)
|
110
|
+
else
|
111
|
+
f = func
|
112
|
+
end
|
119
113
|
# If for some reason, there is no point left, we plot
|
120
114
|
# the original function.
|
121
115
|
if f.size < 2
|
@@ -18,7 +18,7 @@ require 'ctioga2/log'
|
|
18
18
|
# This module contains all the classes used by ctioga
|
19
19
|
module CTioga2
|
20
20
|
|
21
|
-
Version::register_svn_info('$Revision:
|
21
|
+
Version::register_svn_info('$Revision: 535 $', '$Date: 2013-10-02 20:31:21 +0200 (Wed, 02 Oct 2013) $')
|
22
22
|
|
23
23
|
# This module contains all graphical elements of CTioga2
|
24
24
|
module Graphics
|
@@ -38,6 +38,22 @@ module CTioga2
|
|
38
38
|
# LocationStyle object
|
39
39
|
attr_writer :location
|
40
40
|
|
41
|
+
attr_accessor :clipped
|
42
|
+
|
43
|
+
|
44
|
+
# Depth
|
45
|
+
attr_writer :depth
|
46
|
+
|
47
|
+
def initialize()
|
48
|
+
@clipped = true
|
49
|
+
|
50
|
+
@depth = 50 # Hey, like xfig
|
51
|
+
end
|
52
|
+
|
53
|
+
def depth
|
54
|
+
@depth || 50
|
55
|
+
end
|
56
|
+
|
41
57
|
# Makes sure there is a location when one asks for it.
|
42
58
|
def location
|
43
59
|
@location ||= Styles::LocationStyle.new
|
@@ -77,24 +93,43 @@ module CTioga2
|
|
77
93
|
raise "Should be reimplemented by children"
|
78
94
|
end
|
79
95
|
end
|
80
|
-
|
81
96
|
|
82
|
-
# # A unique method call to a FigureMaker object.
|
83
|
-
# class TiogaFuncall < TiogaElement
|
84
97
|
|
85
|
-
#
|
86
|
-
|
87
|
-
|
88
|
-
#
|
89
|
-
|
90
|
-
|
98
|
+
# The base class for all dataset-based elements
|
99
|
+
class PlotBasedElement < TiogaElement
|
100
|
+
|
101
|
+
# The Data::Dataset object that should get plotted.
|
102
|
+
attr_accessor :dataset
|
103
|
+
|
104
|
+
# A Styles::CurveStyle object saying how the curve should be
|
105
|
+
# drawn.
|
106
|
+
attr_accessor :curve_style
|
107
|
+
|
108
|
+
undef :location=, :location
|
109
|
+
|
110
|
+
# Returns the LocationStyle object of the curve. Returns the
|
111
|
+
# one from #curve_style.
|
112
|
+
def location
|
113
|
+
return @curve_style.location
|
114
|
+
end
|
115
|
+
|
116
|
+
undef :clipped, :clipped=
|
117
|
+
|
118
|
+
def clipped
|
119
|
+
return @curve_style.clipped
|
120
|
+
end
|
121
|
+
|
122
|
+
undef :depth, :depth=
|
123
|
+
|
124
|
+
def depth
|
125
|
+
return @curve_style.depth
|
126
|
+
end
|
127
|
+
|
128
|
+
def initialize()
|
129
|
+
super()
|
130
|
+
end
|
131
|
+
end
|
91
132
|
|
92
|
-
# protected
|
93
|
-
|
94
|
-
# def real_do(f)
|
95
|
-
# f.send(@symbol, *@args)
|
96
|
-
# end
|
97
|
-
# end
|
98
133
|
end
|
99
134
|
end
|
100
135
|
end
|
@@ -19,7 +19,7 @@ require 'Dobjects/Function'
|
|
19
19
|
|
20
20
|
module CTioga2
|
21
21
|
|
22
|
-
Version::register_svn_info('$Revision:
|
22
|
+
Version::register_svn_info('$Revision: 535 $', '$Date: 2013-10-02 20:31:21 +0200 (Wed, 02 Oct 2013) $')
|
23
23
|
|
24
24
|
module Graphics
|
25
25
|
|
@@ -40,35 +40,28 @@ module CTioga2
|
|
40
40
|
# factory, I think. Color maps can be used for colors, but for
|
41
41
|
# the rest, things will have to be implemented as parameters to
|
42
42
|
# the curve generator, or even separated commands.
|
43
|
-
class Parametric2D <
|
43
|
+
class Parametric2D < PlotBasedElement
|
44
44
|
|
45
45
|
include Log
|
46
46
|
include Dobjects
|
47
47
|
|
48
|
-
# The Data::Dataset object that should get plotted.
|
49
|
-
attr_accessor :dataset
|
50
|
-
|
51
|
-
# A Styles::CurveStyle object saying how the curve should be
|
52
|
-
# drawn.
|
53
|
-
#
|
54
|
-
# Some of the elements will be overridden.
|
55
|
-
attr_accessor :curve_style
|
56
|
-
|
57
48
|
# For convenience only: xy functions
|
58
49
|
attr_accessor :function
|
59
50
|
|
60
51
|
# A hash Z value -> corresponding XY functions.
|
61
52
|
attr_accessor :planes
|
62
53
|
|
54
|
+
# A ParametricPlotStyle object handling the correspondance
|
55
|
+
# between Z axis and stylistic aspects
|
56
|
+
attr_accessor :parametric_style
|
63
57
|
|
64
|
-
|
65
|
-
undef :location=, :location
|
66
|
-
|
67
58
|
# Creates a new Curve2D object with the given _dataset_ and
|
68
59
|
# _style_.
|
69
|
-
def initialize(dataset, style = nil)
|
60
|
+
def initialize(dataset, style = nil, parametric_plot_style = nil)
|
70
61
|
@dataset = dataset
|
71
62
|
@curve_style = style
|
63
|
+
|
64
|
+
@parametric_style = parametric_plot_style
|
72
65
|
prepare_data
|
73
66
|
end
|
74
67
|
|
@@ -84,22 +77,26 @@ module CTioga2
|
|
84
77
|
@planes[zs[0]].x << x
|
85
78
|
@planes[zs[0]].y << y
|
86
79
|
end
|
80
|
+
|
81
|
+
|
82
|
+
@zmin = []
|
83
|
+
@zmax = []
|
84
|
+
|
85
|
+
## @todo This should rather use Z axes in the end ?
|
86
|
+
(@dataset.ys.size - 1).times do |i|
|
87
|
+
@zmin << @dataset.ys[i+1].values.min
|
88
|
+
@zmax << @dataset.ys[i+1].values.max
|
89
|
+
end
|
87
90
|
end
|
88
91
|
|
89
92
|
protected :prepare_data
|
90
93
|
|
91
|
-
# Returns the LocationStyle object of the curve. Returns the
|
92
|
-
# one from #curve_style.
|
93
|
-
def location
|
94
|
-
return @curve_style.location
|
95
|
-
end
|
96
|
-
|
97
94
|
# Returns the Types::Boundaries of this curve.
|
98
95
|
def get_boundaries
|
99
96
|
return Types::Boundaries.bounds(@function.x, @function.y)
|
100
97
|
end
|
101
98
|
|
102
|
-
# Draws the
|
99
|
+
# Draws the path lines, if applicable.
|
103
100
|
def draw_path(t)
|
104
101
|
min = @dataset.z.values.min
|
105
102
|
max = @dataset.z.values.max
|
@@ -125,19 +122,16 @@ module CTioga2
|
|
125
122
|
|
126
123
|
# Draws the markers, if applicable.
|
127
124
|
def draw_markers(t)
|
128
|
-
|
129
|
-
max = @dataset.z.values.max
|
125
|
+
@parametric_style.prepare
|
130
126
|
if @curve_style.has_marker?
|
131
127
|
# We use a default color map for the markers
|
132
128
|
@curve_style.marker_color_map ||=
|
133
129
|
Styles::ColorMap.from_text("Red--Green")
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
@curve_style.marker.draw_markers_at(t, f.x, f.y,
|
140
|
-
{ 'color' => color})
|
130
|
+
|
131
|
+
@dataset.each_values do |i,x,y,*z|
|
132
|
+
ms = @parametric_style.marker_style(@curve_style,
|
133
|
+
z, @zmin, @zmax)
|
134
|
+
ms.draw_markers_at(t, x, y)
|
141
135
|
end
|
142
136
|
end
|
143
137
|
end
|