ASE Home Page Products Download Purchase Support About ASE
ChartDirector Support
Forum HomeForum Home   SearchSearch

Message ListMessage List     Post MessagePost Message

  Update the FullChart
Posted by Gilles on Nov-07-2016 09:15
HI Peter

I use zoomscrolltrackweb for have only the graph that I want with checkbox, and I have put the WebViewPortControl object of viewportcontroldemoweb.php

The chart is update for the checkbox cheked but not the FullChart (the view port control).
Can you say me how I can update it.

Thank you very much
Gilles


Here is the script:


//
// Execute the following initialization code after the web page is loaded
//
JsChartViewer.addEventListener(window, 'load', function() {


    // Update the chart when the view port has changed (eg. when the user zooms in using the mouse)
    var viewer = JsChartViewer.get('<?php echo $viewer->getId()?>');
    viewer.attachHandler("ViewPortChanged", viewer.partialUpdate);

    // Initialize the navigation pad
    JsViewPortControl.get('<?php echo $viewPortCtrl->getId()?>').setViewer(viewer);

    // Draw track cursor when mouse is moving over plotarea or if the chart updates
    viewer.attachHandler(["MouseMovePlotArea", "TouchStartPlotArea", "TouchMovePlotArea", "PostUpdate",
        "Now", "ChartMove"], function(e) {
        this.preventDefault(e);   // Prevent the browser from using touch events for other actions
        trackLineLegend(viewer, viewer.getPlotAreaMouseX());
    });

    // The Update Chart can also trigger a view port changed event to update the chart.
    document.getElementById("SubmitButton").onclick = function() { viewer.raiseViewPortChangedEvent(); return false; };

    // Before sending the update request to the server, we include the state of the check boxes as custom
    // attributes. The server side charting code will use these attributes to decide the data sets to draw.
    viewer.attachHandler("PreUpdate", function() {
        var checkBoxes = ["data0CheckBox", "data1CheckBox", "data2CheckBox", "data3CheckBox"];
        for (var i = 0; i < checkBoxes.length; ++i)
            viewer.setCustomAttr(checkBoxes[i], document.getElementById(checkBoxes[i]).checked ? "T" : "F");
    });

    // Draw track cursor when mouse is moving over plotarea or if the chart updates
    viewer.attachHandler(["MouseMovePlotArea", "TouchStartPlotArea", "TouchMovePlotArea", "PostUpdate",
        "Now", "ChartMove"], function(e) {
        this.preventDefault(e);   // Prevent the browser from using touch events for other actions
        trackLineLegend(viewer, viewer.getPlotAreaMouseX());
    });
});

//
// Draw track line with legend
//
function trackLineLegend(viewer, mouseX)
{
    // Remove all previously drawn tracking object
    viewer.hideObj("all");

    // The chart and its plot area
    var c = viewer.getChart();
    var plotArea = c.getPlotArea();

    // Get the data x-value that is nearest to the mouse, and find its pixel coordinate.
    var xValue = c.getNearestXValue(mouseX);
    var xCoor = c.getXCoor(xValue);
    if (xCoor == null)
        return;

    // Draw a vertical track line at the x-position
    viewer.drawVLine("trackLine", xCoor, plotArea.getTopY(), plotArea.getBottomY(), "black 1px dotted");

    // Array to hold the legend entries
    var legendEntries = [];

    // Iterate through all layers to build the legend array
    for (var i = 0; i < c.getLayerCount(); ++i)
    {
        var layer = c.getLayerByZ(i);

        // The data array index of the x-value
        var xIndex = layer.getXIndexOf(xValue);

        // Iterate through all the data sets in the layer
        for (var j = 0; j < layer.getDataSetCount(); ++j)
        {
            var dataSet = layer.getDataSetByZ(j);

            // We are only interested in visible data sets with names, as they are required for legend entries.
            var dataName = dataSet.getDataName();
            var color = dataSet.getDataColor();
            if ((!dataName) || (color == null))
                continue;

            // Build the legend entry, consist of a colored square box, the name and the data value.
            var dataValue = dataSet.getValue(xIndex);
            legendEntries.push("<nobr>" + viewer.htmlRect(7, 7, color) + " " + dataName + ": " +
                ((dataValue == null) ? "N/A" : dataValue.toPrecision(4)) + viewer.htmlRect(20, 0) + "</nobr> ");

            // Draw a track dot for data points within the plot area
            var yCoor = c.getYCoor(dataSet.getPosition(xIndex), dataSet.getUseYAxis());
            if ((yCoor != null) && (yCoor >= plotArea.getTopY()) && (yCoor <= plotArea.getBottomY()))
            {
                viewer.showTextBox("dataPoint" + i + "_" + j, xCoor, yCoor, JsChartViewer.Center,
                    viewer.htmlRect(7, 7, color));
            }
        }
    }

    // Create the legend by joining the legend entries.
    var legend = "<nobr>[" + c.xAxis().getFormattedLabel(xValue, "mm/dd/yyyy") + "]" + viewer.htmlRect(20, 0) +
        "</nobr> " + legendEntries.reverse().join("");

    // Display the legend on the top of the plot area
    viewer.showTextBox("legend", plotArea.getLeftX(), plotArea.getTopY(), JsChartViewer.BottomLeft, legend,
        "width:" + plotArea.getWidth() + "px;font:bold 11px Arial;padding:3px;-webkit-text-size-adjust:100%;");
}

