' BandWidthPlot.bas for FilmStar DESIGN, MEASURE 32-bit
' Copyright 1995-2001 FTG Software Associates
'
' Plots graph showing max, center and half width
' To use this program, first scan a spectrum or load one from disk.
' To run this program as a macro, insert the following under Evaluate...Macro...Edit
'
'   Description   BandPass Filter
'   Command       basrun c:\winfilm\basic32\bandwidthplot.bas;
'
Option Explicit
DefInt I-N
DefSng A-H, O-Z

Sub Main
    ' FilmStar BASIC keywords in red
    Dim k, kErr As Boolean, b50, tm, wc, wMin, wMax, gs$
    ' Calculate within range wMin, wMax as shown in FilmStar screen
    ' This allows the spectral data set to be larger than the displayed axes
    ' when there are several peaks to be considered
    AxesRange wMin, wMax
    BandMax wMin, wMax, tm, kErr
    tm = 100*tm
    If Not kErr Then BandCtr wMin, wMax, wc, kErr   ' Band center
    If Not kErr Then BandWidth 50, wMin, wMax, b50, kErr  ' 50% bandwidth
    If Not kErr Then
        PlotClose
        ' Pasted annotation provides code basis
        '    vline 1640,5,|b  1640 nm,9;0
        '    hline 96.7,5,|l96.70%,9;0
        '    graph 1633.7,48.3,43,,9;0
        '    graph 1646.3,48.3,45,,9;1
        '    graph 1647.3,47.6,0,12.6 nm,9;2
        gs$ = "vline " & tStr(wc) & ",5,|b  " & eFmt$(wc) & " nm,9;0" & vbCrLf
        gs$ = gs$ & "hline " & tStr(tm) & ",5,|l" & eFmt$(tm) & "%,9;0" & vbCrLf
        tm = tm/2
        gs$ = gs$ & "graph " & tStr(wc-b50/2) & "," & tStr(tm) & ",43,,9;0" & vbCrLf
        gs$ = gs$ & "graph " & tStr(wc+b50/2) & "," & tStr(tm) & ",45,,9;1" & vbCrLf
        ' offset label +1 nm, -.7 %
        gs$ = gs$ & "graph " & tStr(wc+b50/2 +1) & "," & tStr(tm-.7) & ",0," & eFmt$(b50) & " nm,9;2"
        PlotAnnotation = gs$
        PlotAnnotate True   ' Must be before PlotActivate
        PlotActivate
        PlotNext
    Else
        Display "----Error----", "Bandwidth Calculation", 6000, 4000, "Arial", 32, 1
    End If
End Sub

Sub AxesRange(wMin, wMax)  ' Returns current axes range
    Dim k, s$
    AxesCopy
    s$ = Clipboard$()
    k = InStr(s$, vbTab)
    wMin = Val(Mid$(s$, 1, k -1))
    s$ = Mid$(s$, k + 1)
    k = InStr(s$, vbTab)
    wMax = Val(Mid$(s$, 1, k -1))
End Sub

Function tStr(ByVal v!) As String
    tStr = Trim$(Str(Round(v,3)))
End Function

Function eFmt$(v)
    ' Formats for European decimal (replace "," by "`")
    ' "`" is then replaced by "," in the FSPlot Module
    eFmt$ = Replace(Format$(v, "0.00"),",","`")
End Function