Igor 6.20B03 released

The third public beta of Igor 6.2 has several new features such as additional wave read and write bounds checking, an improved Adopt All dialog, funky Checkbox controls, and greatly revised Gizmo procedures.

As always, choose "Updates for Igor" from Igor's help menu to point to the download links, or use the direct links.

There is no 64-bit version of Igor 6.20B03, as of yet, anyway.

--Jim

=====================================================================

Direct links to downloads:

WINDOWS (32-bit)

This is a Windows 32-bit updater to your installed Igor.exe and ancillary files:

http://www.wavemetrics.net/Updaters/WinUpdateToIgorPro6.20Beta.exe

MACINTOSH (32-bit)

This is a Mac installer for a complete new Igor Pro 6.2 Folder:

http://www.wavemetrics.net/Updaters/MacIgor6.20Beta.dmg

=====================================================================

Here are the changes for Igor 6.20B03:

IGOR APPLICATION

NEW FEATURES

Added index out of bounds and missing dimension label checking for wave read and write in user functions. This runtime checking is performed for code compiled under #pragma rtGlobals=3. (By default, ThreadSafe functions do this checking regardless of rtGloabls. ) The checking can be turned off using

    SetIgorOption DimensionChecking=0xF


and can be turned on for all code (not just that under rtGlobals=3) using

    SetIgorOption DimensionChecking=0xF0


You can now preallocate storage for text waves using Make/T=size. Size is of each point so total allocation is size*numpnts. Data is not cleared and may contain garbage or old text if overwrite. Use

    Make/T=size wname= PadString("",size,0)


to ensure data is initialized if desired. Preallocation can dramatically speed up text wave assignment when the wave has a large number of points -- but only when the new strings are exactly the same size as the preallocation size.

New string function UnPadString(str, padValue). Undoes the action of PadString by removing any trailing bytes of padValue. Useful in speeding up access to very long text waves when using PadString in combination with the new /T=size flag for Make. Allows for the storage of variable length C-based strings (padValue of zero) in a text wave with preallocated string sizes.

Added a new string function that returns info about a FUNCREF variable: FuncRefinfo(fvar) returns

    NAME:<name>;ISPROTO:<1 or 0>;ISXFUNC:<1 or 0>;


<name> will be blank if fvar defaulted to the prototype.

GetRTError can now take a value of 2 to return state of abort flag. This is most useful in thread groups to know when a release has been done. (The abort flag is just read, not cleared.)

Added ReorderImages. Just like ReorderTraces but for images.

Added a new keyword to ModifyImage; interpolate= 1. Turns on smoothing of the boundaries between pixels. Since this is implemented via system graphics calls and not by Igor actually doing the interpolation, it will not affect EPS or EMF export on Windows and will not affect EPS export on Mac. Example: First execute

    Make/O/N=(20,20) jack=enoise(1)
    NewImage jack


then observe effect of

    ModifyImage jack, interpolate=1


Image plots now support 4 plane RGBA image waves. The alpha channel is supported only for unsigned 8 and 16 bit integer data and is not supported when exporting Igor PDF or EPS on Mac and not for PDF, EPS, EMF or printing on Windows. Also, under certain circumstances, color table index images with holes due to NaN in the data now use an alpha-based technique rather than individual pixel drawing. It is used when interpolate is turned on and when exporting a Quartz PDF or when printing on Mac. The new alpha code can be turned off using

    SetIgorOption imagedraw, UseAlpha=0


ImageTransform rgb2gray now supports converting a 4D RGB wave into a 3D grayscale stack.

ImageTransform rotateRows and rotateCols now supports layer specification using the /P flag.

Loess can now be called in ThreadSafe Functions.

ContourZ has new pointFindingTolerance parameter.

ModifyContour has new perturbation and now-documented equalVoroniDistances keywords.

Can now set the pair of cursors displayed in the cursor info panel using ShowInfo/CP= where num is 0 to 4 for AB to IJ.

