-
-
Notifications
You must be signed in to change notification settings - Fork 557
/
Copy pathheightmapgriddrawer.cpp
133 lines (106 loc) · 3.88 KB
/
heightmapgriddrawer.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// This file is a part of "grblControl" application.
// Copyright 2015 Hayrullin Denis Ravilevich
#include "heightmapgriddrawer.h"
HeightMapGridDrawer::HeightMapGridDrawer()
{
m_model = NULL;
m_pointSize = 4;
}
bool HeightMapGridDrawer::updateData()
{
// Clear data
m_lines.clear();
m_points.clear();
// Prepare vertex
VertexData vertex;
vertex.start = QVector3D(sNan, sNan, sNan);
// Calculate grid parameters
int gridPointsX = m_model->columnCount();
int gridPointsY = m_model->rowCount();
double gridStepX = gridPointsX > 1 ? m_borderRect.width() / (gridPointsX - 1) : 0;
double gridStepY = gridPointsY > 1 ? m_borderRect.height() / (gridPointsY - 1) : 0;
// Probe path / dots
for (int i = 0; i < gridPointsY; i++) {
for (int j = 0; j < gridPointsX; j++) {
if (m_model == NULL || std::isnan(m_model->data(m_model->index(i, j), Qt::UserRole).toDouble())) {
vertex.color = QVector3D(1.0, 0.6, 0.0);
vertex.position = QVector3D(m_borderRect.x() + gridStepX * j, m_borderRect.y() + gridStepY * i, m_zTop);
m_lines.append(vertex);
vertex.position = QVector3D(m_borderRect.x() + gridStepX * j, m_borderRect.y() + gridStepY * i, m_zBottom);
m_lines.append(vertex);
} else {
vertex.color = QVector3D(0.0, 0.0, 1.0);
vertex.position = QVector3D(m_borderRect.x() + gridStepX * j, m_borderRect.y() + gridStepY * i, m_model->data(m_model->index(i, j), Qt::UserRole).toDouble());
m_points.append(vertex);
}
}
}
// Horizontal grid lines
vertex.color = QVector3D(0.0, 0.0, 1.0);
for (int i = 0; i < gridPointsY; i++) {
for (int j = 1; j < gridPointsX; j++) {
if (std::isnan(m_model->data(m_model->index(i, j), Qt::UserRole).toDouble())) continue;
vertex.position = QVector3D(m_borderRect.x() + gridStepX * (j - 1), m_borderRect.y() + gridStepY * i, m_model->data(m_model->index(i, j - 1), Qt::UserRole).toDouble());
m_lines.append(vertex);
vertex.position = QVector3D(m_borderRect.x() + gridStepX * j, m_borderRect.y() + gridStepY * i, m_model->data(m_model->index(i, j), Qt::UserRole).toDouble());
m_lines.append(vertex);
}
}
// Vertical grid lines
vertex.color = QVector3D(0.0, 0.0, 1.0);
for (int j = 0; j < gridPointsX; j++) {
for (int i = 1; i < gridPointsY; i++) {
if (std::isnan(m_model->data(m_model->index(i, j), Qt::UserRole).toDouble())) continue;
vertex.position = QVector3D(m_borderRect.x() + gridStepX * j, m_borderRect.y() + gridStepY * (i - 1), m_model->data(m_model->index(i - 1, j), Qt::UserRole).toDouble());
m_lines.append(vertex);
vertex.position = QVector3D(m_borderRect.x() + gridStepX * j, m_borderRect.y() + gridStepY * i, m_model->data(m_model->index(i, j), Qt::UserRole).toDouble());
m_lines.append(vertex);
}
}
return true;
}
QPointF HeightMapGridDrawer::gridSize() const
{
return m_gridSize;
}
void HeightMapGridDrawer::setGridSize(const QPointF &gridSize)
{
m_gridSize = gridSize;
update();
}
QRectF HeightMapGridDrawer::borderRect() const
{
return m_borderRect;
}
void HeightMapGridDrawer::setBorderRect(const QRectF &borderRect)
{
m_borderRect = borderRect;
update();
}
double HeightMapGridDrawer::zTop() const
{
return m_zTop;
}
void HeightMapGridDrawer::setZTop(double zTop)
{
m_zTop = zTop;
update();
}
double HeightMapGridDrawer::zBottom() const
{
return m_zBottom;
}
void HeightMapGridDrawer::setZBottom(double zBottom)
{
m_zBottom = zBottom;
update();
}
QAbstractTableModel *HeightMapGridDrawer::model() const
{
return m_model;
}
void HeightMapGridDrawer::setModel(QAbstractTableModel *model)
{
m_model = model;
update();
}