Quick graph transfer between experiment sessions
chozo
This is a complete and more robust rewrite of the Transfer Graphs project by user wings (see https://www.wavemetrics.com/project/TransferGrpahs ), which does not seem to get updated anymore. The idea is to "save" the top graph and recreate it in another Igor session with just two quick menu calls. The source experiment must have been saved in its current state for this to work. Note that something similar could also be achieved by saving a graph copy and merging the graph experiment file into another session.
Other notes and caveats:
- Details are saved inside the clipboard. Any previous clipboard information is lost.
- The source experiment gets 'modified' by the creation of a temporary wave (W_WaveList). Don't be surprised when Igor asks you to save the experiment even though you only have copied a graph.
- A lot of code is spent on catching errors from loading the data. This could get much shorter when / if LoadData supports the /Z flag.
Menu "Windows"
"Save Top Graph",/Q, SaveTopGraph()
"Load Saved Graph",/Q, LoadSavedGraph()
End
Function SaveTopGraph()
String expName = IgorInfo(12)
if (!strlen(expName))
Abort "You need to save the experiment before using this functionality."
endif
PathInfo home
String saveRec = "TransferGraph@"+S_Path+expName+"@"+WinName(0,1)+"@"
GetWindow kwTopWin, wavelist
Variable i
Wave/T wList=W_WaveList
for (i=0; i<DimSize(wList,0); i++)
saveRec += wList[i][1]+";"
endfor
saveRec += "@"+ReplaceString("root:",WinRecreation("",0),":")
PutScrapText saveRec
KillWaves wList
return 0
End
Function LoadSavedGraph()
String loadRec = GetScrapText()
if (CmpStr(StringFromList(0,loadRec,"@"),"TransferGraph"))
Abort "You need to first save a graph."
endif
String filePath = StringFromList(1,loadRec,"@")
String grName = StringFromList(2,loadRec,"@")
String wList = StringFromList(3,loadRec,"@")
String grRec = StringFromList(4,loadRec,"@")
DFREF saveDFR = GetDataFolderDFR()
SetDataFolder root:
NewDataFolder/O/S $grName
DFREF base = root:$grName
Variable i, j
for (i=0; i<ItemsInList(wList); i++)
String curr = ReplaceString("'",StringFromList(i,wList),"")
String path = ParseFilePath(1, curr, ":", 1, 0)
if (strlen(path))
for (j = 0; j < ItemsInList(path,":"); j++)
NewDataFolder/O/S $StringFromList(j,path,":")
endfor
endif
DebuggerOptions
Variable DebugOn = V_debugOnError, err = 0
DebuggerOptions debugOnError=0
try
LoadData/Q/O/S=path/J=ParseFilePath(0, curr, ":", 1, 0)+";" filePath; AbortOnRTE
catch
err = GetRTError(1)
Print "Could not load the data for the graph. Maybe the source experiment was not saved in its current state. Error: " + GetErrMessage(err, 3)
endtry
DebuggerOptions debugOnError=DebugOn
if (err)
SetDataFolder saveDFR
return -1
endif
SetDataFolder base
endfor
for (i=2; i<ItemsInList(grRec,"\r")-1; i++)
String cmd = StringFromList(i,grRec,"\r")
if(StringMatch(cmd,"*String*"))
continue
endif
if(StringMatch(cmd,"*SetDataFolder fldrSav*"))
SetDataFolder base
continue
endif
Execute cmd
endfor
SetDataFolder saveDFR
return 0
End
"Save Top Graph",/Q, SaveTopGraph()
"Load Saved Graph",/Q, LoadSavedGraph()
End
Function SaveTopGraph()
String expName = IgorInfo(12)
if (!strlen(expName))
Abort "You need to save the experiment before using this functionality."
endif
PathInfo home
String saveRec = "TransferGraph@"+S_Path+expName+"@"+WinName(0,1)+"@"
GetWindow kwTopWin, wavelist
Variable i
Wave/T wList=W_WaveList
for (i=0; i<DimSize(wList,0); i++)
saveRec += wList[i][1]+";"
endfor
saveRec += "@"+ReplaceString("root:",WinRecreation("",0),":")
PutScrapText saveRec
KillWaves wList
return 0
End
Function LoadSavedGraph()
String loadRec = GetScrapText()
if (CmpStr(StringFromList(0,loadRec,"@"),"TransferGraph"))
Abort "You need to first save a graph."
endif
String filePath = StringFromList(1,loadRec,"@")
String grName = StringFromList(2,loadRec,"@")
String wList = StringFromList(3,loadRec,"@")
String grRec = StringFromList(4,loadRec,"@")
DFREF saveDFR = GetDataFolderDFR()
SetDataFolder root:
NewDataFolder/O/S $grName
DFREF base = root:$grName
Variable i, j
for (i=0; i<ItemsInList(wList); i++)
String curr = ReplaceString("'",StringFromList(i,wList),"")
String path = ParseFilePath(1, curr, ":", 1, 0)
if (strlen(path))
for (j = 0; j < ItemsInList(path,":"); j++)
NewDataFolder/O/S $StringFromList(j,path,":")
endfor
endif
DebuggerOptions
Variable DebugOn = V_debugOnError, err = 0
DebuggerOptions debugOnError=0
try
LoadData/Q/O/S=path/J=ParseFilePath(0, curr, ":", 1, 0)+";" filePath; AbortOnRTE
catch
err = GetRTError(1)
Print "Could not load the data for the graph. Maybe the source experiment was not saved in its current state. Error: " + GetErrMessage(err, 3)
endtry
DebuggerOptions debugOnError=DebugOn
if (err)
SetDataFolder saveDFR
return -1
endif
SetDataFolder base
endfor
for (i=2; i<ItemsInList(grRec,"\r")-1; i++)
String cmd = StringFromList(i,grRec,"\r")
if(StringMatch(cmd,"*String*"))
continue
endif
if(StringMatch(cmd,"*SetDataFolder fldrSav*"))
SetDataFolder base
continue
endif
Execute cmd
endfor
SetDataFolder saveDFR
return 0
End
Forum
Support
Gallery
Igor Pro 9
Learn More
Igor XOP Toolkit
Learn More
Igor NIDAQ Tools MX
Learn More
Great. I have forgotten the password and for some other reason, I could not log in forums until now. That is why no update since then...
Thanks for your effort!
August 24, 2021 at 08:39 pm - Permalink
Hi wings, welcome back! Feel free to update your project with above code if you like. I found that some things do not yet work as expected. For example, it is currently problematic to load graphs with the same name from different experiments or there are problems if the file has not been saved after changes have been made. Both problems can be easily fixed with some effort, but so far it worked 'good enough' for me.
August 26, 2021 at 06:25 am - Permalink