Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. QML and Qt Quick
  4. [Solved] Drawing Linear graph using QML canvas

[Solved] Drawing Linear graph using QML canvas

Scheduled Pinned Locked Moved QML and Qt Quick
qml canvasqmlgraphchart
18 Posts 2 Posters 9.4k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • P p3c0
    11 Aug 2015, 11:46

    @vishnu Try mapToItem.

    V Offline
    V Offline
    vishnu
    wrote on 13 Aug 2015, 12:14 last edited by
    #5

    @p3c0
    I didn't really get how to use it so I wrote my own function to map them

    function map(value,srcMax,srcMin,dstMax,dstMin){
            console.log(srcMax,srcMin,dstMax,dstMin," value ",value)
            return Number(((((dstMax - dstMin)*(value - srcMin)/(srcMax - srcMin))+dstMin)).toFixed(1)) ;
        }
    

    I hope it will be useful for someone. one more question. I have drawn the graph assuming positive axis of X to the right(like standard one). How can make it to the left.As shown in here

    P 1 Reply Last reply 14 Aug 2015, 05:09
    0
    • V vishnu
      13 Aug 2015, 12:14

      @p3c0
      I didn't really get how to use it so I wrote my own function to map them

      function map(value,srcMax,srcMin,dstMax,dstMin){
              console.log(srcMax,srcMin,dstMax,dstMin," value ",value)
              return Number(((((dstMax - dstMin)*(value - srcMin)/(srcMax - srcMin))+dstMin)).toFixed(1)) ;
          }
      

      I hope it will be useful for someone. one more question. I have drawn the graph assuming positive axis of X to the right(like standard one). How can make it to the left.As shown in here

      P Offline
      P Offline
      p3c0
      Moderators
      wrote on 14 Aug 2015, 05:09 last edited by
      #6

      @vishnu Using negative x value while drawing ? Passing negative values to lineTo or moveTo from point of origin should work.

      157

      V 1 Reply Last reply 14 Aug 2015, 07:55
      0
      • P p3c0
        14 Aug 2015, 05:09

        @vishnu Using negative x value while drawing ? Passing negative values to lineTo or moveTo from point of origin should work.

        V Offline
        V Offline
        vishnu
        wrote on 14 Aug 2015, 07:55 last edited by vishnu
        #7

        @p3c0
        I got a new error
        Cannot read property 'length' of undefined
        I have defined the properties like this

         property var physicalValue_x: []
            property var physicalValue_z: []
            property var logicalValue_x: [-80,-40,40,80,220,400,740,680,170,-170,-250,-220,-80,-40,-20]
            property var logicalValue_z: [820,820,820,820,780,670,560,305,295,285,380,780,820,820,820]
        
        function map(value,srcMax,srcMin,dstMax,dstMin){
                //        console.log(srcMax,srcMin,dstMax,dstMin," value ",value)
                return Number(((((dstMax - dstMin)*(value - srcMin)/(srcMax - srcMin))+dstMin)).toFixed(1)) ;
            }
        
            function logicalToPhysical()
            {
        //        if(root.physicalValue_x)
                for(var i=0;i<logicalValue_z.length;i++)//error 'length undefined'
                {
                    var pos_x = root.map(logicalValue_x[i],maxRange_x,minRange_x,x1,x0)
                    physicalValue_x[i] = pos_x
                    var pos_z = root.map(logicalValue_z[i],maxRange_z,minRange_z,y1,y0)
                    physicalValue_z[i] = pos_z // here type error
                }
                console.log("physical x values"+physicalValue_x)
                console.log("physical z values"+physicalValue_z)
            }
        

        if i uncomment the checkif(root.physicalValue_x) i get the error at for loop Cannot read property 'length' of undefined.
        If I comment it i get 'TypeError: Type error' at physicalValue_z[i] = pos_z also 'TypeError: Cannot read property '0' of undefined' at var pos_z. I think the properties are not instantiated properly but eventually they will. What is the best practice to avoid these errors. Thanks

        P 1 Reply Last reply 14 Aug 2015, 08:00
        0
        • V vishnu
          14 Aug 2015, 07:55

          @p3c0
          I got a new error
          Cannot read property 'length' of undefined
          I have defined the properties like this

           property var physicalValue_x: []
              property var physicalValue_z: []
              property var logicalValue_x: [-80,-40,40,80,220,400,740,680,170,-170,-250,-220,-80,-40,-20]
              property var logicalValue_z: [820,820,820,820,780,670,560,305,295,285,380,780,820,820,820]
          
          function map(value,srcMax,srcMin,dstMax,dstMin){
                  //        console.log(srcMax,srcMin,dstMax,dstMin," value ",value)
                  return Number(((((dstMax - dstMin)*(value - srcMin)/(srcMax - srcMin))+dstMin)).toFixed(1)) ;
              }
          
              function logicalToPhysical()
              {
          //        if(root.physicalValue_x)
                  for(var i=0;i<logicalValue_z.length;i++)//error 'length undefined'
                  {
                      var pos_x = root.map(logicalValue_x[i],maxRange_x,minRange_x,x1,x0)
                      physicalValue_x[i] = pos_x
                      var pos_z = root.map(logicalValue_z[i],maxRange_z,minRange_z,y1,y0)
                      physicalValue_z[i] = pos_z // here type error
                  }
                  console.log("physical x values"+physicalValue_x)
                  console.log("physical z values"+physicalValue_z)
              }
          

          if i uncomment the checkif(root.physicalValue_x) i get the error at for loop Cannot read property 'length' of undefined.
          If I comment it i get 'TypeError: Type error' at physicalValue_z[i] = pos_z also 'TypeError: Cannot read property '0' of undefined' at var pos_z. I think the properties are not instantiated properly but eventually they will. What is the best practice to avoid these errors. Thanks

          P Offline
          P Offline
          p3c0
          Moderators
          wrote on 14 Aug 2015, 08:00 last edited by
          #8

          @vishnu This means it is out of its scope. Access logicalValue_z just like you accessed physicalValue_x using root.

          157

          V 1 Reply Last reply 14 Aug 2015, 08:21
          0
          • P p3c0
            14 Aug 2015, 08:00

            @vishnu This means it is out of its scope. Access logicalValue_z just like you accessed physicalValue_x using root.

            V Offline
            V Offline
            vishnu
            wrote on 14 Aug 2015, 08:21 last edited by
            #9

            @p3c0
            As you said i have changed like this

             function logicalToPhysical()
                {
            //        if(root.physicalValue_x)
                    for(var i=0;i<root.logicalValue_x.length;i++)
                    {
                        var pos_x = root.map(root.logicalValue_x[i],root.maxRange_x,root.minRange_x,root.x1,root.x0)
                        root.physicalValue_x[i] = pos_x
                        var pos_z = root.map(root.logicalValue_z[i],root.maxRange_z,root.minRange_z,root.y1,root.y0) // here is the error
                        root.physicalValue_z[i] = pos_z
                    }
                    console.log("physical x values"+root.physicalValue_x)
                    console.log("physical z values"+root.physicalValue_z)
                }
            

            But still the error TypeError: Cannot read property '0' of undefined at var pos_z;
            FIY:these are the properties in addition to above properties

              property real y0 : 50.0;
                property real y1 : chart.height - chart.xAxisHeight
                property real x0 : chart.yAxisWidth
                property real x1 : chart.width - 100
            
            P 1 Reply Last reply 14 Aug 2015, 08:35
            0
            • V vishnu
              14 Aug 2015, 08:21

              @p3c0
              As you said i have changed like this

               function logicalToPhysical()
                  {
              //        if(root.physicalValue_x)
                      for(var i=0;i<root.logicalValue_x.length;i++)
                      {
                          var pos_x = root.map(root.logicalValue_x[i],root.maxRange_x,root.minRange_x,root.x1,root.x0)
                          root.physicalValue_x[i] = pos_x
                          var pos_z = root.map(root.logicalValue_z[i],root.maxRange_z,root.minRange_z,root.y1,root.y0) // here is the error
                          root.physicalValue_z[i] = pos_z
                      }
                      console.log("physical x values"+root.physicalValue_x)
                      console.log("physical z values"+root.physicalValue_z)
                  }
              

              But still the error TypeError: Cannot read property '0' of undefined at var pos_z;
              FIY:these are the properties in addition to above properties

                property real y0 : 50.0;
                  property real y1 : chart.height - chart.xAxisHeight
                  property real x0 : chart.yAxisWidth
                  property real x1 : chart.width - 100
              
              P Offline
              P Offline
              p3c0
              Moderators
              wrote on 14 Aug 2015, 08:35 last edited by
              #10

              @vishnu Did Cannot read property 'length' of undefined for logicalValue_z go ?
              For the other check which of the other properties is not accessible.

              157

              V 1 Reply Last reply 14 Aug 2015, 08:48
              0
              • P p3c0
                14 Aug 2015, 08:35

                @vishnu Did Cannot read property 'length' of undefined for logicalValue_z go ?
                For the other check which of the other properties is not accessible.

                V Offline
                V Offline
                vishnu
                wrote on 14 Aug 2015, 08:48 last edited by
                #11

                @p3c0
                Nope. if put the check if(root.physicalValue_x). The error TypeError: Cannot read property 'length' of undefined still appears at for(var i=0;i<root.logicalValue_x.length;i++).If I dont put the check then i get TypeError: Cannot read property '0' of undefined at var pos_z = root.map(root.logicalValue_z[i],root.maxRange_z,root.minRange_z,root.y1,root.y0).

                P 1 Reply Last reply 14 Aug 2015, 08:59
                0
                • V vishnu
                  14 Aug 2015, 08:48

                  @p3c0
                  Nope. if put the check if(root.physicalValue_x). The error TypeError: Cannot read property 'length' of undefined still appears at for(var i=0;i<root.logicalValue_x.length;i++).If I dont put the check then i get TypeError: Cannot read property '0' of undefined at var pos_z = root.map(root.logicalValue_z[i],root.maxRange_z,root.minRange_z,root.y1,root.y0).

                  P Offline
                  P Offline
                  p3c0
                  Moderators
                  wrote on 14 Aug 2015, 08:59 last edited by
                  #12

                  @vishnu Can you post a minimal example which replicates above scenario ? Something is not clear here.

                  157

                  V 1 Reply Last reply 14 Aug 2015, 09:43
                  0
                  • P p3c0
                    14 Aug 2015, 08:59

                    @vishnu Can you post a minimal example which replicates above scenario ? Something is not clear here.

                    V Offline
                    V Offline
                    vishnu
                    wrote on 14 Aug 2015, 09:43 last edited by
                    #13

                    @p3c0
                    okay.

                    Rectangle {
                        id: root
                        width: 1280; height: 800
                        property var physicalValue_x: []
                        property var physicalValue_z: []
                        property var logicalValue_x: [-80,-40,40,80,220,400,740,680,170,-170,-250,-220,-80,-40,-20]
                        property var logicalValue_z: [820,820,820,820,780,670,560,305,295,285,380,780,820,820,820]
                    
                        property int maxRange_x: 1040
                        property int minRange_x: -400
                        property int maxRange_z: 1020
                        property int minRange_z: 100
                        property real y0 : 50.0;
                        property real y1 : chart.height - chart.xAxisHeight
                        property real x0 : chart.yAxisWidth
                        property real x1 : chart.width - 100
                    
                        function map(value,srcMax,srcMin,dstMax,dstMin){
                            return Number(((((dstMax - dstMin)*(value - srcMin)/(srcMax - srcMin))+dstMin)).toFixed(1)) ;
                        }
                    
                        function logicalToPhysical()
                        {
                            for(var i=0;i<root.logicalValue_x.length;i++)
                            {
                                var pos_x = root.map(root.logicalValue_x[i],root.maxRange_x,root.minRange_x,root.x1,root.x0)
                                root.physicalValue_x[i] = pos_x
                                var pos_z = root.map(root.logicalValue_z[i],root.maxRange_z,root.minRange_z,root.y1,root.y0)
                                root.physicalValue_z[i] = pos_z
                            }
                            console.log("physical x values"+root.physicalValue_x)
                            console.log("physical z values"+root.physicalValue_z)
                        }
                    Item{
                            id:root_chart
                            //        anchors.fill: parent
                            anchors.left: root_checkbox.right
                            height: parent.height
                            anchors.right: parent.right
                            Canvas {
                                id: chart
                                property int maxPoints: 200
                                Component.onCompleted: {
                                    logicalToPhysical();/
                                }
                            onWidthChanged: {
                                    console.log("chart width is changing ")
                                    logicalToPhysical() //call 1 
                                    requestPaint()
                                }
                                onHeightChanged: {
                                    console.log("chart height is changing ")
                                    logicalToPhysical()// call 2
                                    requestPaint()
                                }
                         }
                    

                    I found that because of these calls 1 and 2 the error is coming.

                    P 1 Reply Last reply 14 Aug 2015, 09:52
                    0
                    • V vishnu
                      14 Aug 2015, 09:43

                      @p3c0
                      okay.

                      Rectangle {
                          id: root
                          width: 1280; height: 800
                          property var physicalValue_x: []
                          property var physicalValue_z: []
                          property var logicalValue_x: [-80,-40,40,80,220,400,740,680,170,-170,-250,-220,-80,-40,-20]
                          property var logicalValue_z: [820,820,820,820,780,670,560,305,295,285,380,780,820,820,820]
                      
                          property int maxRange_x: 1040
                          property int minRange_x: -400
                          property int maxRange_z: 1020
                          property int minRange_z: 100
                          property real y0 : 50.0;
                          property real y1 : chart.height - chart.xAxisHeight
                          property real x0 : chart.yAxisWidth
                          property real x1 : chart.width - 100
                      
                          function map(value,srcMax,srcMin,dstMax,dstMin){
                              return Number(((((dstMax - dstMin)*(value - srcMin)/(srcMax - srcMin))+dstMin)).toFixed(1)) ;
                          }
                      
                          function logicalToPhysical()
                          {
                              for(var i=0;i<root.logicalValue_x.length;i++)
                              {
                                  var pos_x = root.map(root.logicalValue_x[i],root.maxRange_x,root.minRange_x,root.x1,root.x0)
                                  root.physicalValue_x[i] = pos_x
                                  var pos_z = root.map(root.logicalValue_z[i],root.maxRange_z,root.minRange_z,root.y1,root.y0)
                                  root.physicalValue_z[i] = pos_z
                              }
                              console.log("physical x values"+root.physicalValue_x)
                              console.log("physical z values"+root.physicalValue_z)
                          }
                      Item{
                              id:root_chart
                              //        anchors.fill: parent
                              anchors.left: root_checkbox.right
                              height: parent.height
                              anchors.right: parent.right
                              Canvas {
                                  id: chart
                                  property int maxPoints: 200
                                  Component.onCompleted: {
                                      logicalToPhysical();/
                                  }
                              onWidthChanged: {
                                      console.log("chart width is changing ")
                                      logicalToPhysical() //call 1 
                                      requestPaint()
                                  }
                                  onHeightChanged: {
                                      console.log("chart height is changing ")
                                      logicalToPhysical()// call 2
                                      requestPaint()
                                  }
                           }
                      

                      I found that because of these calls 1 and 2 the error is coming.

                      P Offline
                      P Offline
                      p3c0
                      Moderators
                      wrote on 14 Aug 2015, 09:52 last edited by p3c0
                      #14

                      @vishnu This doesnot show any error specific to what you posted earlier.

                      157

                      V 1 Reply Last reply 14 Aug 2015, 09:55
                      0
                      • P p3c0
                        14 Aug 2015, 09:52

                        @vishnu This doesnot show any error specific to what you posted earlier.

                        V Offline
                        V Offline
                        vishnu
                        wrote on 14 Aug 2015, 09:55 last edited by vishnu
                        #15

                        @p3c0
                        I think i better post the whole file. sorry for the inconvenience.

                        import QtQuick 2.4
                        import QtQuick.Controls 1.2
                        Rectangle {
                            id: root
                            width: 1280; height: 800
                        
                            property variant data1: [20.0]
                            property double currentPos_x:591
                            property double currentPos_y:60
                            property double currentPos_z:193
                        
                            property var physicalValue_x: []
                            property var physicalValue_z: []
                            property var logicalValue_x: [-80,-40,40,80,220,400,740,680,170,-170,-250,-220,-80,-40,-20]
                            property var logicalValue_z: [820,820,820,820,780,670,560,305,295,285,380,780,820,820,820]
                        
                            property double showPos_x
                            property double showPos_y
                            property double showPos_z
                        
                        
                            property int maxRange_x: 1040
                            property int minRange_x: -400
                            property int maxRange_z: 1020
                            property int minRange_z: 100
                            property real y0 : 50.0;
                            property real y1 : chart.height - chart.xAxisHeight
                            property real x0 : chart.yAxisWidth
                            property real x1 : chart.width - 100
                        
                            function map(value,srcMax,srcMin,dstMax,dstMin){
                                //        console.log(srcMax,srcMin,dstMax,dstMin," value ",value)
                                return Number(((((dstMax - dstMin)*(value - srcMin)/(srcMax - srcMin))+dstMin)).toFixed(1)) ;
                            }
                        
                            function logicalToPhysical()
                            {
                                for(var i=0;i<root.logicalValue_x.length;i++)
                                {
                                    var pos_x = root.map(root.logicalValue_x[i],root.maxRange_x,root.minRange_x,root.x1,root.x0)
                                    root.physicalValue_x[i] = pos_x
                                    var pos_z = root.map(root.logicalValue_z[i],root.maxRange_z,root.minRange_z,root.y1,root.y0)
                                    root.physicalValue_z[i] = pos_z
                                }
                                console.log("physical x values"+root.physicalValue_x)
                                console.log("physical z values"+root.physicalValue_z)
                            }
                        
                            function inputToGraph(byteIndex,bitIndex,bitValue){
                        
                                if(bitIndex === -1){
                                    if(byteIndex === 36){
                                        //update x position
                                        showPos_x=Number((bitValue/1000).toFixed(1));
                                        var pos_x= root.map(bitValue/1000,maxRange_x,minRange_x,x1,x0);
                                        currentPos_x=pos_x;
                        //                console.log("current pos x map value"+currentPos_x)
                                    }
                                    if(byteIndex === 40){
                                        //update y position
                                        showPos_y=Number((bitValue/1000).toFixed(1));
                                        currentPos_y=bitValue/1000;
                                        //                console.log("current pos y map value"+currentPos_y)
                                    }
                                    if(byteIndex === 44){
                                        //update z position
                                        showPos_z=Number((bitValue/1000).toFixed(1));
                                        var pos_z= root.map(bitValue/1000,maxRange_z,minRange_z,y1,y0);
                                        currentPos_z=pos_z;
                        //                console.log("current pos z map value"+currentPos_z)
                                    }
                                }
                            }
                        
                            Connections{
                                target: tcpCommunicationPort
                                onDataFromCpp:{
                                    inputToGraph(byteIndex,bitIndex,bitValue)
                                }
                            }
                            Rectangle{
                                id:root_checkbox
                                anchors.left: parent.left
                                width: parent.width/4
                                height: parent.height
                                Row{
                                    spacing: 50
                                    anchors.centerIn: parent
                                    Rectangle{
                                        width: triggerButton.width
                                        height: triggerButton.height
                                        border.color: "red"
                                        TextInput{
                                            id: timeInput
                                            anchors.centerIn: parent
                                        }
                                    }
                                    Button{
                                        id:triggerButton
                                        text:"trigger"
                                        onClicked: {
                                            //                    var y0 = 50.0;
                                            //                    var y1 = chart.height - chart.xAxisHeight
                                            //                    var x0 = chart.yAxisWidth
                                            //                    var x1 = chart.width - 100
                                            //                    var mappedzvalue = root.map(521,maxRange_x,minRange_x,x1,x0);
                                            //                    //                                        point2.ypos = mappedzvalue
                                            //                    var mappedxvalue = root.map(717,maxRange_z,minRange_z,y1,y0)
                                            //                    //                                        point2.xpos =Number((mappedxvalue).toFixed(1))
                                            //                    console.log("mapped z value",mappedzvalue)
                                            //                    console.log("mapped x value",mappedxvalue)
                                            inputToGraph(36,-1,0);
                                            inputToGraph(44,-1,0);
                                        }
                                    }
                                    Button{
                                        id:triggerButton1
                                        text:"trigger1"
                                        onClicked: {
                                            console.log(" current ")
                                        }
                                    }
                                }
                            }
                        
                        
                            Item{
                                id:root_chart
                                //        anchors.fill: parent
                                anchors.left: root_checkbox.right
                                height: parent.height
                                anchors.right: parent.right
                                Canvas {
                                    id: chart
                                    property int maxPoints: 200
                                    Component.onCompleted: {
                                        logicalToPhysical();
                                    }
                                    onWidthChanged: {
                                        console.log("chart width is changing ")
                                        if(root.physicalValue_x){
                                            logicalToPhysical()
                                            requestPaint()
                                        }
                                    }
                                    onHeightChanged: {
                                        console.log("chart height is changing ")
                                        logicalToPhysical()
                                        requestPaint()
                                    }
                        
                                    width: parent.width
                                    height: parent.height
                                    anchors.margins: 50
                                    antialiasing: true
                                    renderStrategy: Canvas.Cooperative
                        
                                    property color linecolor: "#808080"
                                    property color background: "#f5f5f5"
                        
                                    //            property int yRef: chart.height/2 - chart.xAxisHeight
                                    //            property int xRef: chart.yAxisWidth + 100
                        
                                    property int yAxisWidth: 80   // x pos of y-axis in pixel
                                    property int xAxisHeight: 40  // y distance of x-axis from bottom in pixel
                        
                                    property bool fillAreas: false
                                    property int scalingFactor: 30
                        
                                    function drawAxis(ctx) {
                                        var yAxis = {
                                            labels: ["+6 dB", "0 dB", "-6 dB", "-12 dB", "-18 dB"],
                                            lines: [0.0, 0.22, 0.44, 0.66, 0.88]
                                        }
                        
                                        var xAxis = {
                                            labels: ["100 mm", "150 mm", "200 mm", "250 mm", "300 mm",
                                                "350 mm", "400 mm", "450 mm", "500 mm", "550 mm"],
                                            lines: [0.0, 0.15, 0.25, 0.35, 0.50,
                                                0.60, 0.70, 0.82, 0.92, 1.00]
                                        }
                        
                                        //                var y0 = 50.0;
                                        //                var y1 = chart.height - chart.xAxisHeight
                                        //                var x0 = chart.yAxisWidth
                                        //                var x1 = chart.width - 100
                        
                                        // clear
                                        ctx.fillStyle = background
                                        ctx.fillRect(0,0,width,height)
                        
                                        // frame
                                        ctx.strokeStyle = linecolor;
                                        ctx.fillStyle = "#999999";
                                        ctx.lineWidth = 1
                        
                                        ctx.beginPath();
                                        ctx.moveTo(x0,y0);
                        
                                        ctx.lineTo(x1,y0);
                                        ctx.lineTo(x1,y1);
                                        ctx.lineTo(x0,y1);
                                        ctx.lineTo(x0,y0);
                                        ctx.stroke()
                        
                                        var w
                                        var yp
                        
                                        //drawing the small lines on the X and Y axis
                                        for (var y = 0; y < yAxis.lines.length; y++)
                                        {
                                            ctx.beginPath();
                                            ctx.strokeStyle = "black"
                                            yp = (y1 - y0) * yAxis.lines[y] + y0
                                            ctx.moveTo(x0 - 10, yp);
                                            ctx.lineTo(x0, yp);
                                            ctx.stroke();
                                            ctx.closePath();
                        
                                            //                w = ctx.measureText(yAxis.labels[y]).width
                                            //                ctx.fillText(yAxis.labels[y], x0 - w -5, yp + 5)
                                        }
                        
                                        for (var x = 0; x < xAxis.lines.length; x++)
                                        {
                                            ctx.beginPath();
                                            var xp = (x1 - x0) * xAxis.lines[x] + x0
                                            ctx.moveTo(xp, y1);
                                            ctx.lineTo(xp, y1 + 5);
                                            ctx.stroke();
                                            ctx.closePath();
                        
                                            ctx.fillText(xAxis.labels[x], xp - 20, y1 + 20)
                                        }
                                        ctx.beginPath();
                                        console.log("drawing the graph")
                                        console.log("chart width"+ chart.width);
                        
                                        ctx.moveTo(physicalValue_x[0],physicalValue_z[0]);
                                        for( var i=1;i< physicalValue_x.length;i++){
                                            ctx.lineTo(physicalValue_x[i],physicalValue_z[i])
                                        }
                                        ctx.lineWidth = 2
                                        ctx.stroke();
                                        ctx.closePath();
                                    }
                                    onPaint: {
                                        var ctx = getContext("2d");
                                        //                ctx.save();
                                        drawAxis(ctx)
                                        //                ctx.restore();
                                    }
                                }
                                Rectangle {
                                    id: point1
                                    x: currentPos_x
                                    y: currentPos_z
                                    z:10
                                    radius: 5
                                    width: 60; height: 15
                                    color: "#800096d6"
                                    Text{
                                        id:currentpoisionText
                                        anchors.centerIn: parent
                                        text: showPos_x+","+showPos_z
                                    }
                                }
                            }
                        }
                        

                        try to ignore the function inputToGraph and connections because it is from cpp side.

                        P 1 Reply Last reply 14 Aug 2015, 11:31
                        0
                        • V vishnu
                          14 Aug 2015, 09:55

                          @p3c0
                          I think i better post the whole file. sorry for the inconvenience.

                          import QtQuick 2.4
                          import QtQuick.Controls 1.2
                          Rectangle {
                              id: root
                              width: 1280; height: 800
                          
                              property variant data1: [20.0]
                              property double currentPos_x:591
                              property double currentPos_y:60
                              property double currentPos_z:193
                          
                              property var physicalValue_x: []
                              property var physicalValue_z: []
                              property var logicalValue_x: [-80,-40,40,80,220,400,740,680,170,-170,-250,-220,-80,-40,-20]
                              property var logicalValue_z: [820,820,820,820,780,670,560,305,295,285,380,780,820,820,820]
                          
                              property double showPos_x
                              property double showPos_y
                              property double showPos_z
                          
                          
                              property int maxRange_x: 1040
                              property int minRange_x: -400
                              property int maxRange_z: 1020
                              property int minRange_z: 100
                              property real y0 : 50.0;
                              property real y1 : chart.height - chart.xAxisHeight
                              property real x0 : chart.yAxisWidth
                              property real x1 : chart.width - 100
                          
                              function map(value,srcMax,srcMin,dstMax,dstMin){
                                  //        console.log(srcMax,srcMin,dstMax,dstMin," value ",value)
                                  return Number(((((dstMax - dstMin)*(value - srcMin)/(srcMax - srcMin))+dstMin)).toFixed(1)) ;
                              }
                          
                              function logicalToPhysical()
                              {
                                  for(var i=0;i<root.logicalValue_x.length;i++)
                                  {
                                      var pos_x = root.map(root.logicalValue_x[i],root.maxRange_x,root.minRange_x,root.x1,root.x0)
                                      root.physicalValue_x[i] = pos_x
                                      var pos_z = root.map(root.logicalValue_z[i],root.maxRange_z,root.minRange_z,root.y1,root.y0)
                                      root.physicalValue_z[i] = pos_z
                                  }
                                  console.log("physical x values"+root.physicalValue_x)
                                  console.log("physical z values"+root.physicalValue_z)
                              }
                          
                              function inputToGraph(byteIndex,bitIndex,bitValue){
                          
                                  if(bitIndex === -1){
                                      if(byteIndex === 36){
                                          //update x position
                                          showPos_x=Number((bitValue/1000).toFixed(1));
                                          var pos_x= root.map(bitValue/1000,maxRange_x,minRange_x,x1,x0);
                                          currentPos_x=pos_x;
                          //                console.log("current pos x map value"+currentPos_x)
                                      }
                                      if(byteIndex === 40){
                                          //update y position
                                          showPos_y=Number((bitValue/1000).toFixed(1));
                                          currentPos_y=bitValue/1000;
                                          //                console.log("current pos y map value"+currentPos_y)
                                      }
                                      if(byteIndex === 44){
                                          //update z position
                                          showPos_z=Number((bitValue/1000).toFixed(1));
                                          var pos_z= root.map(bitValue/1000,maxRange_z,minRange_z,y1,y0);
                                          currentPos_z=pos_z;
                          //                console.log("current pos z map value"+currentPos_z)
                                      }
                                  }
                              }
                          
                              Connections{
                                  target: tcpCommunicationPort
                                  onDataFromCpp:{
                                      inputToGraph(byteIndex,bitIndex,bitValue)
                                  }
                              }
                              Rectangle{
                                  id:root_checkbox
                                  anchors.left: parent.left
                                  width: parent.width/4
                                  height: parent.height
                                  Row{
                                      spacing: 50
                                      anchors.centerIn: parent
                                      Rectangle{
                                          width: triggerButton.width
                                          height: triggerButton.height
                                          border.color: "red"
                                          TextInput{
                                              id: timeInput
                                              anchors.centerIn: parent
                                          }
                                      }
                                      Button{
                                          id:triggerButton
                                          text:"trigger"
                                          onClicked: {
                                              //                    var y0 = 50.0;
                                              //                    var y1 = chart.height - chart.xAxisHeight
                                              //                    var x0 = chart.yAxisWidth
                                              //                    var x1 = chart.width - 100
                                              //                    var mappedzvalue = root.map(521,maxRange_x,minRange_x,x1,x0);
                                              //                    //                                        point2.ypos = mappedzvalue
                                              //                    var mappedxvalue = root.map(717,maxRange_z,minRange_z,y1,y0)
                                              //                    //                                        point2.xpos =Number((mappedxvalue).toFixed(1))
                                              //                    console.log("mapped z value",mappedzvalue)
                                              //                    console.log("mapped x value",mappedxvalue)
                                              inputToGraph(36,-1,0);
                                              inputToGraph(44,-1,0);
                                          }
                                      }
                                      Button{
                                          id:triggerButton1
                                          text:"trigger1"
                                          onClicked: {
                                              console.log(" current ")
                                          }
                                      }
                                  }
                              }
                          
                          
                              Item{
                                  id:root_chart
                                  //        anchors.fill: parent
                                  anchors.left: root_checkbox.right
                                  height: parent.height
                                  anchors.right: parent.right
                                  Canvas {
                                      id: chart
                                      property int maxPoints: 200
                                      Component.onCompleted: {
                                          logicalToPhysical();
                                      }
                                      onWidthChanged: {
                                          console.log("chart width is changing ")
                                          if(root.physicalValue_x){
                                              logicalToPhysical()
                                              requestPaint()
                                          }
                                      }
                                      onHeightChanged: {
                                          console.log("chart height is changing ")
                                          logicalToPhysical()
                                          requestPaint()
                                      }
                          
                                      width: parent.width
                                      height: parent.height
                                      anchors.margins: 50
                                      antialiasing: true
                                      renderStrategy: Canvas.Cooperative
                          
                                      property color linecolor: "#808080"
                                      property color background: "#f5f5f5"
                          
                                      //            property int yRef: chart.height/2 - chart.xAxisHeight
                                      //            property int xRef: chart.yAxisWidth + 100
                          
                                      property int yAxisWidth: 80   // x pos of y-axis in pixel
                                      property int xAxisHeight: 40  // y distance of x-axis from bottom in pixel
                          
                                      property bool fillAreas: false
                                      property int scalingFactor: 30
                          
                                      function drawAxis(ctx) {
                                          var yAxis = {
                                              labels: ["+6 dB", "0 dB", "-6 dB", "-12 dB", "-18 dB"],
                                              lines: [0.0, 0.22, 0.44, 0.66, 0.88]
                                          }
                          
                                          var xAxis = {
                                              labels: ["100 mm", "150 mm", "200 mm", "250 mm", "300 mm",
                                                  "350 mm", "400 mm", "450 mm", "500 mm", "550 mm"],
                                              lines: [0.0, 0.15, 0.25, 0.35, 0.50,
                                                  0.60, 0.70, 0.82, 0.92, 1.00]
                                          }
                          
                                          //                var y0 = 50.0;
                                          //                var y1 = chart.height - chart.xAxisHeight
                                          //                var x0 = chart.yAxisWidth
                                          //                var x1 = chart.width - 100
                          
                                          // clear
                                          ctx.fillStyle = background
                                          ctx.fillRect(0,0,width,height)
                          
                                          // frame
                                          ctx.strokeStyle = linecolor;
                                          ctx.fillStyle = "#999999";
                                          ctx.lineWidth = 1
                          
                                          ctx.beginPath();
                                          ctx.moveTo(x0,y0);
                          
                                          ctx.lineTo(x1,y0);
                                          ctx.lineTo(x1,y1);
                                          ctx.lineTo(x0,y1);
                                          ctx.lineTo(x0,y0);
                                          ctx.stroke()
                          
                                          var w
                                          var yp
                          
                                          //drawing the small lines on the X and Y axis
                                          for (var y = 0; y < yAxis.lines.length; y++)
                                          {
                                              ctx.beginPath();
                                              ctx.strokeStyle = "black"
                                              yp = (y1 - y0) * yAxis.lines[y] + y0
                                              ctx.moveTo(x0 - 10, yp);
                                              ctx.lineTo(x0, yp);
                                              ctx.stroke();
                                              ctx.closePath();
                          
                                              //                w = ctx.measureText(yAxis.labels[y]).width
                                              //                ctx.fillText(yAxis.labels[y], x0 - w -5, yp + 5)
                                          }
                          
                                          for (var x = 0; x < xAxis.lines.length; x++)
                                          {
                                              ctx.beginPath();
                                              var xp = (x1 - x0) * xAxis.lines[x] + x0
                                              ctx.moveTo(xp, y1);
                                              ctx.lineTo(xp, y1 + 5);
                                              ctx.stroke();
                                              ctx.closePath();
                          
                                              ctx.fillText(xAxis.labels[x], xp - 20, y1 + 20)
                                          }
                                          ctx.beginPath();
                                          console.log("drawing the graph")
                                          console.log("chart width"+ chart.width);
                          
                                          ctx.moveTo(physicalValue_x[0],physicalValue_z[0]);
                                          for( var i=1;i< physicalValue_x.length;i++){
                                              ctx.lineTo(physicalValue_x[i],physicalValue_z[i])
                                          }
                                          ctx.lineWidth = 2
                                          ctx.stroke();
                                          ctx.closePath();
                                      }
                                      onPaint: {
                                          var ctx = getContext("2d");
                                          //                ctx.save();
                                          drawAxis(ctx)
                                          //                ctx.restore();
                                      }
                                  }
                                  Rectangle {
                                      id: point1
                                      x: currentPos_x
                                      y: currentPos_z
                                      z:10
                                      radius: 5
                                      width: 60; height: 15
                                      color: "#800096d6"
                                      Text{
                                          id:currentpoisionText
                                          anchors.centerIn: parent
                                          text: showPos_x+","+showPos_z
                                      }
                                  }
                              }
                          }
                          

                          try to ignore the function inputToGraph and connections because it is from cpp side.

                          P Offline
                          P Offline
                          p3c0
                          Moderators
                          wrote on 14 Aug 2015, 11:31 last edited by
                          #16

                          @vishnu It appears to be the problem with the initialization of properties as well as the intialization of items from where these properties are accessed. It seems that when Canvas is created and its heightChanged signal is invoked the property logicalValue_z is not initialized yet and thus causes that error but very first time only. Later it doesnt seems to give that error. This can be avoided by adding another condition where you can check if that property is initialized just like you checked physicalValue_x

                          if(physicalValue_x && logicalValue_z){
                              logicalToPhysical()
                              requestPaint()
                          }
                          

                          157

                          V 1 Reply Last reply 14 Aug 2015, 11:38
                          1
                          • P p3c0
                            14 Aug 2015, 11:31

                            @vishnu It appears to be the problem with the initialization of properties as well as the intialization of items from where these properties are accessed. It seems that when Canvas is created and its heightChanged signal is invoked the property logicalValue_z is not initialized yet and thus causes that error but very first time only. Later it doesnt seems to give that error. This can be avoided by adding another condition where you can check if that property is initialized just like you checked physicalValue_x

                            if(physicalValue_x && logicalValue_z){
                                logicalToPhysical()
                                requestPaint()
                            }
                            
                            V Offline
                            V Offline
                            vishnu
                            wrote on 14 Aug 2015, 11:38 last edited by
                            #17

                            @p3c0
                            perfect. May i know what does this mean exactly? if(physicalValue_x && logicalValue_z) . I am assuming at this point physicalValue_x!=0 and logicalValue_z !=0 .then it enters inside the condition.

                            P 1 Reply Last reply 14 Aug 2015, 12:18
                            0
                            • V vishnu
                              14 Aug 2015, 11:38

                              @p3c0
                              perfect. May i know what does this mean exactly? if(physicalValue_x && logicalValue_z) . I am assuming at this point physicalValue_x!=0 and logicalValue_z !=0 .then it enters inside the condition.

                              P Offline
                              P Offline
                              p3c0
                              Moderators
                              wrote on 14 Aug 2015, 12:18 last edited by
                              #18

                              @vishnu The control will go ahead if and only if both properties are initialized. Its a normal & operation.

                              157

                              1 Reply Last reply
                              0

                              14/18

                              14 Aug 2015, 09:52

                              • Login

                              • Login or register to search.
                              14 out of 18
                              • First post
                                14/18
                                Last post
                              0
                              • Categories
                              • Recent
                              • Tags
                              • Popular
                              • Users
                              • Groups
                              • Search
                              • Get Qt Extensions
                              • Unsolved