//
// This method is called when the user clicks on the Pointer, Zoom In or Zoom Out buttons
//
function setMouseMode(mode)
{
    var viewer = JsChartViewer.get('<?php echo $viewer->getId()?>');
    if (mode == viewer.getMouseUsage())
        mode = JsChartViewer.Default;

    // Set the button color based on the selected mouse mode
    document.getElementById("scrollButton").className = "chartButton" +
        ((mode  == JsChartViewer.Scroll) ? " chartButtonPressed" : "");
    document.getElementById("zoomInButton").className = "chartButton" +
        ((mode  == JsChartViewer.ZoomIn) ? " chartButtonPressed" : "");
    document.getElementById("zoomOutButton").className = "chartButton" +
        ((mode  == JsChartViewer.ZoomOut) ? " chartButtonPressed" : "");

    // Set the mouse mode
    viewer.setMouseUsage(mode);
}

//
// This method is called when the user clicks on the buttons that selects the last NN days
//
function setTimeRange(duration)
{
    var viewer = JsChartViewer.get('<?php echo $viewer->getId()?>');

    // Set the view port width to represent the required duration (as a ratio to the total x-range)
    viewer.setViewPortWidth(Math.min(1,
        duration / (viewer.getValueAtViewPort("x", 1) - viewer.getValueAtViewPort("x", 0))));

    // Set the view port left so that the view port is moved to show the latest data
    viewer.setViewPortLeft(1 - viewer.getViewPortWidth());

    // Trigger a view port change event
    viewer.raiseViewPortChangedEvent();
}

  Re: Update the FullChart
Posted by Peter Kwan on Nov-08-2016 03:17
Attachments:
Hi Gilles,

You would need to update the main chart as well as the full chart. I have created an example for your reference.

Hope this can help.

Regards
Peter Kwan
viewportcontroldemo.php
viewportcontroldemo.php

23.57 Kb

  Re: Update the FullChart
Posted by Gilles on Nov-08-2016 09:18
Thank you very much Peter

  Re: Update the FullChart
Posted by Gilles on Nov-10-2016 23:53
Attachments:
Hi Peter,

I have try your code and it work well but the chart don't update its timeline but the fullchart update timeline. so there is a gap between the two time lines if you wait a little time.

I have put for you a picture of the gap after waiting around 18hours and push button id="SubmitButton"
I have also put my code if you want see it.

Do you think it's possible to update the two charts?

Thank you very much.
Gilles
gap_timelines.jpg
graph_temperatures.php
<?php

require_once("/volume1/web/GACHES/graphs/lib/phpchartdir.php");
require_once ('/volume1/web/GACHES/graphs/donnees.php');



RecupereDonnees();

#
# Initialize the WebChartViewer when the page is first loaded
#
function initViewer(&$viewer) {
	//Pour récupérer le creneau que l'on a dans la base
	global $dateMini;
	global $nbLigne;
	
	//construction de la période en fonction des données que l'on à dans la base
	$startAnnee = date('Y', $dateMini);
	$startMois = date('m', $dateMini);
	$startJour = date('d', $dateMini);
	$startHeure = date('H', $dateMini);
	$startMinute = date('i', $dateMini);
	$startSeconde = date('s', $dateMini);
	
    # The full x-axis range is from Jan 1, 2007 to Jan 1, 2012
    $startDate = chartTime($startAnnee, $startMois, $startJour, $startHeure, $startMinute, $startSeconde);
    $endDate = chartTime(date('Y'),date('m'),date('d'), date('H'), date('i'), date('s'));
    $viewer->setFullRange("x", $startDate, $endDate);

    # Initialize the view port to show the last 366 days (out of 1826 days)
	#Initialise le graph sur une largeur de 180 données parmis toutes les données
    $viewer->setViewPortWidth(180 / $nbLigne);
    $viewer->setViewPortLeft(1 - $viewer->getViewPortWidth());

    # Set the maximum zoom to 10 days (out of 1826 days)
	# Défini le zoom maximum 1 donnée parmis toutes les données
    $viewer->setZoomInWidthLimit(1 / $nbLigne);
	
}

#
# Create a random table for demo purpose.
#
function getRandomTable() {
    $r = new RanTable(127, 4, 1000);
    $r->setDateCol(0, chartTime(2016, 10, 1), 86400);
    $r->setCol(1, 150, -10, 10);
    $r->setCol(2, 200, -10, 10);
    $r->setCol(3, 250, -8, 8);
    return $r;
}

