Skip to content
lsl.devlsl.devLSL Dev

Google Charts

LSL Header: {{LSL Header}}
This script allows you to take an existing list of values and represent it as a chart using Google's Chart API. The example here takes a list of visitors per hour and represents it as a bar chart. The simpleEncoding method provided by Google has been converted to LSL script.
string simpleEncode(list values, float min, float max)
{
    string text = "";
    float range = 244 / (min - max);//4 * 61
    integer index = -llGetListLength(values);

    do
    {
        integer type = llGetListEntryType(values, index);
        if(type == TYPE_FLOAT || type == TYPE_INTEGER)
            text = llGetSubString(llIntegerToBase64((integer)(range * (min - llList2Float(values, index)))), 4, 4) + text;
        else
            text = "_" + text;

        ++index;
    }
    while (index);

    return text;
}

string cleanup(float value)
{
    string str = (string)value;
    if(value >= 10.0)
        return llGetSubString(str, 0, -8);

    integer i = -1;
    while(llGetSubString(str, i, i) == "0")
        --i;

    if(llGetSubString(str, i, i) == ".")
        --i;

    return llGetSubString(str, 0, i);
}

string chartUrl(list values, list captions, integer yDivisions)
{
    integer min = llFloor(llListStatistics(LIST_STAT_MIN, values));
    integer max = llCeil(llListStatistics(LIST_STAT_MAX, values));

    string url = "http://chart.apis.google.com/chart"
               + "?chs=200x125"
               + "&chd=s:" + simpleEncode(values, min, max)
               + "&cht=lc"
               + "&chxt=x,y"
               + "&chxl=0:";

    integer index = -llGetListLength(captions);
    do
    {
        url += "|" + llEscapeURL(llList2String(captions, index));
        ++index;
    }
    while (index);

    url += "|1:";
    ++yDivisions;
    float range = max - min;

    index = 1;
    do
    {
        url += "|" + cleanup(((index * range) / yDivisions) + min);
        ++index;
    }
    while (index <= yDivisions);

    return url;
}

default
{
    state_entry()
    {
        // PUBLIC_CHANNEL has the integer value 0
        llSay(PUBLIC_CHANNEL,
            chartUrl([8,8,3,2,1,5,3,2,2,3,1,4,6,3,4,7,5,6,5,5,4,5,5,6,4], ["4AM", "4PM", "4AM"], 0));
    }

    touch_start(integer total_number)
    {
        llSay(PUBLIC_CHANNEL,
            chartUrl([8,8,3,2,1,5,3,2,2,3,1,4,6,3,4,7,5,6,5,5,4,5,5,6,4], ["4AM", "4PM", "4AM"], 0));
    }
}
Original wiki source

Some wiki templates and tables need their original context. View this article on the Second Life Wiki. Technical wording and examples are retained from the source; historical guidance may differ from current behavior.

From the Second Life Wiki

Community documentation adapted from Google Charts, by Linden Research, Inc. and contributing residents.View contributors and history.

Imported wiki revision:

Licensed under CC BY-SA 3.0. Last wiki edit: .Formatting and links have been adapted for this site; API metadata follows the LSL definitions.