source: sans/SANSReduction/branches/kline_29MAR07/Put in User Procedures/SANS_Reduction_v5.00/Subtract_1D.ipf @ 72

Last change on this file since 72 was 41, checked in by srkline, 16 years ago

change to UNIX line endings

File size: 17.7 KB
Line 
1#pragma rtGlobals=1             // Use modern global access method.
2#pragma version=5.0
3#pragma IgorVersion=4.0
4
5///////////////////////
6//
7// Procedures to manipulate 1-D datasets
8// specifically, to subtract 1-D data (sample - buffer)
9// as is typically done for biological samples in buffer solution
10//
11// This was written largely by Dobrin Bossev
12// - I simply adapted it to work cleanly with the SANS Reduction Macros
13// - 14MAY03 SRK
14//
15//
16// - could be expanded to do more manipulations, but could quickly
17// become cumbersome (like the Arithmetic Panel)
18//
19// - could allow for interpolation to match data sets, or only a partial
20// q-range for the "solvent" file
21//
22///////////////////////
23
24// main entry procedure for subtraction panel
25// re-initializes necessary folders and waves
26Proc OpenSubtract1DPanel()()
27        DoWindow/F Subtract_1D_Panel
28        if(V_Flag==0)
29                Init_Subtract1D()
30                Subtract_1D()           //the panel
31                Plot_Sub1D()            //the graph
32        endif
33End
34
35// initializes data folder and waves needed for the panel (contains a listbox)
36Proc Init_Subtract1D()
37        //create the data folder
38        NewDataFolder/O/S root:myGlobals:Subtract1D
39        //create the waves and variables
40        String/G gName1="<none>"
41        String/G gName2="<none>"
42        Variable/G gSolvnormal=0
43        Variable/G gPresetc=0
44        Variable/G gS1=0
45        Variable/G gS2=0
46        Variable/G gCorrection=1
47        Variable/G gPlotState=0
48        Variable/G gNullSolvent=0
49               
50        Make/N=1/D/O w01,w11,w21,w31,w41,w51
51        Make/N=1/D/O w02,w12,w22,w32,w42,w52
52        Duplicate/O w01 xsample
53        Duplicate/O w11 ysample
54        Duplicate/O w21 ssample
55        Duplicate/O w02 xsolvent
56        Duplicate/O w12 ysolvent
57        Duplicate/O w22 ssolvent
58        Duplicate/O w01 xresult
59        Duplicate/O w11 yresult
60        Duplicate/O w21 sresult
61       
62        SetDataFolder root:
63End
64
65//draws the panel to control the subtraction
66Proc Subtract_1D()
67        if(root:myGlobals:gIsMac==1)
68                NewPanel /W=(467,139,821,423)/K=2  as "Solvent Subtraction"
69        else
70                NewPanel /W=(522,139,876,422)/K=2  as "Solvent Subtraction"
71        endif
72        DoWindow/C Subtract_1D_Panel
73        SetDrawEnv fsize=10, fstyle= 5,textrgb=(65535,0,0)
74        DrawText 10,20,"Sample Scattering File:"
75        SetDrawEnv textrgb= (0,0,65280),fstyle=5,fsize=10
76        DrawText 10,90,"Solvent Scattering File:"
77        SetDrawEnv  fsize=10, fstyle= 5
78        DrawText 10,165,"Result:"
79        //add the controls
80        Button button_0,pos={150,36},size={90,20},proc=LoadSample, title="Load Sample"
81        Button button_0,help={"This will load the 6 column Sample Scattering File"}
82        Button button_1,pos={150,106},size={90,20},proc=LoadSolvent,title="Load Solvent"
83        Button button_1,help={"This will load the 6 column Solvent Scattering File"}
84        Button button_4,pos={18,248},size={90,20},proc=Calculate,title="Calculate"
85        Button button_4,help={"This will subtract the intensities of the two files according to the shown expression"}
86        Button button_5,pos={122,248},size={110,20},proc=SaveResult,title="Save Result"
87        Button button_5,help={"This will save the result in a file"}
88        Button button_6,pos={10,196},size={125,20},proc=MatchingRange,title="Matching Range"
89        Button button_6,help={"This will capture the range between the two cursors to determine f"}
90        Button button_2,pos={275,248},size={50,20},proc=Sub1D_DoneButton,title="Done"
91        Button button_2,help={"Closes both the panel and the associated graph"}
92        Button button_3,pos={300,36},size={25,20},proc=ShowSub1DHelp,title="?"
93        Button button_3,help={"Shows help file for subtracting 1-D data sets"}
94        CheckBox check_0,pos={14,40},size={117,14},proc=CheckCon,title="Rescale Sample file?"
95        CheckBox check_0,value= root:myGlobals:Subtract1D:gSolvnormal
96        CheckBox check_1,pos={235,187},size={134,14},proc=CheckCon,title="Preset     manually?"
97        CheckBox check_1,value= root:myGlobals:Subtract1D:gPresetc
98        CheckBox check_2,pos={225,150},size={134,14},proc=NullSolventCheck,title="Solvent = 1?"
99        CheckBox check_2,value= root:myGlobals:Subtract1D:gNullSolvent,disable=2
100        //
101        ValDisplay valdisp_0,pos={145,187},size={70,18},title="Start ",Font="Arial",fsize=10
102        ValDisplay valdisp_0,limits={0,0,0},barmisc={0,1000},value= root:myGlobals:Subtract1D:gS1
103        ValDisplay valdisp_1,pos={145,207},size={70,18},title="End  ",Font="Arial",fsize=10
104        ValDisplay valdisp_1,limits={0,0,0},barmisc={0,1000},value= root:myGlobals:Subtract1D:gS2
105        //
106        SetVariable setvar_0,pos={250,207},size={70,19},title=":",font="Arial",fsize=10
107        SetVariable setvar_0,limits={-inf,inf,0},value=root:myGlobals:Subtract1D:gCorrection
108        //sample name
109        SetVariable setvar_1,pos={150,7},size={200,20},title=":",noEdit=1
110        SetVariable setvar_1,limits={1,1,0},value=root:myGlobals:Subtract1D:gName1
111        //solvent name
112        SetVariable setvar_2,pos={150,77},size={200,20},title=":",noEdit=1
113        SetVariable setvar_2,limits={1,1,0},value=root:myGlobals:Subtract1D:gName2
114        //
115        SetDrawEnv fname="Times", fsize=14, fstyle= 3
116        DrawText 289,202,"f"
117        SetDrawEnv fname="Times", fsize=14, fstyle= 3
118        DrawText 241,223,"f"
119        //draw the fancy text on the panel
120        WriteExpression(0)
121       
122EndMacro
123
124Function ShowSub1DHelp(ctrlName) : ButtonControl
125        String ctrlName
126        //DoAlert 0,"The help file has not been written yet\r\r\t\t :-("
127        DisplayHelpTopic/K=1 "SANS Data Reduction Tutorial[Subtract 1D Data]"
128End
129//kills both the panel and the graph, and then the data folder
130Function Sub1D_DoneButton(ctrlName)
131        String ctrlName
132       
133        DoWindow/K Subtract_1D_Panel
134        DoWindow/K Plot_Sub1D
135        KillDataFolder root:myGlobals:Subtract1D
136        return(0)
137End
138
139
140Function Calculate(ctrlName) : ButtonControl
141        String ctrlName
142
143//      SetDataFolder root:myGlobals:Subtract1D
144        Variable p1,p2
145        SVAR gName1 = root:myGlobals:Subtract1D:gName1
146        SVAR gName2 = root:myGlobals:Subtract1D:gName2
147        //check for files
148        if(cmpstr(gName2,"<none>") == 0)
149                DoAlert 0, "Load Solvent file!"
150                return(1)
151        endif
152        if(cmpstr(gName1,"<none>") == 0)
153                DoAlert 0, "Load Sample file!"
154                return(1)
155        endif
156       
157        WAVE xsample=root:myGlobals:Subtract1D:xsample
158        WAVE xsolvent=root:myGlobals:Subtract1D:xsolvent
159        //WAVE w01=root:myGlobals:Subtract1D:w01
160        WAVE ysample=root:myGlobals:Subtract1D:ysample          //w11
161        WAVE ssample=root:myGlobals:Subtract1D:ssample          //w21
162        WAVE ysolvent=root:myGlobals:Subtract1D:ysolvent                        //w12
163        WAVE ssolvent=root:myGlobals:Subtract1D:ssolvent                        //w22
164       
165        NVAR gPresetc = root:myGlobals:Subtract1D:gPresetc
166        NVAR gSolvNormal = root:myGlobals:Subtract1D:gSolvNormal
167        NVAR gCorrection = root:myGlobals:Subtract1D:gCorrection
168        NVAR gNullSolvent = root:myGlobals:Subtract1D:gNullSolvent
169        NVAR gS1 = root:myGlobals:Subtract1D:gS1
170        NVAR gS2 = root:myGlobals:Subtract1D:gS2
171
172//no interpolation - exit if files are not EXACTLY the same length
173// and have EXACTLY the same q-values
174//
175////////////// 
176//      Variable maxDiff
177//      //check that both files are of the same length
178//      if (numpnts(xsample)!=numpnts(xsolvent))
179//              DoAlert 0, "The lengths of Sample and Solvent files are NOT identical!"
180//              return(1)
181//      endif
182//     
183//      //check that both files have the same q-values
184//      //currently, abort, but could offer to interpolate
185//      Duplicate/O xsample helpwave
186//      helpwave = 100*abs((xsample - xsolvent)/xsample)                //% difference in q-values
187//      WaveStats /Q helpwave
188//      KillWaves /Z helpwave
189//      maxDiff = V_max
190//      if(maxDiff > 0.5)               //each q-value must match to within 0.5%
191//              DoAlert 0, "The q-values of Sample and Solvent files are NOT identical!"
192//              return(1)
193//      endif
194///////////////
195       
196        //set up for interpolation
197        Duplicate/O xsample root:myGlobals:Subtract1D:xsolv_interp      //make the solvent x match the sample
198        Duplicate/O xsample root:myGlobals:Subtract1D:ysolv_interp
199        Duplicate/O xsample root:myGlobals:Subtract1D:ssolv_interp
200        WAVE xsolv_interp = root:myGlobals:Subtract1D:xsolv_interp
201        WAVE ysolv_interp = root:myGlobals:Subtract1D:ysolv_interp
202        WAVE ssolv_interp = root:myGlobals:Subtract1D:ssolv_interp
203        ysolv_interp = interp(xsolv_interp, xsolvent, ysolvent )
204        ssolv_interp = interp(xsolv_interp, xsolvent, ssolvent )
205       
206        Duplicate/O xsample root:myGlobals:Subtract1D:xresult
207        Duplicate/O ysample root:myGlobals:Subtract1D:yresult
208        Duplicate/O ssample root:myGlobals:Subtract1D:sresult
209        WAVE xresult = root:myGlobals:Subtract1D:xresult
210        WAVE yresult = root:myGlobals:Subtract1D:yresult
211        WAVE sresult = root:myGlobals:Subtract1D:sresult
212       
213        if (gPresetc==0)                //find the constant from the cursor range
214                Duplicate/O ysample helpwave
215                if(gSolvNormal && gNullSolvent)
216                        helpWave = ysample                              //ysolvent == 0 under these conditions
217                else
218                        helpwave = ysample/ysolv_interp         //get the ratio = I(sample)/I(solvent)
219                endif
220                //gS1 and gS2 are qvalues now, convert them back to points
221                //on the interpolated xsolv_interp
222                p1 = BinarySearch(xsolv_interp, gS1 )
223                p2 = BinarySearch(xsolv_interp, gS2 )
224                //print p1,p2
225                WaveStats/Q/R=[p1,p2] helpwave          //just in the selected range
226                gCorrection = V_avg
227                KillWaves /Z helpwave
228        endif
229        if (gSolvnormal==0)
230                yresult = ysample - gCorrection*ysolv_interp
231                sresult = sqrt(ssample^2+gCorrection*gCorrection*ssolv_interp^2)
232        else
233                yresult = ysample/gCorrection - ysolv_interp
234                sresult = sqrt((ssample^2)/gCorrection/gCorrection+ssolv_interp^2)
235        endif
236        return(0)
237End
238
239Proc LoadSample(ctrlName) : ButtonControl
240        String ctrlName
241       
242        LoadFile_Sub1D(1)
243        SetDataFolder root:myGlobals:Subtract1D
244        Duplicate/O w01 xsample
245        Duplicate/O w11 ysample
246        Duplicate/O w21 ssample
247        SetDataFolder root:
248       
249        //allow user to set unity/null background, now that sample data exists
250        CheckBox check_2 win=Subtract_1D_Panel,disable=0
251        //if solvent was set to one (or zero), toggle the box so the
252        //"solvent" set is updated to reflect the q-values of the newly
253        //loaded sample
254        ControlInfo check_2
255        if(V_Value==1)
256                NullSolventCheck("",1)          //fakes as if the box was checked
257        Endif
258       
259End
260
261
262Proc LoadSolvent(ctrlName) : ButtonControl
263        String ctrlName
264
265        LoadFile_Sub1D(2)
266        SetDataFolder root:myGlobals:Subtract1D
267        Duplicate/O w02 xsolvent
268        Duplicate/O w12 ysolvent
269        Duplicate/O w22 ssolvent
270       
271        if (cmpstr(gName2,"<none>")!=0)
272                Cursor A, ysolvent, leftx(xsolvent)
273                Cursor/A=0 B, ysolvent, rightx(xsolvent)
274                //make sure that the "solvent ==1" checkbox is not checked
275                CheckBox check_2,value=0
276                //MatchingRange("none")
277        endif
278        SetDataFolder root:
279End
280
281//returns the Matching range to use in terms of q-values
282//rather than points, which will be incorrect if the
283//solvent data needs to be interpolated
284Function MatchingRange(ctrlName) : ButtonControl
285        String ctrlName
286
287        SVAR name2 = root:myGlobals:Subtract1D:gName2
288        NVAR s1 = root:myGlobals:Subtract1D:gS1
289        NVAR s2 = root:myGlobals:Subtract1D:gS2
290        if (cmpstr(name2,"<none>") != 0)
291                s1=min(pcsr(A,"Plot_Sub1D" ),pcsr(B,"Plot_Sub1D"))
292                s2=max(pcsr(A,"Plot_Sub1D" ),pcsr(B,"Plot_Sub1D"))
293                Wave qval=root:myGlobals:Subtract1D:xsolvent            //this will exist
294                s1 = qval[s1]
295                s2 = qval[s2]
296                //print s1,s2
297        endif
298End
299
300Proc Plot_Sub1D()
301        SetDataFolder root:myGlobals:Subtract1D
302        if(root:myGlobals:gIsMac==1)
303                Display/W=(14,44,454,484)/K=1 ysample vs xsample
304        else
305                Display/W=(14,44,350,380)/K=1 ysample vs xsample
306        endif
307        DoWindow/C Plot_Sub1D
308        ModifyGraph rgb(ysample)=(65535,0,0)
309        ErrorBars ysample Y,wave=(ssample,ssample)
310        AppendToGraph/L ysolvent vs xsolvent
311        ModifyGraph rgb(ysolvent)=(0,0,65535)
312        ErrorBars ysolvent Y,wave=(ssolvent,ssolvent)
313        //AppendToGraph/R yresult vs xresult
314        AppendToGraph/L yresult vs xresult
315        ModifyGraph rgb(yresult)=(0,65535,0)
316        ErrorBars yresult Y,wave=(sresult,sresult)
317        ModifyGraph mode=3, msize=2, marker=19, mirror=1, tick=2, log(bottom)=1
318        Legend/C/N=text0/J/A=LT/X=2/Y=2 "\\s(ysample) Sample\r\\s(ysolvent) Solvent\r\\s(yresult) Result"
319        ShowInfo
320        Label left "Sample, Solvent I (cm\\S-1\M)"
321        Label bottom "q ("+root:myGlobals:gAngstStr+"\\S-1\M)"
322//      Label right "Result I/cm\\S-1"
323        ControlBar 40
324        Button button_7,pos={10,10},size={125,20},proc=MatchingRange,title="Matching Range"
325        Button button_7,help={"This will capture the range between the two cursors to determine f"}
326        CheckBox check_0,pos={170,12},size={117,14},proc=PlotSub1DCheck,title="Log I(q)?"
327        CheckBox check_0,value= root:myGlobals:Subtract1D:gPlotState
328        SetDataFolder root:
329End
330
331//toggles the y-axis scaling of the graph between log and linear
332// the bottom axis is always log scale
333//
334Proc PlotSub1DCheck(ctrlName,checked) : CheckBoxControl
335        String ctrlName
336        Variable checked
337
338        SetdataFolder root:myGlobals:Subtract1D
339        if(checked)
340                //make log scale
341                ModifyGraph log=1
342        else
343                //make linear scale on y-axis
344                Modifygraph log=0,log(bottom)=1
345        endif
346        gPlotState = checked
347        SetDataFolder root:
348End
349
350//
351Proc NullSolventCheck(ctrlName,checked) : CheckBoxControl
352        String ctrlName
353        Variable checked
354
355        SetDataFolder root:myGlobals:Subtract1D
356       
357        Variable solvValue
358        String nameStr=""
359        if(gSolvNormal)
360                CheckBox check_2,title="Solvent = 0?"
361                solvValue=0
362                nameStr="Solvent values set to zero"
363        else
364                CheckBox check_2,title="Solvent = 1?"
365                solvValue=1
366                nameStr="Solvent value set to one"
367        endif
368       
369        if(checked)
370                //zero/one for the solvent
371                Duplicate/O w01 xsolvent                //duplicate the sample data
372                Duplicate/O w11 ysolvent
373                Duplicate/O w21 ssolvent
374                ysolvent=solvValue
375                ssolvent=0
376                if(gS1==0 && gS2 ==0)
377                        Cursor A, ysample, leftx(xsample)       // put the cursors on the sample data
378                        Cursor/A=0 B, ysample, rightx(xsample)
379                else
380                        Cursor A, ysample, BinarySearch(xsample, gS1 )          // put the cursors on the sample data
381                        Cursor/A=0 B, ysample, BinarySearch(xsample, gS2 )
382                endif
383                gName2 = nameStr
384        else
385                gName2 = "<none>"
386        Endif
387        gNullSolvent=checked
388       
389        SetDataFolder root:
390End
391
392Proc CheckCon(ctrlName,checked) : CheckBoxControl
393        String ctrlName
394        Variable checked
395
396        SetdataFolder root:myGlobals:Subtract1D
397        if (cmpstr(ctrlName,"check_0") == 0)            //box to set the normalization
398                gSolvnormal =checked
399                WriteExpression(checked)                //draw the text of the expression being calculated
400                ControlInfo check_2
401                NullSolventCheck("",V_Value)
402        else
403                //check_1,      box to manually set the preset
404          gPresetc = checked
405        endif
406        SetDataFolder root:
407End
408
409//type = 1 specifies sample data
410//type = 2 specifies solvent data
411//
412// any existing data will be overwritten
413//
414// need to retain header information for later save
415// will need a more sophisticated open/close to get the header
416//
417//don't try to re-write as a function - not worth the effort
418//
419Proc LoadFile_Sub1D(type)
420        Variable type   
421       
422        String n0,n1,n2,n3,n4,n5,help
423       
424        Variable refnum,numLines,numData,numHdr,ii
425        String fileStr="",junkStr=""
426       
427        //junkStr = PadString(junkStr, 100, 0 )
428        fileStr=DoOpenFileDialog("pick a 1D data set")
429        if(cmpstr(fileStr,"")==0)
430                return          //no file selected, exit
431        endif
432       
433        SetDataFolder root:myGlobals:Subtract1D
434        LoadWave/G/D/A fileStr
435        If (V_flag==6)
436                n0 = StringFromList(0, S_waveNames ,";" )
437                n1 = StringFromList(1, S_waveNames ,";" )
438                n2 = StringFromList(2, S_waveNames ,";" )
439                n3 = StringFromList(3, S_waveNames ,";" )
440                n4 = StringFromList(4, S_waveNames ,";" )
441                n5 = StringFromList(5, S_waveNames ,";" )
442                Duplicate/O $n0, $("w0" + num2istr(type))
443                Duplicate/O $n1, $("w1" + num2istr(type))
444                Duplicate/O $n2, $("w2" + num2istr(type))
445                Duplicate/O $n3, $("w3" + num2istr(type))
446                Duplicate/O $n4, $("w4" + num2istr(type))
447                Duplicate/O $n5, $("w5" + num2istr(type))
448                if (type==1)
449                        gName1 = S_fileName
450                        //read in the header of the sample file
451                        // not yet implemented
452                        numLines = CountNumLines(fileStr)
453                        numData = numpnts($n0)
454                        numHdr = numLines - numData
455                        Make/T/O/N=(numHdr) SampleHeader
456                        Open/R refNum as fileStr
457                        ii=0
458                        do
459                                FReadLine refnum, junkStr
460                                SampleHeader[ii] = junkStr
461                                ii+=1
462                        while(ii<numHdr)
463                        Close refnum
464                else
465                        gName2 = S_fileName
466                endif
467               
468        else
469                if (V_flag>0)
470                        DoAlert 0, "This is NOT a six-column file !"
471                endif
472        endif
473        //do some cleanup
474       
475        KillWaves/Z wave0,wave1,wave2,wave3,wave4,wave5,wave6,wave7,wave8,wave9,wave10
476       
477        setDataFolder root:
478end
479
480Function CountNumLines(fileStr)
481        String fileStr
482       
483        Variable num,refnum
484        num=0
485        Open/R refNum as fileStr
486        do
487                FReadLine refnum, junkStr
488                FStatus refnum
489//              Print junkStr
490                num+=1
491        while(V_FilePos<V_logEOF)
492//      print "numlines = ",num
493        Close refnum
494        return(num)
495End
496
497
498Function SaveResult(ctrlName) : ButtonControl
499        String ctrlName
500
501        WAVE xresult = root:myGlobals:Subtract1D:xresult
502        WAVE yresult = root:myGlobals:Subtract1D:yresult
503        WAVE sresult = root:myGlobals:Subtract1D:sresult
504        WAVE w31 = root:myGlobals:Subtract1D:w31
505        WAVE w41 = root:myGlobals:Subtract1D:w41
506        WAVE w51 = root:myGlobals:Subtract1D:w51
507        WAVE/T hdr = root:myGlobals:Subtract1D:SampleHeader
508       
509        //check each wave for existence
510        Variable err=0,refnum
511        String fileName=""
512        String formatStr = "%15.4g %15.4g %15.4g %15.4g %15.4g %15.4g\r\n"
513        err += 1 - WaveExists(xresult)
514        err += 1 - WaveExists(yresult)
515        err += 1 - WaveExists(sresult)
516        err += 1 - WaveExists(w31)
517        err += 1 - WaveExists(w41)
518        err += 1 - WaveExists(w51)
519        err += 1 - WaveExists(hdr)
520       
521        if(err>0)
522                DoAlert 0,"Some of the data is missing - I can't write out the file"
523                return(1)
524        endif
525       
526        fileName = DoSaveFileDialog("Save Data as")
527        if(cmpstr(fileName,"")==0)
528                return(1)
529        endif
530        Open refNum as fileName
531        wfprintf refnum,"%s\n",hdr              //strings already have \r?
532        wfprintf refnum, formatStr, xresult,yresult,sresult,w31,w41,w51
533        Close refnum
534       
535        return(0)
536End
537
538Proc WriteExpression(choice)
539        Variable choice
540
541        SetDrawEnv /W=Subtract_1D_Panel linefgc= (65535,65535,65535)
542        DrawRect 90,140,207,174
543        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,65535,0)
544        DrawText 100,168,"I"
545        SetDrawEnv fname="Times", fsize=22, fstyle= 1,textrgb= (0,0,0)
546        DrawText 100,168,"  ="
547        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (65535,0,0)
548        DrawText 100,168,"     I"
549        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,0,65535)
550        DrawText 100,168,"              I"
551        if (choice==0)
552                SetDrawEnv fname="Symbol", fsize=22, fstyle= 1,textrgb= (0,0,0)
553                DrawText 100,168,"       -"
554                SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,0,0)
555                DrawText 100,168,"          f "
556                SetDrawEnv fname="Times", fsize=22, fstyle= 1,textrgb= (0,0,0)
557                DrawText 100,168,"            *"
558        else
559                SetDrawEnv fname="Times", fsize=22, fstyle= 1,textrgb= (0,0,0)
560                DrawText 100,168,"       /"
561                SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,0,0)
562                DrawText 100,168,"         f "
563                SetDrawEnv fname="Symbol", fsize=22, fstyle= 1,textrgb= (0,0,0)
564                DrawText 100,168,"           -"
565        endif
566End
567
Note: See TracBrowser for help on using the repository browser.