IDL 9.0 Release Notes & What's New

Refer to the IDL Help for instructions on usage. Access the help by selecting Help > Help Contents from the IDL menu bar. Then click "IDL" in the table of contents on the left side of the help page.

See Platform Support for ENVI 6.0 and IDL 9.0 for additional details.

See the following sections:

New Features

Apple Silicon Mac Support

IDL now runs natively on Apple silicon Macs. This enables IDL to take full advantage of Apple's M-series chips. Performance is improved relative to running IDL built for Intel chips under Apple's Rosetta translator on an Apple silicon Mac. The Intel build of IDL remains available for Macs with Intel hardware.

All Macs now use Apple silicon instead of Intel chips. The term "Apple silicon" refers to a system on a chip (SoC) with names that include M1, M2, M2 Pro, M2 Max, M2 Ultra, etc. These can be referred to as "M-series" chips. The common name for the architecture is "arm64" and this is reflected in IDL's "bin.darwin.arm64" directory, which contains IDL's binary files. Finally, this documentation will refer to "Intel builds" and "Arm builds" of IDL.

Intel builds of IDL continue to run natively on Macs with Intel hardware. They can also run on Apple silicon Macs using the Rosetta 2 translator. The Arm builds of IDL only run on Apple silicon Macs.

There are two primary benefits to running the Arm build of IDL on Apple silicon Macs versus an Intel build under translation:

  • Apple's Rosetta 2 software will eventually be removed by Apple. This will prevent Intel builds of IDL from running on Apple silicon hardware. The first version of Rosetta was for the PPC to Intel transition and it was provided by Apple for five years. Rosetta 2 has been in existence for three years, and hence it may last another two years.
  • The Arm build of IDL has better performance on Apple silicon than the Intel build running under Rosetta 2.

HttpRequest Class

IDL has a new HttpRequest class that lets you easily perform Get, Post, Put, and Delete requests to servers. The new class includes support for multipart form posts, authentication, custom headers, and callbacks during upload or download (with the option to cancel the request). For example, to do a simple Get request:

 params = hash('key1', '2+2', 'key2', 'with spaces ') response = HTTPRequest.Get('http://localhost:3000', params=params, /escape) print, response.url print, `status_code = ${response.status_code}` help, response.text

IDL prints:

 http://localhost:3000/?key1=2%2B2&key2=with%20spaces%20 status_code = 200 <Expression> STRING = 'GET /?key1=2%2B2&key2=with%20spaces%20...

Here we do a Post with a multipart form, including a local file:

 multipart = dictionary('key1', 'value1', $   'key2', {file: 'c:/image.jpg', mimetype: 'image/jpeg'}) response = HTTPRequest.Post('https://httpbin.org/post', multipart = multipart) print, `status_code = ${response.status_code}` print, response.json(), /implied