Added a new item to the trace contextual menu: Copy Display Command. Mainly to get full path to trace waves on the clipboard but can also be executed to create a new graph with just the one trace.

Save has a new /H flag to adopt a wave to home, as if /H was used with LoadWave in the first place.

Added Adopt button to the Browse Waves dialog. Now, if you loaded an Igor Binary Wave file (.ibw extension) and you didn't chose to Copy Wave to Home, you can new sever the connection to the wave's file by choosing Data->Browse Waves, choosing the wave from the list, and clicking the Adopt button.

The Adopt All dialog has more control of what's adopted. Now it can be used to adopt only waves, for example. (Hold the Shift key down when selecting the File menu to see the Adopt All dialog item).

New event for ListBox: 13 = Checkbox toggle, sent after checkbox wave is modifed.

Checkbox side=1 displays the checkbox on the right and the title on the left. CustomControl drawing uses new graphics.

New CustomControl keyword usage: now the frame keyword (which has always defaulted to 1) can be set to 0 to prevent drawing the default button. Added other frame values that are eseentially the same as for TitleBox, support for native GUI appearance. This change means you can set varying sizes for a custom control (which is not possible with a proc picture) and does not impose a button on the control. Here's an example which makes a simple clickable TitleBox (TitleBoxes don't have an action procedure, but CustomControls do):

#pragma IgorVersion >= 6.2
#include <CustomControl Definitions>

Window Panel0() : Panel
    PauseUpdate; Silent 1       // building window...
    NewPanel /W=(150,50,440,181) as "Web Link Example"
    CustomControl link,pos={58,51},size={165,19},proc=LinkCustomControlProc
    CustomControl link,title="www.wavemetrics.com&quot;
    CustomControl link,frame=0,fStyle=4,valueColor=(0,0,65535)
EndMacro

Function LinkCustomControlProc(s)
    struct WMCustomControlAction &s
   
    switch(s.eventCode)
        case kCCE_mouseup:
            BrowseURL/Z "http://www.wavemetrics.com&quot;
            break
    endswitch

    return 0
End


CHANGED BEHAVIOR

Added several speed optimizations to compiled user function code especially in regard to reading and writing a wave value such as w[2] or w[var].

Can now hide exterior subwindows by clicking inthe close icon if the subwindow was created using /K=3; Hidden subwindows are now honored by recreation macros.

Keyboard is now usable for external subwindows in tools mode.

Slider mouseWheel event snaps to the slider increment just like dragging the thumb does.

If you manually try to open a notebook or procedure file that is already open in another application, Igor will display a "Do you want to open the file for read-only?" alert. When running in a procedure, Igor just opens the file for read-only.

A relative #include statement now works relative to the Igor Pro User Files folder as well as the Igor Pro folder. See The Include Statement for details.

