ruby-gr 0.0.26 → 0.58.1.0

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 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