Search code examples
graphtclreal-time

blt graph with interval window?


I have a blt real time graph in tcl/tk, the graph collects data over time with no time limit and it keeps storing all the data points into vectors and the user is able to scroll back and forth in the graph. The problem is that if I let the graph collect the points for a long period of time the cpu and memory consumption increases dramatically, i figure that for a 24 hour interval window should be fine. When i try to "unset x(0)" from the graph i get an error saying "command name invalid" i also try with "x delete 0" and same thing. Any help is much appreciated

This is how i initialize the graph:

proc startGraph {} {
    global btnColor
    global backColor
    global startTime
    global txtActionLevel
    global txtAlertLevel
    global x y1 y2 flagTime inStart inTime vectorFlag
    global resolution
    global notFirstTime
    global txtActionLevel
    set notFirstTime 0

    set resolution 0
    # Create stripchart widget
    blt::stripchart .s -width 625 -height 330 -background $backColor -plotbackground black -font defaultFont
     scrollbar .scroll -command { ScrollToEnd
        .s axis view x } -orient horizontal -relief flat -background black -troughcolor $backColor -activebackground black -elementborderwidth 5
    .s axis configure x -scrollcommand { .scroll set }

    # Create BLT vectors
    blt::vector create x
    blt::vector create y1
    blt::vector create y2
    set startTime 0
    set flagTime 0
    set inStart -1
    set inTime 0
    set vectorFlag 0

    .s configure -borderwidth 0 \
             -leftmargin 0 \
             -rightmargin 0 \
             -plotborderwidth 0 \
             -plotpadx {0 0} \
             -plotpady {0 0}

    .s legend configure -hide yes

    .s grid configure -color gray \
                      -dashes 1 \
                      -minor 0 \
                      -hide 0

    # X-axis

    .s axis configure x -autorange 60 \
                        -shiftby 1 \
                        -stepsize 10 \
                        -subdivisions 1 \
                        -command FormatXLabel


    # Alert txtAlertLevel
    #.s tag create line -mapx 2 -mapy 2

    proc FormatXLabel {widget x} {
        set x [expr round($x)]
        return [clock format $x -format "%I:%M:%S"]
    }

    # Y-axis
    #.s axis configure y -title "C o u n t s"
    image create photo .countsIcon -format PNG -file counts.png
    label .titleGraph -image .countsIcon -background $backColor
    place .titleGraph -in .measureView -x 0 -y 160

    # Particles
    .s element create Particles -symbol {} -color yellow -linewidth 1 \
        -smooth linear -xdata x -ydata y1

    # Bio
    .s element create Bio -symbol {} -color red -linewidth 1 \
        -smooth linear -xdata x -ydata y2


    .s marker create line -name actionLine -coords {-Inf $txtActionLevel Inf $txtActionLevel} -linewidth 1 -outline orange
    .s marker create line -name alertLine -coords {-Inf $txtAlertLevel Inf $txtAlertLevel} -linewidth 1 -outline green

    place .s -in .measureView -x 10 -y 50
    place .scroll -in .measureView -x 60 -y 380 -width 515 -height 35

    #chartTime
}

this is where i add the values to the vectors:

set x(++end) [clock seconds]
    set flagTime 0
    set vectorFlag 1
    set len [y1 length]
    if {$len == 0} {

        set startTime $x(end)

        set y1(++end) $particle_sec
        set y2(++end) $x_summary(bio_sec)
        #if {$inStart < 0} {
        #   .s axis configure x -min "" -max ""
        #   set inStart 0
        #}
    } else {
        set y1(++end) $particle_sec
        set y2(++end) $x_summary(bio_sec)

    }

    puts "Vector length [x length]------"
    puts "First value $x(0)----------"
    #This is where i'm trying to catch whenever it reaches 60 seconds in this case
    #when the length of the vector reaches 60 seconds it will unset the first value
    #but it doesn't work it throws and invalid command name error
    if {[x length] > 60} {
         [unset -nocomplain x(0)]
    }
    #incr everyten
    add_Result $particle_sec $bioSec [format "%.2f" $fv_eff]

Solution

  • for some odd reason when you use blt::vector create the "[unset -nocomplain x(0)]" doesn't seem to work, so i change it back to "x delete 0" without the square brackets and it works now.