source: sans/Dev/trunk/NCNR_User_Procedures/Reduction/SANS/Subtract_1D.ipf @ 418

Last change on this file since 418 was 412, checked in by ajj, 14 years ago

More reorg.

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