ctioga2 0.6.1 → 0.7
Sign up to get free protection for your applications and to get access to all the features.
- 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
|