Use a listbox to select a group of waves, duplicate and apply an operation
tony
menu "Macros"
"Normalize Waves", /Q
end
function NormalizeWaves()
dowindow /k NormPanel
NewDataFolder /O root:Packages
NewDataFolder /O root:Packages:Normalizer
DFREF dfr=root:Packages:Normalizer
make /o /n=(0,3)/T dfr:w_newList /WAVE=w_newList
make /o/W/U /n=(3,5,3) dfr:w_color/WAVE=w_color
w_color={{0,0,0},{65535,0,0}}
MatrixTranspose w_color
make /o /n=(0,3,3) dfr:w_selection /WAVE=w_selection
SetDimLabel 2,1,backColors,w_selection // define plane 1 as background colors
make /o /n=3 /T dfr:w_titles /wave=w_titles
w_titles={"input","mm","output"}
wave /T w_wavelist=ListToTextWave(wavelist("*",";","DIMS:1"), ";")
killwaves /Z dfr:w_wavelist
movewave w_wavelist dfr:w_wavelist
make /o/n=(numpnts(w_wavelist)) dfr:w_waveselection /wave=w_waveselection
string /G dfr:s_edit=""
NewPanel /K=1/N=NormPanel/W=(100,100,950,560) as "Normalize"
ModifyPanel /W=NormPanel fixedSize=1
ListBox listboxWaves,win=NormPanel, pos={20, 40},size={200, 350}, listwave=w_wavelist, selwave=w_waveselection, mode=9
button buttonGrabWaves win=NormPanel, pos={250,180},size={50,50},title=">", proc=normButtons
ListBox listboxOut,win=NormPanel, mode=6, selwave=w_selection, titlewave=w_titles, pos={330, 40},size={500, 350}, editstyle=1
ListBox listboxOut,win=NormPanel, colorwave=w_color, listwave=w_newList,widths={150,50,150}, fsize=16, proc=normListBox
Button buttonDoIt win=NormPanel,pos={780,410},size={50,30},title="Do It", proc=normButtons
Button buttonCancel win=NormPanel,pos={700,410},size={60,30},title="Cancel", proc=normButtons
end
// wrapper for buttons
function normButtons(ba)
STRUCT WMButtonAction &ba
DFREF dfr=root:Packages:Normalizer
wave /T w_wavelist=dfr:w_wavelist
wave w_waveselection=dfr:w_waveselection
wave /T w_newList=dfr:w_newList
wave w_selection=dfr:w_selection
wave w_color=dfr:w_color
variable i,count
switch( ba.eventCode )
case 2: // mouse up
if(stringmatch(ba.ctrlName, "buttonGrabWaves"))
count=numpnts(w_wavelist)
for (i=0;i<count;i+=1)
if (w_waveselection[i])
variable rowsinwave=dimsize(w_newList, 0)
FindValue /TEXT=w_wavelist[i] w_newList
if (V_value==-1 || v_value>rowsinwave) // add a wave
w_newList[dimsize(w_newList, 0)][]={{w_wavelist[i]},{"0"},{CleanupName(w_wavelist[i]+"_cm",0)}}
w_selection[dimsize(w_selection, 0)][]={{0},{2},{2}}
normSanityCheck()
endif
endif
endfor
elseif(stringmatch(ba.ctrlName, "buttonDoIt"))
count=dimsize(w_newList, 0)
for (i=0;i<count;i+=1)
if (waveexists($w_newList[i][2]))
doalert 1, "Overwrite "+w_newList[i][2]+"?"
if (v_flag==2)
continue
endif
endif
wave w=$w_newList[i][0]
variable factor=str2num(w_newList[i][1])
duplicate /o w $w_newList[i][2]/wave=w2
w2=w/(factor/10)
// output is forced to be non-liberal
printf "Duplicate /O %s %s\r", possiblyquotename(w_newList[i][0]), w_newList[i][2]
printf "%s = %s / %g\r", w_newList[i][2], possiblyquotename(w_newList[i][0]), factor/10
endfor
redimension /N=(0,-1,-1,-1) w_newList, w_selection
elseif(stringmatch(ba.ctrlName, "buttonCancel"))
dowindow /k NormPanel
endif
break
case -1: // control being killed
break
endswitch
return 0
end
// check sanity of edits
function normListBox(lba) : ListBoxControl
STRUCT WMListboxAction &lba
Variable row = lba.row
Variable col = lba.col
WAVE/T/Z listWave = lba.listWave
WAVE/Z selWave = lba.selWave
DFREF dfr=root:Packages:Normalizer
SVAR s_edit=dfr:s_edit
switch( lba.eventCode )
case -1: // control being killed
break
case 1:
selWave[][1,2][0]=selWave & ~1
// stop edit when cell loses focus
// so that bg color is visible
break
case 6: // begin edit
s_edit=listWave[row][col]
break
case 7: // finish edit
if(col==1)
if(numtype(str2num(listWave[row][col]))==2)
listWave[row][col]=s_edit
else
listWave[row][col]=num2str(str2num(listWave[row][col]))
endif
elseif(col==2)
listWave[row][col]=CleanupName( listWave[row][col],0)
normSanityCheck()
endif
break
endswitch
return 0
end
function normSanityCheck()
DFREF dfr=root:Packages:Normalizer
wave /T listWave=dfr:w_newList
wave selWave=dfr:w_selection
variable i,j,i_max=dimsize(listWave, 0)
selWave[][2][%backcolors]=0
for (i=0; i<i_max; i+=1)
for (j=i+1; j<i_max; j+=1)
if (stringmatch(listWave[i][2], listWave[j][2]))
selWave[i][2][%backcolors]=1
selWave[j][2][%backcolors]=1
endif
endfor
if(waveexists($listWave[i][2]))
selWave[i][2][%backcolors]=1
endif
endfor
end
"Normalize Waves", /Q
end
function NormalizeWaves()
dowindow /k NormPanel
NewDataFolder /O root:Packages
NewDataFolder /O root:Packages:Normalizer
DFREF dfr=root:Packages:Normalizer
make /o /n=(0,3)/T dfr:w_newList /WAVE=w_newList
make /o/W/U /n=(3,5,3) dfr:w_color/WAVE=w_color
w_color={{0,0,0},{65535,0,0}}
MatrixTranspose w_color
make /o /n=(0,3,3) dfr:w_selection /WAVE=w_selection
SetDimLabel 2,1,backColors,w_selection // define plane 1 as background colors
make /o /n=3 /T dfr:w_titles /wave=w_titles
w_titles={"input","mm","output"}
wave /T w_wavelist=ListToTextWave(wavelist("*",";","DIMS:1"), ";")
killwaves /Z dfr:w_wavelist
movewave w_wavelist dfr:w_wavelist
make /o/n=(numpnts(w_wavelist)) dfr:w_waveselection /wave=w_waveselection
string /G dfr:s_edit=""
NewPanel /K=1/N=NormPanel/W=(100,100,950,560) as "Normalize"
ModifyPanel /W=NormPanel fixedSize=1
ListBox listboxWaves,win=NormPanel, pos={20, 40},size={200, 350}, listwave=w_wavelist, selwave=w_waveselection, mode=9
button buttonGrabWaves win=NormPanel, pos={250,180},size={50,50},title=">", proc=normButtons
ListBox listboxOut,win=NormPanel, mode=6, selwave=w_selection, titlewave=w_titles, pos={330, 40},size={500, 350}, editstyle=1
ListBox listboxOut,win=NormPanel, colorwave=w_color, listwave=w_newList,widths={150,50,150}, fsize=16, proc=normListBox
Button buttonDoIt win=NormPanel,pos={780,410},size={50,30},title="Do It", proc=normButtons
Button buttonCancel win=NormPanel,pos={700,410},size={60,30},title="Cancel", proc=normButtons
end
// wrapper for buttons
function normButtons(ba)
STRUCT WMButtonAction &ba
DFREF dfr=root:Packages:Normalizer
wave /T w_wavelist=dfr:w_wavelist
wave w_waveselection=dfr:w_waveselection
wave /T w_newList=dfr:w_newList
wave w_selection=dfr:w_selection
wave w_color=dfr:w_color
variable i,count
switch( ba.eventCode )
case 2: // mouse up
if(stringmatch(ba.ctrlName, "buttonGrabWaves"))
count=numpnts(w_wavelist)
for (i=0;i<count;i+=1)
if (w_waveselection[i])
variable rowsinwave=dimsize(w_newList, 0)
FindValue /TEXT=w_wavelist[i] w_newList
if (V_value==-1 || v_value>rowsinwave) // add a wave
w_newList[dimsize(w_newList, 0)][]={{w_wavelist[i]},{"0"},{CleanupName(w_wavelist[i]+"_cm",0)}}
w_selection[dimsize(w_selection, 0)][]={{0},{2},{2}}
normSanityCheck()
endif
endif
endfor
elseif(stringmatch(ba.ctrlName, "buttonDoIt"))
count=dimsize(w_newList, 0)
for (i=0;i<count;i+=1)
if (waveexists($w_newList[i][2]))
doalert 1, "Overwrite "+w_newList[i][2]+"?"
if (v_flag==2)
continue
endif
endif
wave w=$w_newList[i][0]
variable factor=str2num(w_newList[i][1])
duplicate /o w $w_newList[i][2]/wave=w2
w2=w/(factor/10)
// output is forced to be non-liberal
printf "Duplicate /O %s %s\r", possiblyquotename(w_newList[i][0]), w_newList[i][2]
printf "%s = %s / %g\r", w_newList[i][2], possiblyquotename(w_newList[i][0]), factor/10
endfor
redimension /N=(0,-1,-1,-1) w_newList, w_selection
elseif(stringmatch(ba.ctrlName, "buttonCancel"))
dowindow /k NormPanel
endif
break
case -1: // control being killed
break
endswitch
return 0
end
// check sanity of edits
function normListBox(lba) : ListBoxControl
STRUCT WMListboxAction &lba
Variable row = lba.row
Variable col = lba.col
WAVE/T/Z listWave = lba.listWave
WAVE/Z selWave = lba.selWave
DFREF dfr=root:Packages:Normalizer
SVAR s_edit=dfr:s_edit
switch( lba.eventCode )
case -1: // control being killed
break
case 1:
selWave[][1,2][0]=selWave & ~1
// stop edit when cell loses focus
// so that bg color is visible
break
case 6: // begin edit
s_edit=listWave[row][col]
break
case 7: // finish edit
if(col==1)
if(numtype(str2num(listWave[row][col]))==2)
listWave[row][col]=s_edit
else
listWave[row][col]=num2str(str2num(listWave[row][col]))
endif
elseif(col==2)
listWave[row][col]=CleanupName( listWave[row][col],0)
normSanityCheck()
endif
break
endswitch
return 0
end
function normSanityCheck()
DFREF dfr=root:Packages:Normalizer
wave /T listWave=dfr:w_newList
wave selWave=dfr:w_selection
variable i,j,i_max=dimsize(listWave, 0)
selWave[][2][%backcolors]=0
for (i=0; i<i_max; i+=1)
for (j=i+1; j<i_max; j+=1)
if (stringmatch(listWave[i][2], listWave[j][2]))
selWave[i][2][%backcolors]=1
selWave[j][2][%backcolors]=1
endif
endfor
if(waveexists($listWave[i][2]))
selWave[i][2][%backcolors]=1
endif
endfor
end
Forum
Support
Gallery
Igor Pro 9
Learn More
Igor XOP Toolkit
Learn More
Igor NIDAQ Tools MX
Learn More