ruby-grads 1.0.3 → 1.0.6
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.
- checksums.yaml +4 -4
- data/README.md +67 -1
- data/Rakefile +14 -0
- data/bin/ncdef2ctl +107 -0
- data/lib/grads.rb +1 -0
- data/lib/grads/command.rb +419 -9
- data/lib/grads/gridded.rb +64 -20
- data/lib/grads/lib/axis_xtime.rb +217 -0
- data/lib/grads/lib/makecpt.rb +21 -55
- data/ruby-grads.gemspec +2 -1
- data/ruby-grads.gemspec~ +23 -0
- metadata +9 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d3ec3f629db574dd3245ce9ed04e371ead7d8646cce6ca964dfda1d8eafaadb1
|
4
|
+
data.tar.gz: bf5b28282a3d11cf3fcc5cbcf1a8fbd3cbadb50fc0195c4636729da957d78b9d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4e4e8fae8d55ad18f403a5c0c7ee5bef1c9c94f74e4e5efe0c90317838758b9dac3616fb27731b66bd7a1857e0ae286344aa511d94054f976912e71f77049207
|
7
|
+
data.tar.gz: 3e2f6b6d92682e0560e3db04cb27d2e467e10f3a8e90f1388b8d082975a2f5888799d1aa0b1530c6ac20f23a211b75cacb79cd6b458debef3a8d3996534fa530
|
data/README.md
CHANGED
@@ -15,7 +15,6 @@ Execute grads command sequence
|
|
15
15
|
GrADS#exec filename
|
16
16
|
GrADS#exec_string text
|
17
17
|
|
18
|
-
|
19
18
|
### CArray -> GrADS variable
|
20
19
|
|
21
20
|
Write block as GrADS::Gridded::Writer definition
|
@@ -27,5 +26,72 @@ Write block as GrADS::Gridded::Writer definition
|
|
27
26
|
|
28
27
|
GrADS#save_image(filename, size="640", dpi=300)
|
29
28
|
|
29
|
+
### parea, vpage
|
30
|
+
|
31
|
+
parea(x1, x2, y1, y2) { |area|
|
32
|
+
|
33
|
+
}
|
34
|
+
|
35
|
+
vpage(x1, x2, y1, y2) { |area|
|
36
|
+
|
37
|
+
}
|
38
|
+
|
39
|
+
### plot
|
40
|
+
|
41
|
+
plot (expr, type) {
|
42
|
+
... CONFIG ...
|
43
|
+
}
|
44
|
+
|
45
|
+
### axis
|
46
|
+
|
47
|
+
axis (dummy_expr) {
|
48
|
+
... CONFIG ...
|
49
|
+
}
|
50
|
+
|
51
|
+
#### axis_xtime
|
52
|
+
|
53
|
+
require "grads/lib/axis_xtime"
|
54
|
+
axis_xtime (dummy_expr, OPTIONS) {
|
55
|
+
... CONFIG__
|
56
|
+
}
|
57
|
+
|
58
|
+
OPTIONS:
|
59
|
+
offset: TIME OFFSET in seconds
|
60
|
+
skip: TIME axis interval to skip labels
|
61
|
+
|
62
|
+
#### time_skip
|
63
|
+
|
64
|
+
Use with axis_xtime to calculate skip for x-time in vector plot.
|
65
|
+
|
66
|
+
skp = time_skip()
|
67
|
+
plot("skip(u,1,#{skp});v", :vector) {
|
68
|
+
...
|
69
|
+
}
|
70
|
+
|
71
|
+
### axis label
|
72
|
+
|
73
|
+
draw_ylabel(text, area: area, color: 1, just: "bc", thickness: 3, rot 0, offset: STRING, side: "l")
|
74
|
+
draw_xlabel(text, area: area, color: 1, just: "bc", thickness: 3, rot: 0, offset: STRING, side: "b")
|
75
|
+
|
76
|
+
### COLOR NAMES
|
77
|
+
|
78
|
+
COLOR(COLOR_NAME)
|
30
79
|
|
80
|
+
"background" => 0,
|
81
|
+
"foregraound" => 1,
|
82
|
+
"red" => 2,
|
83
|
+
"green" => 3,
|
84
|
+
"dark blue" => 4,
|
85
|
+
"light blue" => 5,
|
86
|
+
"magenta" => 6,
|
87
|
+
"yellow" => 7,
|
88
|
+
"orange" => 8,
|
89
|
+
"purple" => 9,
|
90
|
+
"yellow green" => 10,
|
91
|
+
"medium blue" => 11,
|
92
|
+
"dark yellow" => 12,
|
93
|
+
"aqua" => 13,
|
94
|
+
"dark purple" => 14,
|
95
|
+
"gray" => 15,
|
96
|
+
|
31
97
|
|
data/Rakefile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
|
2
|
+
GEMSPEC = "ruby-grads.gemspec"
|
3
|
+
|
4
|
+
# gem install #{spec.full_name}.gem -- --with-gnuplotting-palette
|
5
|
+
|
6
|
+
task :install do
|
7
|
+
spec = eval File.read(GEMSPEC)
|
8
|
+
system %{
|
9
|
+
gem build #{GEMSPEC}; gem install --no-document #{spec.full_name}.gem
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
require 'rspec/core/rake_task'
|
14
|
+
RSpec::Core::RakeTask.new
|
data/bin/ncdef2ctl
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "grads"
|
4
|
+
require "stringio"
|
5
|
+
|
6
|
+
def scan_vars (vars)
|
7
|
+
items = {:namelist=>[]}
|
8
|
+
nvars = nil
|
9
|
+
vars.each_line do |line|
|
10
|
+
case line
|
11
|
+
when /\A\s*\*/, /\A\s*\Z/
|
12
|
+
next
|
13
|
+
when /\A\s*vars\s+(\d+)/i
|
14
|
+
nvars = $1.to_i
|
15
|
+
when /\A\s*endvars/i
|
16
|
+
break
|
17
|
+
when /\A\s*(\w+)\s*(.*)\Z/
|
18
|
+
name = $1
|
19
|
+
items[:namelist].push(name)
|
20
|
+
items[name] = line
|
21
|
+
end
|
22
|
+
end
|
23
|
+
if items[:namelist].size != nvars
|
24
|
+
raise "invalid vars number"
|
25
|
+
end
|
26
|
+
return items
|
27
|
+
end
|
28
|
+
|
29
|
+
def scan_control_file (ctltxt)
|
30
|
+
io = StringIO.new(ctltxt)
|
31
|
+
items = {}
|
32
|
+
buffer = ""
|
33
|
+
while line = io.gets
|
34
|
+
case line
|
35
|
+
when /\A\s*\*/, /\A\s*\Z/
|
36
|
+
next
|
37
|
+
when /\A\s*(dtype|dset|title|undef|options|pdef|xdef|ydef|zdef|tdef|vectorpairs)\s*(.*)\Z/i
|
38
|
+
name = $1.downcase
|
39
|
+
if items[name]
|
40
|
+
items[name] = [items[name]]
|
41
|
+
items[name] << $2.rstrip
|
42
|
+
buffer = items[name].last
|
43
|
+
else
|
44
|
+
items[name] = $2.rstrip
|
45
|
+
buffer = items[name]
|
46
|
+
end
|
47
|
+
when /\A\s*(chsub|fileheader|theader|tailerbyts|xyheader)\s*(.*)\Z/i
|
48
|
+
raise "#{$1} entry is not supported, sorry"
|
49
|
+
when /\A\s*vars/
|
50
|
+
vars = scan_vars(line + io.read)
|
51
|
+
break
|
52
|
+
else
|
53
|
+
line = line.chomp.sub(/\\\z/,'').rstrip
|
54
|
+
buffer.replace(buffer + " " + line)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
return items, vars
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
def levels2linear (axis, line)
|
62
|
+
list = line.split(/\s+/)
|
63
|
+
num = list.shift.to_i
|
64
|
+
type = list.shift
|
65
|
+
data = list
|
66
|
+
case type
|
67
|
+
when "levels"
|
68
|
+
case axis
|
69
|
+
when "tdef"
|
70
|
+
return axis + " " + line
|
71
|
+
else
|
72
|
+
data = data.to_ca.double
|
73
|
+
diff = (data[1..-1]-data[0..-2]).mean
|
74
|
+
return format("%s %i %s %f %f", axis, num, "linear", data[0], diff)
|
75
|
+
end
|
76
|
+
when "linear"
|
77
|
+
return axis + " " + line
|
78
|
+
else
|
79
|
+
raise "invalid #{defname} definition"
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
GrADS.start("grads -b") {
|
85
|
+
|
86
|
+
sdfopen(ARGV[0])
|
87
|
+
|
88
|
+
ctl = query(:ctlinfo)
|
89
|
+
|
90
|
+
header, var = scan_control_file(ctl)
|
91
|
+
|
92
|
+
header.keys.each do |key|
|
93
|
+
case key
|
94
|
+
when "xdef", "ydef", "zdef", "tdef"
|
95
|
+
puts levels2linear(key, header[key])
|
96
|
+
else
|
97
|
+
puts "#{key} #{header[key]}"
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
puts "vars #{var[:namelist].size}"
|
102
|
+
var[:namelist].each do |name|
|
103
|
+
puts var[name]
|
104
|
+
end
|
105
|
+
puts "endvars"
|
106
|
+
|
107
|
+
}
|
data/lib/grads.rb
CHANGED
data/lib/grads/command.rb
CHANGED
@@ -183,7 +183,11 @@ class GrADS::Command
|
|
183
183
|
attr_reader :log
|
184
184
|
|
185
185
|
def method_missing (id, *argv)
|
186
|
-
|
186
|
+
if argv.empty?
|
187
|
+
return id
|
188
|
+
else
|
189
|
+
super
|
190
|
+
end
|
187
191
|
end
|
188
192
|
|
189
193
|
def quit
|
@@ -409,7 +413,6 @@ class GrADS::Command
|
|
409
413
|
"reinit",
|
410
414
|
"reset",
|
411
415
|
"run",
|
412
|
-
"sdfwrite",
|
413
416
|
"swap",
|
414
417
|
"undefine",
|
415
418
|
].each do |name|
|
@@ -420,9 +423,21 @@ class GrADS::Command
|
|
420
423
|
}
|
421
424
|
end
|
422
425
|
|
426
|
+
[
|
427
|
+
"sdfwrite",
|
428
|
+
].each do |name|
|
429
|
+
class_eval %{
|
430
|
+
def #{name} (*argv)
|
431
|
+
if argv.empty?
|
432
|
+
return :#{name}
|
433
|
+
else
|
434
|
+
put "#{name} " + argv.join(" ")
|
435
|
+
end
|
436
|
+
end
|
437
|
+
}
|
438
|
+
end
|
439
|
+
|
423
440
|
def clear (*argv)
|
424
|
-
@ccols = nil
|
425
|
-
@clevs = nil
|
426
441
|
put "clear " + argv.join(" ")
|
427
442
|
end
|
428
443
|
|
@@ -525,13 +540,20 @@ class GrADS::Command
|
|
525
540
|
end
|
526
541
|
|
527
542
|
def set_clevs (*argv)
|
528
|
-
@clevs = argv
|
529
543
|
set :clevs, *argv
|
530
544
|
end
|
531
545
|
|
532
546
|
def set_ccols (*argv)
|
533
|
-
|
534
|
-
|
547
|
+
list = []
|
548
|
+
argv.each do |arg|
|
549
|
+
case arg
|
550
|
+
when RGB
|
551
|
+
list << set_rgb(arg)
|
552
|
+
else
|
553
|
+
list << arg
|
554
|
+
end
|
555
|
+
end
|
556
|
+
set :ccols, *list
|
535
557
|
end
|
536
558
|
|
537
559
|
def import (*args)
|
@@ -653,7 +675,7 @@ class GrADS::Command
|
|
653
675
|
end
|
654
676
|
|
655
677
|
begin
|
656
|
-
require "
|
678
|
+
require "simple-netcdf"
|
657
679
|
def get_var (expr)
|
658
680
|
@var_id ||= 0
|
659
681
|
@var_id += 1
|
@@ -737,6 +759,395 @@ class GrADS::Command
|
|
737
759
|
end
|
738
760
|
end
|
739
761
|
|
762
|
+
class Area
|
763
|
+
|
764
|
+
def initialize (x1, x2, y1, y2)
|
765
|
+
@x1 = x1
|
766
|
+
@x2 = x2
|
767
|
+
@y1 = y1
|
768
|
+
@y2 = y2
|
769
|
+
end
|
770
|
+
|
771
|
+
attr_reader :x1, :x2, :y1, :y2
|
772
|
+
|
773
|
+
def w
|
774
|
+
return @x2 - @x1
|
775
|
+
end
|
776
|
+
|
777
|
+
def h
|
778
|
+
return @y2 - @y1
|
779
|
+
end
|
780
|
+
|
781
|
+
def center
|
782
|
+
return @x1 + w/2
|
783
|
+
end
|
784
|
+
|
785
|
+
def mid
|
786
|
+
return @y1 + h/2
|
787
|
+
end
|
788
|
+
|
789
|
+
end
|
790
|
+
|
791
|
+
def len (str)
|
792
|
+
ans = query("string #{str}")
|
793
|
+
return subwrd(ans, 4).to_f
|
794
|
+
end
|
795
|
+
|
796
|
+
def parea (x1, x2, y1, y2)
|
797
|
+
set :parea, x1, x2, y1, y2
|
798
|
+
set :clip, x1, x2, y1, y2
|
799
|
+
yield Area.new(x1, x2, y1, y2)
|
800
|
+
end
|
801
|
+
|
802
|
+
def vpage (x1, x2, y1, y2)
|
803
|
+
set :vpage, x1, x2, y1, y2
|
804
|
+
yield Area.new(x1, x2, y1, y2)
|
805
|
+
end
|
806
|
+
|
807
|
+
def display_nothing (dummy)
|
808
|
+
ans = query("dims")
|
809
|
+
case ans.scan("varying").size
|
810
|
+
when 2
|
811
|
+
set :gxout, :contour
|
812
|
+
set :clevs, -9.99e99
|
813
|
+
set :ccolor, -1
|
814
|
+
set :clab, :off
|
815
|
+
set :cmark, 0
|
816
|
+
when 1
|
817
|
+
set :gxout, :line
|
818
|
+
set :line, -1
|
819
|
+
set :ylab, :off
|
820
|
+
set :vrange, -9.99e99, -9.99e98
|
821
|
+
end
|
822
|
+
if block_given?
|
823
|
+
yield
|
824
|
+
end
|
825
|
+
case dummy
|
826
|
+
when String
|
827
|
+
put "display #{dummy}"
|
828
|
+
else
|
829
|
+
display dummy
|
830
|
+
end
|
831
|
+
end
|
832
|
+
|
833
|
+
def axis_off
|
834
|
+
set :frame, :off
|
835
|
+
set :xlab, :off
|
836
|
+
set :ylab, :off
|
837
|
+
set :grid, :off
|
838
|
+
set :grads, :off
|
839
|
+
set :mpdraw, :off
|
840
|
+
end
|
841
|
+
|
842
|
+
def axis_on
|
843
|
+
set :frame, :on
|
844
|
+
set :xlab, :on
|
845
|
+
set :ylab, :on
|
846
|
+
set :grid, :on
|
847
|
+
set :grads, :on
|
848
|
+
set :mpdraw, :on
|
849
|
+
end
|
850
|
+
|
851
|
+
def plot (var, *args)
|
852
|
+
begin
|
853
|
+
axis_off
|
854
|
+
if block_given?
|
855
|
+
yield
|
856
|
+
end
|
857
|
+
set :gxout, *args
|
858
|
+
case var
|
859
|
+
when String
|
860
|
+
put "display #{var}"
|
861
|
+
else
|
862
|
+
display var
|
863
|
+
end
|
864
|
+
ensure
|
865
|
+
axis_on
|
866
|
+
end
|
867
|
+
end
|
868
|
+
|
869
|
+
def axis (dummy, &block)
|
870
|
+
begin
|
871
|
+
axis_on
|
872
|
+
display_nothing(dummy, &block)
|
873
|
+
ensure
|
874
|
+
axis_off
|
875
|
+
end
|
876
|
+
end
|
877
|
+
|
878
|
+
def draw_ylabel (text, area:, color: 1, just: "bc", thickness: 3, rot: 90, offset: "M", side: "l")
|
879
|
+
set :string, color, just, thickness, rot
|
880
|
+
case side
|
881
|
+
when "l"
|
882
|
+
draw :string, area.x1-len(offset), area.mid, text
|
883
|
+
when "r"
|
884
|
+
draw :string, area.x2+len(offset), area.mid, text
|
885
|
+
else
|
886
|
+
raise "invalid side sepecification"
|
887
|
+
end
|
888
|
+
end
|
889
|
+
|
890
|
+
def draw_xlabel (text, area:, color: 1, just: "bc", thickness: 3, rot: 0, offset: "M", side: "b")
|
891
|
+
set :string, color, just, thickness, rot
|
892
|
+
case side
|
893
|
+
when "b"
|
894
|
+
draw :string, area.center, area.y1-len(offset), text
|
895
|
+
when "t"
|
896
|
+
draw :string, area.center, area.y2+len(offset), text
|
897
|
+
else
|
898
|
+
raise "invalid side sepecification"
|
899
|
+
end
|
900
|
+
end
|
901
|
+
|
902
|
+
COLOR_TABLE = {
|
903
|
+
"background" => 0,
|
904
|
+
"foregraound" => 1,
|
905
|
+
"red" => 2,
|
906
|
+
"green" => 3,
|
907
|
+
"dark blue" => 4,
|
908
|
+
"light blue" => 5,
|
909
|
+
"magenta" => 6,
|
910
|
+
"yellow" => 7,
|
911
|
+
"orange" => 8,
|
912
|
+
"purple" => 9,
|
913
|
+
"yellow green" => 10,
|
914
|
+
"medium blue" => 11,
|
915
|
+
"dark yellow" => 12,
|
916
|
+
"aqua" => 13,
|
917
|
+
"dark purple" => 14,
|
918
|
+
"gray" => 15,
|
919
|
+
}
|
920
|
+
|
921
|
+
def COLOR (name)
|
922
|
+
if COLOR_TABLE.has_key?(name)
|
923
|
+
COLOR_TABLE[name]
|
924
|
+
else
|
925
|
+
-1
|
926
|
+
end
|
927
|
+
end
|
928
|
+
|
929
|
+
class LINE
|
930
|
+
|
931
|
+
def initialize (type = 1, color: 1, thickness: 3)
|
932
|
+
case type
|
933
|
+
when "","solid"
|
934
|
+
@type = 1
|
935
|
+
when "--", "long dash"
|
936
|
+
@type = 2
|
937
|
+
when "-", "short dash"
|
938
|
+
@type = 3
|
939
|
+
when "-- -", "long dash short dash"
|
940
|
+
@type = 4
|
941
|
+
when ".", "dotted"
|
942
|
+
@type = 5
|
943
|
+
when ". -", "dot dash"
|
944
|
+
@type = 6
|
945
|
+
when ". . -", "dot dot dash"
|
946
|
+
@type = 7
|
947
|
+
else
|
948
|
+
@type = type
|
949
|
+
end
|
950
|
+
@color = color
|
951
|
+
@thickness = thickness
|
952
|
+
end
|
953
|
+
|
954
|
+
attr_reader :type, :color
|
955
|
+
|
956
|
+
def to_a
|
957
|
+
return [@color, @type, @thickness]
|
958
|
+
end
|
959
|
+
|
960
|
+
end
|
961
|
+
|
962
|
+
class TILE
|
963
|
+
|
964
|
+
def self.reset
|
965
|
+
@@number = 0
|
966
|
+
end
|
967
|
+
|
968
|
+
def self.next_number
|
969
|
+
@@number += 1
|
970
|
+
if @@number > 2047
|
971
|
+
reset
|
972
|
+
end
|
973
|
+
return @@number
|
974
|
+
end
|
975
|
+
|
976
|
+
reset
|
977
|
+
|
978
|
+
def initialize (type, width: 6, height: nil, thickness: 3, color: 1, bgcolor: -1)
|
979
|
+
case type
|
980
|
+
when "."
|
981
|
+
@type = 2
|
982
|
+
when "\\"
|
983
|
+
@type = 3
|
984
|
+
when "/"
|
985
|
+
@type = 4
|
986
|
+
when "x"
|
987
|
+
@type = 5
|
988
|
+
when "|"
|
989
|
+
@type = 6
|
990
|
+
when "-"
|
991
|
+
@type = 7
|
992
|
+
when "#", "+"
|
993
|
+
@type = 8
|
994
|
+
else
|
995
|
+
@type = type
|
996
|
+
end
|
997
|
+
@width = width
|
998
|
+
@height = height || width
|
999
|
+
@thickness = thickness
|
1000
|
+
@color = color
|
1001
|
+
@bgcolor = bgcolor
|
1002
|
+
end
|
1003
|
+
|
1004
|
+
attr_reader :type, :color
|
1005
|
+
|
1006
|
+
def to_a
|
1007
|
+
return [@type, @width, @height, @thickness, @color, @bgcolor]
|
1008
|
+
end
|
1009
|
+
|
1010
|
+
end
|
1011
|
+
|
1012
|
+
class RGB
|
1013
|
+
|
1014
|
+
@@number = nil
|
1015
|
+
@@table = {}
|
1016
|
+
|
1017
|
+
def self.reset
|
1018
|
+
@@number = 100
|
1019
|
+
end
|
1020
|
+
|
1021
|
+
def self.next_number
|
1022
|
+
@@number += 1
|
1023
|
+
if @@number > 2047
|
1024
|
+
reset
|
1025
|
+
end
|
1026
|
+
return @@number
|
1027
|
+
end
|
1028
|
+
|
1029
|
+
reset
|
1030
|
+
|
1031
|
+
def initialize (r, g, b, a=255)
|
1032
|
+
@r = r
|
1033
|
+
@g = g
|
1034
|
+
@b = b
|
1035
|
+
@a = a
|
1036
|
+
end
|
1037
|
+
|
1038
|
+
attr_reader :r, :g, :b, :a
|
1039
|
+
|
1040
|
+
def to_s
|
1041
|
+
return format("%i %i %i %i", @r, @g, @b, @a)
|
1042
|
+
end
|
1043
|
+
|
1044
|
+
def to_a
|
1045
|
+
return [@r, @g, @b, @a]
|
1046
|
+
end
|
1047
|
+
|
1048
|
+
def % (alpha)
|
1049
|
+
if alpha >= 0 and alpha <= 1
|
1050
|
+
a = (@a*alpha).to_i
|
1051
|
+
else
|
1052
|
+
raise "invalid alpha value"
|
1053
|
+
end
|
1054
|
+
return RGB.new(@r, @g, @b, a)
|
1055
|
+
end
|
1056
|
+
|
1057
|
+
def * (scale)
|
1058
|
+
if scale >= 0 and scale <= 1
|
1059
|
+
return RGB.new((@r*scale).to_i, (@g*scale).to_i, (@b*scale).to_i, @a)
|
1060
|
+
else
|
1061
|
+
raise "invalid scale value"
|
1062
|
+
end
|
1063
|
+
end
|
1064
|
+
|
1065
|
+
def / (scale)
|
1066
|
+
if scale >= 1
|
1067
|
+
return RGB.new((@r/scale).to_i, (@g/scale).to_i, (@b/scale).to_i, @a)
|
1068
|
+
else
|
1069
|
+
raise "invalid scale value"
|
1070
|
+
end
|
1071
|
+
end
|
1072
|
+
|
1073
|
+
def + (other)
|
1074
|
+
r = [self.r, other.r].max
|
1075
|
+
g = [self.g, other.g].max
|
1076
|
+
b = [self.b, other.b].max
|
1077
|
+
a = [self.a, other.a].max
|
1078
|
+
return RGB.new(r,g,b,a)
|
1079
|
+
end
|
1080
|
+
|
1081
|
+
end
|
1082
|
+
|
1083
|
+
def LINE (*argv)
|
1084
|
+
return LINE.new(*argv)
|
1085
|
+
end
|
1086
|
+
|
1087
|
+
def TILE (*argv)
|
1088
|
+
return TILE.new(*argv)
|
1089
|
+
end
|
1090
|
+
|
1091
|
+
def RGB (*argv)
|
1092
|
+
case argv.size
|
1093
|
+
when 1
|
1094
|
+
return GrADS::Command::RGB_TABLE[argv[0]]
|
1095
|
+
else
|
1096
|
+
return GrADS::Command::RGB.new(*argv)
|
1097
|
+
end
|
1098
|
+
end
|
1099
|
+
|
1100
|
+
def self.RGB (*argv)
|
1101
|
+
case argv.size
|
1102
|
+
when 1
|
1103
|
+
return GrADS::Command::RGB_TABLE[argv[0]]
|
1104
|
+
else
|
1105
|
+
return GrADS::Command::RGB.new(*argv)
|
1106
|
+
end
|
1107
|
+
end
|
1108
|
+
|
1109
|
+
RGB_TABLE = {
|
1110
|
+
"red" => RGB(255,0,0),
|
1111
|
+
"green" => RGB(0,255,0),
|
1112
|
+
"blue" => RGB(0,0,255),
|
1113
|
+
}
|
1114
|
+
RGB_TABLE.update({
|
1115
|
+
"cyan" => RGB("green") + RGB("blue"),
|
1116
|
+
})
|
1117
|
+
|
1118
|
+
def set_line (obj)
|
1119
|
+
args = obj.to_a
|
1120
|
+
if obj.color.is_a?(RGB)
|
1121
|
+
args[0] = set_rgb(obj.color)
|
1122
|
+
end
|
1123
|
+
set :line, *args
|
1124
|
+
set :ccolor, args[0]
|
1125
|
+
set :cstyle, args[1]
|
1126
|
+
set :cthick, args[2]
|
1127
|
+
end
|
1128
|
+
|
1129
|
+
def set_rgb (*argv)
|
1130
|
+
list = []
|
1131
|
+
argv.each do |obj|
|
1132
|
+
num = RGB.next_number
|
1133
|
+
case obj
|
1134
|
+
when TILE
|
1135
|
+
nt = TILE.next_number
|
1136
|
+
args = obj.to_a
|
1137
|
+
if obj.color.is_a?(RGB)
|
1138
|
+
c = set_rgb(obj.color)
|
1139
|
+
args[4] = c
|
1140
|
+
end
|
1141
|
+
set :tile, nt, *args.to_a
|
1142
|
+
set :rgb, num, :tile, nt
|
1143
|
+
when RGB
|
1144
|
+
set :rgb, num, *obj.to_a
|
1145
|
+
end
|
1146
|
+
list << num
|
1147
|
+
end
|
1148
|
+
return list
|
1149
|
+
end
|
1150
|
+
|
740
1151
|
end
|
741
1152
|
|
742
1153
|
def GrADS.start (*argv, &block)
|
@@ -755,4 +1166,3 @@ def GrADS.script (name, definition)
|
|
755
1166
|
end
|
756
1167
|
|
757
1168
|
|
758
|
-
|
data/lib/grads/gridded.rb
CHANGED
@@ -34,6 +34,16 @@
|
|
34
34
|
require "carray"
|
35
35
|
require "strscan"
|
36
36
|
|
37
|
+
begin
|
38
|
+
require "simple-proj"
|
39
|
+
require "simple-proj-carray"
|
40
|
+
rescue LoadError
|
41
|
+
begin
|
42
|
+
require "proj4r"
|
43
|
+
rescue LoadError
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
37
47
|
module GrADS
|
38
48
|
end
|
39
49
|
|
@@ -320,7 +330,13 @@ class GrADS::Gridded
|
|
320
330
|
end
|
321
331
|
|
322
332
|
def parse_pdef_lcc (args)
|
323
|
-
|
333
|
+
if defined? PROJ4 and defined? PROJ4::Proj
|
334
|
+
projlib = "proj4r"
|
335
|
+
elsif defined? PROJ
|
336
|
+
projlib = "simple-proj"
|
337
|
+
else
|
338
|
+
raise "can't find proj related library"
|
339
|
+
end
|
324
340
|
rlat = args[1].to_f
|
325
341
|
rlon = args[2].to_f
|
326
342
|
xi = args[3].to_f
|
@@ -331,29 +347,57 @@ class GrADS::Gridded
|
|
331
347
|
dx = args[8].to_f
|
332
348
|
dy = args[9].to_f
|
333
349
|
slat0 = slat1 > 0 ? 90 : -90
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
350
|
+
case projlib
|
351
|
+
when "proj4r"
|
352
|
+
if @radius
|
353
|
+
proj = PROJ4::Proj.new %{
|
354
|
+
+ellps=sphere +a=#{@radius} +b=#{@radius} +proj=lcc \
|
355
|
+
+lat_1=#{slat1} +lat_2=#{slat2} +lon_0=#{slon}
|
356
|
+
}
|
357
|
+
else
|
358
|
+
proj = PROJ4::Proj.new %{
|
359
|
+
+ellps=sphere +proj=lcc \
|
360
|
+
+lat_1=#{slat1} +lat_2=#{slat2} +lon_0=#{slon}
|
361
|
+
}
|
362
|
+
end
|
363
|
+
when "simple-proj"
|
364
|
+
if @radius
|
365
|
+
proj = PROJ.new %{
|
366
|
+
+ellps=sphere +a=#{@radius} +b=#{@radius} +proj=lcc \
|
367
|
+
+lat_1=#{slat1} +lat_2=#{slat2} +lon_0=#{slon}
|
368
|
+
}
|
369
|
+
else
|
370
|
+
proj = PROJ.new %{
|
371
|
+
+ellps=sphere +proj=lcc \
|
372
|
+
+lat_1=#{slat1} +lat_2=#{slat2} +lon_0=#{slon}
|
373
|
+
}
|
374
|
+
end
|
344
375
|
end
|
345
376
|
rx, ry = proj.forward(rlon, rlat)
|
346
377
|
rx0 = rx - (xi-1)*dx
|
347
378
|
ry0 = ry - (yi-1)*dy
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
379
|
+
case projlib
|
380
|
+
when "proj4r"
|
381
|
+
@forward = lambda { |lon, lat|
|
382
|
+
mx, my = proj.forward(lon, lat)
|
383
|
+
[(mx - rx0)/dx, (my - ry0)/dy]
|
384
|
+
}
|
385
|
+
@inverse = lambda { |fi, fj|
|
386
|
+
mx = fi*dx + rx0
|
387
|
+
my = fj*dy + ry0
|
388
|
+
proj.inverse(mx, my)
|
389
|
+
}
|
390
|
+
when "simple-proj"
|
391
|
+
@forward = lambda { |lon, lat|
|
392
|
+
mx, my = proj.forward_carray(lon, lat)
|
393
|
+
[(mx - rx0)/dx, (my - ry0)/dy]
|
394
|
+
}
|
395
|
+
@inverse = lambda { |fi, fj|
|
396
|
+
mx = fi*dx + rx0
|
397
|
+
my = fj*dy + ry0
|
398
|
+
proj.inverse_carray(mx, my)
|
399
|
+
}
|
400
|
+
end
|
357
401
|
@xy = lambda {
|
358
402
|
x = CArray.float(xsize).seq(rx0, dx)
|
359
403
|
y = CArray.float(ysize).seq(ry0, dy)
|
@@ -0,0 +1,217 @@
|
|
1
|
+
#
|
2
|
+
#
|
3
|
+
# draw_xlab_time(dummy, offset: nil, skip: nil)
|
4
|
+
#
|
5
|
+
#
|
6
|
+
#
|
7
|
+
#
|
8
|
+
|
9
|
+
class GrADS::Command
|
10
|
+
|
11
|
+
def time_skip
|
12
|
+
ans = query("dims")
|
13
|
+
t1 = subwrd(sublin(ans, 5), 11).to_i
|
14
|
+
t2 = subwrd(sublin(ans, 5), 13).to_i
|
15
|
+
d1 = Time.parse(subwrd(sublin(ans, 5), 6).sub(/Z/," "))
|
16
|
+
d2 = Time.parse(subwrd(sublin(ans, 5), 8).sub(/Z/," "))
|
17
|
+
nt = t2 - t1 + 1
|
18
|
+
nd = (d2 - d1)/86400.0
|
19
|
+
dt = ((d2-d1)/(t2-t1)).round
|
20
|
+
|
21
|
+
type = nil
|
22
|
+
skip = nil
|
23
|
+
|
24
|
+
if nd <= 1
|
25
|
+
type = "day"
|
26
|
+
elsif nd <= 3
|
27
|
+
type = "3days"
|
28
|
+
elsif nd <= 7
|
29
|
+
type = "week"
|
30
|
+
elsif nd <= 14
|
31
|
+
type = "2weeks"
|
32
|
+
elsif nd <= 31
|
33
|
+
type = "month"
|
34
|
+
elsif nd <= 120
|
35
|
+
type = "season"
|
36
|
+
elsif nd <= 360
|
37
|
+
type = "year"
|
38
|
+
else
|
39
|
+
type = "years"
|
40
|
+
end
|
41
|
+
|
42
|
+
unless skip
|
43
|
+
case type
|
44
|
+
when "day"
|
45
|
+
skip = dt.to_i/3600
|
46
|
+
when "3days"
|
47
|
+
skip = 3*dt.to_i/3600
|
48
|
+
when "week"
|
49
|
+
skip = 6*dt.to_i/3600
|
50
|
+
when "2weeks"
|
51
|
+
skip = 12*dt.to_i/3600
|
52
|
+
when "month"
|
53
|
+
skip = 24*dt.to_i/3600
|
54
|
+
when "season"
|
55
|
+
skip = 3*24*dt.to_i/3600
|
56
|
+
when "year", "years"
|
57
|
+
skip = 10*24*dt.to_i/3600
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
return skip
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
def axis_xtime (dummy, offset: nil, skip: nil, &block)
|
66
|
+
puts ans = query("dims")
|
67
|
+
t1 = subwrd(sublin(ans, 5), 11).to_i
|
68
|
+
t2 = subwrd(sublin(ans, 5), 13).to_i
|
69
|
+
d1 = Time.parse(subwrd(sublin(ans, 5), 6).sub(/Z/," "))
|
70
|
+
d2 = Time.parse(subwrd(sublin(ans, 5), 8).sub(/Z/," "))
|
71
|
+
nt = t2 - t1 + 1
|
72
|
+
nd = (d2 - d1)/86400.0
|
73
|
+
dt = ((d2-d1)/(t2-t1)).round
|
74
|
+
time = CArray.object(nt).seq(d1,dt)
|
75
|
+
|
76
|
+
type = nil
|
77
|
+
skip = nil
|
78
|
+
|
79
|
+
if offset
|
80
|
+
time = time + offset
|
81
|
+
end
|
82
|
+
|
83
|
+
if nd <= 1
|
84
|
+
type = "day"
|
85
|
+
elsif nd <= 3
|
86
|
+
type = "3days"
|
87
|
+
elsif nd <= 7
|
88
|
+
type = "week"
|
89
|
+
elsif nd <= 14
|
90
|
+
type = "2weeks"
|
91
|
+
elsif nd <= 31
|
92
|
+
type = "month"
|
93
|
+
elsif nd <= 120
|
94
|
+
type = "season"
|
95
|
+
elsif nd <= 360
|
96
|
+
type = "year"
|
97
|
+
else
|
98
|
+
type = "years"
|
99
|
+
end
|
100
|
+
|
101
|
+
unless skip
|
102
|
+
case type
|
103
|
+
when "day"
|
104
|
+
skip = dt.to_i/3600
|
105
|
+
when "3days"
|
106
|
+
skip = 3*dt.to_i/3600
|
107
|
+
when "week"
|
108
|
+
skip = 6*dt.to_i/3600
|
109
|
+
when "2weeks"
|
110
|
+
skip = 12*dt.to_i/3600
|
111
|
+
when "month"
|
112
|
+
skip = 24*dt.to_i/3600
|
113
|
+
when "season"
|
114
|
+
skip = 3*24*dt.to_i/3600
|
115
|
+
when "year", "years"
|
116
|
+
skip = 10*24*dt.to_i/3600
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
xlabs = []
|
121
|
+
xlabs2 = []
|
122
|
+
flag = false
|
123
|
+
|
124
|
+
case type
|
125
|
+
when "day", "3days", "week"
|
126
|
+
hour0 = 0
|
127
|
+
time[[nil,skip]].each do |t|
|
128
|
+
if not flag
|
129
|
+
xlabs << t.strftime("%d%b%Y").upcase
|
130
|
+
flag = true
|
131
|
+
elsif hour0 > t.hour
|
132
|
+
xlabs << t.strftime("%d%b").upcase
|
133
|
+
else
|
134
|
+
xlabs << t.strftime("")
|
135
|
+
end
|
136
|
+
hour0 = t.hour
|
137
|
+
end
|
138
|
+
time[[nil,skip]].each do |t|
|
139
|
+
if nt > 73
|
140
|
+
if t.hour % 3 == 0
|
141
|
+
xlabs2 << t.strftime("%H")
|
142
|
+
end
|
143
|
+
else
|
144
|
+
xlabs2 << t.strftime("%H")
|
145
|
+
end
|
146
|
+
end
|
147
|
+
units = ["hour", "day"]
|
148
|
+
when "2weeks"
|
149
|
+
hour0 = 0
|
150
|
+
time[[nil,skip]].each do |t|
|
151
|
+
if not flag
|
152
|
+
xlabs << t.strftime("%d%b%Y").upcase
|
153
|
+
flag = true
|
154
|
+
elsif hour0 > t.hour
|
155
|
+
xlabs << t.strftime("%d").upcase
|
156
|
+
else
|
157
|
+
xlabs << t.strftime("")
|
158
|
+
end
|
159
|
+
hour0 = t.hour
|
160
|
+
end
|
161
|
+
time[[nil,skip]].each do |t|
|
162
|
+
if nt > 73
|
163
|
+
if t.hour % 3 == 0
|
164
|
+
xlabs2 << t.strftime("%H")
|
165
|
+
end
|
166
|
+
else
|
167
|
+
xlabs2 << t.strftime("%H")
|
168
|
+
end
|
169
|
+
end
|
170
|
+
units = ["hour", "day"]
|
171
|
+
when "month","season", "year"
|
172
|
+
day0 = 1
|
173
|
+
time[[nil,skip]].each do |t|
|
174
|
+
if not flag
|
175
|
+
xlabs << t.strftime("%d%b%Y").upcase
|
176
|
+
flag = true
|
177
|
+
elsif day0 > t.day
|
178
|
+
xlabs << t.strftime("%b").upcase
|
179
|
+
else
|
180
|
+
xlabs << t.strftime("")
|
181
|
+
end
|
182
|
+
day0 = t.day
|
183
|
+
end
|
184
|
+
time[[nil,skip]].each do |t|
|
185
|
+
if nt > 73
|
186
|
+
if t.hour % 3 == 0
|
187
|
+
xlabs2 << t.strftime("%d")
|
188
|
+
end
|
189
|
+
else
|
190
|
+
xlabs2 << t.strftime("%d")
|
191
|
+
end
|
192
|
+
end
|
193
|
+
units = ["day", "month"]
|
194
|
+
end
|
195
|
+
|
196
|
+
begin
|
197
|
+
axis_off
|
198
|
+
set :xlab, :on
|
199
|
+
set :xlabs, xlabs2.join(" | ")
|
200
|
+
set :xlpos, 0, :b
|
201
|
+
|
202
|
+
display_nothing(dummy)
|
203
|
+
|
204
|
+
axis_on
|
205
|
+
set :xlab, :on
|
206
|
+
set :xlabs, xlabs.join(" | ")
|
207
|
+
set :xlpos, -0.3, :b
|
208
|
+
|
209
|
+
display_nothing(dummy, &block)
|
210
|
+
ensure
|
211
|
+
set :xlpos, 0, b
|
212
|
+
end
|
213
|
+
|
214
|
+
return units
|
215
|
+
end
|
216
|
+
|
217
|
+
end
|
data/lib/grads/lib/makecpt.rb
CHANGED
@@ -10,12 +10,6 @@ class GrADS::Command
|
|
10
10
|
|
11
11
|
def setcpt (file)
|
12
12
|
io = Kernel::open(file)
|
13
|
-
while line = io.gets
|
14
|
-
if line =~ /COLOR_MODEL\s*=\s*\+?(HSV|RGB)/
|
15
|
-
model = $1
|
16
|
-
break
|
17
|
-
end
|
18
|
-
end
|
19
13
|
bgrb = nil
|
20
14
|
frgb = nil
|
21
15
|
list = []
|
@@ -24,12 +18,12 @@ class GrADS::Command
|
|
24
18
|
when /\A[\#N]/
|
25
19
|
next
|
26
20
|
when /\AB\s/
|
27
|
-
brgb = line.split(
|
21
|
+
brgb = line.split(/[\s\/]+/)[1..3].map(&:to_f)
|
28
22
|
when /\AF\s/
|
29
|
-
frgb = line.split(
|
23
|
+
frgb = line.split(/[\s\/]+/)[1..3].map(&:to_f)
|
30
24
|
else
|
31
|
-
list << line.
|
32
|
-
last = line.
|
25
|
+
list << line.split(/[\s\/]+/)[0..3].map(&:to_f)
|
26
|
+
last = line.split(/[\s\/]+/)[4..7].map(&:to_f)
|
33
27
|
end
|
34
28
|
end
|
35
29
|
list << last
|
@@ -38,49 +32,32 @@ class GrADS::Command
|
|
38
32
|
ccols = []
|
39
33
|
ic = 16
|
40
34
|
if brgb
|
41
|
-
|
42
|
-
set :rgb, ic, *_hsv2rgb(*brgb)
|
43
|
-
else
|
44
|
-
set :rgb, ic, *brgb
|
45
|
-
end
|
35
|
+
set :rgb, ic, *brgb.map(&:round)
|
46
36
|
ccols << ic
|
47
37
|
else
|
48
|
-
ccols <<
|
38
|
+
ccols << -1
|
49
39
|
end
|
50
40
|
ic += 1
|
51
41
|
list.each_with_index do |(v,r,g,b),i|
|
52
|
-
|
53
|
-
set :rgb, i+ic, *_hsv2rgb(r, g, b)
|
54
|
-
else
|
55
|
-
set :rgb, i+ic, r, g, b
|
56
|
-
end
|
42
|
+
set :rgb, i+ic, r.round, g.round, b.round
|
57
43
|
clevs << v
|
58
44
|
if ! frgb and i == list.size - 1
|
59
|
-
ccols <<
|
45
|
+
ccols << -1
|
60
46
|
else
|
61
47
|
ccols << i+ic
|
62
48
|
end
|
63
49
|
end
|
64
50
|
ic += list.size - 1
|
65
51
|
if frgb
|
66
|
-
|
67
|
-
set :rgb, ic, *_hsv2rgb(*frgb)
|
68
|
-
else
|
69
|
-
set :rgb, ic, *frgb
|
70
|
-
end
|
52
|
+
set :rgb, ic, *frgb.map(&:round)
|
71
53
|
end
|
72
54
|
set_clevs *clevs
|
73
55
|
set_ccols *ccols
|
56
|
+
return clevs, ccols
|
74
57
|
end
|
75
58
|
|
76
59
|
def makecpt (*args)
|
77
|
-
io = IO::popen("makecpt #{args.join(' ')}", "r")
|
78
|
-
while line = io.gets
|
79
|
-
if line =~ /COLOR_MODEL\s*=\s*\+?(HSV|RGB)/
|
80
|
-
model = $1
|
81
|
-
break
|
82
|
-
end
|
83
|
-
end
|
60
|
+
io = IO::popen("makecpt -Fr #{args.join(' ')}", "r")
|
84
61
|
bgrb = nil
|
85
62
|
frgb = nil
|
86
63
|
list = []
|
@@ -89,12 +66,12 @@ class GrADS::Command
|
|
89
66
|
when /\A[\#N]/
|
90
67
|
next
|
91
68
|
when /\AB\s/
|
92
|
-
brgb = line.split(
|
69
|
+
brgb = line.split(/[\s\/]/)[1..3].map(&:to_f)
|
93
70
|
when /\AF\s/
|
94
|
-
frgb = line.split(
|
71
|
+
frgb = line.split(/[\s\/]/)[1..3].map(&:to_f)
|
95
72
|
else
|
96
|
-
list << line.split(
|
97
|
-
last = line.split(
|
73
|
+
list << line.split(/[\s\/]/)[0..3].map(&:to_f)
|
74
|
+
last = line.split(/[\s\/]/)[4..7].map(&:to_f)
|
98
75
|
end
|
99
76
|
end
|
100
77
|
list << last
|
@@ -103,39 +80,28 @@ class GrADS::Command
|
|
103
80
|
ccols = []
|
104
81
|
ic = 16
|
105
82
|
if brgb
|
106
|
-
|
107
|
-
set :rgb, ic, *_hsv2rgb(*brgb)
|
108
|
-
else
|
109
|
-
set :rgb, ic, *brgb
|
110
|
-
end
|
83
|
+
set :rgb, ic, *brgb.map(&:round)
|
111
84
|
ccols << ic
|
112
85
|
else
|
113
|
-
ccols <<
|
86
|
+
ccols << -1
|
114
87
|
end
|
115
88
|
ic += 1
|
116
89
|
list.each_with_index do |(v,r,g,b),i|
|
117
|
-
|
118
|
-
set :rgb, i+ic, *_hsv2rgb(r, g, b)
|
119
|
-
else
|
120
|
-
set :rgb, i+ic, r, g, b
|
121
|
-
end
|
90
|
+
set :rgb, i+ic, r.round, g.round, b.round
|
122
91
|
clevs << v
|
123
92
|
if ! frgb and i == list.size - 1
|
124
|
-
ccols <<
|
93
|
+
ccols << -1
|
125
94
|
else
|
126
95
|
ccols << i+ic
|
127
96
|
end
|
128
97
|
end
|
129
98
|
ic += list.size - 1
|
130
99
|
if frgb
|
131
|
-
|
132
|
-
set :rgb, ic, *_hsv2rgb(*frgb)
|
133
|
-
else
|
134
|
-
set :rgb, ic, *frgb
|
135
|
-
end
|
100
|
+
set :rgb, ic, *frgb.map(&:round)
|
136
101
|
end
|
137
102
|
set_clevs *clevs
|
138
103
|
set_ccols *ccols
|
104
|
+
return clevs, ccols
|
139
105
|
end
|
140
106
|
|
141
107
|
def _hsv2rgb(h, s, v)
|
data/ruby-grads.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
|
2
2
|
Gem::Specification::new do |s|
|
3
|
-
version = "1.0.
|
3
|
+
version = "1.0.6"
|
4
4
|
|
5
5
|
files = Dir.glob("**/*") - [
|
6
6
|
Dir.glob("ruby-grads*.gem"),
|
@@ -18,5 +18,6 @@ Gem::Specification::new do |s|
|
|
18
18
|
s.homepage = 'https://github.com/himotoyoshi/ruby-grads'
|
19
19
|
s.files = files
|
20
20
|
# s.extensions = [ "extconf.rb" ]
|
21
|
+
s.executables << 'ncdef2ctl'
|
21
22
|
s.required_ruby_version = ">= 1.8.1"
|
22
23
|
end
|
data/ruby-grads.gemspec~
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
|
2
|
+
Gem::Specification::new do |s|
|
3
|
+
version = "1.0.5"
|
4
|
+
|
5
|
+
files = Dir.glob("**/*") - [
|
6
|
+
Dir.glob("ruby-grads*.gem"),
|
7
|
+
].flatten
|
8
|
+
|
9
|
+
s.platform = Gem::Platform::RUBY
|
10
|
+
s.name = "ruby-grads"
|
11
|
+
s.summary = "Library for driving GrADS from Ruby"
|
12
|
+
s.description = <<-HERE
|
13
|
+
Library for driving GrADS from Ruby
|
14
|
+
HERE
|
15
|
+
s.version = version
|
16
|
+
s.author = "Hiroki Motoyoshi"
|
17
|
+
s.email = ""
|
18
|
+
s.homepage = 'https://github.com/himotoyoshi/ruby-grads'
|
19
|
+
s.files = files
|
20
|
+
# s.extensions = [ "extconf.rb" ]
|
21
|
+
s.executables << 'ncdef2ctl'
|
22
|
+
s.required_ruby_version = ">= 1.8.1"
|
23
|
+
end
|
metadata
CHANGED
@@ -1,32 +1,37 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-grads
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hiroki Motoyoshi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-02-03 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: " Library for driving GrADS from Ruby\n"
|
14
14
|
email: ''
|
15
|
-
executables:
|
15
|
+
executables:
|
16
|
+
- ncdef2ctl
|
16
17
|
extensions: []
|
17
18
|
extra_rdoc_files: []
|
18
19
|
files:
|
19
20
|
- README.md
|
21
|
+
- Rakefile
|
22
|
+
- bin/ncdef2ctl
|
20
23
|
- extconf.rb
|
21
24
|
- lib/grads.rb
|
22
25
|
- lib/grads/binary.rb
|
23
26
|
- lib/grads/command.rb
|
24
27
|
- lib/grads/gridded.rb
|
28
|
+
- lib/grads/lib/axis_xtime.rb
|
25
29
|
- lib/grads/lib/colorbar.rb
|
26
30
|
- lib/grads/lib/makecpt.rb
|
27
31
|
- lib/grads/lib/save_image.rb
|
28
32
|
- lib/grads/lib/xcbar_with_ccols.rb
|
29
33
|
- ruby-grads.gemspec
|
34
|
+
- ruby-grads.gemspec~
|
30
35
|
- test/gradsdraw.rb
|
31
36
|
- test/test.rb
|
32
37
|
homepage: https://github.com/himotoyoshi/ruby-grads
|
@@ -47,8 +52,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
47
52
|
- !ruby/object:Gem::Version
|
48
53
|
version: '0'
|
49
54
|
requirements: []
|
50
|
-
|
51
|
-
rubygems_version: 2.7.7
|
55
|
+
rubygems_version: 3.1.2
|
52
56
|
signing_key:
|
53
57
|
specification_version: 4
|
54
58
|
summary: Library for driving GrADS from Ruby
|