IDL 9.1新特性
IDL 9.1版本具有以下新增功能和更新:
新增功能:
- Windows 小部件的深色模式
- 球谐变换
- GAUSS_QUAD_LEGENDRE 功能
- 读取和转换 float16/binary16 半精度浮点数
- 命令行进度条
- IDL_HASHVAR 功能
- 新的 SVG 图标
- RENDER_SVG 功能
- RENDER_ICON 功能
- SVG_ICON_BROWSER 例程
更新功能:
- VS Code 的 IDL 扩展
- HDF5 可以处理空数组
- HttpRequest 进度条
- IDL_String::replace 新的 Count 参数
- 对 NaN 和 Infinity 值的 JSON 支持
- LEGEND 填充颜色
- MapContinents Shapefile
- 多行工具提示
- PRINT/PRINTF 新的 NEWLINE 关键字
- Shapefile 增强
- TS_SMOOTH新的 NAN 关键字
- WIDGET_BROWSER 支持
- WIDGET_LABEL 和 WIDGET_TEXT 文本和背景颜色
- WIDGET_PROPERTYSHEET Top Header 关键字
- WIDGET_TEXT 对齐关键字
- WIDGET_TEXT FRAME = 0
- WRITE_PNG 压缩关键字
- Dataminer 安装
1 新功能
1.1 Windows 小部件的深色模式
在 Windows 上,IDL 小部件现在支持深色模式主题。您可以使用新的 IDL 首选项IDL_THEME 更改小部件主题,该首选项可以设置为 0 表示浅色模式(默认),设置为 1 表示深色模式。可以使用 IDL Workbench 中的首选项对话框或使用 PREF_SET 例程来设置主题首选项。新的只读系统变量 !THEME允许您确定首选项的当前值。
一些一般说明:
- 在 Windows 上,所有 IDL 小部件应用程序(包括 ENVI)都将遵循主题设置。
- 如果您更改主题,则必须重新启动 IDL 才能使更改生效。
- IDL 小组件主题独立于 Windows 系统主题设置。
- IDL Workbench 有自己的主题设置,与此设置无关。
- 直接图形窗口和对象图形窗口中的图形不受影响。
- Linux 和 Mac 平台将默认忽略主题首选项,并始终使用浅色模式。
1.2 球谐变换
IDL 现在具有用于执行正向和逆向球谐变换的内置函数。
SPHERE_HARM_FORWARD 函数使用 Gauss-Legendre 算法来计算球面坐标网格上二维输入数组的正向球面谐波变换。SPHERE_HARM_INVERSE 函数计算逆向球谐变换,并在球面坐标网格上返回结果。正向变换和逆向变换都是用 C 代码编写的,并且是多线程的,以实现最佳性能。
球谐变换是在全球数据集上分析波型的有用工具,广泛用于气象学和海洋学,以及地磁场和太阳磁场的研究。正向和逆向变换对于应用频谱滤波器也很有用。在这种情况下,执行正向变换,然后对频谱系数应用滤波函数,之后执行逆变换。
除了转换函数之外,IDL 现在还有两个新例程:SPHERE_HARM_FILTER 和 SPHERE_HARM_KERNEL。这些例程可用于对球面数据集进行光谱过滤,以保持波数长于特定阈值。
例如,这里我们加载一些 1884 年 12 月 1 日的气温数据,然后计算 T63 截断:
restore, filepath('reanl20v3_1dec1884_512x256dbl.sav', $
subdir=['examples', 'data'])
T63 = sphere_harm_filter(A, 63)
im = image(A, rgb_table = 75, layout=[1, 2, 1], $
dim=[550, 580], min = -30, max = 30)
im = image(T63, rgb_table = 75, /current, $
layout=[1, 2, 2])
这些例程基于 Mark Miesch、Marc DeRosa 和 Gilbert P. Compo 编写的原始变换和过滤例程,并经许可使用。有关更详细的示例以及数据来源和参考,请参阅 SPHERE_HARM_FORWARD。
1.3 GAUSS_QUAD_LEGENDRE 功能
新的 GAUSS_QUAD_LEGENDRE 函数计算高斯正交积分的 x 值(横坐标)和加权系数,其中 x 值是 N 阶勒让德多项式(Legendre polynomial)的根。GAUSS_QUAD_LEGENDRE基于剑桥大学出版社出版的 Numerical Recipes in C: The Art of Scientific Computing(第二版)第 4.5 节中描述的gauleg例程,并经许可使用。
1.4 读取和转换 float16/binary16 半精度浮点数
半精度浮点数的长度为 16 位,而单精度浮点数的长度为 32 位,双精度浮点数的长度为 64 位。这些数字的标准格式称为 float16(或 binary16),基于 IEEE 754 标准。尽管 IDL 没有原生支持16 位浮点数,但 IDL 现在可以读取和转换 float16 数字。READ_BINARY 函数有一个新的 FLOAT16 关键字,它会自动从文件中读取 float16 数字并将其转换为 32 位浮点数。此外,您还可以使用新的 FLOAT16_DECODE 和 FLOAT16_ENCODE 函数将 16 位无符号整数(float16 格式)与 32 位浮点数相互转换。
例如:
a = uint([0, 1, 0x8001, 0x3ff, 0x3c00, 0xbc00, 0x7bff, 0x7c00, 0xfc00, 0x7fff])
b = float16_decode(a)
help, b
print, b
IDL 打印:
B FLOAT = Array[10]
0.00000 5.96046e-08 -5.96046e-08 6.09756e-05 1.00000 -1.00000 65504.0 Inf -Inf NaN
现在转换回来:
c = float16_encode(b)
help, c
print, c, format='(10z)'
IDL 打印:
C UINT = Array[10]
0 1 8001 3ff 3c00 bc00 7bff 7c00 fc00 7fff
有关详细信息,请参阅 FLOAT16_DECODE、FLOAT16_ENCODE 和 READ_BINARY。
1.5 命令行进度条
新的 CLI_Progress 类在 IDL Workbench 控制台中或在终端中运行 IDL 时实现命令行进度条。例如:
length = 1000 ; for example, file length in bytes
cli_progress.initialize, title = 'Download', maximum = length, /remaining
for i=0,length do begin & $
cli_progress.update, i & $
wait,0.01 & $
endfor
在这里,进度条将从 0% 缓慢前进到 100%,类似于:
Download 46% [##################----------------------] 6m:27s
CLI_Progress 类具有用于控制条宽、字符、剩余时间以及标题和文本消息的选项。您还可以构建一个“乒乓”选取框进度条,其中进度指示器沿进度条来回弹跳。例如:
CLI_Progress.Initialize, ping_pong = !true, complete_char = "<IDL>"
for i = 0,114 do begin & $
CLI_Progress.Update & $
wait, 0.02 & $
endfor
<IDL> 这个词来回跳动:
[-----------------------------------<IDL>-----]
有关更多信息,请参阅 CLI_Progress 或访问 CLI_Progress 示例页面。
1.6 IDL_HASHVAR 功能
IDL 有一个新的 IDL_HASHVAR 函数,该函数接受任何 IDL 变量并返回表示该值的标量 32 位哈希代码。IDL_HASHVAR 函数用于创建简单的哈希码值,可用于将任意值转换为具有均匀分布的 32 位(四字节)哈希码。它还可以用于确定两个字符串是否相同,因为字符串中的微小差异(例如单个字符)将产生完全不同的哈希值。有关更多详细信息,请参阅 IDL_HASHVAR。
1.7 新的 SVG 图标
IDL 现在附带了 Font Awesome 项目中的 2000 多个新图标。这些图标可以在 IDL 发行版的以下目录中找到:
<IDL_DIR>/resource/bitmaps/svg/brands
<IDL_DIR>/resource/bitmaps/svg/regular
<IDL_DIR>/resource/bitmaps/svg/solid
您可以使用新SVG_ICON_BROWSER显示所有图标,也可以使用新的 RENDER_ICON 和 RENDER_SVG 函数来访问它们。所有这些图标均根据 Creative Commons Attribution 4.0 International License 分发,可以在您自己的应用程序中自由使用。
1.8 RENDER_SVG 功能
IDL 具有一个新的 RENDER_SVG 函数,该函数可以将 SVG 文件渲染为具有可选输出大小、背景色和前景色的位图图像。例如:
file = filepath('folder-open.svg', subdir=['resource', 'bitmaps', 'svg', 'regular'])
img = RENDER_SVG(file, width=128, height=128, background=0xCCCCCC, foreground=0xFF0000)
help, img
i = image(img)
IDL 打印:
IMG BYTE = Array[128, 128, 3]
1.9 RENDER_ICON 功能
IDL 具有一个新的 RENDER_ICON 函数,可从 IDL 中的 SVG 文件创建图标。例如:
w = widget_base(/row)
icon = RENDER_ICON("folder-open")
w1 = widget_base(w)
wb = widget_button(w1, value=icon, /bitmap)
icon = RENDER_ICON("folder-open", width=32, height=32)
w1 = widget_base(w)
wb = widget_button(w1, value=icon, /bitmap)
icon = RENDER_ICON("folder-open", width=64, height=64)
w1 = widget_base(w)
wb = widget_button(w1, value=icon, /bitmap)
widget_control, w, /realize
1.10 SVG_ICON_BROWSER 例程
IDL 增加了一个新的 SVG_ICON_BROWSER 例程,用于显示 IDL 附带的所有 2000+ 图标的缩略图。浏览器有一个过滤器,还会显示各个图标的示例代码,以及快速查看该图标在各种窗口小部件类型中的显示方式。有关详细信息,请参阅 SVG_ICON_BROWSER。
2 功能更新
2.1 VS Code 的 IDL 扩展
IDL 现在拥有了一个新的现代化开发环境,可在 Visual Studio Code 中免费使用。可以从 VS Code 扩展页面轻松下载和安装 VSCode 扩展的 IDL。该扩展具有以下功能:
- 功能齐全的 IDL 代码编辑器,具有变量类型检测、自动完成、色彩编码、问题报告和代码格式化功能。
- 带有断点的集成调试器,或在 VS Code 终端中运行命令行 IDL。
- 支持 IDL Notebook 风格的界面,带有嵌入式图形并保存为 PDF。
- 可定制的主题和颜色。
- 悬停帮助包含完整的 IDL 文档,包括代码示例。
- 为 SAVE 文件或 DLM 中的例程创建例程定义文档。
- 原生多语言支持。
有关详细信息,请访问 VSCode 的 IDL 页面。
2.2 HDF5 可以处理空数组
H5D_READ 和 H5_GETDATA 例程现在可以处理具有零长度数组的 H5T_VLEN 数据类型。在这些情况下,结果是指向 !NULL 变量。
2.3 HttpRequest 进度条
HttpRequest 类(在 IDL 9.0 中引入)现在在 ::Get、::Post 和 ::Put 方法上有一个可选的进度条。此进度条使用上述新CLI_Progress条。有关详细信息,请参阅 HttpRequest::Get、HttpRequest::Post 和 HttpRequest::Put。
2.4 IDL_String::replace 新的 Count 参数
IDL_String Replace 方法现在具有新的可选 Count 参数。该参数允许您指定要替换的匹配项数量。默认值是替换所有匹配项。例如:
IDL> str = '.......'
IDL> print, str.replace('.', '*', 3)
***....
还可以指定一个负计数,从字符串的末尾开始:
IDL> str = '.......'
IDL> print, str.replace('.', '*', -3)
....***
有关更多详细信息,请参阅 IDL_String::Replace。
2.5 对 NaN 和 Infinity 值的 JSON 支持
IDL 的 JSON_PARSE 函数现在支持数组中的末尾逗号以及特殊的 NaN、Inf 和 Infinity(不带引号)值。这些都是对 JSON 规范的非标准补充,但提供了与 Python 和其他生成 JSON 工具更好的互操作性。
此外,JSON_SERIALIZE 现在有一个新的 NANINF_LITERAL 关键字。默认行为是将 NaN 和 Infinity 值输出为带引号的字符串,这遵循 JSON 规范,但不允许将它们转换回浮点值。设置 NANINF_LITERAL 关键字将输出这些值,但不带引号。这允许 JSON_PARSE 和其他工具(如 Python)理解这些值并返回浮点 NaN 和 Infinity 值。
2.6 LEGEND 填充颜色
现在可以指定 LEGEND 图形函数的填充颜色:
p = plot(/test)
l = legend(target=p, fill_color='yellow')
有关详细信息,请参阅 LEGEND。
2.7 MapContinents Shapefile
MapContinents 图形功能已更新,包含适用于各大洲、国家/地区、湖泊、岛屿和河流的更多最新 shapefile,包括适用于各大洲、湖泊和河流的新高分辨率版本。例如:
m0 = Map('Geographic', limit=[41, -93, 50, -83], margin=[0.1, 0.1, 0.1, 0.05])
m0.mapgrid.label_position = 0
m0.mapgrid.linestyle = "none"
m0.mapgrid.grid_longitude = 2
m0.mapgrid.grid_latitude = 2
m1 = MapContinents(/hires, fill_color="light green")
m2 = MapContinents(/lakes, /hires, fill_color='light blue', linestyle=0)
m3 = MapContinents(/islands, fill_color='green')
m4 = MapContinents(/rivers, /hires, color='blue', thick = 2)
2.8 多行工具提示
IDL 小组件现在支持跨多行的工具提示。要创建多行工具提示,只需在设置 TOOLTIP 关键字时嵌入换行符 \n 即可。有关详细信息,请参阅 WIDGET_BUTTON、WIDGET_DRAW 或 WIDGET_TREE 上的 TOOLTIP 关键字。
2.9 PRINT/PRINTF 新的 NEWLINE 关键字
PRINT 和 PRINTF 过程具有新的 NEWLINE 关键字。默认值为 1,与以前一样在输出末尾输出换行符(\n)。设置 NEWLINE=0 将隐藏换行符,并允许您多次调用 PRINT 并使所有输出都出现在同一行上。
2.10 Shapefile 增强
IDLffShape 类使用的 Shapefile 库已更新到最新版本。此外,IDLffShape 现在可以处理 Date 和 Logical 属性类型。您还可以使用新属性检索所有属性的 Shapefile 类型。有关详细信息,请参阅 IDLffShape。
2.11 TS_SMOOTH新的 NAN 关键字
TS_SMOOTH 函数具有新的 NAN 关键字。设置此关键字可使例程检查输入数据中是否出现 IEEE 浮点值 NaN 或 Infinity。值为 NaN 或 Infinity 的元素被视为缺失数据。因此,例程会将这些缺失的元素替换为平滑窗口内有效点的平滑值(使用简单的 Boxcar 平滑)。
2.12 WIDGET_BROWSER 支持
WIDGET_BROWSER 已更新为包含对 macOS 的支持。
2.13 WIDGET_LABEL 和 WIDGET_TEXT 文本和背景颜色
WIDGET_LABEL 和 WIDGET_TEXT 现在支持 FOREGROUND_COLOR 和 BACKGROUND_COLOR 关键字,这些关键字允许您设置文本颜色和背景文本框颜色。您还可以使用 WIDGET_CONTROL 动态更改这些属性。例如,保存并运行以下代码:
pro widtext_ex_change, ev
common _widtext, w1, w2
widget_control, w1, foreground_color=bytscl(randomu(s,3)), background_color=bytscl(randomu(s,3))
widget_control, w2, foreground_color=bytscl(randomu(s,3)), background_color=bytscl(randomu(s,3))
end
pro widtext_ex
common _widtext, w1, w2
w = widget_base(xsize = 200, /column)
w0 = widget_base(w, /row)
f = 'Segoe*24'
w1 = widget_label(w0, value='Label', foreground_color=[0,200,0], background_color=[255,255,0], font=f, scr_xsize=100)
w2 = widget_text(w0, value='My Text', /editable, foreground_color=[200,0,0], background_color=[0,255,255], font=f)
w0 = widget_base(w, /row)
wbutton = widget_button(w0, value='Change', event_pro = 'widtext_ex_change', font=f)
widget_control, w, /realize
xmanager,'widtext_ex', w, /no_block
end
2.14 WIDGET_PROPERTYSHEET Top Header 关键字
WIDGET_PROPERTYSHEET 有一个新的 TOP_HEADER 关键字,当该关键字设置为 0 时,将隐藏顶部(列)标题。
2.15 WIDGET_TEXT 对齐关键字
WIDGET_TEXT 有 6 个新的对齐关键词:
- ALIGN_BOTTOM、ALIGN_CENTER、ALIGN_LEFT、ALIGN_RIGHT 和 ALIGN_TOP 关键字控制小部件在其父部件中的位置。这些关键字在所有平台上都是允许的。默认值为 ALIGN_CENTER。
- 新的 ALIGNMENT 关键字允许您设置文本对齐方式。此关键字可用于Windows平台,但在其他平台上将被静默忽略。
2.16 WIDGET_TEXT FRAME = 0
在 Windows 上,WIDGET_TEXT现在可以设置 FRAME=0 以删除文本构件周围的边框。在其他平台上,文本小部件始终具有框架,设置 FRAME=0 将不起作用。
2.17 WRITE_PNG 压缩关键字
WRITE_PNG 函数具有一个新的 COMPRESSION 关键字,该关键字允许您控制 PNG 输出的压缩量。该值必须在 0 到 9 的范围内。值为 0 表示无压缩。较高的值将提供较小的文件,但写入和读取的速度会变慢。默认值为 6,这在压缩和速度之间提供了良好的平衡。
2.18 Dataminer 安装
Dataminer 模块现在默认与 IDL 一起安装。它仍然需要许可证才能使用。Dataminer 支持读取和连接到 Microsoft Excel、PostgreSQL 和许多其他数据库管理系统。
3 库更新
第三方库已更新到以下版本:
- ArmPL 24.04
- CEF 121.3.7 for Windows and Mac. To support Red Hat-based systems (Fedora, CentOS, and Rocky Linux). Linux uses CEF 99.2.14.
- antlr 2.7.7
- curl 8.9.0
- Eclipse CVS Client 1.4.2000.v20211124-1800
- eclipse-egit-plugin 6.7.0.202309050840-r
- eclipse-platform 4.29.0.v20230903-1000
- Eclipse Temurin JDK 21.0.2
- Eclipse Temurin JRE 21.0.2
- HDF5 1.14.3
- Inno Setup 6.2.2(u)
- jackson-json-processor 2.15.2
- ibtiff 4.6.0t
- Libxml2 2.13.3
- microsoft-vcredist 14.40.33810
- mongo-c-driver 1.27.0
- mongo-cxx-driver 3.10.1
- nghttp2 1.62.1
- NumPy 1.24.4
- NumPy 1.26.4
- OpenSSL 3.3.1
- P4Eclipse 2023.1.2516406
- poco 1.13.3
- Python 3.12.4
- shapelib 1.6.0
- SQLite 3.46.0
- x11-dev-tools 1.0.2
- X PixMap Library 3.5.17
- xerces-c 3.2.5
- zlib 1.3.1
添加了以下第三方库:
- Eclipse JGit 6.7.0.202309050840-r
- libtirpc 1.3.4
- LunaSVG 2.3.9
以下第三方库已被删除:
- HASP Sentinel-LDK_SDK