#
# Draw the chart
#
function drawChart(&$viewer) {
	global $timeStamps;
	global $dataSeriesA;
	global $dataSeriesB;
	global $dataSeriesC;
	global $dataSeriesD;
	global $dataSeriesE;
	global $dataSeriesF;
	global $dataSeriesG;
	global $dataSeriesH;
	global $dataSeriesI;
	global $dataSeriesJ;
	global $dataSeriesK;
	global $dataSeriesL;
	global $dataSeriesM;
	global $dataSeriesN;

	
    # Determine the visible x-axis range
    $viewPortStartDate = $viewer->getValueAtViewPort("x", $viewer->getViewPortLeft());
    $viewPortEndDate = $viewer->getValueAtViewPort("x", $viewer->getViewPortLeft() +
    $viewer->getViewPortWidth());

    # We need to get the data within the visible x-axis range. In real code, this can be by using a
    # database query or some other means as specific to the application. In this demo, we just
    # generate a random data table, and then select the data within the table.
//$r = getRandomTable();
// print_r($r->getCol(0));
    # Select the data for the visible date range viewPortStartDate to viewPortEndDate. It is
    # possible there is no data point at exactly viewPortStartDate or viewPortEndDate. In this case,
    # we also need the data points that are just outside the visible date range to "overdraw" the
    # line a little bit (the "overdrawn" part will be clipped to the plot area) In this demo, we do
    # this by adding a one day margin to the date range when selecting the data.
//$r->selectDate(0, $viewPortStartDate - 86400, $viewPortEndDate + 86400);

    # The selected data from the random data table
	
// $timeStamps = $r->getCol(0);
// $dataSeriesA = $r->getCol(1);
// $dataSeriesB = $r->getCol(2);
// $dataSeriesC = $r->getCol(3);
// print_r($r->getCol(0));
// print_r($timeStamps);
// print_r($dataSeriesA);
    #
    # Now we have obtained the data, we can plot the chart.
    #

    #================================================================================
    # Configure overall chart appearance.
    #================================================================================

    # Create an XYChart object of size 640 x 400 pixels
    $c = new XYChart(1100, 800);

    # Set the plotarea at (55, 55) with width 80 pixels less than chart width, and height 90 pixels
    # less than chart height. Use a vertical gradient from light blue (f0f6ff) to sky blue (a0c0ff)
    # as background. Set border to transparent and grid lines to white (ffffff).
    $c->setPlotArea(55, 55, $c->getWidth() - 80, $c->getHeight() - 100, $c->linearGradientColor(0,
        55, 0, $c->getHeight() - 35, 0xf0f6ff, 0xa0c0ff), -1, Transparent, 0xffffff, 0xffffff);

    # As the data can lie outside the plotarea in a zoomed chart, we need to enable clipping.
    $c->setClipping();

    # Add a title box using dark grey (0x333333) 18pt Arial Bold font
    $c->addTitle("   Température(s) gâche(s)", "arialbd.ttf", 15, 0x333333);

    if ($viewer->isAttachmentRequest()) {
        $b = $c->addLegend(55, 28, false, "arialbd.ttf", 10);
        $b->setBackground(Transparent, Transparent);
        $b->setLineStyleKey();
    }

    # Set the x and y axis stems to transparent and the label font to 10pt Arial
    $c->xAxis->setColors(Transparent);
    $c->yAxis->setColors(Transparent);
    $c->xAxis->setLabelStyle("arial.ttf", 10);
    $c->yAxis->setLabelStyle("arial.ttf", 10);

    # Add axis title using 10pt Arial Bold font
    $c->yAxis->setTitle("Température (C°)", "arialbd.ttf", 10);

    #================================================================================
    # Add data to chart
    #================================================================================

    #
    # In this example, we represent the data by lines. You may modify the code below to use other
    # layer types (areas, scatter plot, etc).
    #

    # Add a line layer for the lines, using a line width of 2 pixels
    $layer = $c->addLineLayer2();
    $layer->setLineWidth(2);

    # In this demo, we do not have too many data points. In real code, the chart may contain a lot
    # of data points when fully zoomed out - much more than the number of horizontal pixels in this
    # plot area. So it is a good idea to use fast line mode.
    $layer->setFastLineMode();

    # Add up to 3 data series to a line layer, depending on whether the user has selected the data
    # series.
    $layer->setXData($timeStamps);
    if ($viewer->getCustomAttr("data0CheckBox") != "F") {
        $layer->addDataSet($dataSeriesA, 0xB0CC99, "Proc SDR");
    }
    if ($viewer->getCustomAttr("data1CheckBox") != "F") {
        $layer->addDataSet($dataSeriesB, 0x677E52, "Boite SDR");
    }
    if ($viewer->getCustomAttr("data2CheckBox") != "F") {
        $layer->addDataSet($dataSeriesC, 0x046380, "Proc 2ème");
    }
	if ($viewer->getCustomAttr("data3CheckBox") != "F") {
	$layer->addDataSet($dataSeriesD, 0x002F2F, "Boite 2ème");
    }
	if ($viewer->getCustomAttr("data4CheckBox") != "F") {
        $layer->addDataSet($dataSeriesE, 0x457DBB, "Proc 1er Dr");
    }
    if ($viewer->getCustomAttr("data5CheckBox") != "F") {
        $layer->addDataSet($dataSeriesF, 0x5F8CA3, "Boite 1er Dr");
    }
    if ($viewer->getCustomAttr("data6CheckBox") != "F") {
        $layer->addDataSet($dataSeriesG, 0x52251C, "Proc 1er G");
    }
	if ($viewer->getCustomAttr("data7CheckBox") != "F") {
	$layer->addDataSet($dataSeriesH, 0x795344, "Boite 1er G");
    }
	if ($viewer->getCustomAttr("data8CheckBox") != "F") {
        $layer->addDataSet($dataSeriesI, 0xD45E3A, "Proc RDC");
    }
    if ($viewer->getCustomAttr("data9CheckBox") != "F") {
        $layer->addDataSet($dataSeriesJ, 0x940602, "Boite RDC");
    }
	if ($viewer->getCustomAttr("data10CheckBox") != "F") {
        $layer->addDataSet($dataSeriesK, 0x132959, "Proc Barrière");
    }
    if ($viewer->getCustomAttr("data11CheckBox") != "F") {
        $layer->addDataSet($dataSeriesL, 0x234CA5, "Boite Barrière");
    }
    if ($viewer->getCustomAttr("data12CheckBox") != "F") {
        $layer->addDataSet($dataSeriesM, 0xFDD131, "Proc Poubelles");
    }
	if ($viewer->getCustomAttr("data13CheckBox") != "F") {
	$layer->addDataSet($dataSeriesN, 0xF9A41E, "Boite Poubelles");
    }


    #================================================================================
    # Configure axis scale and labelling
    #================================================================================

    # Set the x-axis as a date/time axis with the scale according to the view port x range.
    $viewer->syncDateAxisWithViewPort("x", $c->xAxis);

    # For the automatic y-axis labels, set the minimum spacing to 30 pixels.
    $c->yAxis->setTickDensity(30);

    #
    # In this demo, the time range can be from a few years to a few days. We demonstrate how to set
    # up different date/time format based on the time range.
    #

    # If all ticks are yearly aligned, then we use "yyyy" as the label format.
    $c->xAxis->setFormatCondition("align", 360 * 86400);
    $c->xAxis->setLabelFormat("{value|yyyy}");

    # If all ticks are monthly aligned, then we use "mmm yyyy" in bold font as the first label of a
    # year, and "mmm" for other labels.
    $c->xAxis->setFormatCondition("align", 30 * 86400);
    $c->xAxis->setMultiFormat(StartOfYearFilter(), "<*font=bold*>{value|mmm<*br*>yyyy}",
        AllPassFilter(), "{value|mmm}");

    # If all ticks are daily algined, then we use "mmm dd<*br*>yyyy" in bold font as the first label
    # of a year, and "mmm dd" in bold font as the first label of a month, and "dd" for other labels.
    $c->xAxis->setFormatCondition("align", 86400);
    $c->xAxis->setMultiFormat(StartOfYearFilter(),
        "<*block,halign=left*><*font=bold*>{value|dd mmm<*br*>yyyy}", StartOfMonthFilter(),
        "<*font=bold*>{value|mmm dd}");
    $c->xAxis->setMultiFormat2(AllPassFilter(), "{value|dd}");

    # For all other cases (sub-daily ticks), use "hh:nn<*br*>mmm dd" for the first label of a day,
    # and "hh:nn" for other labels.
    $c->xAxis->setFormatCondition("else");
    $c->xAxis->setMultiFormat(StartOfDayFilter(), "<*font=bold*>{value|hh:nn <*br*> dd mmm}",
        AllPassFilter(), "{value|hh:nn}");

    #================================================================================
    # Step 5 - Output the chart
    #================================================================================

    if ($viewer->isAttachmentRequest()) {
        # Output as PDF attachment
        header("Content-type: application/pdf");
        header("Content-Disposition: attachment; filename=\\"Graph_temperature.pdf\\"");
        print($c->makeChart2(PDF));
        exit();
    } else {
        # Output the chart
        $chartQuery = $c->makeSession($viewer->getId());

        # Set the chart URL to the viewer
        $viewer->setImageUrl("getchart.php?".$chartQuery);

        # Output Javascript chart model to the browser to support tracking cursor
        $viewer->setChartModel($c->getJsChartModel());
    } 
}

