X
12473 Rate this article:
No rating

Accessing Features Only Available to 32-bit IDL from 64-bit IDL

Anonym

Not all functionality available to IDL and ENVI in 32-bit mode is available in 64-bit mode, and vice versa.

There are multiple tables in our online documentation that list support for various platforms.

If you're on a 64-bit platform, you have the option of launching IDL in either 32- or 64-bit mode. But that doesn't really solve the problem.

For example, let's say you have a main application that executes in 64-bit IDL, but you want to have access to data in DXF-format files. If you attempt to create an instance of an IDLffDXF object that parses this file format, you'll get an error:

IDL> heart = obj_new('idlffdxf', filepath('heart.dxf', subdir = ['data']))
% OBJ_NEW: Dynamically loadable module is unavailable on this platform: DXF.
% Execution halted at: $MAIN$          

We could fire up a second command line or Workbench session of IDL in 32-bit to parse the file, but a more convenient method, and the way we would want to implement a solution within a compiled routine, is through an IDL_IDLBridge object. There's a special keyword named OPS (technically, "out-of-process server") which allows us to set whether the bridge process should run in 32- or 64-bit mode.

Here, we'll start a 32-bit IDL process from our 64-bit IDL session.

IDL> b = idl_idlbridge(ops = 32)
% Loaded DLM: IDL_IDLBRIDGE.

Obviously, if you're on a 32-bit platform (still?!) you cannot simply create a 64-bit process via the magic of an IDL keyword.

We can construct a command to be executed in our 32-bit process to read the data.

IDL> command = "heart = obj_new('idlffdxf', filepath('heart.dxf', subdir = ['examples','data']))"
IDL> b->execute, command

Now we can proceed with an example from the documentation for the IDLffDXF::GetEntity method's documentation, transferring the data back to our main process for display.

IDL> b->execute,  "heartTypes = heart->getcontents()"
IDL> b->execute, "tissue = heart->getentity(heartTypes[1])"
IDL> b->execute, "connectivity = *tissue.connectivity"
IDL> b->execute, "vertices = *tissue.vertices"
IDL> vertices = b.getvar('vertices')
IDL> connectivity = b.getvar('connectivity')

Now that we have local copies in our 64-bit process of the vertices and connectivity list data from the 32-bit process, we can display the result.

IDL> poly = idlgrpolygon(vertices, poly = connectivity, style = 2, color = !color.red)
IDL> xobjview, poly