Meshroom/meshroom/ui/qml/Viewer/SfmStatsView.qml

251 lines
7.3 KiB
QML

import QtCharts
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import AliceVision 1.0 as AliceVision
import Charts 1.0
import Controls 1.0
import Utils 1.0
FloatingPane {
id: root
property var msfmData: null
property int viewId
property color textColor: Colors.sysPalette.text
visible: (_reconstruction.sfm && _reconstruction.sfm.isComputed) ? root.visible : false
clip: true
padding: 4
// To avoid interaction with components in background
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton
onPressed: {}
onReleased: {}
onWheel: {}
}
InteractiveChartView {
id: residualChart
width: parent.width * 0.5
height: parent.height * 0.5
title: "Reprojection Errors"
legend.visible: false
antialiasing: true
ValueAxis {
id: residualValueAxisX
titleText: "Reprojection Error"
min: 0.0
max: viewStat.residualMaxAxisX
}
ValueAxis {
id: residualValueAxisY
labelFormat: "%i"
titleText: "Number of Points"
min: 0
max: viewStat.residualMaxAxisY
}
LineSeries {
id: residualFullLineSerie
axisX: residualValueAxisX
axisY: residualValueAxisY
name: "Average on All Cameras"
}
LineSeries {
id: residualViewLineSerie
axisX: residualValueAxisX
axisY: residualValueAxisY
name: "Current"
}
}
Item {
id: residualBtnContainer
Layout.fillWidth: true
anchors.bottom: residualChart.bottom
anchors.bottomMargin: 35
anchors.left: residualChart.left
anchors.leftMargin: residualChart.width * 0.15
RowLayout {
ChartViewCheckBox {
id: allResiduals
text: "ALL"
color: textColor
checkState: residualLegend.buttonGroup.checkState
onClicked: {
var _checked = checked;
for (var i = 0; i < residualChart.count; ++i) {
residualChart.series(i).visible = _checked
}
}
}
ChartViewLegend {
id: residualLegend
chartView: residualChart
}
}
}
InteractiveChartView {
id: observationsLengthsChart
width: parent.width * 0.5
height: parent.height * 0.5
anchors.top: parent.top
anchors.topMargin: (parent.height) * 0.5
legend.visible: false
title: "Observations Lengths"
ValueAxis {
id: observationsLengthsvalueAxisX
labelFormat: "%i"
titleText: "Observations Length"
min: 2
max: viewStat.observationsLengthsMaxAxisX
tickAnchor: 2
tickInterval: 1
tickCount: 5
}
ValueAxis {
id: observationsLengthsvalueAxisY
labelFormat: "%i"
titleText: "Number of Points"
min: 0
max: viewStat.observationsLengthsMaxAxisY
}
LineSeries {
id: observationsLengthsFullLineSerie
axisX: observationsLengthsvalueAxisX
axisY: observationsLengthsvalueAxisY
name: "All Cameras"
}
LineSeries {
id: observationsLengthsViewLineSerie
axisX: observationsLengthsvalueAxisX
axisY: observationsLengthsvalueAxisY
name: "Current"
}
}
Item {
id: observationsLengthsBtnContainer
Layout.fillWidth: true
anchors.bottom: observationsLengthsChart.bottom
anchors.bottomMargin: 35
anchors.left: observationsLengthsChart.left
anchors.leftMargin: observationsLengthsChart.width * 0.25
RowLayout {
ChartViewCheckBox {
id: allObservations
text: "ALL"
color: textColor
checkState: observationsLengthsLegend.buttonGroup.checkState
onClicked: {
var _checked = checked;
for (var i = 0; i < observationsLengthsChart.count; ++i) {
observationsLengthsChart.series(i).visible = _checked
}
}
}
ChartViewLegend {
id: observationsLengthsLegend
chartView: observationsLengthsChart
}
}
}
InteractiveChartView {
id: observationsScaleChart
width: parent.width * 0.5
height: parent.height * 0.5
anchors.left: parent.left
anchors.leftMargin: (parent.width) * 0.5
anchors.top: parent.top
legend.visible: false
title: "Observations Scale"
ValueAxis {
id: observationsScaleValueAxisX
titleText: "Scale"
min: 0
max: viewStat.observationsScaleMaxAxisX
}
ValueAxis {
id: observationsScaleValueAxisY
titleText: "Number of Points"
min: 0
max: viewStat.observationsScaleMaxAxisY
}
LineSeries {
id: observationsScaleFullLineSerie
axisX: observationsScaleValueAxisX
axisY: observationsScaleValueAxisY
name: " Average on All Cameras"
}
LineSeries {
id: observationsScaleViewLineSerie
axisX: observationsScaleValueAxisX
axisY: observationsScaleValueAxisY
name: "Current"
}
}
Item {
id: observationsScaleBtnContainer
Layout.fillWidth: true
anchors.bottom: observationsScaleChart.bottom
anchors.bottomMargin: 35
anchors.left: observationsScaleChart.left
anchors.leftMargin: observationsScaleChart.width * 0.15
RowLayout {
ChartViewCheckBox {
id: allObservationsScales
text: "ALL"
color: textColor
checkState: observationsScaleLegend.buttonGroup.checkState
onClicked: {
var _checked = checked;
for (var i = 0; i < observationsScaleChart.count; ++i) {
observationsScaleChart.series(i).visible = _checked
}
}
}
ChartViewLegend {
id: observationsScaleLegend
chartView: observationsScaleChart
}
}
}
// Stats from a view the sfmData
AliceVision.MViewStats {
id: viewStat
msfmData: (root.visible && root.msfmData && root.msfmData.status === AliceVision.MSfMData.Ready) ? root.msfmData : null
viewId: root.viewId
onViewStatsChanged: {
fillResidualFullSerie(residualFullLineSerie)
fillResidualViewSerie(residualViewLineSerie)
fillObservationsLengthsFullSerie(observationsLengthsFullLineSerie)
fillObservationsLengthsViewSerie(observationsLengthsViewLineSerie)
fillObservationsScaleFullSerie(observationsScaleFullLineSerie)
fillObservationsScaleViewSerie(observationsScaleViewLineSerie)
}
}
}