ruby-gr 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/lib/gr/plot.rb.md ADDED
@@ -0,0 +1,207 @@
1
+ This is a memo to think about the structure of Plot/Figure.
2
+
3
+ ````ruby
4
+
5
+ module GR
6
+ # object oriented way
7
+ class PlotBase
8
+ end
9
+
10
+ class Line < PlotBase
11
+ end
12
+
13
+ class << self
14
+ def set_viewport; end
15
+
16
+ def minmax; end
17
+
18
+ def set_window; end
19
+
20
+ def draw_axes; end
21
+
22
+ def draw_polar_axes; end
23
+
24
+ def _inqtext; end
25
+
26
+ def _text; end
27
+
28
+ def draw_legend; end
29
+
30
+ def draw_colorbar; end
31
+
32
+ def colormap; end
33
+
34
+ def to_rgba; end
35
+
36
+ # Ruby is object-oriented language.
37
+ # Julia is more functional...
38
+ # def create_context
39
+ # end
40
+ # def restore_context
41
+ # end
42
+ # def figure
43
+ # end
44
+
45
+ # def hold
46
+ # end
47
+ # def usecolorscheme
48
+ # end
49
+
50
+ # Set current subplot index.
51
+ def subplot; end
52
+
53
+ # draw_grid
54
+
55
+ # xticks
56
+ # yticks
57
+ # zticks
58
+
59
+ # xticklabels
60
+ # yticklabels
61
+
62
+ def plot_img; end # should be private?
63
+
64
+ def plot_iso; end # should be private?
65
+
66
+ def plot_polar; end # should be private?
67
+
68
+ # send_meta
69
+
70
+ def plot_data; end # should be private?
71
+
72
+ def plot_args; end # should be private?
73
+
74
+ # Draw one or more line plots.
75
+ def plot_line; end
76
+ alias lineplot plot_line
77
+
78
+ # def plot_line_over oplot_line ?
79
+
80
+ # Draw one or more step or staircase plots.
81
+ def plot_step; end
82
+ alias stepplot plot_step
83
+ alias step plot_step
84
+
85
+ # Draw one or more scatter plots.
86
+ def plot_scatter; end
87
+ alias scatterplot plot_scatter
88
+ alias scatter plot_scatter
89
+
90
+ # Draw a stem plot.
91
+ def plot_stem; end
92
+ alias stemplot plot_stem
93
+ alias stem plot_stem
94
+
95
+ # Draw a bar plot.
96
+ def plot_bar; end
97
+ alias barplot plot_bar
98
+ alias bar plot_bar
99
+
100
+ def hist; end # should be private?
101
+
102
+ # Draw a histogram.
103
+ def plot_histgram; end
104
+ alias histogram plot_histgram
105
+
106
+ # Draw a polar histogram.
107
+ def plot_polarhistogram; end
108
+ alias polarhistogram plot_polarhistogram
109
+
110
+ # Draw a contour plot.
111
+ def plot_contour; end
112
+ alias contourplot plot_contour
113
+ # GR.contour is already defined in GR::FFI class.
114
+
115
+ # Draw a filled contour plot.
116
+ def plot_contourf; end
117
+ alias contourfplot plot_contour # change name?
118
+ # GR.contourf is already defined in GR::FFI class.
119
+
120
+ # Draw a hexagon binning plot.
121
+ def plot_hexbin; end
122
+ alias hexbinplot plot_hexbin
123
+ # GR.hexbin is already defined in GR::FFI class.
124
+ alias jointplot plot_hexbin
125
+
126
+ # Draw a heatmap.
127
+ def plot_heatmap; end
128
+ alias heatmap plot_heatmap
129
+
130
+ def plot_polarheatmap; end
131
+ alias polarheatmap plot_polarheatmap
132
+
133
+ # Draw a three-dimensional wireframe plot.
134
+ def plot_wireframe; end
135
+ alias wireframe plot_wireframe
136
+
137
+ # Draw a three-dimensional surface plot.
138
+ def plot_surface; end
139
+ alias surfaceplot plot_surface
140
+
141
+ def plot_volume; end
142
+ alias volumeplot plot_volume
143
+
144
+ # Draw one or more three-dimensional line plots.
145
+ def plot_line3; end
146
+ alias lineplot3 plot_line3
147
+
148
+ # Draw one or more three-dimensional scatter plots.
149
+ def plot_scatter3; end
150
+ alias scatterplot3 plot_scatter3
151
+
152
+ def redraw; end
153
+
154
+ def title; end
155
+
156
+ def xlabel; end
157
+
158
+ def ylabel; end
159
+
160
+ def legend; end
161
+
162
+ def xlim; end
163
+
164
+ def ylim; end
165
+
166
+ def savefig; end
167
+
168
+ def meshgrid; end # should be private ?
169
+
170
+ def peaks; end # should be private ?
171
+
172
+ def imshow; end
173
+
174
+ # Draw an isosurface.
175
+ def plot_isosurface; end
176
+
177
+ # Draw one or more polar plots.
178
+ def plot_polar; end
179
+
180
+ # Draw a triangular surface plot.
181
+ def plot_trisurf; end
182
+
183
+ # Draw a triangular contour plot.
184
+ def plot_tricont; end
185
+
186
+ def plot_shade; end
187
+
188
+ # def set_panzoom ?
189
+
190
+ # mainloop
191
+
192
+ # GR.plot do
193
+ #
194
+ # end
195
+ #
196
+ # GR.plot(:scatter, * * *)
197
+ def plot; end
198
+
199
+ # Object ?
200
+
201
+ # a = GR::Bar.new()
202
+ # a.draw ?
203
+ # a = GR::Bar.plot() ?
204
+ end
205
+ end
206
+
207
+ ```
data/lib/gr3.rb CHANGED
@@ -2,38 +2,52 @@
2
2
 
3
3
  # OverView of GR.rb
4
4
  #
5
- # +--------------------+
6
- # +-------------------+ | GR3 module |
7
- # | GR module | | +----------------+ |
8
- # | +---------------+ | | | GR3::FFI | |
9
- # | | GR::FFI | | | | + libGR3.so | |
10
- # | | + libGR.so | | | +----------------+ |
11
- # | +---------------+ | | | define_method |
12
- # | | define_method | | +----------------+ |
13
- # | +---------------+ | | | | GR3::GR3Base | |
14
- # | | | GR::GRBase | | | | v (Private) | |
15
- # | | v (Private) | | | +++--------------+ |
16
- # | +++-------------+ | | | Extend |
17
- # | | Extend | | v +------+ |
18
- # | v | | |Check | |
19
- # | | | <--+Error | |
20
- # +-------+-----------+ | +------+ |
21
- # ^ +---------+----------+
22
- # | +------------------+ ^
23
- # Extend | | GRCommons module | | Extend
24
- # | | +--------------+ | |
25
- # +----+ CommonUtils +----+
26
- # | | +--------------+ | |
27
- # | | +--------------+ | |
28
- # +----+ Version +----+
29
- # | | +--------------+ |
30
- # | | +--------------+ |
31
- # +----+JupyterSupport| |
32
- # | +--------------+ |
33
- # +------------------+
34
-
35
- require 'ffi'
36
-
5
+ # +--------------------+
6
+ # +-------------------+ | GR3 module |
7
+ # | GR module | | +----------------+ |
8
+ # | +---------------+ | | | GR3::FFI | |
9
+ # | | GR::FFI | | | | + libGR3.so | |
10
+ # | | + libGR.so | | | +----------------+ |
11
+ # | +---------------+ | | | define_method |
12
+ # | | define_method | | +----------------+ |
13
+ # | +---------------+ | | | | GR3::GR3Base | |
14
+ # | | | GR::GRBase | | | | v (Private) | |
15
+ # | | v (Private) | | | +++--------------+ |
16
+ # | +++-------------+ | | | Extend |
17
+ # | | Extend | | v +------+ |
18
+ # | v | | |Check | |
19
+ # | | | <--+Error | |
20
+ # +-------+-----------+ | +------+ |
21
+ # ^ +---------+----------+
22
+ # | +------------------+ ^
23
+ # Extend | | GRCommons module | | Extend
24
+ # | | +--------------+ | |
25
+ # | | | Fiddley | | |
26
+ # | | +--------------+ | |
27
+ # | | +--------------+ | |
28
+ # +----+ CommonUtils +----+
29
+ # | | +--------------+ | |
30
+ # | | +--------------+ | |
31
+ # +----+ Version +----+
32
+ # | | +--------------+ |
33
+ # | | +--------------+ |
34
+ # +----+JupyterSupport| |
35
+ # | +--------------+ |
36
+ # +------------------+
37
+ #
38
+ # Why not GR::GR3?
39
+ # * kojix2 did not want to force gr3 to be loaded when gr is loaded.
40
+ # * kojix2 did not want to write `GR3 = GR::GR3` or something.
41
+ # * This is a opinion of kojix2 and may be changed in the future.
42
+ #
43
+ # GR3 uses Numo::Narrray.
44
+ # * It is difficult to write GR3 modules with only Ruby arrays.
45
+ # * Numo::Narray has better performance and is easier to read.
46
+ # * Numo::Narray does not work with JRuby.
47
+ # * https://github.com/ruby-numo/numo-narray/issues/147
48
+ #
49
+ # This is a procedural interface to the GR3 in GR plotting library,
50
+ # https://github.com/sciapp/gr
37
51
  module GR3
38
52
  class Error < StandardError; end
39
53
 
@@ -42,19 +56,18 @@ module GR3
42
56
  end
43
57
 
44
58
  # Platforms | path
45
- # Windows | bin/libgr3.dll
59
+ # Windows | bin/libGR3.dll
46
60
  # MacOSX | lib/libGR3.so (NOT .dylib)
47
61
  # Ubuntu | lib/libGR3.so
48
62
  raise Error, 'Please set env variable GRDIR' unless ENV['GRDIR']
49
63
 
50
64
  ENV['GKS_FONTPATH'] ||= ENV['GRDIR']
51
- @ffi_lib = case RbConfig::CONFIG['host_os']
52
- when /mswin|msys|mingw|cygwin|bccwin|wince|emc/
53
- File.expand_path('bin/libgr3.dll', ENV['GRDIR'])
54
- .gsub('/', '\\') # windows backslash
55
- else
56
- File.expand_path('lib/libGR3.so', ENV['GRDIR'])
57
- end
65
+ if Object.const_defined?(:RubyInstaller)
66
+ @ffi_lib = File.expand_path('bin/libGR3.dll', ENV['GRDIR'])
67
+ RubyInstaller::Runtime.add_dll_directory(File.dirname(@ffi_lib))
68
+ else
69
+ @ffi_lib = File.expand_path('lib/libGR3.so', ENV['GRDIR'])
70
+ end
58
71
 
59
72
  require_relative 'gr_commons'
60
73
  require_relative 'gr3/version'
@@ -69,13 +82,14 @@ module GR3
69
82
  # This module is for adding error checking to all methods in GR3
70
83
  module CheckError
71
84
  def geterror
72
- line = ::FFI::MemoryPointer.new(:int)
73
- file = ::FFI::MemoryPointer.new(:pointer)
85
+ line = GRCommons::Fiddley::MemoryPointer.new(:int)
86
+ file = GRCommons::Fiddley::MemoryPointer.new(:pointer)
74
87
  e = super(1, line, file)
75
88
  return [0, nil, nil] if e == 0
76
89
 
77
90
  line = line.read_int
78
- file = file.read_pointer.read_string
91
+ # to_ptr: Fiddley::MemoryPointer -> Fiddle::Pointer
92
+ file = file.to_ptr.ptr.to_s
79
93
  [e, line, file]
80
94
  end
81
95
 
@@ -90,11 +104,15 @@ module GR3
90
104
  mesg = FFI.gr3_geterrorstring(e)
91
105
  raise "GR3 error #{file} #{line} #{mesg}"
92
106
  end
107
+ values
93
108
  end
94
109
  end
95
110
  end
96
111
  extend CheckError
97
112
 
113
+ # Now you can see a lot of methods just calling super here.
114
+ # Why? Do they really need?
115
+ # Yes. They are written to help the yard generate the documentation.
98
116
  class << self
99
117
  # This method initializes the gr3 context.
100
118
  # @return [Integer]
@@ -124,13 +142,13 @@ module GR3
124
142
  # If gr3 is not initialized `"Not initialized"` is returned.
125
143
  # @return [String]
126
144
  def getrenderpathstring(*)
127
- super
145
+ super.to_s
128
146
  end
129
147
 
130
148
  # This function returns a string representation of a given error code.
131
149
  # @return [String]
132
150
  def geterrorstring(*)
133
- super
151
+ super.to_s
134
152
  end
135
153
 
136
154
  # This function clears the draw list.
@@ -366,9 +384,9 @@ module GR3
366
384
  # a new mesh has to be created.
367
385
  # @param nx [Integer] number of points in x-direction
368
386
  # @param ny [Integer] number of points in y-direction
369
- # @param px [Array, NArray] an array containing the x-coordinates
370
- # @param py [Array, NArray] an array containing the y-coordinates
371
- # @param pz [Array, NArray] an array of length nx * ny containing the z-coordinates
387
+ # @param x [Array, NArray] an array containing the x-coordinates
388
+ # @param y [Array, NArray] an array containing the y-coordinates
389
+ # @param z [Array, NArray] an array of length nx * ny containing the z-coordinates
372
390
  # @param option [Integer] option for the surface mesh; the GR3_SURFACE constants can be combined with bitwise or. See the table below.
373
391
  # * 0 : GR3_SURFACE_DEFAULT
374
392
  # * default behavior
@@ -383,9 +401,9 @@ module GR3
383
401
  # * 16 : GR3_SURFACE_GRZSHADED
384
402
  # * like GR3_SURFACE_GRCOLOR, but use the z-value directly as color index
385
403
  # @return [Integer]
386
- def createsurfacemesh(nx, ny, px, py, pz, option = 0)
404
+ def createsurfacemesh(nx, ny, x, y, z, option = 0)
387
405
  inquiry_int do |mesh|
388
- super(mesh, nx, ny, px, py, pz, option)
406
+ super(mesh, nx, ny, x, y, z, option)
389
407
  end
390
408
  end
391
409
 
@@ -413,16 +431,16 @@ module GR3
413
431
  end
414
432
 
415
433
  # Create a surface plot with gr3 and draw it with gks as cellarray.
416
- # @param px [Array, NArray] an array containing the x-coordinates
417
- # @param py [Array, NArray] an array containing the y-coordinates
418
- # @param pz [Array, NArray] an array of length nx * ny containing the z-coordinates
434
+ # @param x [Array, NArray] an array containing the x-coordinates
435
+ # @param y [Array, NArray] an array containing the y-coordinates
436
+ # @param z [Array, NArray] an array of length nx * ny containing the z-coordinates
419
437
  # @param option [Integer] see the option parameter of gr_surface.
420
438
  # OPTION_COLORED_MESH and OPTION_Z_SHADED_MESH are supported.
421
- def surface(px, py, pz, _option)
422
- nx = px.length
423
- ny = py.length
439
+ def surface(x, y, z, option)
440
+ nx = x.length
441
+ ny = y.length
424
442
  # TODO: Check out_of_bounds
425
- super(nx, ny, px, py, pz, ption)
443
+ super(nx, ny, x, y, z, option)
426
444
  end
427
445
 
428
446
  # drawtubemesh
@@ -675,10 +693,10 @@ module GR3
675
693
 
676
694
  def volume(data, algorithm)
677
695
  inquiry %i[double double] do |dmin, dmax|
678
- amin.write_double(-1)
696
+ dmin.write_double(-1)
679
697
  dmax.write_double(-1)
680
698
  # TODO: raise error when no NArray
681
- data = Numo::DFloat.cast(data) if data.is_a Array
699
+ data = Numo::DFloat.cast(data) if data.is_a? Array
682
700
  nx, ny, nz = data.shape
683
701
  super(nx, ny, nz, data, algorithm, dmin, dmax)
684
702
  end
@@ -731,38 +749,38 @@ module GR3
731
749
  end
732
750
 
733
751
  # InitAttribute
734
- IA_END_OF_LIST = 0
735
- IA_FRAMEBUFFER_WIDTH = 1
752
+ IA_END_OF_LIST = 0
753
+ IA_FRAMEBUFFER_WIDTH = 1
736
754
  IA_FRAMEBUFFER_HEIGHT = 2
737
755
 
738
756
  # Error
739
- ERROR_NONE = 0
740
- ERROR_INVALID_VALUE = 1
741
- ERROR_INVALID_ATTRIBUTE = 2
742
- ERROR_INIT_FAILED = 3
743
- ERROR_OPENGL_ERR = 4
744
- ERROR_OUT_OF_MEM = 5
745
- ERROR_NOT_INITIALIZED = 6
746
- ERROR_CAMERA_NOT_INITIALIZED = 7
747
- ERROR_UNKNOWN_FILE_EXTENSION = 8
748
- ERROR_CANNOT_OPEN_FILE = 9
749
- ERROR_EXPORT = 10
757
+ ERROR_NONE = 0
758
+ ERROR_INVALID_VALUE = 1
759
+ ERROR_INVALID_ATTRIBUTE = 2
760
+ ERROR_INIT_FAILED = 3
761
+ ERROR_OPENGL_ERR = 4
762
+ ERROR_OUT_OF_MEM = 5
763
+ ERROR_NOT_INITIALIZED = 6
764
+ ERROR_CAMERA_NOT_INITIALIZED = 7
765
+ ERROR_UNKNOWN_FILE_EXTENSION = 8
766
+ ERROR_CANNOT_OPEN_FILE = 9
767
+ ERROR_EXPORT = 10
750
768
 
751
769
  # Quality
752
- QUALITY_OPENGL_NO_SSAA = 0
753
- QUALITY_OPENGL_2X_SSAA = 2
754
- QUALITY_OPENGL_4X_SSAA = 4
755
- QUALITY_OPENGL_8X_SSAA = 8
770
+ QUALITY_OPENGL_NO_SSAA = 0
771
+ QUALITY_OPENGL_2X_SSAA = 2
772
+ QUALITY_OPENGL_4X_SSAA = 4
773
+ QUALITY_OPENGL_8X_SSAA = 8
756
774
  QUALITY_OPENGL_16X_SSAA = 16
757
- QUALITY_POVRAY_NO_SSAA = 0 + 1
758
- QUALITY_POVRAY_2X_SSAA = 2 + 1
759
- QUALITY_POVRAY_4X_SSAA = 4 + 1
760
- QUALITY_POVRAY_8X_SSAA = 8 + 1
775
+ QUALITY_POVRAY_NO_SSAA = 0 + 1
776
+ QUALITY_POVRAY_2X_SSAA = 2 + 1
777
+ QUALITY_POVRAY_4X_SSAA = 4 + 1
778
+ QUALITY_POVRAY_8X_SSAA = 8 + 1
761
779
  QUALITY_POVRAY_16X_SSAA = 16 + 1
762
780
 
763
781
  # Drawable
764
782
  DRAWABLE_OPENGL = 1
765
- DRAWABLE_GKS = 2
783
+ DRAWABLE_GKS = 2
766
784
 
767
785
  # SurfaceOption
768
786
  SURFACE_DEFAULT = 0