function drawFullChart(&$vp, &$viewer) {
	global $startDate, $endDate;
	//Afin de pouvoir récupérer les variable provenant de l'extérieur de la fonction
	global $timeStamps;
	global $dataSeriesA;
	global $dataSeriesB;
	global $dataSeriesC;
	global $dataSeriesD;
	global $dataSeriesE;
	global $dataSeriesF;
	global $dataSeriesG;
	global $dataSeriesH;
	global $dataSeriesI;
	global $dataSeriesJ;
	global $dataSeriesK;
	global $dataSeriesL;
	global $dataSeriesM;
	global $dataSeriesN;
    # We need to draw a small thumbnail chart for the full data range. The simplest method is to
    # simply get the full data to draw the chart. If the full data are very large (eg. millions of
    # points), for such a small thumbnail chart, it is often acceptable to just retreive a small
    # sample of the data.
    #
    # In this example, there are only around 5500 points for the 3 data series. This amount is not
    # large to ChartDirector, so we simply pass all the data to ChartDirector.
//$r = getRandomTable();

    # Get all the data from the random table
// $timeStamps = $r->getCol(0);
// $dataSeriesA = $r->getCol(1);
// $dataSeriesB = $r->getCol(2);
// $dataSeriesC = $r->getCol(3);

    # Create an XYChart object of size 640 x 60 pixels
    $c = new XYChart(1100, 60);

    # Set the plotarea with the same horizontal position as that in the main chart for alignment.
    # The vertical position is set to equal to the chart height.
    $c->setPlotArea(55, 0, $c->getWidth() - 80, $c->getHeight() - 1, 0xc0d8ff, -1, 0x888888,
        Transparent, 0xffffff);

    # Set the x axis stem to transparent and the label font to 10pt Arial
    $c->xAxis->setColors(Transparent);
    $c->xAxis->setLabelStyle("arial.ttf", 10);

    # Put the x-axis labels inside the plot area by setting a negative label gap. Use
    # setLabelAlignment to put the label at the right side of the tick.
    $c->xAxis->setLabelGap(-10);
    $c->xAxis->setLabelAlignment(1);

//--
    #
    # In this demo, the time range can be from a few years to a few days. We demonstrate how to set
    # up different date/time format based on the time range.
    #

    # If all ticks are yearly aligned, then we use "yyyy" as the label format.
    $c->xAxis->setFormatCondition("align", 360 * 86400);
    $c->xAxis->setLabelFormat("{value|yyyy}");

    # If all ticks are monthly aligned, then we use "mmm yyyy" in bold font as the first label of a
    # year, and "mmm" for other labels.
    $c->xAxis->setFormatCondition("align", 30 * 86400);
    $c->xAxis->setMultiFormat(StartOfYearFilter(), "<*font=bold*>{value|mmm<*br*>yyyy}",
        AllPassFilter(), "{value|mmm}");

    # If all ticks are daily algined, then we use "mmm dd<*br*>yyyy" in bold font as the first label
    # of a year, and "mmm dd" in bold font as the first label of a month, and "dd" for other labels.
    $c->xAxis->setFormatCondition("align", 86400);
    $c->xAxis->setMultiFormat(StartOfYearFilter(),
        "<*block,halign=left*><*font=bold*>{value|dd mmm<*br*>yyyy}", StartOfMonthFilter(),
        "<*font=bold*>{value|mmm dd}");
    $c->xAxis->setMultiFormat2(AllPassFilter(), "{value|dd}");

    # For all other cases (sub-daily ticks), use "hh:nn<*br*>mmm dd" for the first label of a day,
    # and "hh:nn" for other labels.
    $c->xAxis->setFormatCondition("else");
    $c->xAxis->setMultiFormat(StartOfDayFilter(), "<*font=bold*>{value|hh:nn <*br*> dd mmm}",
        AllPassFilter(), "{value|hh:nn}");
	
//--
    # Set the y axis stem and labels to transparent (that is, hide the labels)
    $c->yAxis->setColors(Transparent, Transparent);

    # Add a line layer for the lines with fast line mode enabled
    $layer = $c->addLineLayer2();
    $layer->setFastLineMode();

	
    # Now we add the 3 data series to a line layer, using the color red (0xff3333), green (0x008800)
    # and blue (0x3333cc)

	    $layer->setXData($timeStamps);
    if ($viewer->getCustomAttr("data0CheckBox") != "F") {
        $layer->addDataSet($dataSeriesA, 0xB0CC99, "Proc SDR");
    }
    if ($viewer->getCustomAttr("data1CheckBox") != "F") {
        $layer->addDataSet($dataSeriesB, 0x677E52, "Boite SDR");
    }
    if ($viewer->getCustomAttr("data2CheckBox") != "F") {
        $layer->addDataSet($dataSeriesC, 0x046380, "Proc 2ème");
    }
	if ($viewer->getCustomAttr("data3CheckBox") != "F") {
	$layer->addDataSet($dataSeriesD, 0x002F2F, "Boite 2ème");
    }
	if ($viewer->getCustomAttr("data4CheckBox") != "F") {
        $layer->addDataSet($dataSeriesE, 0x457DBB, "Proc 1er Dr");
    }
    if ($viewer->getCustomAttr("data5CheckBox") != "F") {
        $layer->addDataSet($dataSeriesF, 0x5F8CA3, "Boite 1er Dr");
    }
    if ($viewer->getCustomAttr("data6CheckBox") != "F") {
        $layer->addDataSet($dataSeriesG, 0x52251C, "Proc 1er G");
    }
	if ($viewer->getCustomAttr("data7CheckBox") != "F") {
	$layer->addDataSet($dataSeriesH, 0x795344, "Boite 1er G");
    }
	if ($viewer->getCustomAttr("data8CheckBox") != "F") {
        $layer->addDataSet($dataSeriesI, 0xD45E3A, "Proc RDC");
    }
    if ($viewer->getCustomAttr("data9CheckBox") != "F") {
        $layer->addDataSet($dataSeriesJ, 0x940602, "Boite RDC");
    }
	if ($viewer->getCustomAttr("data10CheckBox") != "F") {
        $layer->addDataSet($dataSeriesK, 0x132959, "Proc Barrière");
    }
    if ($viewer->getCustomAttr("data11CheckBox") != "F") {
        $layer->addDataSet($dataSeriesL, 0x234CA5, "Boite Barrière");
    }
    if ($viewer->getCustomAttr("data12CheckBox") != "F") {
        $layer->addDataSet($dataSeriesM, 0xFDD131, "Proc Poubelles");
    }
	if ($viewer->getCustomAttr("data13CheckBox") != "F") {
	$layer->addDataSet($dataSeriesN, 0xF9A41E, "Boite Poubelles");
    }
	
    # The x axis scales should reflect the full range of the view port
    // $c->xAxis->setDateScale($viewer->getValueAtViewPort("x", 0), $viewer->getValueAtViewPort("x", 1)
        // );
	$c->xAxis->setDateScale($startDate, $endDate);
	
    # For the automatic x-axis labels, set the minimum spacing to 75 pixels.
    $c->xAxis->setTickDensity(75);

    # For the auto-scaled y-axis, as we hide the labels, we can disable axis rounding. This can make
    # the axis scale fit the data tighter.
    $c->yAxis->setRounding(false, false);

    # Output the chart
    $chartQuery = $c->makeSession($vp->getId());

    # Set the chart URL and chart metrics to the viewport control
    $vp->setImageUrl("getchart.php?".$chartQuery);
    $vp->setChartMetrics($c->getChartMetrics());
}