IDL prints:

 status_code = 200 { "files": { "key2": "data:image/jpeg;base64,/9j/4AAQ..." },   "form": { "key1": "value1" }, "headers": { "Accept": "*/*", "Content-Length": "1040", ... } 

See HttpRequest for details.

IDL Extension for VS Code

IDL now has a new, modern developer environment, available for free within Visual Studio Code. The IDL for VSCode extension can be easily downloaded and installed from the VS Code extensions page. The extension has the following features:

  • Make the editor your own with extensions and themes.
  • Basic IDL type detection for seamless auto-complete.
  • Automation for formatting, adding and updating code documentation.
  • Auto-completion for routines, methods, keywords, and variables.
  • Hover help contains complete IDL documentation including code examples.
  • Problem detection, detects more than 100 problems in your code without having to compile.
  • An integrated debugger with breakpoints, or run command-line IDL within the VS Code terminal.
  • Native multi-language support.

For details visit the IDL for VSCode page.

IDL Notebooks

IDL now has a native IDL Notebook format and developer environment. The IDL Notebooks are available for free via the IDL for VSCode extension. IDL Notebooks are:

  • A friendly format for capturing text markup and code in one place.
  • The way that modern or ad-hoc developers and scientists are learning to program.
  • More approachable compared to creating files on disk and running from a command line.

IDL Notebooks can be easily created from the IDL for VSCode extension. You can also convert an IDL Notebook to a fully-commented IDL program that can be run outside of VSCode. The IDL Notebooks is fully native, is not based on Jupyter, and does not require Python. For details visit the IDL for VSCode page.

IDL_String::Dup and IDL_Variable::Dup Method

All IDL strings and variables now have a new Dup static method. The Dup method duplicates a scalar value and returns either a new scalar string or a new array variable. See IDL_String::Dup and IDL_Variable::Dup for details.

Matrix_Multiply NAN Keyword

The MATRIX_MULTIPLY function has a new NAN keyword. Set this keyword to cause the routine to check for occurrences of the IEEE floating-point values NaN or Infinity in the input data. Elements with the value NaN or Infinity are treated as equal to zero.

TYPESIZE attribute for variable attributes

Static variable attributes now have a new TYPESIZE attribute that returns the size in bytes of a single element of that datatype. For example:

 IDL> x = 1.5d + 2i IDL> print, x.typename, x.typesize DCOMPLEX 16 IDL> x = findgen(1000) IDL> print, x.typename, x.typesize FLOAT 4

The TYPESIZE attribute may be useful when performing unformatted input/output, or converting variables to/from bytes. For example:

 IDL> x = [!values.f_infinity, !values.f_nan] IDL> print, byte(x, 0, x.length * x.typesize) 0 0 128 127 0 0 192 127

For more details see Variable Attributes.


ARROW function supports dashed and dotted line styles

The ARROW graphics function has a new LINESTYLE keyword. Set this keyword to an integer or string specifying the line style for the arrow. See ARROW for details.

Improved margins for MAP function

The MAP graphics function now uses better default margins when creating the map, based upon the font size.

MODIFYCT now allows color tables to be removed

The MODIFYCT procedure now allows you to remove direct graphics color tables by supplying an empty string for the color table name. See MODIFYCT for details.

TIFF now supports Zstandard (zstd) compression

The READ_TIFF and WRITE_TIFF routines are now able to read and write using Zstandard (zstd) compression. In addition, the QUERY_TIFF routine is now able to return the compression used in a TIFF file. Zstandard is a fast lossless compression algorithm which is fast enough for real-time compression. See QUERY_TIFF, READ_TIFF and WRITE_TIFF for details.

Variable attributes now support indexing

Static variable attributes now support array indexing without using parentheses. For example:

 arr = fltarr(5,4,3) print, arr.dim print, arr.dim[1] ; used to require (arr.dim)[1]

IDL prints:

 5 4 3 4

For more details see Variable Attributes.

IDL Python Bridge now supports Python 3.11

The IDL Python Bridge (IDL to Python and Python to IDL) now supports Python 3.11. The IDL-to-Python bridge lets you easily access Python routines and objects within IDL:

 IDL> np = Python.Import('numpy') IDL> coords = np.random.random([10,2]) IDL> x = coords[0,*] IDL> y = coords[1,*] IDL> r = np.sqrt(x^2+y^2) IDL> t = np.arctan2(y,x)

Similarly, the Python-to-IDL bridge lets you access all IDL functionality from within Python:

 Python 3.11.4 | packaged by Anaconda, Inc. >>> import sys >>> sys.path.append('c:/Program Files/NV5/IDL90/lib/bridges') >>> from idlpy import * IDL 9.0.0 (Win32 x86_64 m64). >>> p = IDL.plot(test=1) >>> p.color = 'red'

See the IDL Python Bridge for details and examples.

Library Updates

The 3rd party libraries listed below have been updated to these versions:

  • Curl 8.4.0
  • ffmpeg 4.4.4
  • Libtiff 4.5.1
  • Libxml2 2.11.5
  • NetCDF 4.9.2
  • OpenSSL 3.0.11

The following 3rd party libraries have been added:

  • c-ares 1.19.1 (Http/2 support for CURL)
  • libev 4.33 (Http/2 support for CURL)
  • nghttp2 1.58.0 (Http/2 support for CURL)
  • IDL Python Bridge support for Python 3.11

The following 3rd party libraries have been removed:

  • (none)

Fixed Issues

Issue Description
IDL-15221 Menu items with separators cannot be destroyed: You can now destroy separator menu items and they are actually destroyed.
IDL-69163 MAP function will sometimes clip map grid labels: IDL will now resize the window margins to avoid clipping grid labels on maps.
IDL-70208 Using multibyte characters such as 확인 would cause WIDGET_TEXT to crash: IDL now correctly handles these characters.
IDL-70730 IMAGE function throws an error if one of the dimensions is 3: The IMAGE function now accepts arrays of 3xN or Nx3 and correctly displays the image.
IDL-70748 IDLnetURL should provide access to the HTTP response body. The new HttpRequest class provides this functionality.
IDL-70848 MAP function: If a map contained a point below the horizon, then PDF output would be empty. This has now been fixed.
IDL-70881 Antialiasing was not working for the PLOT function in IDL 8.8. This has been fixed.
IDL-70934 IDLnetURL: ability to set arbitrary CURL parameters. The new HttpRequest class provides this functionality.
IDL-70976 READ_DICOM is slow due to DICOMEx license check. IDL's new license mechanism is now significantly faster than before, which fixes the slowdown in READ_DICOM.
IDL-71019 On Windows, long filepaths (greater than 260 characters) did not work. IDL now accepts long filepaths when used with OPENR, OPENW, FILE_MKDIR, HDF5, PNG, and TIFF files.
IDL-71022 When comparing list items that contain structures, IDL would return false if the datatypes were different, even if the values were actually the same. IDL now returns true in these cases.
IDL-71027 An astute user noticed that the CONVOL function had a subtle bug where short integers at the boundary were being clipped to -32678 instead of the correct -32768. This has now been fixed.
IDL-71029 IDL crashes when indexing into a structure or dictionary field with a temporary variable and += operator. This has now been fixed.
IDL-71035 Calling REFORM with an undefined variable would return an indeterminate result, leading to crashes. Now, REFORM will throw the appropriate error for undefined input arguments.
IDL-71036 ToString method: In IDL 8.9, the ToString method was incorrectly changed to drop empty (null) strings. Now, the ToString method behaves as before - zero-length strings are preserved.
IDL-71047 IDL crash when using TRIANGULATE with colinear input points: In very specific cases, irregularly-spaced data could have colinear data points, and would crash TRIANGULATE. This has now been fixed.
IDL-71054 Image on a Map drops one row/column: Previously, when a function graphics Image was placed on a Map projection, the first row and column would be clipped. Now the entire image is displayed. If you had worked around the bug by padding your image with an extra row and column, you can now remove that padding.
IDL-71056 The MEAN and MOMENT functions had different behavior with a scalar input and with DIMENSION=1. Now, with DIMENSION=1, both functions simply return the scalar value as the result.

Known Issues

Help Display on macOS

Using the IDL Help System on macOS with the Safari web browser results in the error "The operation couldn't be completed," or it displays a blank page. By default, Safari prohibits some local file operations; the error occurs when a temporary HTML file auto-created by the Help system attempts to perform a redirect to the specific IDL Help content. There are two workarounds to display the Help:

  • In Safari, enable the Disable Local File Restrictions setting.
  • If you prefer not to disable local file restrictions in Safari, use Chrome or Firefox as your browser to open IDL Help content.

Remotely Accessing IDL Help on Linux with Firefox

Accessing IDL Help remotely using Firefox on a Linux environment (X Window Server through Windows-MobaXterm/Mac-XQuartz) can cause a core dump crash under these circumstances:

  1. The default browser of the remote connection destination is NOT Firefox, but Firefox is set in the IDL_HELP_BROWSER environment variable on the local machine.
  2. The idlhelp command is issued.

Use one of the following workarounds:

  • Before issuing the idlhelp command, start Firefox on the local machine.
  • Use the NV5 Geospatial Solutions Documentation Center.