#pragma rtGlobals=3 // Use modern global access method and strict wave access. // Point Label v1.2 Improved label formatting, including settings control panel // v1.2.1 panel formatting takes platform (MAc, Win) into account // R. Knochenmuss 8 Jan 2018 constant macpaneldefault=1.2 // scale factors for control panel constant winpaneldefault=1 Menu "Point Labels" "Add point label@csrA /OF2",/Q,AddPointLabel() "Del labels wave of csrA /OF3",/Q,DelPointLabels() "Point Label settings",/Q,MakePointLabelControl() End //-------------------------------------------------------------------------------------------------------------------- Function MakePointLabelControl() string str variable pscale DoWindow PointLabelControl if (v_flag) DoWindow/F PointLabelControl else if (!datafolderexists("root:Packages")) NewDataFolder root:Packages endif if (!datafolderexists("root:Packages:PtLbl")) NewDataFolder root:Packages:PtLbl variable/G root:Packages:PtLbl:afterdecimal = 2 variable/G root:Packages:PtLbl:labelrelsize = 100 endif str=igorinfo(2) // OS win or mac? if (cmpstr(str,"Windows")==0) pscale=winpaneldefault else pscale=macpaneldefault endif NewPanel /K=1/W=(134,60,134+165*pscale,150) as "Point Labels" DoWindow/C PointLabelControl ModifyPanel cbRGB=(65534,65534,65534) SetDrawLayer UserBack SetDrawEnv fsize= 13,fstyle= 1 DrawText 21*pscale,23,"Point Label Settings" SetVariable setdec,pos={11, 30},size={147*pscale,18.33},title="Digits after decimal " SetVariable setdec,fSize=12 SetVariable setdec,limits={0,inf,1},value= root:Packages:PtLbl:afterdecimal SetVariable setdec1,pos={18,55},size={137*pscale,18.33},title="Rel. font size, % " SetVariable setdec1,fSize=12 SetVariable setdec1,limits={10,990,10},value= root:Packages:PtLbl:labelrelsize endif End //-------------------------------------------------------------------------------------------------------------------- Function AddPointLabel() // puts vertical X tag on wave carrying cursor A string tagname,wname,wnamex, taglabel, tracename, info, DFname, CTRname, labelfmt variable xwexists, tagvalue, ii, jj, namehash wname=CsrWave(A) // name of wave on which user has placed cursor A if (StrLen(wname)==0) print "Cursor A is not on a wave" abort else wname=GetWavesDataFolder(CsrWaveRef(A),2) tracename=NameofWave(CsrWaveRef(A)) endif wave DA=$wname // local reference to Y wave if (WaveExists(XWaveRefFromTrace("",tracename))) // check for X wave xwexists=1 wnamex=NameofWave(XWaveRefFromTrace("",tracename) ) //XWaveName("",wname) // name of X-wave on which user has placed cursor A wave DAx=XWaveRefFromTrace("",tracename) // local reference to X wave tagvalue=DAx[pcsr(A)] //print "using x wave:",wnamex setscale /P x,0,1,DA // "point" scaling to facilitate tag setting else xwexists=0 tagvalue=xcsr(A) endif //print tagvalue, pcsr(A) String savedDataFolder = GetDataFolder(1) // Save current DF name if (!datafolderexists("root:Packages")) NewDataFolder root:Packages endif if (!datafolderexists("root:Packages:PtLbl")) NewDataFolder root:Packages:PtLbl variable/G root:Packages:PtLbl:afterdecimal = 2 variable/G root:Packages:PtLbl:labelrelsize = 100 MakePointLabelControl() endif nvar afterdecimal=root:Packages:PtLbl:afterdecimal nvar labelrelsize=root:Packages:PtLbl:labelrelsize info=CsrInfo(A) ii= strsearch(info,"/W=",0) ii+=3 jj= strsearch(info," ",ii) DFname=info[ii,jj-1] + "_" + CsrWave(A) namehash=stringCRC(0,DFname) // hashing enables us to use long names sprintf DFname, "%12d",namehash DFname=replacestring (" ",DFname,"x") SetDataFolder root:Packages:PtLbl if (!datafolderexists(DFname)) NewDataFolder $DFname endif setdatafolder dfname CTRname= "NpointLabels" if (!exists(CTRname)) variable/G $CTRname // this stores nr of labels on this wave in this window endif nvar NpointLabels=$CTRname NpointLabels+=1 // label formatting if (labelrelsize<100) labelfmt=" \\Zr0"+num2str(labelrelsize)+"%."+num2str(afterdecimal)+"f " else labelfmt=" \\Zr"+num2str(labelrelsize)+"%."+num2str(afterdecimal)+"f " endif sprintf taglabel, labelfmt , tagvalue if (NpointLabels<10) sprintf tagname,"%s_%1d",DFname,NpointLabels elseif (NpointLabels<100) sprintf tagname,"%s_%2d",DFname,NpointLabels else sprintf tagname,"%s_%3d",DFname,NpointLabels endif SetDataFolder savedDataFolder Tag/C/A=MB/B=1/N=$tagname/F=0/L=1/X=0.00/Y=5.00/O=90/I=1 $tracename, xcsr(A), taglabel End //-------------------------------------------------------------------------------------------------------------------- Function DelPointLabels() // removes all tags on wave carrying cursor A string tagname,wname,wnamex, taglabel, tracename, info, DFname, CTRname variable xwexists, tagvalue, ii, jj, namehash wname=CsrWave(A) // name of wave on which user has placed cursor A if (StrLen(wname)==0) print "Cursor A is not on a wave" abort else wname=GetWavesDataFolder(CsrWaveRef(A),2) tracename=NameofWave(CsrWaveRef(A)) endif wave DA=$wname // local reference to Y wave String savedDataFolder = GetDataFolder(1) // Save current DF name if (!datafolderexists("root:Packages:PtLbl")) // nothing to delete if this hasnt been created return 0 endif setdatafolder root:Packages:PtLbl info=CsrInfo(A) ii= strsearch(info,"/W=",0) ii+=3 jj= strsearch(info," ",ii) DFname=info[ii,jj-1] + "_" + CsrWave(A) namehash=stringCRC(0,DFname) // hashing enables us to use long names sprintf DFname, "%12d",namehash DFname=replacestring (" ",DFname,"x") if (!datafolderexists(DFname)) // nothing to delete SetDataFolder savedDataFolder return 0 endif setdatafolder DFname CTRname= "NpointLabels" if (!exists(CTRname)) // nothing to delete SetDataFolder savedDataFolder return 0 endif nvar NpointLabels=$CTRname for (ii=NpointLabels; ii>0; ii-=1) if (ii<10) sprintf tagname,"%s_%1d",DFname,ii elseif (NpointLabels<100) sprintf tagname,"%s_%2d",DFname,ii else sprintf tagname,"%s_%3d",DFname,ii endif Tag/K/N=$tagname endfor NpointLabels=0 setdatafolder root:Packages:PtLbl KillDataFolder/Z DFname SetDataFolder savedDataFolder End