Pressing the option key while clicking close box of a window now always kills the window even if the /K=2 (don't kill) or /K=3 (hide instead of kill) flags where used to create the window. This provides a way to kill the window during development.

The LoadData operation now allows loading experiment files with the wrong extension.

Windows: A second instance of Igor now launches faster. This required changing how Igor deals with an error when opening a file that is already open in another application.

Windows: Igor now loads XOPs such that the folder containing the XOP is searched for any DLLs that the XOP requires.

Macintosh: Igor emits a Can't load the executable file in the XOP package error if the package name, executable name and CFBundleExecutable keys of an XOP do not all agree. This is to help Macintosh XOP programmers find out why their XOP is not loading.

BUGS FIXED

Fixed problems in the new ThreadGroupGetDFR.

Fixed clipping when exporting postscript (new graphics.)

Fixed crash in debugger when stepping out of wave function.

Fixed compiled AddMovieFrame/PICT.

Fixed a bug that could cause a crash when calling an external operation from a threadsafe user-defined function called from the main thread.

Fixed a bug that could cause a crash when an external operations was called from multiple threads more or less simultaneously.

SetVariable no longer clips the control height to a smaller title height; the larger of the title and value height is used.

The Optimize operation could crash using the multivariate function format having two waves as inputs, if the X wave had just one point. The crash is fixed, and you are also allowed to use the multivariate minimizer with just one independent variable.

Fixed crash when doing threaded ODR fit to user fit function.

Fixed an obscure bug that caused could cause a crash in GPIBRead and VDTRead operations.

The crash could happen if you did a read of a number and there were no numeric characters available to read.

Fixed a bug in the Curve Fit dialog: when fitting to a matrix the dialog failed to remember qcsr(A), qcsr(B) sub-range settings for the second dimension.

Fixed a bug in the Curve Fit dialog: when fitting to a multidimensional wave, if you had a subrange entered for lower dimension but not higher dimensions, the command generated lacked trailing empty square brackets to indicate the full dimension was to be used.

Orthogonal Distance Regression (ODR) fitting failed to compute coefficient confidence intervals when asked. See Errors in Variables: Orthogonal Distance Regression.

Arrow keys now work to move selected objects in an external control panel in draw mode.

Undo now works in an external panel in draw mode.

WinRecreation with option=4 no longer destroys undo information when called for a graph or control panel in draw mode.

Copy Commands item in the control contextual menu in a control panel no longer truncates very long control names.

Graph trace info tags no longer interfere with updating the cursor info panel.

Windows: SetWindow's "menuenable" event now gets the correct keycode value.

Windows: Fixed SpecialDirPath("Igor Pro User Files", 0, 0,0) improperly using backslash separators on Windows when the user has changed from the default location.

Windows: Dialog Wave Browsers can now properly shift between multiple- and single-selection modes. This affects a few dialogs, notably the Smooth dialog when shifting between Loess and other smoothing options.

Windows: Modify Trace Appearance, Color as F(z) dialog, wave selection for color as f(z) was broken.

Windows: Fixed error from Windows FTPDownload/D caused by . and .. pseudo-directories.

Windows: Fixed GDI object leak related to dashed lines in legend and UseOldGrids mode.

IMPROVED DOCUMENTATION

The documentation for background tasks has been updated. See Background Tasks.

A new example experiment explains background tasks and provides code that is easily redeployed for another project. Choose File->Example Experiments->Programming->Background Task Demo.

XOPS

Added to Gizmo a new hookEvent that responds for changes in the viewing transformation.

Added to ModifyGizmo a new keyword to control auto-scaling on a per-axis basis.

Added to ModifyGizmo and GetGizmo new keywords to store named "userstrings", similar to but different from userData in a panel or graph.

Added curGroup keyword to GetGizmo to return the path to the current group object.

Updated XLLoadWave XOP to version 6.00. This version can load Excel .xlsx files as well as Excel .xls files.

For GCC 4.3 compatibility, the main function of an XOP can now be named XOPMain instead of main. An XOP that uses XOPMain instead of main will require Igor Pro 6.20B03 or late

PROCEDURES

Rewrote many of the Gizmo-related procedures to add a "Zoom and Pan" panel, a new "Append Image" panel, a new "Make Gizmo Texture from Graph" panel, and improved Axis Range, 3D Pie chart, and Append Contour to Gizmo panels.

The new XY Pair to Waveform Panel.ipf procedure file implements a panel-based interface, available in the Data->Packages menu.

Added CustomControl Definitions.ipf, which defines constants you can use when writing the action procedure for a CustomControl.

In MultipeakFit 2: Added Total Area printout on results window; fixed bug: Include Background Info checkbox in the Results window didn't move when the window was re-sized; in the call to FuncFit, the mask wave was specified using /W instead of /M; fixed out-of-bounds access to HoldStrings wave in MPF2_HoldStringForPeakListItem()

In Global Fit: rtGlobals=3 turned up possible out-of-range indexing in the linking and unlinking code.

Wave Loading.ipf's "Copy All Waves To Home" menu item now actually works with packed (and unpacked) experiments.

GIS Utilities (Data->Load Waves->Packages->Install GIS Utilities) GSHHS coastline database loader updated by Steven Howell at University of Hawaii to load version 2 GSHHS files.

Global Fit 2 has several "Index out of range" errors fixed, a Windows-only problem with restored panel size was fixed, and the control panel now remembers the setup from when it was last closed.

EXAMPLES

The Examples->Visualization->Advanced->Gizmo Earth experiment has been rewritten to use the new Make Gizmo Texture from Graph panel and to include some advanced details about using textures in Gizmo.

Quote:
additional wave read and write bounds checking

When the problem comes up I get a "** a wave read gave error: index out of range" error being printed in the history. In order to get rid of this I turned the debugger on and selected debug on error. However, the error doesn't drop into the debugger, it just prints a message. In order for me to fix code the error will need to drop into the debugger.

When there is a error such as this, can I ask IGOR to give a stack trace. If not, then could I have this feature?

Also, this causes problems with the perennially nice mywave[inf] = 1, when you want to enter values in the last point of a wave. Defaulting to bounds checking in threadsafe functions is also really annoying. Why not have the default of no bounds checking at all, unless  rtGlobals=3
andyfaff wrote:
When the problem comes up I get a "** a wave read gave error: index out of range" error being printed in the history. In order to get rid of this I turned the debugger on and selected debug on error. However, the error doesn't drop into the debugger, it just prints a message. In order for me to fix code the error will need to drop into the debugger.


Well, it *should* drop into the Debugger if Debug On Error is also enabled. There may be a temporary insistence on printing instead of putting up the error dialog. That behavior should stop when the user performs some interactive task like:

Execute a command in Igor's command line.
Choose a user-defined menu
Click on a panel's control.

Quote:
When there is a error such as this, can I ask IGOR to give a stack trace. If not, then could I have this feature?


The debugger shows the stack, and getting into the debugger should be the goal. I'd like to see the experiment and the instructions to reproduce what seems like a bug: Please send both to support@wavemetrics.com, which is really where you'll more reliably get an answer to a question like this, rather than the forum, which is supposed to be mostly a user (not developer) forum.

And there *is* GetRTStackInfo(selector):

If selector is 0, GetRTStackInfo returns a semicolon-separated list of the macros and procedures that are executing. This list is the same you would see in the debugger's stack list.


Quote:
Also, this causes problems with the perennially nice mywave[inf] = 1, when you want to enter values in the last point of a wave.


That's true, and that's intended. While this may be convenient, it's pretty difficult to distinguish that usage from the this-is-actually-a-bug usage:

 
myWave[numpnts(myWave)] = valueThatOverwrites myWave[numpnts(myWave)-1]
 

Quote:
Defaulting to bounds checking in threadsafe functions is also really annoying. Why not have the default of no bounds checking at all, unless  #pragma rtGlobals=3


When you email to support, ask the author of that decision to explain himself :-)

