Ankündigung

Einklappen
Keine Ankündigung bisher.

Kreisdiagramm / Tortendiagram / Segementdiagramm

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    #16
    Wenn der js-Code aus Post #11 mit smartVISU2.8 nicht funktioniert (ich habe es nicht getestet), dann sollte folgender hoffentlich gehen.

    Javascript-Code (z.B. als diagram.js speichern):
    Code:
        // ----- plot.pie ----------------------------------------------------------
        $(document).delegate('div[data-widget="plot.pie"]', {
            'update': function (event, response) {
                event.stopPropagation();
    
                var isLabel = false;
                var isLegend = false;            
                var labels = [];
                if ($(this).attr('data-label')) {
                    labels = $(this).attr('data-label').explode();
                    isLabel = true;
                }            
                if ($(this).attr('data-mode') == 'legend') {
                    isLegend = true;
                    isLabel = false;
                }
                var colors = [];
                if ($(this).attr('data-color')) {
                    colors = $(this).attr('data-color').explode();
                }
                var val = 0;
                for (i = 0; i < response.length; i++) {
                    val = val + response[i];
                }
                var data = [];
                for (i = 0; i < response.length; i++) {    
                    data[i] = {
                        name: labels[i],
                        y: response[i] * 100 / val,
                        color: (colors[i] ? colors[i] : null)
                    }
    
                }
    
                // design
                var headline = $(this).attr('data-text');
                var position = 'top';
                if ($(this).attr('data-text') == '') {
                    position = 'bottom';
                }
    
                // draw the plot
                $(this).highcharts({
                    chart: {
                        plotBackgroundColor: null,
                        plotBorderWidth: null,
                        plotShadow: false,
                        type: 'pie'    
    
                    },
                    legend: {
                        align: 'center',
                        verticalAlign:  position,
                        x: 0,
                        y: 20
                    },
                    title: {
                        text: headline
                    },
                    tooltip: {
                        formatter: function() {
                            return this.point.name + ' <b>' + this.y.transUnit('%') + '</b>';
                        },
                    },
                    plotOptions: {
                        pie: {
                            allowPointSelect: true,
                            cursor: 'pointer',
                            dataLabels: {
                                enabled: isLabel,
                                formatter: function() {
                                    return this.point.name + ' <b>' + this.y.transUnit('%') + '</b>';
                                },                            
                                style: {
                                    color: null
                                }
                            },
                            showInLegend: isLegend
                        }
                    },                        
                    series: [{
                        name: headline,
                        colorByPoint: true,
                        data: data
                    }],
                });    
            },
            'point': function (event, response) {
                event.stopPropagation();
    
                var val = 0;
                var data = [];
                var items = $(this).attr('data-item').explode();        
                for (i = 0; i < items.length; i++) {
                    if (response[i]) {
                        val = val +  +response[i];
                    }
                    else
                    {
                        val = val +  +widget.get(items[i]);
                    }
                }
                for (i = 0; i < items.length; i++) {
                    if (response[i]) {
                        data[i] = +response[i] * 100 / val;
                    }
                    else
                    {
                        data[i] = +widget.get(items[i]) * 100 / val;
                    }
                }
    
                var chart = $(this).highcharts();
                for (i = 0; i < data.length; i++) {
                    chart.series[0].data[i].update(data[i]);                
                }
                chart.redraw();            
            }
        });

    Kommentar


      #17
      Wie immer wenn jemand was schlaues macht, werde ich dies gerne in Vrrsion 2.9 integrieren (und evtl. noch etwas erweitern).

      Kommentar


        #18
        Kannst du gerne machen!
        Ich hätte auch noch ein paar Highchart Gauges im Angebot, die ich bei mir integriert habe und ohne Probleme funktionieren:

        Solid als Halbkreis, "C-Form" und Kreis
        Speedometer und VU-Meter (von der Demoseite)

        Die Nachfrage scheint ja hier gegeben zu sein!

        solid.jpg

        Kommentar


          #19
          An den Gauges bastele ich auch grade rum, hab sie aber für die jetzige Probierphase noch mehr oder weniger noch hardcoded im HTML zu liegen. Hast Du da schon ein fertiges Widget? Das würde mir vermutlich einiges an Arbeit ersparen ...

          /tom

          Kommentar


            #20
            Hab es hier gepostet:

            https://knx-user-forum.de/forum/supp...63#post1049063

            Kommentar


              #21
              Zitat von ramann Beitrag anzeigen
              Javascript-Code (z.B. als diagram.js speichern):
              Wo müssen die Javascript-Files abgelegt werden?
              Danke für die Info

              Kommentar


                #22
                Das einfachste ist, wenn du die Javascript-Files in deinem Projektordner in einer visu.js abspeicherst. Wenn noch nicht vorhanden, dann musst du sie selbst erstellen.

                Kommentar


                  #23
                  Zitat von ramann Beitrag anzeigen
                  Das einfachste ist, wenn du die Javascript-Files in deinem Projektordner in einer visu.js abspeicherst. Wenn noch nicht vorhanden, dann musst du sie selbst erstellen.
                  Danke für die schnelle Antwort.
                  Können alle Inhalte in eine .js zusammengefasst werden?
                  In meiner aktuellen visu.js ist das UZSU drin. Kann ich die Chart direkt darunter einfügen?

                  Kommentar


                    #24
                    Ja, kannst Du, ist auch im Moment die gängige Variante.

                    Da fällt mir ein: Es gab mal einen Vorschlag, alle zusätzlichen .js 'einzusammeln', die im Unterverzeichnis von pages/xyz/js liegen, statt alles aus einer zentralen visu.js zu holen. Wäre IMHO ein Issue auf GitHub wert, da dadurch deutlich mehr Übersichtlichkeit reinkommt, und die ganze .js-Geschichte übersichtlicher wird.

                    smai Stefan, was meinst Du dazu?

                    /tom

                    Kommentar


                      #25
                      Probiers einfach aus! Wenn du den Code aus dem Post #16 nimmst, sollte es eigentlich schon gehen.

                      Kommentar


                        #26
                        Zitat von Tom Bombadil Beitrag anzeigen
                        Da fällt mir ein: Es gab mal einen Vorschlag, alle zusätzlichen .js 'einzusammeln', die im Unterverzeichnis von pages/xyz/js liegen, statt alles aus einer zentralen visu.js zu holen. Wäre IMHO ein Issue auf GitHub wert, da dadurch deutlich mehr Übersichtlichkeit reinkommt, und die ganze .js-Geschichte übersichtlicher wird.
                        Klingt gar nicht so schlecht.
                        Einziger kleiner Punkt ist halt die Reihenfolge, die User müssen halt dafür sorgen, dass es keine Abhängigkeiten zwischen den Files gibt. Bzw. könnte man definieren, dass in alphabetischer Reihenfolge geladen wird, dann könnte man bewusst ein Filename z.B. mit Underline beginnen, um es früher zu laden.

                        Gleiches dann wohl auch für CSS (dort ust die Reihenfolge halt noch wichtiger).

                        Das ganze geht eigentlich in Richtung der modularen Widgets, die ich machen wollte. Vll. wäre diese Modularisuerung damit nicht mal mehr so wichtig.

                        Kommentar


                          #27
                          Hab's gefunden:

                          Code:
                          {% for item in dir('pages/'~config_pages~'/js') %}
                              <script type="text/javascript" src="{{ item.path }}"></script>
                          {% endfor %}
                          Hier, Dreizeiler aus 2014.

                          /tom

                          Kommentar


                            #28
                            Hallo,
                            hab das Tortendiagramm nun endlich auch hinbekommen.
                            torte.PNG

                            Wie kann man die Größe des Widgets bspw. in Pixel x Pixel definieren?
                            Wie kann man den Hintergrund transparent machen?

                            Danke für die Hilfe

                            Kommentar


                              #29
                              Normalerweise ist für die Highchart-Plots bei jedem Design eine js-Datei dabei, in der dieses festgelegt ist (eigentlich transparenter Hintergrund, der "Highcharts.com" Schriftzug ist ausgeblendet und die Farben sind ans Design angepasst.
                              Ist diese js-Datei bei dier in root.html eingebunden? Sollte es normalerweise sein! Evtl. spielt es hier auch eine Rolle, in welcher Reihenfolge die Javascript-Files "geladen" werden. Da musst du einfach mal testen.

                              Die Größe der Plots wird von SV festgelegt. Damit nicht alle Plots von der Größenänderung betroffen sind, kannst du deine Definition in ein <div> mit der Klasse disk packen:
                              Code:
                              <div class="disk">{{ diagram.pie('Test_plot', ['item.used,'item.free'], ['used','free']) }}</div>
                              In deiner visu.css kopierst du dann folgendes:
                              Code:
                              .disk .plot {
                                  height: 100px;
                              }

                              Kommentar


                                #30
                                @ramann: Danke für die Informationen.

                                Ja ich habe die root.html angepasst. siehe hier:
                                Code:
                                <html>
                                <head>
                                    <title>{{ config_title }}</title>
                                
                                    <meta charset="utf-8" />
                                    <meta name="viewport" content="width=device-width, user-scalable=yes, initial-scale=1, maximum-scale=1.3, minimum-scale=1" />
                                    <meta name="apple-mobile-web-app-capable" content="yes" />
                                    <meta name="apple-mobile-web-app-status-bar-style" content="black" />
                                    <meta http-equiv="expires" content="0" />
                                
                                    <link rel="icon" href="favicon.png" />
                                    <link rel="icon" href="favicon.ico" type="image/x-icon" />
                                    <link rel="apple-touch-icon" href="favicon.png" />
                                
                                    <link rel="stylesheet" href="vendor/jquery.mobile/jquery.mobile.structure-1.3.2.min.css" />
                                    <script type="text/javascript" src="vendor/jquery/jquery-2.0.3.min.js"></script>
                                
                                    {% if config_transition != 'fade' %}
                                        <script type="text/javascript">
                                            $(document).on("mobileinit", function () {
                                                $.mobile.defaultPageTransition = '{{ config_transition }}';
                                            });
                                        </script>
                                    {% endif %}
                                
                                    <script type="text/javascript" src="vendor/jquery.mobile/jquery.mobile-1.3.2.min.js"></script>
                                    <script type="text/javascript" src="lib/base/jquery.mobile.slider.{{ config_js }}"></script>
                                
                                    <script type="text/javascript" src="designs/{{ config_design }}.{{ config_js }}"></script>
                                    <script type="text/javascript" src="widgets/widget.{{ config_js }}"></script>
                                    <script type="text/javascript" src="vendor/plot.highcharts/highcharts-more.js"></script>
                                    <script type="text/javascript" src="vendor/plot.highcharts/highcharts.js"></script>    
                                
                                
                                
                                
                                    {% if config_animation %}
                                        <script type="text/javascript" src="widgets/animation.{{ config_js }}"></script>{% endif %}
                                
                                    <script type="text/javascript" src="lib/base/base.{{ config_js }}"></script>
                                    <script type="text/javascript" src="lib/base/base.php"></script>
                                    <script type="text/javascript" src="driver/io_{{ config_driver }}.{{ config_js }}"></script>
                                
                                    <link rel="stylesheet" type="text/css" href="designs/{{ config_design }}.min.css" />
                                    <link rel="stylesheet" type="text/css" href="pages/base/base.css" />
                                
                                    {% if isfile('pages/'~config_pages~'/visu.js') %}
                                        <script type="text/javascript" src="pages/{{ config_pages }}/visu.js"></script>{% endif %}
                                
                                    {% if isfile('pages/'~config_pages~'/visu.css') %}
                                        <link rel="stylesheet" type="text/css" href="pages/{{ config_pages }}/visu.css" />{% endif %}
                                
                                    {% block head %}{% endblock %}
                                
                                    {% import "lib.html" as lib %}
                                    {% import "basic.html" as basic %}
                                    {% import "device.html" as device %}
                                    {% import "plot.html" as plot %}
                                </head>
                                
                                
                                <body>
                                
                                <script type="text/javascript">
                                    io.init('{{ config_driver_address }}', '{{ config_driver_port }}');
                                {% if config_driver_autoreconnect %}
                                    activateAutoReconnect();
                                {% endif %}
                                
                                    // Do some actions before page is shown
                                    $(document).on('pagebeforeshow', function () {
                                        fx.init();
                                        repeater.init();
                                        widget.prepare();
                                        // repeater.list();
                                    });
                                
                                    // Run the io and all widgets
                                    $(document).on('pageshow', function () {
                                        io.run({{ config_driver_realtime }});
                                        // console.log('[io] run');           
                                        notify.display();
                                        // widget.list();
                                    });
                                
                                    $.mobile.page.prototype.options.domCache = {{ (config_cache_dom ? 'true' : 'false') }};
                                </script>
                                
                                {% block body %}{% endblock %}
                                
                                </body>
                                </html>
                                in Vendor liegen die highcharts vom aktuellen SV master.
                                Das müsste doch eigentlich passen, oder?
                                Die Plots sind nun aber alle mit weißen Hintergrund.

                                Kommentar

                                Lädt...
                                X