Заговор в прошлом - PullRequest
       13

Заговор в прошлом

1 голос
/ 25 марта 2019

При расширении трасс с помощью графика точки рисуются в прошлом.Как вы можете видеть на картинке, любая

Изображение проблемы

Диаграмма теперь состоит из 2 частей, одна справа - это данные из базы данных, и дляслева - данные, отображаемые в режиме реального времени.Данные, которые наносятся на график в режиме реального времени, находятся слева от данных из базы данных, даже если временные метки идут после меток из баз данных.

Отметка времени в журналах консоли правильная, но сюжетно размещает их в неправильное время на оси X.Следует рисовать в конце графика.

updateData (sensorData) {
    if (!this.initiated || !this.isLiveData) {
        return
    }

    let y = []
    let i = 0
    let x = []
    let traces = []
    for (let sensor in this.configuration) {
        for (let signal in this.configuration[sensor]) {
            let xDate = new Date(sensorData[sensor].timestamp)

            if (sensorData.hasOwnProperty(sensor) && sensorData[sensor].hasOwnProperty(signal)) {
                y.push([sensorData[sensor][signal]])
                x.push([xDate.getTime()])
            }
            // x time seems to be good here
            console.log('Update data', xDate.getTime(), xDate)

            traces.push(i)
            i++
        }
    }

    console.log('Plotting', y, x, this.widget.getXRange())
    if (y.length > 0) {
        this.$plotly.extendTraces('plotly-chart', {
            y: y,
            x: x
        }, traces)
    }
},

Данные из базы данных добавляются с помощью следующего кода.

updateFromDb (sensorData) {
    let data = []
    let x = []
    let yData = {}

    for (let sensor in this.configuration) {
        for (let i = 0, len = sensorData[sensor].length; i < len; i++) {
            let timestamp = sensorData[sensor][i].timestamp
            x.push(timestamp)

            for (let source in this.configuration[sensor]) {
                let name = sensor + ' ' + getSignalName(source, this.angleLabel)

                if (!yData.hasOwnProperty(name)) {
                    yData[name] = {
                        data: [],
                        color: this.configuration[sensor][source].color
                    }
                }

                if (!sensorData[sensor][i].hasOwnProperty(source)) {
                    yData[name].data.push(0)
                } else {
                    yData[name].data.push(sensorData[sensor][i][source])
                }

                if (this.configuration[sensor][source].hasOwnProperty('yaxis')) {
                    yData[name]['yaxis'] = 'y' + this.configuration[sensor][source].yaxis
                }
            }
        }
    }

    for (let name in yData) {
        let sensorData = {
            name: name,
            x: x,
            y: yData[name].data,
            type: 'line',
            mode: 'lines',
            line: {
                width: 2,
                color: yData[name].color
            },
            marker: {
                width: 2,
                color: yData[name].color
            }
        }

        if (yData[name].hasOwnProperty('yaxis')) {
            sensorData['yaxis'] = yData[name].yaxis
        }
        data.push(sensorData)
    }

    this.$plotly.react(
        document.getElementById('plotly-chart'),
        data,
        this.getLayout(false),
        this.chartProperties
    )
}

Существует также функция, которая прокручивает окноxaxis каждые 50 мс, чтобы он выглядел гладко.

windowScroller () {
    if (!this.initiated || !this.isLiveData) {
        return
    }

    let timeDifference = 0
    if (this.timeDifference !== null) {
        timeDifference = this.timeDifference
    }

    /**
     * Make sure the line never gets behind the scroller.
     */
    if (Object.keys(this.latestPoint).length > 0) {
        let latestTime = this.latestPoint[Object.keys(this.latestPoint)[0]].timestamp
        let scrollDiff = new Date().getTime() - latestTime
        if (scrollDiff !== this.scrollDelay && this.lastDelayTime !== latestTime && scrollDiff < 60000) {
            this.lastDelayTime = latestTime
            this.scrollDelay = scrollDiff
            // console.log('update scroll', scrollDiff, 'from', latestTime)
        }
    }

    let currentTime = new Date().getTime() - timeDifference - this.scrollDelay
    let firstTime = new Date().getTime() - this.getMilisecondsFromMinutes(this.widget.getXRange()) - timeDifference - this.scrollDelay
    let relayoutPromise = new Promise((resolve, reject) => {
        this.$plotly.relayout('plotly-chart', {
            xaxis: {
                color: '#fff',
                type: 'date',
                range: [firstTime, currentTime]
            }
        })
    })

    relayoutPromise.then(() => {
        console.log('relayout')
    })

    let data = document.getElementById('plotly-chart').data

    // We calculate the max points using 4 hertz
    let maxPoints = (this.getSecondsFromMinutes(this.widget.getXRange()) + 10) * this.widget.getRefreshRate()

    if (this.minMax) {
        maxPoints = maxPoints * 2
    }
    for (let i in data) {
        if (data[i].y.length >= maxPoints) {
            data[i].y.shift()
            data[i].x.shift()
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...