--Jim Prouty
Software Engineer, WaveMetrics, Inc.
andyfaff wrote:
....Also, this causes problems with the perennially nice mywave[inf] = 1, when you want to enter values in the last point of a wave. .... Why not have the default of no bounds checking at all, unless  rtGlobals=3


Would something akin to a new keyword designating the "last" point .... mywave[last] = ... (or something equivalent) be useful? It would certainly be shorter and possibly be easier to understand than the need to write mywave[numpnts(mywave)-1] = ....

--
J. J. Weimer
Chemistry / Chemical & Materials Engineering, UAHuntsville
Along the lines of the rightx and leftx functions, perhaps there should be a rightp function. Hmm...

--Jim Prouty
Software Engineer, WaveMetrics, Inc.
JimProuty wrote:
Along the lines of the rightx and leftx functions, perhaps there should be a rightp function. Hmm...


Or perhaps better: "lastp" or "endp". The leftx and rightx intuitively give different values depending on whether the wave scaling increases or decreases. By comparison, intuition (at least mine) always has a better sense for what is meant by "first" (the ZEROth by default) and "last" or "end" POINTS in an array (as opposed to what is to be meant by left or right POINTS for an array).

--
J. J. Weimer
Chemistry / Chemical & Materials Engineering, UAHuntsville