ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
ccMeasurementRecorder.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 
9 
10 #include "ccItemTree.h"
11 
12 // CV_DB_LIB
13 #include "ecvScalarField.h"
14 
15 constexpr char const* ROOT_FOLDER_NAME = "MPlane";
16 constexpr char const* FITTING_POINT_FOLDER_NAME = "Fitting-points";
17 constexpr char const* MEASUREMENT_FOLDER_NAME = "Measurements";
18 constexpr char const* MPLANE_PLANE_NAME = "Fitting-plane";
19 constexpr char const* MPLANE_SCALARFIELD_NAME = "MPlane Distance";
20 
21 const std::vector<ccMPlanePoint>& ccMeasurementRecorder::getFittingPoints()
22  const {
23  return m_fittingPoints;
24 }
25 
26 const std::vector<ccMPlanePoint>& ccMeasurementRecorder::getMeasurementPoints()
27  const {
28  return m_measurementPoints;
29 }
30 
32  return static_cast<unsigned int>(m_fittingPoints.size());
33 }
34 
36  return static_cast<unsigned int>(m_fittingPoints.size());
37 }
38 
40  loadFolders();
41  loadFittingPoints();
42  loadMeasurementPoints();
43  loadAndDeleteFittingPlane();
44 }
45 
47  const ccPickingListener::PickedItem& item) {
49  QString("Point %1").arg(getActualFittingPointIndex()), m_rootCloud,
50  item.clickPoint, item.itemIndex);
51  m_fittingPointFolder->addChild(newLabel);
52  m_app->addToDB(newLabel, false, true, false, false);
53  m_fittingPoints.push_back(ccMPlanePoint(newLabel));
54 }
55 
57  const ccPickingListener::PickedItem& item, float distance) {
58  QString measurementName = QString("#%1").arg(m_measurementPoints.size());
60  measurementName, m_rootCloud, item.clickPoint, item.itemIndex);
61  m_measurementFolder->addChild(measureLabel);
62  m_app->addToDB(measureLabel, false, true, false, false);
63 
64  m_measurementPoints.push_back(ccMPlanePoint(measureLabel));
65  m_measurementPoints.back().setDistance(distance);
66 }
67 
68 void ccMeasurementRecorder::loadFolders() {
69  m_rootFolder = CC_ITEM_TREE::findOrCreateContainer(m_rootCloud,
70  ROOT_FOLDER_NAME, m_app);
71  m_fittingPointFolder = CC_ITEM_TREE::findOrCreateContainer(
72  m_rootFolder, FITTING_POINT_FOLDER_NAME, m_app);
73  m_measurementFolder = CC_ITEM_TREE::findOrCreateContainer(
74  m_rootFolder, MEASUREMENT_FOLDER_NAME, m_app);
75 }
76 
77 void ccMeasurementRecorder::loadFittingPoints() {
78  std::vector<ccHObject*> fittingPointLabels;
79  m_fittingPointFolder->filterChildren(fittingPointLabels, false,
81  std::transform(std::begin(fittingPointLabels), std::end(fittingPointLabels),
82  std::back_inserter(m_fittingPoints), [](ccHObject* item) {
83  return ccMPlanePoint(static_cast<cc2DLabel*>(item));
84  });
85 }
86 
87 void ccMeasurementRecorder::loadMeasurementPoints() {
88  std::vector<ccHObject*> measurementLabels;
89  m_measurementFolder->filterChildren(measurementLabels, false,
91  std::transform(std::begin(measurementLabels), std::end(measurementLabels),
92  std::back_inserter(m_measurementPoints),
93  [](ccHObject* item) {
94  return ccMPlanePoint(static_cast<cc2DLabel*>(item));
95  });
96 }
97 
98 void ccMeasurementRecorder::loadAndDeleteFittingPlane() {
99  m_plane = static_cast<ccPlane*>(CC_ITEM_TREE::findItemInHierarchy(
100  m_rootFolder, CC_ITEM_TREE::CC_TYPES_MAP::PLANE,
102  deletePlane();
103 }
104 
105 bool ccMeasurementRecorder::renameMeasurement(const QString& newName,
106  unsigned int measurementIndex) {
107  auto element = std::find_if(std::begin(m_measurementPoints),
108  std::end(m_measurementPoints),
109  [&newName](const ccMPlanePoint& point) {
110  return point.getName() == newName;
111  });
112 
113  if (element != std::end(m_measurementPoints)) {
114  return false;
115  }
116 
117  m_measurementPoints[measurementIndex].setName(newName);
118  m_measurementPoints[measurementIndex].getLabel()->redrawDisplay();
119  return true;
120 }
121 
123  unsigned int measurementIndex) {
124  m_measurementPoints[measurementIndex].setDistance(distance);
125 }
126 
127 ccPlane* ccMeasurementRecorder::getPlane() const { return m_plane; }
128 
130  deletePlane();
131  m_plane = const_cast<ccPlane*>(plane);
132 
133  CCVector3 bbMin, bbMax;
134  m_rootCloud->getBoundingBox(bbMin, bbMax);
135  float length =
136  std::max(abs(bbMax.x - bbMin.x),
137  std::max(abs(bbMax.y - bbMin.y), abs(bbMax.z - bbMin.z)));
140 
141  m_measurementFolder->addChild(m_plane);
142  // m_plane->setDisplay(m_rootCloud->getDisplay());
143  // m_plane->prepareDisplayForRefresh_recursive();
144  m_app->addToDB(m_plane);
145 }
146 
148  if (m_plane) {
149  m_app->removeFromDB(m_plane);
150  m_plane = nullptr;
151  }
152 }
153 
155  m_app->removeFromDB(m_fittingPoints[index].getLabel());
156  m_fittingPoints.erase(m_fittingPoints.begin() + index);
157 }
158 
159 void ccMeasurementRecorder::renameFittingPoint(const QString& newName,
160  unsigned int fittingPointIndex) {
161  m_fittingPoints[fittingPointIndex].getLabel()->setName(
162  QString("Point %1").arg(fittingPointIndex));
163 }
float PointCoordinateType
Type of the coordinates of a (N-D) point.
Definition: CVTypes.h:16
constexpr char const * MPLANE_PLANE_NAME
constexpr char const * MPLANE_SCALARFIELD_NAME
constexpr char const * MEASUREMENT_FOLDER_NAME
constexpr char const * ROOT_FOLDER_NAME
constexpr char const * FITTING_POINT_FOLDER_NAME
Type y
Definition: CVGeom.h:137
Type x
Definition: CVGeom.h:137
Type z
Definition: CVGeom.h:137
2D label (typically attached to points)
Definition: ecv2DLabel.h:22
Hierarchical CLOUDVIEWER Object.
Definition: ecvHObject.h:25
virtual bool addChild(ccHObject *child, int dependencyFlags=DP_PARENT_OF_OTHER, int insertIndex=-1)
Adds a child.
unsigned filterChildren(Container &filteredChildren, bool recursive=false, CV_CLASS_ENUM filter=CV_TYPES::OBJECT, bool strict=false) const
Collects the children corresponding to a certain pattern.
unsigned int getActualFittingPointIndex() const
const std::vector< ccMPlanePoint > & getFittingPoints() const
bool renameMeasurement(const QString &newName, unsigned int measurementIndex)
unsigned int getFittingPointAmount() const
void setPlane(const ccPlane *plane)
void deleteFittingPoint(unsigned int index)
void addFittingPoint(const ccPickingListener::PickedItem &item)
const std::vector< ccMPlanePoint > & getMeasurementPoints() const
void updateMeasurement(float distance, unsigned int measurementIndex)
void renameFittingPoint(const QString &newName, unsigned int fittingPointIndex)
void addMeasurementPoint(const ccPickingListener::PickedItem &item, float distance)
Plane (primitive)
Definition: ecvPlane.h:18
void setXWidth(PointCoordinateType w, bool autoUpdate=true)
Sets 'X' width.
Definition: ecvPlane.h:61
void setYWidth(PointCoordinateType h, bool autoUpdate=true)
Sets 'Y' width.
Definition: ecvPlane.h:67
void getBoundingBox(CCVector3 &bbMin, CCVector3 &bbMax) override
Definition: PointCloudTpl.h:57
virtual void addToDB(ccHObject *obj, bool updateZoom=false, bool autoExpandDBTree=true, bool checkDimensions=false, bool autoRedraw=true)=0
virtual void removeFromDB(ccHObject *obj, bool autoDelete=true)=0
Removes an entity from main db tree.
__host__ __device__ float length(float2 v)
Definition: cutil_math.h:1162
__host__ __device__ int2 abs(int2 v)
Definition: cutil_math.h:1267
int max(int a, int b)
Definition: cutil_math.h:48
ccHObject * findItemInHierarchy(ccHObject *root, CC_TYPES_MAP itemType, QString itemName=nullptr)
Definition: ccItemTree.cpp:28
ccHObject * findOrCreateContainer(ccHObject *parent, const QString &containerName, ecvMainAppInterface *app)
Definition: ccItemTree.cpp:51
cc2DLabel * createPointLabel2D(QString labelText, ccPointCloud *parentCloud, QPoint clickPoint, unsigned int pointIdx)
Definition: ccItemTree.cpp:76
@ LABEL_2D
Definition: CVTypes.h:140
@ PLANE
Definition: CVTypes.h:120
Definition: lsd.c:149