ctioga2 0.11 → 0.12
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Changelog +17 -0
- data/lib/ctioga2/commands/commands.rb +2 -1
- data/lib/ctioga2/commands/doc/documentation-commands.rb +2 -1
- data/lib/ctioga2/commands/doc/html.rb +27 -0
- data/lib/ctioga2/commands/general-commands.rb +13 -0
- data/lib/ctioga2/commands/type.rb +1 -1
- data/lib/ctioga2/data/dataset.rb +210 -0
- data/lib/ctioga2/data/stack.rb +1 -1
- data/lib/ctioga2/graphics/elements/primitive.rb +8 -6
- data/lib/ctioga2/graphics/elements/subplot.rb +0 -7
- data/lib/ctioga2/graphics/elements/tangent.rb +3 -1
- data/lib/ctioga2/graphics/elements/xyz-map.rb +47 -28
- data/lib/ctioga2/graphics/styles.rb +1 -0
- data/lib/ctioga2/graphics/styles/arrows.rb +141 -1
- data/lib/ctioga2/graphics/styles/axes.rb +18 -1
- data/lib/ctioga2/graphics/styles/base.rb +41 -2
- data/lib/ctioga2/graphics/styles/box.rb +1 -1
- data/lib/ctioga2/graphics/styles/drawable.rb +60 -54
- data/lib/ctioga2/graphics/styles/errorbar.rb +10 -3
- data/lib/ctioga2/graphics/styles/factory.rb +80 -9
- data/lib/ctioga2/graphics/styles/plot.rb +1 -1
- data/lib/ctioga2/graphics/styles/scope.rb +72 -0
- data/lib/ctioga2/graphics/styles/sets.rb +2 -1
- data/lib/ctioga2/graphics/types.rb +1 -1
- data/lib/ctioga2/graphics/types/dimensions.rb +48 -0
- data/lib/ctioga2/log.rb +12 -0
- data/lib/ctioga2/metabuilder/type.rb +32 -20
- data/lib/ctioga2/metabuilder/types/strings.rb +2 -2
- data/lib/ctioga2/plotmaker.rb +14 -0
- data/lib/ctioga2/utils.rb +51 -3
- data/lib/ctioga2/version.rb +2 -2
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f25f506adfb25689dc8c090adcfb35beac30af3d
|
4
|
+
data.tar.gz: 1731cd6baf714e9bf480d9ea50039b9acc0ac9d4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d7fb0ecfa3ed8cc7c2e3e8b5723b92b676ba837681eb33eb7fa19db61cf0f0131566cbf76f4a6c49c91969b074553607b3bdfcdae3df1d52510432339a22d1de
|
7
|
+
data.tar.gz: 87e302b8f937f3f638f24a0eca891cec89282aa10d7a2f7721432dbdd0e100711334efe883fd65a79dc7e72b540074336a5c5048844171b8cd8dcdf5b44554f2
|
data/Changelog
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
ctioga2 (0.12)
|
2
|
+
|
3
|
+
* The xyz-map plot type now handles correctly inhomogeneous grids (so long
|
4
|
+
as points do not overlap)
|
5
|
+
* One can now separately choose the fill and the stroke color for
|
6
|
+
markers
|
7
|
+
* Selection of line width for axes
|
8
|
+
* A set of commands to manipulate styles (skip the next style or copy
|
9
|
+
the style of previous plots)
|
10
|
+
* Selection of error bar line width
|
11
|
+
* All lines are also arrows now (just with a different default)
|
12
|
+
* A pause command to ask for user input before quitting if there were
|
13
|
+
errors or warnings
|
14
|
+
* Improvement of error messages
|
15
|
+
|
16
|
+
-- Vincent <vincent.fourmond@9online.fr> Sun 22 Mar 18:38:49 CET 2015
|
17
|
+
|
1
18
|
ctioga2 (0.11)
|
2
19
|
|
3
20
|
* Implemented patterned fills
|
@@ -204,7 +204,8 @@ module CTioga2
|
|
204
204
|
if(@arguments.size == 0 && args.size == 1 && args[0] == true)
|
205
205
|
return []
|
206
206
|
else
|
207
|
-
|
207
|
+
ar = args.map { |x| "'#{x}'"}
|
208
|
+
raise ArgumentNumberMismatch, "Command #{@name} was called with #{args.size} arguments: #{ar.join(", ")}, but it takes #{@arguments.size}"
|
208
209
|
end
|
209
210
|
end
|
210
211
|
retval = []
|
@@ -89,6 +89,16 @@ module CTioga2
|
|
89
89
|
def write_commands(opts, out = STDOUT)
|
90
90
|
cmds, groups = @doc.documented_commands
|
91
91
|
|
92
|
+
if opts['snippets']
|
93
|
+
require 'yaml'
|
94
|
+
snippets = begin
|
95
|
+
YAML.load(IO.readlines(opts['snippets']).join())
|
96
|
+
rescue Exception => e
|
97
|
+
Log::error { "Failed to load snippets file '#{opts['snippets']}'\n => #{e.inspect}" }
|
98
|
+
{}
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
92
102
|
write_page_menu(opts, out) do |out|
|
93
103
|
out.puts "<div class='quick-jump'>"
|
94
104
|
out.puts "<h3>Quick jump</h3>"
|
@@ -120,6 +130,23 @@ module CTioga2
|
|
120
130
|
for cmd in commands
|
121
131
|
out.puts
|
122
132
|
out.puts command_documentation(cmd)
|
133
|
+
if snippets
|
134
|
+
snpts = snippets[cmd.name]
|
135
|
+
if snpts
|
136
|
+
str = ""
|
137
|
+
for k in snpts.keys.sort
|
138
|
+
s = snpts[k]
|
139
|
+
ln = s[:line].chomp
|
140
|
+
# if ln[-1] == '\\'
|
141
|
+
# ln = ln[0..-2]
|
142
|
+
# end
|
143
|
+
# Strip links from the line
|
144
|
+
ln.gsub!(/<a[^>]+>(.*?)<\/a>/) { || $1 }
|
145
|
+
str += "<pre class='#{s[:cls]}'><a href='#{k}'>#{ln}</a></pre>\n"
|
146
|
+
end
|
147
|
+
out.puts "<h5 id='#snippets-h5-#{cmd.name}' onclick='toggleExamples(this);'>Examples...</h5>\n<div id='#snippets-#{cmd.name}' class='snippets'>#{str}</div>"
|
148
|
+
end
|
149
|
+
end
|
123
150
|
end
|
124
151
|
end
|
125
152
|
end
|
@@ -126,6 +126,19 @@ EOH
|
|
126
126
|
|
127
127
|
VerboseLogging.describe("Makes ctioga2 more verbose", <<EOH, GeneralGroup)
|
128
128
|
With this on, ctioga2 outputs quite a fair amount of informative messages.
|
129
|
+
EOH
|
130
|
+
|
131
|
+
Pause =
|
132
|
+
Cmd.new("pause", nil, "--pause",
|
133
|
+
[ CmdArg.new('boolean') ]) do |plotmaker, val|
|
134
|
+
plotmaker.pause_on_errors = val
|
135
|
+
end
|
136
|
+
|
137
|
+
Pause.describe("Pause on errors", <<EOH, GeneralGroup)
|
138
|
+
When this is on, the program will ask for confirmation before finishing,
|
139
|
+
when errors or warnings have been shown. This is especially useful on windows
|
140
|
+
or other environments where the terminal shuts down as soon as ctioga2
|
141
|
+
has finished.
|
129
142
|
EOH
|
130
143
|
|
131
144
|
# Write debugging information.
|
data/lib/ctioga2/data/dataset.rb
CHANGED
@@ -16,6 +16,8 @@ require 'ctioga2/log'
|
|
16
16
|
require 'ctioga2/data/datacolumn'
|
17
17
|
require 'ctioga2/data/indexed-dtable'
|
18
18
|
|
19
|
+
require 'set'
|
20
|
+
|
19
21
|
module CTioga2
|
20
22
|
|
21
23
|
# \todo now, port the backend infrastructure...
|
@@ -57,6 +59,9 @@ module CTioga2
|
|
57
59
|
|
58
60
|
# Cache for the indexed dtable
|
59
61
|
@indexed_dtable = nil
|
62
|
+
|
63
|
+
# Cache for the homogeneous dtables
|
64
|
+
@homogeneous_dtables = nil
|
60
65
|
end
|
61
66
|
|
62
67
|
# Creates a
|
@@ -340,6 +345,204 @@ module CTioga2
|
|
340
345
|
return Dataset.new(name + "_mod", result)
|
341
346
|
end
|
342
347
|
|
348
|
+
# Takes a list of x and y values, and subdivise into
|
349
|
+
# non-overlapping groups.
|
350
|
+
def self.subdivise(x,y, x_idx, y_idx)
|
351
|
+
|
352
|
+
# We make a list of sets. Each element of the list represent
|
353
|
+
# one column, and in each set we store the index of of lines
|
354
|
+
# that contain data.
|
355
|
+
|
356
|
+
cols = []
|
357
|
+
|
358
|
+
x.each_index do |i|
|
359
|
+
ix = x_idx[x[i]]
|
360
|
+
iy = y_idx[y[i]]
|
361
|
+
|
362
|
+
cols[ix] ||= Set.new
|
363
|
+
cols[ix].add(iy)
|
364
|
+
end
|
365
|
+
|
366
|
+
# The return value is an array of [ [xindices] [yindices]]
|
367
|
+
ret = []
|
368
|
+
|
369
|
+
# Now, the hard part.
|
370
|
+
|
371
|
+
# We run for as long as there are sets ?
|
372
|
+
fc = 0
|
373
|
+
while fc < cols.size
|
374
|
+
# We start with the set of the current column
|
375
|
+
st = cols[fc]
|
376
|
+
# Empty, go to next column
|
377
|
+
if st.size == 0
|
378
|
+
fc += 1
|
379
|
+
next
|
380
|
+
end
|
381
|
+
|
382
|
+
# Set columns that contain the set
|
383
|
+
set_cols = [fc]
|
384
|
+
# Now, we look for restrictions on the set.
|
385
|
+
fc2 = fc + 1
|
386
|
+
while fc2 < cols.size
|
387
|
+
# if non-void intersection, we stick to that
|
388
|
+
inter = st.intersection(cols[fc2])
|
389
|
+
# p [fc, fc2, st, inter]
|
390
|
+
if inter.size > 0
|
391
|
+
st = inter
|
392
|
+
set_cols << fc2
|
393
|
+
fc2 += 1
|
394
|
+
break
|
395
|
+
end
|
396
|
+
|
397
|
+
fc2 += 1
|
398
|
+
# Try to implement other kinds of restrictions?
|
399
|
+
end
|
400
|
+
|
401
|
+
# Now, we have a decent set, we go on until the intersection
|
402
|
+
# with the set is not the set.
|
403
|
+
while fc2 < cols.size
|
404
|
+
inter = st.intersection(cols[fc2])
|
405
|
+
if inter.size > 0
|
406
|
+
if inter.size == st.size
|
407
|
+
set_cols << fc2
|
408
|
+
else
|
409
|
+
break
|
410
|
+
end
|
411
|
+
end
|
412
|
+
fc2 += 1
|
413
|
+
end
|
414
|
+
|
415
|
+
# Now, we have a set and all the indices that match.
|
416
|
+
ret << [ set_cols.dup.sort, st.to_a.sort ]
|
417
|
+
# And, now, go again through all the columns and remove the set
|
418
|
+
for c in set_cols
|
419
|
+
cols[c].subtract(st)
|
420
|
+
end
|
421
|
+
end
|
422
|
+
|
423
|
+
return ret
|
424
|
+
end
|
425
|
+
|
426
|
+
# Takes a list of indices, the corresponding vector (ie mapping
|
427
|
+
# the indices to the vector gives the actual coordinates) and
|
428
|
+
# returns a list of arrays of indices with homogeneous deltas.
|
429
|
+
def self.homogenenous_deltas_indices(indices, vector, tolerance = 1e-3)
|
430
|
+
vct = indices.map do |i|
|
431
|
+
vector[i]
|
432
|
+
end
|
433
|
+
subdiv = Utils::split_homogeneous_deltas(vct, tolerance)
|
434
|
+
rv = []
|
435
|
+
idx = 0
|
436
|
+
for s in subdiv
|
437
|
+
rv << indices[idx..idx+s.size-1]
|
438
|
+
idx += s.size
|
439
|
+
end
|
440
|
+
if idx != indices.size
|
441
|
+
error { "blundered ?" }
|
442
|
+
end
|
443
|
+
return rv
|
444
|
+
end
|
445
|
+
|
446
|
+
# Returns a series of IndexedDTable representing the XYZ data.
|
447
|
+
def homogeneous_dtables()
|
448
|
+
if @homogeneous_dtables
|
449
|
+
return @homogeneous_dtables
|
450
|
+
end
|
451
|
+
if @ys.size < 2
|
452
|
+
raise "Need at least 3 data columns in dataset '#{@name}'"
|
453
|
+
end
|
454
|
+
# We convert the index into three x,y and z arrays
|
455
|
+
x = @x.values.dup
|
456
|
+
y = @ys[0].values.dup
|
457
|
+
z = @ys[1].values.dup
|
458
|
+
|
459
|
+
xvals = x.sort.uniq
|
460
|
+
yvals = y.sort.uniq
|
461
|
+
|
462
|
+
# Now building reverse hashes to speed up the conversion:
|
463
|
+
x_index = {}
|
464
|
+
i = 0
|
465
|
+
xvals.each do |v|
|
466
|
+
x_index[v] = i
|
467
|
+
i += 1
|
468
|
+
end
|
469
|
+
|
470
|
+
y_index = {}
|
471
|
+
i = 0
|
472
|
+
yvals.each do |v|
|
473
|
+
y_index[v] = i
|
474
|
+
i += 1
|
475
|
+
end
|
476
|
+
|
477
|
+
fgrps = []
|
478
|
+
if x.size != xvals.size * yvals.size
|
479
|
+
# This is definitely not a homogeneous map
|
480
|
+
fgrps = Dataset.subdivise(x, y, x_index, y_index)
|
481
|
+
else
|
482
|
+
fgrps = [ [ x_index.values, y_index.values ] ]
|
483
|
+
end
|
484
|
+
|
485
|
+
# Now, we resplit according to the deltas:
|
486
|
+
grps = []
|
487
|
+
for grp in fgrps
|
488
|
+
xv, yv = *grp
|
489
|
+
|
490
|
+
xv_list = Dataset.homogenenous_deltas_indices(xv, xvals)
|
491
|
+
yv_list = Dataset.homogenenous_deltas_indices(yv, yvals)
|
492
|
+
|
493
|
+
for cxv in xv_list
|
494
|
+
for cyv in yv_list
|
495
|
+
grps << [ cxv, cyv]
|
496
|
+
end
|
497
|
+
end
|
498
|
+
end
|
499
|
+
|
500
|
+
# Now we construct a list of indexed dtables
|
501
|
+
rv = []
|
502
|
+
for grp in grps
|
503
|
+
xv = grp[0].sort
|
504
|
+
yv = grp[1].sort
|
505
|
+
|
506
|
+
# Build up intermediate hashes
|
507
|
+
xvh = {}
|
508
|
+
xvl = []
|
509
|
+
idx = 0
|
510
|
+
for xi in xv
|
511
|
+
val = xvals[xi]
|
512
|
+
xvh[val] = idx
|
513
|
+
xvl << val
|
514
|
+
idx += 1
|
515
|
+
end
|
516
|
+
|
517
|
+
yvh = {}
|
518
|
+
yvl = []
|
519
|
+
idx = 0
|
520
|
+
for yi in yv
|
521
|
+
val = yvals[yi]
|
522
|
+
yvh[val] = idx
|
523
|
+
yvl << val
|
524
|
+
idx += 1
|
525
|
+
end
|
526
|
+
|
527
|
+
table = Dobjects::Dtable.new(xv.size, yv.size)
|
528
|
+
# We initialize all the values to NaN
|
529
|
+
table.set(0.0/0.0)
|
530
|
+
|
531
|
+
x.each_index do |i|
|
532
|
+
ix = xvh[x[i]]
|
533
|
+
next unless ix
|
534
|
+
iy = yvh[y[i]]
|
535
|
+
next unless iy
|
536
|
+
# Y first !
|
537
|
+
table[iy, ix] = z[i]
|
538
|
+
end
|
539
|
+
rv << IndexedDTable.new(xvl, yvl, table)
|
540
|
+
end
|
541
|
+
@homogeneous_dtables = rv
|
542
|
+
return rv
|
543
|
+
end
|
544
|
+
|
545
|
+
|
343
546
|
|
344
547
|
# Returns an IndexedDTable representing the XYZ
|
345
548
|
# data. Information about errors are not included.
|
@@ -354,6 +557,9 @@ module CTioga2
|
|
354
557
|
if @indexed_dtable
|
355
558
|
return @indexed_dtable
|
356
559
|
end
|
560
|
+
if @ys.size < 2
|
561
|
+
raise "Need at least 3 data columns in dataset '#{@name}'"
|
562
|
+
end
|
357
563
|
# We convert the index into three x,y and z arrays
|
358
564
|
x = @x.values.dup
|
359
565
|
y = @ys[0].values.dup
|
@@ -377,6 +583,10 @@ module CTioga2
|
|
377
583
|
i += 1
|
378
584
|
end
|
379
585
|
|
586
|
+
if x.size != xvals.size * yvals.size
|
587
|
+
error {"Heterogeneous, stopping here for now"}
|
588
|
+
end
|
589
|
+
|
380
590
|
table = Dobjects::Dtable.new(xvals.size, yvals.size)
|
381
591
|
# We initialize all the values to NaN
|
382
592
|
table.set(0.0/0.0)
|
data/lib/ctioga2/data/stack.rb
CHANGED
@@ -96,7 +96,7 @@ EOH
|
|
96
96
|
begin
|
97
97
|
datasets << backend.dataset(s)
|
98
98
|
rescue Exception => e
|
99
|
-
error { "Could not load dataset #{s}
|
99
|
+
error { "Could not load dataset '#{s}' with backend '#{backend.description.name }':\n\t -> #{e}" }
|
100
100
|
debug { "#{e.backtrace.join("\n")}" }
|
101
101
|
end
|
102
102
|
end
|
@@ -245,17 +245,19 @@ EOD
|
|
245
245
|
[ 'point', 'point' ],
|
246
246
|
Styles::ArrowStyle,
|
247
247
|
'arrow') do |t, tail, head, style, options|
|
248
|
-
|
249
|
-
|
248
|
+
stl = style.dup
|
249
|
+
stl.use_defaults_from(Styles::ArrowStyle::TiogaDefaults)
|
250
|
+
stl.draw_arrow(t, *( tail.to_figure_xy(t) +
|
251
|
+
head.to_figure_xy(t) ))
|
250
252
|
end
|
251
253
|
|
252
254
|
styled_primitive("line", "line",
|
253
255
|
[ 'point', 'point' ],
|
254
|
-
Styles::
|
256
|
+
Styles::ArrowStyle,
|
255
257
|
'line'
|
256
258
|
) do |t, tail, head, style, options|
|
257
|
-
style.
|
258
|
-
|
259
|
+
style.draw_arrow(t, *( tail.to_figure_xy(t) +
|
260
|
+
head.to_figure_xy(t) ))
|
259
261
|
end
|
260
262
|
|
261
263
|
# @todo Do the same thing for arrows...
|
@@ -264,7 +266,7 @@ EOD
|
|
264
266
|
Styles::OrientedLineStyle,
|
265
267
|
'oriented-line'
|
266
268
|
) do |t, org, dim, style, options|
|
267
|
-
style.
|
269
|
+
style.draw_oriented_arrow(t, *org.to_figure_xy(t), dim)
|
268
270
|
end
|
269
271
|
|
270
272
|
|
@@ -24,13 +24,6 @@ module CTioga2
|
|
24
24
|
# * inclusion of curves
|
25
25
|
# * legends
|
26
26
|
# * a way to set/get its figure boundaries.
|
27
|
-
#
|
28
|
-
# @todo It would be interesting to feature several layers:
|
29
|
-
# background/normal/foreground, that could be addressed just
|
30
|
-
# using options to drawing commands
|
31
|
-
#
|
32
|
-
# @todo It would also be interesting to offer the possibility to
|
33
|
-
# output non-clipped objects.
|
34
27
|
class Subplot < Container
|
35
28
|
|
36
29
|
# Various stylistic aspects of the plot, as a
|
@@ -1,5 +1,5 @@
|
|
1
|
-
#
|
2
|
-
# copyright (c) 2006, 2007, 2008, 2009, 2010 by Vincent Fourmond
|
1
|
+
# xyz-map.rb: a heatmap
|
2
|
+
# copyright (c) 2006, 2007, 2008, 2009, 2010, 2013, 2015 by Vincent Fourmond
|
3
3
|
|
4
4
|
# This program is free software; you can redistribute it and/or modify
|
5
5
|
# it under the terms of the GNU General Public License as published by
|
@@ -34,7 +34,7 @@ module CTioga2
|
|
34
34
|
include Dobjects
|
35
35
|
|
36
36
|
# The IndexedTable object representing the underlying data
|
37
|
-
attr_accessor :
|
37
|
+
attr_accessor :tables
|
38
38
|
|
39
39
|
|
40
40
|
# Creates a new XYZMap object with the given _dataset_ and
|
@@ -43,18 +43,33 @@ module CTioga2
|
|
43
43
|
@dataset = dataset
|
44
44
|
@curve_style = style
|
45
45
|
prepare_data
|
46
|
+
@boundaries = nil
|
46
47
|
end
|
47
48
|
|
48
49
|
# Prepares the internal storage of the data, from the @dataset
|
49
50
|
def prepare_data
|
50
|
-
@
|
51
|
+
@tables = @dataset.homogeneous_dtables
|
52
|
+
info {
|
53
|
+
str = ""
|
54
|
+
for tbl in @tables
|
55
|
+
str << " - #{tbl.x_values.min}, #{tbl.y_values.min} -> #{tbl.x_values.max}, #{tbl.y_values.max} #{tbl.width}x#{tbl.height}\n"
|
56
|
+
end
|
57
|
+
"There are #{@tables.size} different homogeneous submaps in #{@dataset.name}\n#{str}"
|
58
|
+
}
|
59
|
+
|
51
60
|
end
|
52
61
|
|
53
62
|
protected :prepare_data
|
54
63
|
|
55
64
|
# Returns the Types::Boundaries of this curve.
|
56
65
|
def get_boundaries
|
57
|
-
|
66
|
+
if @boundaries
|
67
|
+
return @boundaries
|
68
|
+
end
|
69
|
+
bnds = Graphics::Types::Boundaries.bounds(@dataset.x.values,
|
70
|
+
@dataset.y.values)
|
71
|
+
@boundaries = bnds
|
72
|
+
return bnds
|
58
73
|
end
|
59
74
|
|
60
75
|
|
@@ -72,31 +87,35 @@ module CTioga2
|
|
72
87
|
|
73
88
|
@curve_style.color_map ||=
|
74
89
|
Styles::ColorMap.from_text("Red--Green")
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
90
|
+
|
91
|
+
zmin = @dataset.z.values.min
|
92
|
+
zmax = @dataset.z.values.max
|
93
|
+
|
94
|
+
for tbl in @tables
|
95
|
+
dict = @curve_style.color_map.
|
96
|
+
prepare_data_display(t,tbl.table, zmin, zmax)
|
97
|
+
if @curve_style.zaxis
|
98
|
+
begin
|
99
|
+
@parent.style.get_axis_style(@curve_style.zaxis).
|
100
|
+
set_color_map(@curve_style.color_map,
|
101
|
+
zmin,
|
102
|
+
zmax)
|
103
|
+
rescue
|
104
|
+
error { "Could not set Z info to non-existent axis #{@curve_style.zaxis}" }
|
105
|
+
end
|
88
106
|
end
|
89
|
-
end
|
90
107
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
108
|
+
dict.update(tbl.corner_positions)
|
109
|
+
dict.update('width' => tbl.width,
|
110
|
+
'height' => tbl.height)
|
111
|
+
dict.update('interpolate' => false)
|
112
|
+
if (! @curve_style.fill.transparency) ||
|
113
|
+
(@curve_style.fill.transparency < 0.99)
|
114
|
+
t.show_image(dict)
|
115
|
+
# t.stroke_rect(dict['ul'][0], dict['ul'][1], dict['lr'][0] - dict['ul'][0], dict['lr'][1] - dict['ul'][1])
|
116
|
+
else
|
117
|
+
info { 'Not showing map as transparency is over 0.99' }
|
118
|
+
end
|
100
119
|
end
|
101
120
|
end
|
102
121
|
end
|