#pragma TextEncoding = "UTF-8" #pragma rtGlobals=3 // Use modern global access method and strict wave access #pragma DefaultTab={3,20,4} // Set default tab width in Igor Pro 9 and later #pragma version=3 // JP230609: v3, added missing gstop // JP230609: v2, uses DrawPoly/ABS, revised Graph user menus #pragma moduleName=MoveTraceToBack #include // work around Igor 9.02's AllTracesPopup QuickFit menu bug #if IgorVersion() > 9.02 Menu "TracePopup", dynamic MoveTraceToBack#MenuItemForTrace("Move %s to ProgBack"),/Q, GetLastUserMenuInfo; fMoveTraceToProgBack(S_graphName, S_traceName) Submenu "Restore ProgBack Trace" ProgBackTracesList(WinName(0,1,1)), /Q, GetLastUserMenuInfo; fRemoveProgBackTrace(S_graphName, S_value) End End Menu "AllTracesPopup" "Restore All ProgBack Traces",/Q, RemoveAllProgBackTraces(WinName(0,1,1)) End #else Menu "TracePopup", dynamic MoveTraceToBack#MenuItemForTrace("Move %s to ProgBack"),/Q, GetLastUserMenuInfo; fMoveTraceToProgBack(S_graphName, S_traceName) Submenu "Restore ProgBack Trace" ProgBackTracesList(WinName(0,1,1)), /Q, GetLastUserMenuInfo; fRemoveProgBackTrace(S_graphName, S_value) "Restore All ProgBack Traces",/Q, RemoveAllProgBackTraces(WinName(0,1,1)) End End #endif Menu "GraphPopup", dynamic Submenu "Restore ProgBack Trace" ProgBackTracesList(WinName(0,1,1)), /Q, GetLastUserMenuInfo; fRemoveProgBackTrace(S_graphName, S_value) End "Restore all ProgBack Traces",/Q, RemoveAllProgBackTraces(WinName(0,1,1)) "Show all Traces", /Q, fShowAllTraces(WinName(0,1,1)) End Menu "Graph" "-" // "Move a Trace to ProgBack...",/Q, MoveTraceToProgBack() Submenu "Move a Trace to ProgBack" NotProgBackTracesList(WinName(0,1,1)), /Q, GetLastUserMenuInfo; fMoveTraceToProgBack(S_graphName, S_value) End // "Restore a ProgBack Trace...",/Q, RemoveProgBackTrace() Submenu "Restore ProgBack Trace" ProgBackTracesList(WinName(0,1,1)), /Q, GetLastUserMenuInfo; fRemoveProgBackTrace(S_graphName, S_value) End "Restore all ProgBack Traces",/Q, RemoveAllProgBackTraces(WinName(0,1,1)) "Show all Traces", /Q, fShowAllTraces(WinName(0,1,1)) "-" End static Function/S MenuItemForTrace(String format) // format is menu item text with %s for trace name GetLastUserMenuInfo String traceName= "Trace" if( strlen(S_traceName) ) traceName= S_traceName endif String menuItem sprintf menuItem, format, traceName return menuItem End Proc MoveTraceToProgBack(traceName) String traceName Prompt traceName, "Trace to move to ProgBack", popup, TraceNameList(WinName(0,1,1),";",0x1) fMoveTraceToProgBack(WinName(0,1,1), traceName) End Function fMoveTraceToProgBack(String graphName, String traceName) // get information from trace to replicate selected properties in the polygon String info= TraceInfo(graphName, traceName, 0) // instance taken from traceName String xaxis = StringByKey("XAXIS", info) String yaxis = StringByKey("YAXIS", info) String rgbaStr = WMGetRECREATIONInfoByKey("rgb(x)", info) Variable red, green, blue, alpha ParseColor(rgbaStr, red, green, blue, alpha) Variable lSize = str2num(WMGetRECREATIONInfoByKey("lSize(x)", info)) Variable lStyle = str2num(WMGetRECREATIONInfoByKey("lStyle(x)", info)) WAVE wy = TraceNameToWaveRef(graphName, traceName) WAVE/Z wx = XWaveRefFromTrace(graphName, traceName) if( !WaveExists(wx) ) // Create an x wave from the y wave's x scaling // in the same data folder as the y wave. String wxName= CleanupName(NameOfWave(wy)+"_x",0) DFREF waveDFR = GetWavesDataFolderDFR(wy) DFREF saveDFR = GetDataFolderDFR() SetDataFolder waveDFR Duplicate/O wy, $wxName // OVERWRITE WAVE wx = $wxName wx=x SetDataFolder saveDFR endif // replace any existing polygon in the group named after the trace. String groupName= GroupNameForTrace(traceName) SetDrawLayer/W=$graphName ProgBack // TO DO: input destination layer name as parameter DrawAction/W=$graphName getgroup=$groupName, delete, begininsert SetDrawEnv/W=$graphName gstart,gname= $groupName SetDrawEnv/W=$graphName xcoord= $xaxis,ycoord= $yaxis, fillpat=0 // no fill SetDrawEnv/W=$graphName linefgc=(red,green,blue,alpha) SetDrawEnv/W=$graphName linethick=lSize SetDrawEnv/W=$graphName dash=lStyle // DrawPoly /W=$graphName wx[0],wy[0],1,1,wx,wy DrawPoly /W=$graphName/ABS 0,0,1,1,wx,wy // this way, if wx[0] or wy[0] changes, so does the ProgBack poly SetDrawEnv/W=$graphName gstop DrawAction/W=$graphName endinsert SetDrawLayer/W=$graphName $S_Name ModifyGraph /W=$graphName hideTrace($traceName)=1 End Proc RemoveProgBackTrace(traceName) String traceName Prompt traceName, "Trace to remove from ProgBack", popup, ProgBackTracesList(WinName(0,1,1)) fRemoveProgBackTrace(WinName(0,1,1), traceName) End Function RemoveAllProgBackTraces(String graphName) String traces = TraceNameList(graphName,";",0x1) // 0x1 includes hidden traces Variable i, n=ItemsInList(traces) for(i=0; i