#
# This script handles both the full page request, as well as the subsequent partial updates (AJAX
# chart updates). We need to determine the type of request first before we processing it.
#

# Create the WebChartViewer object
$viewer = new WebChartViewer("chart1");

if ($viewer->isPartialUpdateRequest()) {
	# Is a partial update request. Draw the chart and perform a partial response.
	if ($viewer->getSenderClientId() == "fullchart1") {
		# Is updating the fullchart
		$viewer = new WebChartViewer("fullchart1");
		drawFullChart($viewer, $viewer);
		
	}
	else
		drawChart($viewer);
	
    print($viewer->partialUpdateChart());
    exit();
}

#
# If the code reaches here, it is a full page request.
#

# Initialize the WebChartViewer and draw the chart.
initViewer($viewer);
drawChart($viewer);

# Create the WebViewPortControl object
$viewPortCtrl = new WebViewPortControl("fullchart1");
drawFullChart($viewPortCtrl, $viewer);
?>

<!DOCTYPE html>
<html>
<head>
    <title>Temperatures</title>
    <script type="text/javascript" src="cdjcv.js"></script>
    <style type="text/css">
        .chartButton { font:12px Verdana; border-bottom:#000000 1px solid; padding:5px; cursor:pointer;}
        .chartButtonSpacer { font:12px Verdana; border-bottom:#000000 1px solid; padding:5px;}
        .chartButton:hover { box-shadow:inset 0px 0px 0px 2px #444488; }
        .chartButtonPressed { background-color: #CCFFCC; }
    </style>
</head>
<body style="margin:0px;">
<script type="text/javascript">

//
// Execute the following initialization code after the web page is loaded
//
JsChartViewer.addEventListener(window, 'load', function() {

	
    // Update the chart when the view port has changed (eg. when the user zooms in using the mouse)
    var viewer = JsChartViewer.get('<?php echo $viewer->getId()?>');
    viewer.attachHandler("ViewPortChanged", viewer.partialUpdate);
	
	
    var vpViewer = JsChartViewer.get('<?php echo $viewPortCtrl->getId()?>');
    vpViewer.attachHandler("ViewPortChanged", vpViewer.partialUpdate);
	
    // Initialize the navigation pad
	JsChartViewer.get('<?php echo $viewPortCtrl->getId()?>');
    JsViewPortControl.get('<?php echo $viewPortCtrl->getId()?>').setViewer(viewer);
	
    // The Update Chart can also trigger a view port changed event to update the chart.
    document.getElementById("SubmitButton").onclick = function() { 
		viewer.raiseViewPortChangedEvent(); 
		vpViewer.raiseViewPortChangedEvent();
		return false; 
	};
	
    // Before sending the update request to the server, we include the state of the check boxes as custom
    // attributes. The server side charting code will use these attributes to decide the data sets to draw.
    viewer.attachHandler("PreUpdate", function() {
        var checkBoxes = ["data0CheckBox", "data1CheckBox", "data2CheckBox", "data3CheckBox", "data4CheckBox", "data5CheckBox", "data6CheckBox", "data7CheckBox", "data8CheckBox", "data9CheckBox", "data10CheckBox", "data11CheckBox", "data12CheckBox", "data13CheckBox"];
        for (var i = 0; i < checkBoxes.length; ++i)
		{
            viewer.setCustomAttr(checkBoxes[i], document.getElementById(checkBoxes[i]).checked ? "T" : "F");
			vpViewer.setCustomAttr(checkBoxes[i], document.getElementById(checkBoxes[i]).checked ? "T" : "F");
		}
    });

    // Draw track cursor when mouse is moving over plotarea or if the chart updates
    viewer.attachHandler(["MouseMovePlotArea", "TouchStartPlotArea", "TouchMovePlotArea", "PostUpdate",
        "Now", "ChartMove"], function(e) {
        this.preventDefault(e);   // Prevent the browser from using touch events for other actions
        trackLineLegend(viewer, viewer.getPlotAreaMouseX());
    });
});

//
// Draw track line with legend
//
function trackLineLegend(viewer, mouseX)
{
    // Remove all previously drawn tracking object
    viewer.hideObj("all");

    // The chart and its plot area
    var c = viewer.getChart();
    var plotArea = c.getPlotArea();

    // Get the data x-value that is nearest to the mouse, and find its pixel coordinate.
    var xValue = c.getNearestXValue(mouseX);
    var xCoor = c.getXCoor(xValue);
    if (xCoor == null)
        return;

    // Draw a vertical track line at the x-position
    viewer.drawVLine("trackLine", xCoor, plotArea.getTopY(), plotArea.getBottomY(), "black 1px dotted");

    // Array to hold the legend entries
    var legendEntries = [];

    // Iterate through all layers to build the legend array
    for (var i = 0; i < c.getLayerCount(); ++i)
    {
        var layer = c.getLayerByZ(i);

        // The data array index of the x-value
        var xIndex = layer.getXIndexOf(xValue);

        // Iterate through all the data sets in the layer
        for (var j = 0; j < layer.getDataSetCount(); ++j)
        {
            var dataSet = layer.getDataSetByZ(j);

            // We are only interested in visible data sets with names, as they are required for legend entries.
            var dataName = dataSet.getDataName();
            var color = dataSet.getDataColor();
            if ((!dataName) || (color == null))
                continue;

            // Build the legend entry, consist of a colored square box, the name and the data value.
            var dataValue = dataSet.getValue(xIndex);
            legendEntries.push("<nobr>" + viewer.htmlRect(7, 7, color) + " " + dataName + ": " +
                ((dataValue == null) ? "N/A" : dataValue.toPrecision(4)) + viewer.htmlRect(20, 0) + "</nobr> ");

            // Draw a track dot for data points within the plot area
            var yCoor = c.getYCoor(dataSet.getPosition(xIndex), dataSet.getUseYAxis());
            if ((yCoor != null) && (yCoor >= plotArea.getTopY()) && (yCoor <= plotArea.getBottomY()))
            {
                viewer.showTextBox("dataPoint" + i + "_" + j, xCoor, yCoor, JsChartViewer.Center,
                    viewer.htmlRect(7, 7, color));
            }
        }
    }

    // Create the legend by joining the legend entries.
    var legend = "<nobr>[" + c.xAxis().getFormattedLabel(xValue, "mm/dd/yyyy") + "]" + viewer.htmlRect(20, 0) +
        "</nobr> " + legendEntries.reverse().join("");

    // Display the legend on the top of the plot area
    viewer.showTextBox("legend", plotArea.getLeftX(), plotArea.getTopY(), JsChartViewer.BottomLeft, legend,
        "padding:0px 0px 3px 3px; font:bold 13px Arial; -webkit-text-size-adjust:100%;");
}

//
// This method is called when the user clicks on the Pointer, Zoom In or Zoom Out buttons
//
function setMouseMode(mode)
{
    var viewer = JsChartViewer.get('<?php echo $viewer->getId()?>');
    if (mode == viewer.getMouseUsage())
        mode = JsChartViewer.Default;

    // Set the button color based on the selected mouse mode
    document.getElementById("scrollButton").className = "chartButton" +
        ((mode  == JsChartViewer.Scroll) ? " chartButtonPressed" : "");
    document.getElementById("zoomInButton").className = "chartButton" +
        ((mode  == JsChartViewer.ZoomIn) ? " chartButtonPressed" : "");
    document.getElementById("zoomOutButton").className = "chartButton" +
        ((mode  == JsChartViewer.ZoomOut) ? " chartButtonPressed" : "");

    // Set the mouse mode
    viewer.setMouseUsage(mode);
}

//
// This method is called when the user clicks on the buttons that selects the last NN days
//
function setTimeRange(duration)
{
    var viewer = JsChartViewer.get('<?php echo $viewer->getId()?>');

    // Set the view port width to represent the required duration (as a ratio to the total x-range)
    viewer.setViewPortWidth(Math.min(1,
        duration / (viewer.getValueAtViewPort("x", 1) - viewer.getValueAtViewPort("x", 0))));

    // Set the view port left so that the view port is moved to show the latest data
    viewer.setViewPortLeft(1 - viewer.getViewPortWidth());

    // Trigger a view port change event
    viewer.raiseViewPortChangedEvent();
}

</script>
<form method="post" id="ZoomScrollTrack" runat="server">
<table cellspacing="0" cellpadding="0" style="border:black 1px solid;">
    <tr>
        <td align="right" colspan="2" style="background:#457DBB; color:#ffff00; padding:0px 4px 2px 0px; text-align:center;">
            <a style="color:#FFFF00; font:italic bold 10pt Arial; text-decoration:none" href="http://www.hemiris.fr/">
                Supervision de la température des systemes d'ouverture à HEMIRIS
            </a>
        </td>
    </tr>
    <tr valign="top">
        <td style="width:150px; background:#C3D9E0;">
        <div style="width:150px">
            <!-- The following table is to create 3 cells for 3 buttons to control the mouse usage mode. -->
            <table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tr>
					<td class="chartButtonSpacer">
						<div style="padding:2px">&nbsp;</div>
					</td>
				</tr>
                <tr>
                    <td class="chartButton" id="scrollButton" onclick="setMouseMode(JsChartViewer.Scroll)"
                        ontouchstart="this.onclick(event); event.preventDefault();">
                        <img src="scrollew.gif" style="vertical-align:middle" alt="Drag" />&nbsp;&nbsp;Déplacer graph
                    </td>
                </tr>
                <tr>
                    <td class="chartButton" id="zoomInButton" onclick="setMouseMode(JsChartViewer.ZoomIn)"
                        ontouchstart="this.onclick(event); event.preventDefault();">
                        <img src="zoomInIcon.gif" style="vertical-align:middle" alt="Zoom In" />&nbsp;&nbsp;Zoom +
                    </td>
                </tr>
                <tr>
                    <td class="chartButton" id="zoomOutButton" onclick="setMouseMode(JsChartViewer.ZoomOut)"
                        ontouchstart="this.onclick(event); event.preventDefault();">
                        <img src="zoomOutIcon.gif" style="vertical-align:middle" alt="Zoom Out" />&nbsp;&nbsp;Zoom -
                    </td>
                </tr>
                <tr>
                    <td class="chartButtonSpacer">
                        <div style="padding:2px">&nbsp;</div>
                    </td>
                </tr>
                <tr>
                    <td class="chartButton" onclick="setTimeRange(1 * 3600);"
                        ontouchstart="this.onclick(event); event.preventDefault();">
                        <img src="goto.gif" style="vertical-align:middle" alt="Last 30 days" />&nbsp;&nbsp;Dernière heure
                    </td>
                </tr>
                <tr>
                    <td class="chartButton" onclick="setTimeRange(1 * 86400);"
                        ontouchstart="this.onclick(event); event.preventDefault();">
                        <img src="goto.gif" style="vertical-align:middle" alt="Last 90 days" />&nbsp;&nbsp;Dernier jour
                    </td>
                </tr>
                <tr>
                    <td class="chartButton" onclick="setTimeRange(31 * 86400);"
                        ontouchstart="this.onclick(event); event.preventDefault();">
                        <img src="goto.gif" style="vertical-align:middle" alt="Last Year" />&nbsp;&nbsp;Dernier mois
                    </td>
                </tr>
                <tr>
                    <td class="chartButton" onclick="setTimeRange(1E15);"
                        ontouchstart="this.onclick(event); event.preventDefault();">
                        <img src="goto.gif" style="vertical-align:middle" alt="All Time" />&nbsp;&nbsp;Toutes les données
                    </td>
                </tr>

            
				<tr>
					<div style="font:9pt Verdana; line-height:1.5; padding-top:25px">
					<input id="data0CheckBox" type="checkbox" checked="checked" /> Proc SDR<br />
					<input id="data1CheckBox" type="checkbox" checked="checked" /> Boitier SDR<br />
					<input id="data2CheckBox" type="checkbox" checked="checked" /> Proc 2ème<br />
					<input id="data3CheckBox" type="checkbox" checked="checked" /> Boitier 2ème<br />
					<input id="data4CheckBox" type="checkbox" checked="checked" /> Proc 1er Droite<br />
					<input id="data5CheckBox" type="checkbox" checked="checked" /> Boitier 1er Droite<br />
					<input id="data6CheckBox" type="checkbox" checked="checked" /> Proc 1er Gauche<br />
					<input id="data7CheckBox" type="checkbox" checked="checked" /> Boitier 1er Gauche<br />
					<input id="data8CheckBox" type="checkbox" checked="checked" /> Proc RDC<br />
					<input id="data9CheckBox" type="checkbox" checked="checked" /> Boitier RDC<br />
					<input id="data10CheckBox" type="checkbox" checked="checked" /> Proc Barrière<br />
					<input id="data11CheckBox" type="checkbox" checked="checked" /> Boitier Barrière<br />
					<input id="data12CheckBox" type="checkbox" checked="checked" /> Proc Poubelles<br />
					<input id="data13CheckBox" type="checkbox" checked="checked" /> Boitier Poubelles<br />
				</div>
				</tr>
				
            <div style="font:13pt Verdana; margin-top:15px; margin-left:5px; text-align:center; width:124px;">
                <input type="submit" id="SubmitButton" name="SubmitButton" value="Afficher graphes"></input>
            </div>
			<br />
			<br />

			</table>	
			
			<br />
			<br />			
            <div>
                <input type="button" value="Créer PDF" style="font:13px Verdana; width:110px;margin-left:10px; "
                    onclick="JsChartViewer.get('<?php echo $viewer->getId()?>').partialUpdateAsAttachment();" />
            </div>
        </div>
        </td>

		<td style="border-left:black 1px solid; padding:10px 5px 10px 5px;">
            <!-- ****** Here is the chart image ****** -->
            <?php echo $viewer->renderHTML()?><br />
            <!-- ****** Here is the viewport control ****** -->
            <?php echo $viewPortCtrl->renderHTML()?>
        </td>
    </tr>
</table>
</form>
</body>
</html>

  Re: Update the FullChart
Posted by Peter Kwan on Nov-11-2016 03:11
Hi Gilles,

In your code, the full data range can change at any moment, but it calls setFullRange in initViewer, which is only run during initialization. So the main chart will not know the full range have been updated. However, the full chart always plots all the data so it always reflect the updated full range. The main chart and the full chart therefore become inconsistent.

To address this issue, please move the setFullRange code from initViewer to the drawChart function so that the main chart would know the most updated full range.


function initViewer(&$viewer) {
    //Pour récupérer le creneau que l'on a dans la base
    global $nbLigne;

    # Initialize the view port to show the last 366 days (out of 1826 days)
    #Initialise le graph sur une largeur de 180 données parmis toutes les données
    $viewer->setViewPortWidth(180 / $nbLigne);
    $viewer->setViewPortLeft(1 - $viewer->getViewPortWidth());

    # Set the maximum zoom to 10 days (out of 1826 days)
    # Défini le zoom maximum 1 donnée parmis toutes les données
    $viewer->setZoomInWidthLimit(1 / $nbLigne);
}


function drawChart(&$viewer)
{
     global $dateMini;

     //construction de la période en fonction des données que l'on à dans la base
    $startAnnee = date('Y', $dateMini);
    $startMois = date('m', $dateMini);
    $startJour = date('d', $dateMini);
    $startHeure = date('H', $dateMini);
    $startMinute = date('i', $dateMini);
    $startSeconde = date('s', $dateMini);

    # The full x-axis range is from Jan 1, 2007 to Jan 1, 2012
    $startDate = chartTime($startAnnee, $startMois, $startJour, $startHeure, $startMinute, $startSeconde);
    $endDate = chartTime(date('Y'),date('m'),date('d'), date('H'), date('i'), date('s'));
    $viewer->setFullRange("x", $startDate, $endDate);

    ......
    ......

}

I noticed that even for regular update (such as for zoom in), the full range would have changed, and you would need to update both the main chart and the full chart to make them consistent. I suggest you can change the window.load event handler below to ensure both charts always update together:

//
// Execute the following initialization code after the web page is loaded
//
JsChartViewer.addEventListener(window, 'load', function() {

    // Update the chart when the view port has changed (eg. when the user zooms in using the mouse)
    var viewer = JsChartViewer.get('<?php echo $viewer->getId()?>');
    var vpViewer = JsChartViewer.get('<?php echo $viewPortCtrl->getId()?>');

    // Update the main will also update the full chart
    viewer.attachHandler("ViewPortChanged", function() {
        viewer.partialUpdate();
        vpViewer.partialUpdate();
    });

    // Initialize the navigation pad
    JsViewPortControl.get('<?php echo $viewPortCtrl->getId()?>').setViewer(viewer);

    // The Update Chart can also trigger a view port changed event to update the chart.
    document.getElementById("SubmitButton").onclick = function() {
        viewer.raiseViewPortChangedEvent();
        return false;
    };

    // Before sending the update request to the server, we include the state of the check boxes as custom
    // attributes. The server side charting code will use these attributes to decide the data sets to draw.
    viewer.attachHandler("PreUpdate", function() {
        var checkBoxes = ["data0CheckBox", "data1CheckBox", "data2CheckBox", "data3CheckBox", "data4CheckBox", "data5CheckBox", "data6CheckBox", "data7CheckBox", "data8CheckBox", "data9CheckBox", "data10CheckBox", "data11CheckBox", "data12CheckBox", "data13CheckBox"];
        for (var i = 0; i < checkBoxes.length; ++i)
{
            viewer.setCustomAttr(checkBoxes[i], document.getElementById(checkBoxes[i]).checked ? "T" : "F");
            vpViewer.setCustomAttr(checkBoxes[i], document.getElementById(checkBoxes[i]).checked ? "T" : "F");
}
    });

    // Draw track cursor when mouse is moving over plotarea or if the chart updates
    viewer.attachHandler(["MouseMovePlotArea", "TouchStartPlotArea", "TouchMovePlotArea", "PostUpdate",
        "Now", "ChartMove"], function(e) {
        this.preventDefault(e);   // Prevent the browser from using touch events for other actions
        trackLineLegend(viewer, viewer.getPlotAreaMouseX());
    });
});


Hope this can help.

Regards
Peter Kwan