ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
tablemodel.cpp
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
8 #include "tablemodel.h"
9 
10 #include "utils.h"
11 
12 // CV_CORE_LIB
13 #include <CVLog.h>
14 
15 #include <cstdlib>
16 
17 // CV_DB_LIB
18 #include <ecvGenericMesh.h>
19 #include <ecvGenericPointCloud.h>
20 #include <ecvHObject.h>
21 #include <ecvHObjectCaster.h>
22 
23 // QT
24 #include <QDebug>
25 
26 namespace VtkUtils {
27 
28 TableModel::TableModel(int column, int row, QObject* parent)
29  : QAbstractTableModel(parent), m_cols(column), m_rows(row) {
30  m_cols = column;
31  m_rows = row;
32 
33  // m_data
34  for (int i = 0; i < m_rows; i++) {
35  QVector<qreal>* dataVec = new QVector<qreal>(m_cols);
36  for (int k = 0; k < dataVec->size(); k++) {
37  if (k % 2 == 0)
38  dataVec->replace(k, i * 50 + std::rand() % 20);
39  else
40  dataVec->replace(k, std::rand() % 100);
41  }
42  m_data.append(dataVec);
43  }
44 }
45 
46 TableModel::TableModel(const ccHObject* objContainer, QObject* parent)
47  : QAbstractTableModel(parent) {
48  updateData(objContainer);
49 }
50 
51 void TableModel::updateData(const ccHObject* objContainer) {
52  clear();
53  m_cols = 3;
54 
55  for (unsigned ci = 0; ci != objContainer->getChildrenNumber(); ++ci) {
56  ccHObject* obj = objContainer->getChild(ci);
57  if (!obj) {
58  continue;
59  }
60  ccGenericPointCloud* inputCloud =
62  if (!inputCloud) {
63  continue;
64  }
65  const ccGenericPointCloud::VisibilityTableType& verticesVisibility =
66  inputCloud->getTheVisibilityArray();
67  bool visFiltering = (verticesVisibility.size() >= inputCloud->size());
68  int count = static_cast<int>(inputCloud->size());
69  bool showColor = inputCloud->colorsShown();
70 
71  for (int i = 0; i < count; ++i) {
72  if (visFiltering && verticesVisibility.at(i) != POINT_VISIBLE) {
73  continue;
74  }
75 
76  QVector<qreal>* dataVec = new QVector<qreal>(m_cols);
77  const CCVector3* P = inputCloud->getPoint(static_cast<unsigned>(i));
78  for (int k = 0; k < dataVec->size(); k++) {
79  dataVec->replace(k, P->u[k]);
80  }
81  m_data.append(dataVec);
82  }
83 
84  if (obj->isKindOf(CV_TYPES::POINT_CLOUD)) {
85  } else if (obj->isKindOf(CV_TYPES::MESH)) {
86  ccGenericMesh* mesh = static_cast<ccGenericMesh*>(obj);
87  // vertices visibility
88  int triNum = static_cast<int>(mesh->size());
89  for (int i = 0; i < triNum; ++i) {
90  const cloudViewer::VerticesIndexes* tsi =
91  mesh->getTriangleVertIndexes(i);
92  if (visFiltering) {
93  // we skip the triangle if at least one vertex is hidden
94  if ((verticesVisibility[tsi->i1] != POINT_VISIBLE) ||
95  (verticesVisibility[tsi->i2] != POINT_VISIBLE) ||
96  (verticesVisibility[tsi->i3] != POINT_VISIBLE)) {
97  continue;
98  }
99  }
100  m_vertices.append(Tuple3ui(tsi->i));
101  }
102  }
103  }
104 
105  m_rows = m_data.size();
106 }
107 
109 
110 void TableModel::random(int min, int max) {
111  m_randomMin = min;
112  m_randomMax = max;
113 
114  for (int r = 0; r < m_rows; ++r) {
115  for (int c = 0; c < m_cols; ++c) {
116  auto vecPtr = m_data[r];
117  vecPtr->replace(c, Utils::random(m_randomMin, m_randomMax));
118  }
119  }
120  emit layoutChanged();
121 }
122 
123 void TableModel::resize(int column, int row) {
124  if (m_cols == column && m_rows == row) {
125  // qDebug() << "TableModel::resize: same cols & rows.";
126  return;
127  }
128 
129  if (m_cols != column) emit columnsChanged(m_cols, column);
130 
131  if (m_rows != row) emit rowsChanged(m_rows, row);
132 
133  qDeleteAll(m_data);
134  m_data.clear();
135 
136  m_cols = column;
137  m_rows = row;
138 
139  // m_data
140  for (int i = 0; i < m_rows; i++) {
141  QVector<qreal>* dataVec = new QVector<qreal>(m_cols);
142  for (int k = 0; k < dataVec->size(); k++) dataVec->replace(k, qreal());
143  m_data.append(dataVec);
144  }
145 }
146 
148  qDeleteAll(m_data);
149  m_data.clear();
150  m_vertices.clear();
151 
152  m_rows = 0;
153  m_cols = 0;
154 
155  emit layoutChanged();
156 }
157 
158 int TableModel::randomMin() { return m_randomMin; }
159 
160 int TableModel::randomMax() { return m_randomMax; }
161 
162 void TableModel::setHorizontalHeaderData(const QVariantList& data) {
163  if (m_horHeaderData != data) {
164  m_horHeaderData = data;
165  emit layoutChanged();
166  }
167 }
168 
169 QVariantList TableModel::horizontalHeaderData() const {
170  return m_horHeaderData;
171 }
172 
173 void TableModel::setVerticalHeaderData(const QVariantList& data) {
174  if (m_verHeaderData != data) {
175  m_verHeaderData = data;
176  emit layoutChanged();
177  }
178 }
179 
180 QVariantList TableModel::verticalHeaderData() const { return m_verHeaderData; }
181 
182 int TableModel::rowCount(const QModelIndex& parent) const {
183  Q_UNUSED(parent)
184  return m_rows;
185 }
186 
187 int TableModel::columnCount(const QModelIndex& parent) const {
188  Q_UNUSED(parent)
189  return m_cols;
190 }
191 
192 QVariant TableModel::headerData(int section,
193  Qt::Orientation orientation,
194  int role) const {
195  if (role != Qt::DisplayRole) return QVariant();
196 
197  if (orientation == Qt::Horizontal) {
198  if (!m_horHeaderData.isEmpty() && m_horHeaderData.size() > section)
199  return m_horHeaderData.at(section);
200  else
201  return QString("%1").arg(section + 1);
202  }
203 
204  if (orientation == Qt::Vertical) {
205  if (!m_verHeaderData.isEmpty() && m_verHeaderData.size() > section)
206  return m_verHeaderData.at(section);
207  else
208  return QString("%1").arg(section + 1);
209  }
210  return QVariant();
211 }
212 
213 QVariant TableModel::data(const QModelIndex& index, int role) const {
214  if (role == Qt::DisplayRole) {
215  return m_data[index.row()]->at(index.column());
216  } else if (role == Qt::EditRole) {
217  return m_data[index.row()]->at(index.column());
218  }
219 
220  return QVariant();
221 }
222 
223 qreal TableModel::data(int row, int col) const { return m_data[row]->at(col); }
224 
225 QVector<Tuple3ui> TableModel::verticesData() const { return m_vertices; }
226 
227 bool TableModel::setData(const QModelIndex& index,
228  const QVariant& value,
229  int role) {
230  if (index.isValid() && role == Qt::EditRole) {
231  m_data[index.row()]->replace(index.column(), value.toDouble());
232  emit dataChanged(index, index);
233  return true;
234  }
235  return false;
236 }
237 
238 bool TableModel::setData(int row, int column, const QVariant& value) {
239  QModelIndex index = this->createIndex(row, column);
240  return setData(index, value);
241 }
242 
243 Qt::ItemFlags TableModel::flags(const QModelIndex& index) const {
244  return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
245 }
246 
247 } // namespace VtkUtils
constexpr unsigned char POINT_VISIBLE
Definition: CVConst.h:92
Tuple3Tpl< unsigned int > Tuple3ui
Tuple of 3 unsigned int values.
Definition: CVGeom.h:219
int count
Type u[3]
Definition: CVGeom.h:139
QVector< Tuple3ui > verticesData() const
Definition: tablemodel.cpp:225
void columnsChanged(int oldCols, int newCols)
QVariantList verticalHeaderData() const
Definition: tablemodel.cpp:180
Qt::ItemFlags flags(const QModelIndex &index) const
Definition: tablemodel.cpp:243
int columnCount(const QModelIndex &parent=QModelIndex()) const
Definition: tablemodel.cpp:187
void random(int min=-5, int max=5)
Definition: tablemodel.cpp:110
void rowsChanged(int oldRows, int newRows)
void updateData(const ccHObject *objContainer)
Definition: tablemodel.cpp:51
void setVerticalHeaderData(const QVariantList &data)
Definition: tablemodel.cpp:173
void resize(int column, int row)
Definition: tablemodel.cpp:123
QVariantList horizontalHeaderData() const
Definition: tablemodel.cpp:169
QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const
Definition: tablemodel.cpp:192
TableModel(int column, int row, QObject *parent=nullptr)
Definition: tablemodel.cpp:28
int rowCount(const QModelIndex &parent=QModelIndex()) const
Definition: tablemodel.cpp:182
bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole)
Definition: tablemodel.cpp:227
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const
Definition: tablemodel.cpp:213
void setHorizontalHeaderData(const QVariantList &data)
Definition: tablemodel.cpp:162
virtual bool colorsShown() const
Returns whether colors are shown or not.
Generic mesh interface.
A 3D cloud interface with associated features (color, normals, octree, etc.)
virtual VisibilityTableType & getTheVisibilityArray()
Returns associated visibility array.
std::vector< unsigned char > VisibilityTableType
Array of "visibility" information for each point.
static ccGenericPointCloud * ToGenericPointCloud(ccHObject *obj, bool *isLockedVertices=nullptr)
Converts current object to 'equivalent' ccGenericPointCloud.
Hierarchical CLOUDVIEWER Object.
Definition: ecvHObject.h:25
unsigned getChildrenNumber() const
Returns the number of children.
Definition: ecvHObject.h:312
ccHObject * getChild(unsigned childPos) const
Returns the ith child.
Definition: ecvHObject.h:325
bool isKindOf(CV_CLASS_ENUM type) const
Definition: ecvObject.h:128
virtual unsigned size() const =0
Returns the number of points.
virtual const CCVector3 * getPoint(unsigned index) const =0
Returns the ith point.
virtual VerticesIndexes * getTriangleVertIndexes(unsigned triangleIndex)=0
Returns the indexes of the vertices of a given triangle.
virtual unsigned size() const =0
Returns the number of triangles.
GraphType data
Definition: graph_cut.cc:138
@ MESH
Definition: CVTypes.h:105
@ POINT_CLOUD
Definition: CVTypes.h:104
double random(int low, int high)
Definition: utils.cpp:55
Triangle described by the indexes of its 3 vertices.