ruby-gr 0.0.26 → 0.58.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fd24ca7e167933c74ba77c3185be37e322665f41c4e94d547789d28f7b282d7a
4
- data.tar.gz: a3f53215287be5208e2217bc83fc033030aa2067cb438e46343b85b33357adab
3
+ metadata.gz: f620965108eafb5f65fc8b1c946db5abea180708db175b88246a2ecd97a66b53
4
+ data.tar.gz: 8ff0c1b787c4b3e70a29ace39eb2fb39abaf60d71afc05b4b382edfcb6f570fa
5
5
  SHA512:
6
- metadata.gz: f661c8aa91cb27046f66590643a372391c5d9fa1703146b891137f1a0639c3671243679d4f14697e304e737d17408a5c880c8e2399278285b02fddfe08a18e8a
7
- data.tar.gz: 32945088f9c0cbf22a8525c36f0dd527fcd5d81a763986a334736331b1d0ad9013d9f6b89a3202118427a85021b261bd0b35caad6690d38e8969efe0299c7c60
6
+ metadata.gz: cb816d775831c8e05f43e0ded3d15a22328ff0b7e5810c484782393b4fe06ee5aa03fbf431b3cbbe6c8bac2763b07ef377e42dd5d9024da1aec819251b264951
7
+ data.tar.gz: 9e12f1fa434d64b1f202a3198afa30be70ee1b4961493cde92d308134b146703ff21e2e1915cd01ed286f476f7e6900425aaa5ebdc8f1b33fd550a3d3567a14f
data/README.md CHANGED
@@ -123,8 +123,6 @@ Some GR module methods are overwritten.
123
123
  [`imshow`](../../wiki/Plotting-functions#imshow)
124
124
  [`isosurface`](../../wiki/Plotting-functions#isosurface)
125
125
 
126
- We are preparing a [more object-oriented interface](https://github.com/kojix2/GRUtils.rb) based on [GRUtils.jl](https://github.com/heliosdrm/GRUtils.jl) in the future.
127
-
128
126
  #### GR - A module for calling native GR functions.
129
127
 
130
128
  2-D Plots and common 3-D Plots.
@@ -148,6 +146,16 @@ require 'gr3'
148
146
  GR3.cameralookat(-3, 2, -2, 0, 0, 0, 0, 0, -1)
149
147
  ```
150
148
 
149
+ ### Using GR.rb non-interactively
150
+
151
+ Both APIs will by default start a Qt based window to show the result of the last call.
152
+ This behavior is caused by GR itself as it will [implicitly generate output to a file or application](https://gr-framework.org/workstations.html#no-output).
153
+ If you want to use GR.rb non-interactively, eg., as part of a static site build, you can do this by setting the environment variable `GKS_WSTYPE`to `100`.
154
+
155
+ ```sh
156
+ export GKS_WSTYPE=100
157
+ ```
158
+
151
159
  ## Documentation
152
160
 
153
161
  - [GR.rb Wiki](https://github.com/red-data-tools/GR.rb/wiki)
@@ -168,7 +176,7 @@ Set environment variable GRDIR.
168
176
  export GRDIR="your/path/to/gr"
169
177
  ```
170
178
 
171
- * macOS Catalina and macOS Mojave: See the "How to open an app that hasn’t been notarized or is from an unidentified developer" section under [Safely open apps on your Mac](https://support.apple.com/en-us/HT202491) in the Apple documentation.
179
+ macOS : Please the section "How to open apps from un-notarized or unidentified developers" in the Apple documentation ["Safely open apps on your Mac"](https://support.apple.com/en-us/HT202491).
172
180
 
173
181
  ### Using package managers
174
182
 
@@ -180,10 +188,9 @@ export GRDIR="your/path/to/gr"
180
188
 
181
189
  ```sh
182
190
  brew install libgr
183
- # brew install --build-from-source libgr
191
+ export GKS_WSTYPE=411 # gksqt (recommended)
184
192
  ```
185
193
 
186
-
187
194
  #### Linux - APT
188
195
 
189
196
  [packages.red-data-tools.org](https://github.com/red-data-tools/packages.red-data-tools.org) provides `libgr-dev`, `libgr3-dev` and `libgrm-dev`
@@ -192,7 +199,8 @@ Debian GNU/Linux and Ubuntu
192
199
 
193
200
  ```sh
194
201
  sudo apt install -y -V ca-certificates lsb-release wget
195
- wget https://packages.red-data-tools.org/$(lsb_release --id --short | tr 'A-Z' 'a-z')/red-data-tools-apt-source-latest-$(lsb_release --codename --short).deb
202
+ wget https://packages.red-data-tools.org/$(lsb_release --id --short | tr 'A-Z' 'a-z'\
203
+ )/red-data-tools-apt-source-latest-$(lsb_release --codename --short).deb
196
204
  sudo apt install -y -V ./red-data-tools-apt-source-latest-$(lsb_release --codename --short).deb
197
205
  sudo apt update
198
206
  sudo apt install libgrm-dev
@@ -207,14 +215,10 @@ CentOS
207
215
  sudo dnf install -y gr-devel
208
216
  ```
209
217
 
210
- ### Windows - MSYS2
218
+ #### Windows - MSYS2
211
219
 
212
220
  If you are using Rubyinstaller, pacman will automatically install [mingw-w64-gr](https://packages.msys2.org/base/mingw-w64-gr) when the gem is installed.
213
221
 
214
- ## Backend for Charty
215
-
216
- GR.rb will be the default backend for [Charty](https://github.com/red-data-tools/charty).
217
-
218
222
  ## Contributing
219
223
 
220
224
  GR.rb is a library under development, so even small improvements like fixing typos are welcome!
@@ -227,6 +231,22 @@ Please feel free to send us your PR.
227
231
  * Update GR packages ( Homebrew, MinGW, red-data-tools )
228
232
  * Create visualization tools based on GR.rb
229
233
 
234
+ To get started with development:
235
+
236
+ ```sh
237
+ git clone https://github.com/red-data-tools/GR.rb
238
+ cd GR.rb
239
+ bundle install
240
+ bundle exec rake test
241
+ ```
242
+
243
+ * [I'm new to Ruby](https://github.com/red-data-tools/GR.rb/wiki/I%27m-new-to-Ruby)
244
+
245
+ ## Future plans
246
+
247
+ * GR.rb will be the default backend for [Charty](https://github.com/red-data-tools/charty).
248
+ * [Object-oriented interface](https://github.com/kojix2/GRUtils.rb) based on [GRUtils.jl](https://github.com/heliosdrm/GRUtils.jl).
249
+
230
250
  ## Acknowledgements
231
251
 
232
252
  We would like to thank Josef Heinen, the creator of [GR](https://github.com/sciapp/gr) and [GR.jl](https://github.com/jheinen/GR.jl), Florian Rhiem, the creator of [python-gr](https://github.com/sciapp/python-gr), and all [GR](https://github.com/sciapp/gr) developers.
data/lib/gr.rb CHANGED
@@ -58,7 +58,7 @@ module GR
58
58
 
59
59
  # Platforms | path
60
60
  # Windows | bin/libgr.dll
61
- # MacOSX | lib/libGR.so (v0.53.0 .so)
61
+ # MacOSX | lib/libGR.dylib ( <= v0.53.0 .so)
62
62
  # Ubuntu | lib/libGR.so
63
63
  platform = RbConfig::CONFIG['host_os']
64
64
  lib_names, pkg_name = \
@@ -70,6 +70,9 @@ module GR
70
70
  else
71
71
  [['libGR.so'], 'gr']
72
72
  end
73
+
74
+ # On Windows + RubyInstaller,
75
+ # the environment variable GKS_FONTPATH will be set.
73
76
  lib_path = GRCommons::GRLib.search(lib_names, pkg_name)
74
77
 
75
78
  raise NotFoundError, "#{lib_names} not found" if lib_path.nil?
@@ -178,7 +181,7 @@ module GR
178
181
  # @param x [Array, NArray] A list containing the X coordinates
179
182
  # @param y [Array, NArray] A list containing the Y coordinates
180
183
  # @param linewidth [Array, NArray, Numeric] A list containing the line widths
181
- # @param line_z [Array, NArray] A list to be converted to colors
184
+ # @param line_z [Array, NArray, Numeric] A list to be converted to colors
182
185
  #
183
186
  # The values for x and y are in world coordinates.
184
187
  # The attributes that control the appearance of a polyline are linetype,
@@ -190,13 +193,24 @@ module GR
190
193
  if linewidth.nil? && line_z.nil?
191
194
  super(n, x, y)
192
195
  else
193
- linewidth = Array.new(n, linewidth) if linewidth.is_a?(Numeric)
194
- linewidth.map! { |i| (100 * i).round }
195
- line_z ||= Array.new(n, 0)
196
- raise ArgumentError if n != equal_length(linewidth, line_z)
197
-
198
- color = to_rgb_color(line_z)
199
- gdp(x, y, GDP_DRAW_LINES, linewidth.zip(color).flatten)
196
+ linewidth ||= GR.inqlinewidth
197
+ linewidth = if linewidth.is_a?(Numeric)
198
+ Array.new(n, linewidth * 100)
199
+ else
200
+ raise ArgumentError if n != linewidth.length
201
+
202
+ linewidth.map { |i| (100 * i).round }
203
+ end
204
+ line_z ||= GR.inqcolor(989) # FIXME
205
+ color = if line_z.is_a?(Numeric)
206
+ Array.new(n, line_z)
207
+ else
208
+ raise ArgumentError if n != line_z.length
209
+
210
+ to_rgb_color(line_z)
211
+ end
212
+ z = linewidth.to_a.zip(color).flatten # to_a : NArray
213
+ gdp(x, y, GDP_DRAW_LINES, z)
200
214
  end
201
215
  end
202
216
 
@@ -205,7 +219,7 @@ module GR
205
219
  # @param x [Array, NArray] A list containing the X coordinates
206
220
  # @param y [Array, NArray] A list containing the Y coordinates
207
221
  # @param markersize [Array, NArray, Numeric] A list containing the marker sizes
208
- # @param marker_z [Array, NArray] A list to be converted to colors
222
+ # @param marker_z [Array, NArray, Numeric] A list to be converted to colors
209
223
  #
210
224
  # The values for x and y are in world coordinates.
211
225
  # The attributes that control the appearance of a polymarker are marker type,
@@ -217,13 +231,24 @@ module GR
217
231
  if markersize.nil? && marker_z.nil?
218
232
  super(n, x, y)
219
233
  else
220
- markersize = Array.new(n, markersize) if markersize.is_a?(Numeric)
221
- markersize.map! { |i| (100 * i).round }
222
- marker_z ||= Array.new(n, 0)
223
- raise ArgumentError if n != equal_length(markersize, marker_z)
224
-
225
- color = to_rgb_color(marker_z)
226
- gdp(x, y, GDP_DRAW_MARKERS, markersize.zip(color).flatten)
234
+ markersize ||= GR.inqmarkersize
235
+ markersize = if markersize.is_a?(Numeric)
236
+ Array.new(n, markersize * 100)
237
+ else
238
+ raise ArgumentError if n != markersize.length
239
+
240
+ markersize.map { |i| (100 * i).round }
241
+ end
242
+ marker_z ||= GR.inqcolor(989) # FIXME
243
+ color = if marker_z.is_a?(Numeric)
244
+ Array.new(n, marker_z)
245
+ else
246
+ raise ArgumentError if n != marker_z.length
247
+
248
+ to_rgb_color(marker_z)
249
+ end
250
+ z = markersize.to_a.zip(color).flatten # to_a : NArray
251
+ gdp(x, y, GDP_DRAW_MARKERS, z)
227
252
  end
228
253
  end
229
254
 
@@ -308,9 +333,9 @@ module GR
308
333
  # raidus. The center point of the resulting disk is located at `xorg`, `yorg`
309
334
  # and the radius of the disk is `rmax`.
310
335
  #
311
- # @param xorg [Numeric] X coordinate of the disk center in world
336
+ # @param x_org [Numeric] X coordinate of the disk center in world
312
337
  # coordinates
313
- # @param yorg [Numeric] Y coordinate of the disk center in world
338
+ # @param y_org [Numeric] Y coordinate of the disk center in world
314
339
  # coordinates
315
340
  # @param phimin [Numeric] start angle of the disk sector in degrees
316
341
  # @param phimax [Numeric] end angle of the disk sector in degrees
@@ -318,7 +343,7 @@ module GR
318
343
  # coordinates
319
344
  # @param rmax [Numeric] outer radius of the punctured disk in world
320
345
  # coordinates
321
- # @param dimiphi [Integer] Phi (X) dimension of the color index array
346
+ # @param dimphi [Integer] Phi (X) dimension of the color index array
322
347
  # @param dimr [Integer] iR (Y) dimension of the color index array
323
348
  # @param color [Array, NArray] Color index array
324
349
  #
@@ -1355,7 +1380,7 @@ module GR
1355
1380
  # @param x [Array, NArray] A list containing the X coordinates
1356
1381
  # @param y [Array, NArray] A list containing the Y coordinates
1357
1382
  # @param z [Array, NArray] A list containing the Z coordinates
1358
- # @param lavels [Array, NArray] A list of contour levels
1383
+ # @param levels [Array, NArray] A list of contour levels
1359
1384
  #
1360
1385
  def tricontour(x, y, z, levels)
1361
1386
  npoints = x.length # equal_length ?
@@ -1414,6 +1439,16 @@ module GR
1414
1439
  super(n, r, g, b, positions)
1415
1440
  end
1416
1441
 
1442
+ # Inquire the color index range of the current colormap.
1443
+ #
1444
+ # @return [Array] first_color_ind The color index of the first color,
1445
+ # last_color_ind The color index of the last color
1446
+ def inqcolormapinds
1447
+ inquiry %i[int int] do |first_color_ind, last_color_ind|
1448
+ super(first_color_ind, last_color_ind)
1449
+ end
1450
+ end
1451
+
1417
1452
  # @!method colorbar
1418
1453
 
1419
1454
  def inqcolor(color)
@@ -1601,14 +1636,14 @@ module GR
1601
1636
  # curves.
1602
1637
  #
1603
1638
  # @param points [Array, NArray] (N, 2) array of (x, y) vertices
1604
- # @parm codes [Array, NArray] N-length array of path codes
1639
+ # @param codes [Array, NArray] N-length array of path codes
1605
1640
  # * STOP : end the entire path
1606
1641
  # * MOVETO : move to the given vertex
1607
1642
  # * LINETO : draw a line from the current position to the given vertex
1608
1643
  # * CURVE3 : draw a quadratic Bézier curve
1609
1644
  # * CURVE4 : draw a cubic Bézier curve
1610
1645
  # * CLOSEPOLY : draw a line segment to the start point of the current path
1611
- # @parm fill [Integer]
1646
+ # @param fill [Integer]
1612
1647
  # A flag indication whether resulting path is to be filled or not
1613
1648
  #
1614
1649
  def drawpath(points, codes, fill)
data/lib/gr/ffi.rb CHANGED
@@ -117,6 +117,7 @@ module GR
117
117
  try_extern 'void gr_setcolormap(int)'
118
118
  try_extern 'void gr_inqcolormap(int *)'
119
119
  try_extern 'void gr_setcolormapfromrgb(int n, double *r, double *g, double *b, double *x)'
120
+ try_extern 'void gr_inqcolormapinds(int *, int *)'
120
121
  try_extern 'void gr_colorbar(void)'
121
122
  try_extern 'void gr_inqcolor(int, int *)'
122
123
  try_extern 'int gr_inqcolorfromrgb(double, double, double)'
data/lib/gr/plot.rb CHANGED
@@ -39,11 +39,11 @@ module GR
39
39
  # Keyword options conform to GR.jl.
40
40
  KW_ARGS = %i[accelerate algorithm alpha ax backgroundcolor barwidth baseline
41
41
  clabels clear clim color colormap crange figsize font grid
42
- horizontal isovalue kind label labels levels location nbins
43
- ratio rotation scale size spec subplot tilt title update xaxis
44
- xflip xform xlabel xlim xlog xrange xticks yaxis yflip ylabel
45
- ylim ylog zflip yrange yticks viewport vp where window zaxis
46
- zlabel zlim zlog zrange zticks].freeze
42
+ horizontal isovalue kind label labels levels linewidth location
43
+ nbins ratio rotation scale size spec subplot tilt title update
44
+ xaxis xflip xform xlabel xlim xlog xrange xticks yaxis yflip
45
+ ylabel ylim ylog zflip yrange yticks viewport vp where window
46
+ zaxis zlabel zlim zlog zrange zticks].freeze
47
47
 
48
48
  FONTS = {
49
49
  times_roman: 101,
@@ -152,15 +152,20 @@ module GR
152
152
  vp1, vp2, vp3, vp4 = vp
153
153
  end
154
154
 
155
- viewport = [vp1 + 0.125 * (vp2 - vp1),
156
- vp1 + 0.925 * (vp2 - vp1),
157
- vp3 + 0.125 * (vp4 - vp3),
158
- vp3 + 0.925 * (vp4 - vp3)]
159
-
160
- if %i[contour contourf hexbin heatmap nonuniformheatmap polarheatmap
161
- nonuniformpolarheatmap surface trisurf volume].include?(kind)
162
- viewport[1] -= 0.1
163
- end
155
+ left_margin = kvs.has_key?(:ylabel) ? 0.05 : 0
156
+ right_margin = if %i[contour contourf hexbin heatmap nonuniformheatmap polarheatmap
157
+ nonuniformpolarheatmap surface trisurf volume].include?(kind)
158
+ (vp2 - vp1) * 0.1
159
+ else
160
+ 0
161
+ end
162
+ bottom_margin = kvs.has_key?(:xlabel) ? 0.05 : 0
163
+ top_margin = kvs.has_key?(:title) ? 0.075 : 0
164
+
165
+ viewport = [vp1 + (0.075 + left_margin) * (vp2 - vp1),
166
+ vp1 + (0.95 - right_margin) * (vp2 - vp1),
167
+ vp3 + (0.075 + bottom_margin) * (vp4 - vp3),
168
+ vp3 + (0.975 - top_margin) * (vp4 - vp3)]
164
169
 
165
170
  if %i[line step scatter stem].include?(kind) && kvs[:labels]
166
171
  location = kvs[:location] || 1
@@ -218,7 +223,7 @@ module GR
218
223
  kvs[:xrange] = [xmin, xmax]
219
224
  kvs[:yrange] = [ymin, ymax]
220
225
  else
221
- minmax
226
+ minmax(kind)
222
227
  end
223
228
 
224
229
  major_count = if %i[wireframe surface plot3 scatter3 polar polarhist
@@ -246,7 +251,7 @@ module GR
246
251
  if kvs.has_key?(:xticks)
247
252
  kvs[:xticks]
248
253
  else
249
- [GR.tick(xmin, xmax) / major_count, major_count]
254
+ [auto_tick(xmin, xmax) / major_count, major_count]
250
255
  end
251
256
  else
252
257
  [1, 1]
@@ -275,7 +280,7 @@ module GR
275
280
  if kvs.has_key?(:yticks)
276
281
  kvs[:yticks]
277
282
  else
278
- [GR.tick(ymin, ymax) / major_count, major_count]
283
+ [auto_tick(ymin, ymax) / major_count, major_count]
279
284
  end
280
285
  else
281
286
  [1, 1]
@@ -290,7 +295,7 @@ module GR
290
295
  if kvs.has_key?(:zticks)
291
296
  kvs[:zticks]
292
297
  else
293
- [GR.tick(zmin, zmax) / major_count, major_count]
298
+ [auto_tick(zmin, zmax) / major_count, major_count]
294
299
  end
295
300
  else
296
301
  [1, 1]
@@ -300,15 +305,16 @@ module GR
300
305
  end
301
306
 
302
307
  kvs[:window] = xmin, xmax, ymin, ymax
303
- if %i[polar polarhist polarheatmap nonuniformpolarheatmap].include?(kind)
308
+ if %i[polar polarhist polarheatmap nonuniformpolarheatmap trisurf].include?(kind)
304
309
  GR.setwindow(-1, 1, -1, 1)
305
310
  else
306
311
  GR.setwindow(xmin, xmax, ymin, ymax)
307
312
  end
308
313
  if %i[wireframe surface plot3 scatter3 trisurf volume].include?(kind)
309
314
  rotation = kvs[:rotation] || 40
310
- tilt = kvs[:tilt] || 70
311
- GR.setspace(zmin, zmax, rotation, tilt)
315
+ tilt = kvs[:tilt] || 60
316
+ GR.setwindow3d(xmin, xmax, ymin, ymax, zmin, zmax)
317
+ GR.setspace3d(-rotation, tilt, 30, 0)
312
318
  end
313
319
 
314
320
  kvs[:scale] = scale
@@ -327,10 +333,10 @@ module GR
327
333
  GR.setlinecolorind(1)
328
334
  diag = Math.sqrt((viewport[1] - viewport[0])**2 + (viewport[3] - viewport[2])**2)
329
335
  GR.setlinewidth(1)
330
- charheight = [0.018 * diag, 0.012].max
331
- GR.setcharheight(charheight)
332
336
  ticksize = 0.0075 * diag
333
337
  if %i[wireframe surface plot3 scatter3 trisurf volume].include?(kind)
338
+ charheight = [0.024 * diag, 0.012].max
339
+ GR.setcharheight(charheight)
334
340
  ztick, zorg, majorz = kvs[:zaxis]
335
341
  if pass == 1 && drawgrid
336
342
  GR.grid3d(xtick, 0, ztick, xorg[0], yorg[1], zorg[0], 2, 0, 2)
@@ -340,6 +346,8 @@ module GR
340
346
  GR.axes3d(0, ytick, 0, xorg[1], yorg[0], zorg[0], 0, majory, 0, ticksize)
341
347
  end
342
348
  else
349
+ charheight = [0.018 * diag, 0.012].max
350
+ GR.setcharheight(charheight)
343
351
  if %i[heatmap nonuniformheatmap shade].include?(kind)
344
352
  ticksize = -ticksize
345
353
  elsif drawgrid
@@ -422,7 +430,7 @@ module GR
422
430
  GR.setcharheight(charheight)
423
431
  GR.setlinetype(GR::LINETYPE_SOLID)
424
432
 
425
- tick = 0.5 * GR.tick(rmin, rmax)
433
+ tick = auto_tick(rmin, rmax)
426
434
  n = ((rmax - rmin) / tick + 0.5).round
427
435
  (n + 1).times do |i|
428
436
  r = i.to_f / n
@@ -584,7 +592,7 @@ module GR
584
592
  charheight = [0.016 * diag, 0.012].max
585
593
  GR.setcharheight(charheight)
586
594
  if kvs[:scale] & GR::OPTION_Z_LOG == 0
587
- ztick = 0.5 * GR.tick(zmin, zmax)
595
+ ztick = auto_tick(zmin, zmax)
588
596
  GR.axes(0, ztick, 1, zmin, 0, 1, 0.005)
589
597
  else
590
598
  GR.setscale(GR::OPTION_Y_LOG)
@@ -661,8 +669,12 @@ module GR
661
669
 
662
670
  when :line
663
671
  mask = GR.uselinespec(spec)
664
- GR.polyline(x, y) if hasline(mask)
665
- GR.polymarker(x, y) if hasmarker(mask)
672
+ linewidth = kvs[:linewidth]
673
+ # Slightly different from Julia,
674
+ # Because the implementation of polyline and polymarker is different.
675
+ z ||= linewidth # FIXME
676
+ GR.polyline(x, y, z, c) if hasline(mask)
677
+ GR.polymarker(x, y, z, c) if hasmarker(mask)
666
678
 
667
679
  when :step
668
680
  mask = GR.uselinespec(spec)
@@ -698,20 +710,9 @@ module GR
698
710
 
699
711
  when :scatter
700
712
  GR.setmarkertype(GR::MARKERTYPE_SOLID_CIRCLE)
701
- if z || c
702
- if c
703
- cmin, cmax = kvs[:crange]
704
- c = c.map { |i| normalize_color(i, cmin, cmax) }
705
- cind = c.map { |i| (1000 + i * 255).round }
706
- end
707
- x.length.times do |i|
708
- GR.setmarkersize(z[i] / 100.0) if z
709
- GR.setmarkercolorind(cind[i]) if c
710
- GR.polymarker([x[i]], [y[i]])
711
- end
712
- else
713
- GR.polymarker(x, y)
714
- end
713
+ z = z&.map { |i| i * 0.01 }
714
+ c = c&.map { |i| normalize_color(i, *kvs[:crange]) }
715
+ GR.polymarker(x, y, z, c)
715
716
 
716
717
  when :stem
717
718
  GR.setlinecolorind(1)
@@ -775,7 +776,7 @@ module GR
775
776
  GR.polarcellarray(0, 0, 0, 360, 0, 1, w, h, colors)
776
777
  when :nonuniformpolarheatmap
777
778
  ymax = y.max.to_f
778
- ρ = y.map{|i| i / ymax}
779
+ ρ = y.map { |i| i / ymax }
779
780
  θ = x.map { |i| i * 180 / Math::PI }
780
781
  GR.nonuniformpolarcellarray(θ, ρ, w, h, colors)
781
782
  end
@@ -800,7 +801,7 @@ module GR
800
801
  zmin = kvs[:zlim].first if kvs[:zlim].first
801
802
  zmax = kvs[:zlim].last if kvs[:zlim].last
802
803
  end
803
-
804
+ GR.setprojectiontype(0)
804
805
  GR.setspace(zmin, zmax, 0, 90)
805
806
  levels = kvs[:levels] || 0
806
807
  clabels = kvs[:clabels] || false
@@ -1108,8 +1109,8 @@ module GR
1108
1109
 
1109
1110
  # Normalize a color c with the range [cmin, cmax]
1110
1111
  # 0 <= normalize_color(c, cmin, cmax) <= 1
1111
- # Note: narray.map{|i| normalize_color(i)} There's room for speedup.
1112
1112
  def normalize_color(c, cmin, cmax)
1113
+ # NOTE: narray.map{|i| normalize_color(i)} There's room for speedup.
1113
1114
  c = c.to_f # if c is Integer
1114
1115
  c = c.clamp(cmin, cmax) - cmin
1115
1116
  c /= (cmax - cmin) if cmin != cmax
@@ -1146,7 +1147,7 @@ module GR
1146
1147
  [a, b]
1147
1148
  end
1148
1149
 
1149
- def minmax
1150
+ def minmax(kind)
1150
1151
  xmin = ymin = zmin = cmin = Float::INFINITY
1151
1152
  xmax = ymax = zmax = cmax = -Float::INFINITY
1152
1153
  scale = kvs[:scale]
@@ -1159,6 +1160,8 @@ module GR
1159
1160
  x0, x1 = x.minmax
1160
1161
  xmin = [x0, xmin].min
1161
1162
  xmax = [x1, xmax].max
1163
+ elsif kind == :volume
1164
+ xmin, xmax = -1, 1
1162
1165
  else
1163
1166
  xmin = 0
1164
1167
  xmax = 1
@@ -1170,6 +1173,8 @@ module GR
1170
1173
  y0, y1 = y.minmax
1171
1174
  ymin = [y0, ymin].min
1172
1175
  ymax = [y1, ymax].max
1176
+ elsif kind == :volume
1177
+ ymin, ymax = -1, 1
1173
1178
  else
1174
1179
  ymin = 0
1175
1180
  ymax = 1
@@ -1211,6 +1216,21 @@ module GR
1211
1216
  end
1212
1217
  end
1213
1218
 
1219
+ def to_wc(wn)
1220
+ xmin, ymin = GR.ndctowc(wn[0], wn[2])
1221
+ xmax, ymax = GR.ndctowc(wn[1], wn[3])
1222
+ [xmin, xmax, ymin, ymax]
1223
+ end
1224
+
1225
+ def auto_tick(amin, amax)
1226
+ scale = 10.0**Math.log10(amax - amin).truncate
1227
+ tick_size = [5.0, 2.0, 1.0, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01]
1228
+ i = tick_size.find_index do |tsize|
1229
+ ((amax - amin) / scale / tsize) > 7 # maximum number of tick marks
1230
+ end
1231
+ tick = tick_size[i - 1] * scale
1232
+ end
1233
+
1214
1234
  def legend_size
1215
1235
  scale = GR.inqscale
1216
1236
  GR.selntran(0)
data/lib/gr3.rb CHANGED
@@ -68,7 +68,7 @@ module GR3
68
68
 
69
69
  # Platforms | path
70
70
  # Windows | bin/libGR3.dll
71
- # MacOSX | lib/libGR3.dylib (v0.53.0 .so)
71
+ # MacOSX | lib/libGR3.dylib ( <= v0.53.0 .so)
72
72
  # Ubuntu | lib/libGR3.so
73
73
  platform = RbConfig::CONFIG['host_os']
74
74
  lib_names, pkg_name = \
@@ -80,6 +80,9 @@ module GR3
80
80
  else
81
81
  [['libGR3.so'], 'gr3']
82
82
  end
83
+
84
+ # On Windows + RubyInstaller,
85
+ # the environment variable GKS_FONTPATH will be set.
83
86
  lib_path = GRCommons::GRLib.search(lib_names, pkg_name)
84
87
 
85
88
  raise NotFoundError, "#{lib_names} not found" if lib_path.nil?
@@ -23,45 +23,66 @@ module GRCommons
23
23
  # - mingw-w64-gr
24
24
  module GRLib
25
25
  class << self
26
+ # Check if using RubyInstaller or not.
27
+ def ruby_installer?
28
+ Object.const_defined?(:RubyInstaller)
29
+ end
30
+
31
+ # Return the directory path from the GRDIR environment variable.
32
+ def get_grdir_from_env(lib_names)
33
+ return nil unless ENV['GRDIR']
34
+ return ENV['GRDIR'] if Dir.exist?(ENV['GRDIR'])
35
+
36
+ warn "#{lib_names} : Dir GRDIR=#{ENV['GRDIR']} not found." # return nil
37
+ end
38
+
26
39
  # Search the shared library.
27
40
  # @note This method does not detect the Operating System.
28
41
  #
29
42
  # @param lib_names [Array] The actual file name of the shared library.
30
43
  # @param pkg_name [String] The package name to be used when searching with pkg-configg
31
44
  def search(lib_names, pkg_name)
45
+ # FIXME: There may be a better way to do it...
32
46
  def lib_names.map_find(&block)
33
47
  lazy.map(&block).find { |path| path }
34
48
  end
49
+
50
+ # ENV['GRDIR']
51
+ # Verify that the directory exists.
52
+ grdir = get_grdir_from_env(lib_names)
53
+
35
54
  # Windows + RubyInstaller
36
- if Object.const_defined?(:RubyInstaller)
37
- dir = ENV['GRDIR'] || [
38
- RubyInstaller::Runtime.msys2_installation.msys_path,
39
- RubyInstaller::Runtime.msys2_installation.mingwarch
40
- ].join(File::ALT_SEPARATOR)
41
- lib_names.lazy.map do |lib_name|
42
- recursive_search(lib_name, dir)
43
- end.find { |i| i }.tap do |path|
44
- RubyInstaller::Runtime.add_dll_directory(File.dirname(path)) if path
45
- end
46
- # ENV['GRDIR'] (Linux, Mac, Windows)
47
- elsif ENV['GRDIR']
48
- # Search for XXX.dylib and then XXX.so on macOS
49
- lib_names.map_find do |lib_name|
50
- recursive_search(lib_name, ENV['GRDIR'])
51
- end || lib_names.map_find do |lib_name|
52
- pkg_config_search(lib_name, pkg_name)
53
- end
54
- else
55
- lib_names.map_find do |lib_name|
56
- pkg_config_search(lib_name, pkg_name)
55
+ if ruby_installer?
56
+ grdir ||= File.join(RubyInstaller::Runtime.msys2_installation.msys_path,
57
+ RubyInstaller::Runtime.msys2_installation.mingwarch)
58
+ end
59
+
60
+ # Search grdir
61
+ if grdir
62
+ lib_path = lib_names.map_find do |lib_name|
63
+ recursive_search(lib_name, grdir)
57
64
  end
58
65
  end
66
+
67
+ # Search with pkg-config
68
+ lib_path ||= lib_names.map_find do |lib_name|
69
+ pkg_config_search(lib_name, pkg_name)
70
+ end
71
+
72
+ # Windows + RubyInstaller
73
+ if ruby_installer?
74
+ RubyInstaller::Runtime.add_dll_directory(File.dirname(lib_path))
75
+ # FIXME: Where should I write this code?
76
+ ENV['GKS_FONTPATH'] ||= grdir
77
+ end
78
+
79
+ lib_path
59
80
  end
60
81
 
61
82
  # Recursive file search in directories
62
83
  # @param name [String] File to search for
63
84
  # @param base_dir [String] Directory to search
64
- # @retrun path [String, NilClass] Returns the first path found.
85
+ # @return path [String, NilClass] Returns the first path found.
65
86
  # If not found, nil is returned.
66
87
  def recursive_search(name, base_dir)
67
88
  Dir.chdir(base_dir) do
@@ -5,10 +5,11 @@
5
5
  # It should not be loaded when gr_commons/gr_commons is loaded.
6
6
 
7
7
  require 'logger'
8
- require 'rainbow'
9
- require 'awesome_print'
8
+ require 'pp'
10
9
 
11
10
  module GRCommons
11
+ # Convenience class methods
12
+
12
13
  class << self
13
14
  # Create a new GRLogger
14
15
  # @param out [String]
@@ -16,30 +17,35 @@ module GRCommons
16
17
  # @example
17
18
  # require 'gr_commons/gr_logger'
18
19
  # GRCommons.gr_log("log.txt")
20
+
19
21
  def gr_log(out = $stderr)
20
22
  GRCommons::GRLogger.new(out)
21
23
  end
22
24
 
23
25
  # Return the last created GRLogger
24
26
  # @return [GRLogger]
27
+
25
28
  def gr_logger
26
29
  GRCommons::GRLogger.logger
27
30
  end
28
31
  end
29
32
 
30
- # Outputs function calls to GR Framework to a log file.
31
- # Mainly used for debugging.
32
- # @note This module is for those who want to see low-level function calls in GR.
33
+ # If GR.rb call native functions of the GR framework,
34
+ # it will be recorded in the log file.
35
+ #
36
+ # @note Mainly used by developers for debugging.
33
37
  #
34
38
  # = How it works 
35
- # prepend a module named Inspector to the singular class
36
- # of the FFI module. It will inspects the GR function call of the FFI module
39
+ # It prepend a module named Inspector to the singular class of the FFI module.
40
+ # It will inspects the GR function call of the FFI module
37
41
  #
38
42
  # @example
39
43
  # require 'gr_commons/gr_logger'
40
- # GRCommons.gr_log("log.txt")
44
+ # GRCommons::GRLogger.new("log.txt")
45
+
41
46
  class GRLogger < Logger
42
47
  # Return the last created GRLogger
48
+
43
49
  def self.logger
44
50
  @@logger ||= GRCommons::GRLogger.new
45
51
  end
@@ -51,13 +57,15 @@ module GRCommons
51
57
  end
52
58
  end
53
59
 
60
+ # GR
61
+
54
62
  if Object.const_defined?(:GR)
55
63
  module GR
56
64
  module FFI
57
65
  module Inspector
58
66
  GR::FFI.ffi_methods.each do |s|
59
67
  define_method(s) do |*args|
60
- GRCommons.gr_logger.info "GR::FFI.#{s}\n" + args.ai + "\n"
68
+ GRCommons.gr_logger.info "GR::FFI.#{s}\n#{args.pretty_inspect}\n"
61
69
  super(*args)
62
70
  end
63
71
  end
@@ -69,13 +77,15 @@ if Object.const_defined?(:GR)
69
77
  end
70
78
  end
71
79
 
80
+ # GR3
81
+
72
82
  if Object.const_defined?(:GR3)
73
83
  module GR3
74
84
  module FFI
75
85
  module Inspector
76
86
  GR3::FFI.ffi_methods.each do |s|
77
87
  define_method(s) do |*args|
78
- GRCommons.gr_logger.info "GR3::FFI.#{s}\n" + args.ai + "\n"
88
+ GRCommons.gr_logger.info "GR3::FFI.#{s}\n#{args.pretty_inspect}\n"
79
89
  super(*args)
80
90
  end
81
91
  end
@@ -87,13 +97,15 @@ if Object.const_defined?(:GR3)
87
97
  end
88
98
  end
89
99
 
100
+ # GRM
101
+
90
102
  if Object.const_defined?(:GRM)
91
103
  module GRM
92
104
  module FFI
93
105
  module Inspector
94
106
  GRM::FFI.ffi_methods.each do |s|
95
107
  define_method(s) do |*args|
96
- GRCommons.gr_logger.info "GRM::FFI.#{s}\n" + args.ai + "\n"
108
+ GRCommons.gr_logger.info "GRM::FFI.#{s}\n#{args.pretty_inspect}\n"
97
109
  super(*args)
98
110
  end
99
111
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GRCommons
4
- VERSION = '0.0.26'
4
+ VERSION = '0.58.1.0'
5
5
  end
data/lib/grm.rb CHANGED
@@ -27,7 +27,7 @@ module GRM
27
27
 
28
28
  # Platforms | path
29
29
  # Windows | bin/libGRM.dll
30
- # MacOSX | lib/libGRM.dylib (v0.53.0 .so)
30
+ # MacOSX | lib/libGRM.dylib ( <= v0.53.0 .so)
31
31
  # Ubuntu | lib/libGRM.so
32
32
  platform = RbConfig::CONFIG['host_os']
33
33
  lib_names, pkg_name = \
@@ -39,6 +39,9 @@ module GRM
39
39
  else
40
40
  [['libGRM.so'], 'grm']
41
41
  end
42
+
43
+ # On Windows + RubyInstaller,
44
+ # the environment variable GKS_FONTPATH will be set.
42
45
  lib_path = GRCommons::GRLib.search(lib_names, pkg_name)
43
46
 
44
47
  raise NotFoundError, "#{lib_names} not found" if lib_path.nil?
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-gr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.26
4
+ version: 0.58.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - kojix2
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-04-05 00:00:00.000000000 Z
11
+ date: 2021-08-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: histogram
@@ -186,7 +186,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
186
186
  - !ruby/object:Gem::Version
187
187
  version: '0'
188
188
  requirements: []
189
- rubygems_version: 3.2.3
189
+ rubygems_version: 3.2.22
190
190
  signing_key:
191
191
  specification_version: 4
192
192
  summary: GR for Ruby