16 #include "qfiledialog.h"
21 : QObject(), m_app(app) {
22 m_device = std::make_unique<ccMeasurementDevice>(m_app);
44 m_selectedCloud = selectedCloud;
48 loadDataFromSelectedCloud();
68 m_mode = tabIndex == 0 ? CC_Mode::CC_POINT_SELECTION
69 : CC_Mode::CC_MEASUREMENT;
73 if (!m_data->renameMeasurement(item->text(), item->row())) {
75 QString(
"[MPlane] Measurement point %1 already exists!")
79 m_data->getMeasurementPoints()[item->row()].getName(),
91 m_data->deleteFittingPoint(index);
93 updateFittingPoints();
94 updatAllMeasurementEntities();
103 m_showNormal = checked;
104 m_data->getPlane()->showNormalVector(checked);
106 m_data->getPlane()->setRedrawFlagRecursive(
true);
107 m_data->getPlane()->redrawDisplay();
114 QString fileName = QFileDialog::getSaveFileName(
115 m_dialog, tr(
"Save Measurements"),
"",
116 tr(
"Comma-separated values (*.csv);;All Files (*)"));
117 QFile file(fileName);
118 if (file.open(QIODevice::ReadWrite | QIODevice::Truncate)) {
119 QTextStream stream(&file);
120 stream <<
"measurement,x-coord,y-coord,z-coord,distance"
123 stream <<
point.getName() <<
"," <<
point.getCoordinates().
x <<
","
124 <<
point.getCoordinates().
y <<
","
125 <<
point.getCoordinates().z <<
"," <<
point.getDistance()
138 "[MPlane] Can only pick points from selected cloud.",
141 if (m_mode == CC_Mode::CC_POINT_SELECTION) {
142 pickFittingPoint(item);
143 updatAllMeasurementEntities();
145 m_data->getActualFittingPointIndex());
147 pickMeasurementPoint(item);
153 void ccMPlaneDlgController::loadDataFromSelectedCloud() {
154 m_data = std::make_unique<ccMeasurementRecorder>(m_selectedCloud, m_app);
155 m_data->loadDataFromSelectedCloud();
157 updateFittingPoints();
158 updatAllMeasurementEntities();
163 void ccMPlaneDlgController::registerDialog() {
170 void ccMPlaneDlgController::startPicking() {
173 "[MPlane] Could not retrieve valid picking hub. Measurement "
180 "[MPlane] Another tool is already using the picking mechanism. "
188 void ccMPlaneDlgController::stopPicking() {
193 void ccMPlaneDlgController::pickFittingPoint(
195 m_data->addFittingPoint(item);
206 void ccMPlaneDlgController::pickMeasurementPoint(
208 float distance = m_device->measurePointToPlaneDistance(
209 m_data->getPlane(), item.
P3D, m_signedMeasurement);
210 m_data->addMeasurementPoint(item, distance);
211 const auto &
point = m_data->getMeasurementPoints().back();
220 void ccMPlaneDlgController::updatePlane() {
221 ccPlane *plane = m_device->fitPlaneToPoints(m_data->getFittingPoints(),
224 m_data->setPlane(plane);
227 void ccMPlaneDlgController::updateScalarfield() {
228 m_device->createScalarFieldForCloud(m_data->getPlane(), m_selectedCloud,
229 m_signedMeasurement);
232 void ccMPlaneDlgController::updateMeasurements() {
234 const std::vector<ccMPlanePoint> &
points = m_data->getMeasurementPoints();
235 for (
auto i = 0; i <
points.size(); ++i) {
236 float distance = m_device->measurePointToPlaneDistance(
237 m_data->getPlane(),
points[i].getCoordinates(),
238 m_signedMeasurement);
239 m_data->updateMeasurement(distance, i);
244 void ccMPlaneDlgController::updateFittingPoints() {
246 const std::vector<ccMPlanePoint> &
points = m_data->getFittingPoints();
247 for (
auto i = 0; i <
points.size(); ++i) {
248 m_data->renameFittingPoint(QString(
"Point %1").arg(i), i);
256 void ccMPlaneDlgController::updatAllMeasurementEntities() {
257 if (m_data->getFittingPointAmount() >= 3) {
261 updateMeasurements();
264 m_data->deletePlane();
265 m_device->deleteScalarFieldFromCloud(m_selectedCloud);
constexpr char const * MPLANE_PLANE_NAME
Hierarchical CLOUDVIEWER Object.
void onMeasureNameChanged(QTableWidgetItem *)
void onSaveButtonClicked()
virtual void onItemPicked(const ccPickingListener::PickedItem &pi) override
ccMPlaneDlgController(ecvMainAppInterface *app)
void onCloseButtonPressed()
void onFittingPointDelete(int index)
void onNormalCheckBoxClicked(bool checked)
void onMeasurementModeChanged()
void onNewTab(int tabIndex)
void openDialog(ccPointCloud *selectedCloud)
void signalShowNormalCheckBoxClicked(bool checked)
void enableMeasurementTab(bool enable)
void signalMeasureNameChanged(QTableWidgetItem *item)
void selectFittingPoint(unsigned int rowIndex)
void addFittingPoint(int rowIndex, const CCVector3 &point)
void renameMeasurement(const QString &name, unsigned int rowIndex)
void signalFittingPointDelete(int index)
void clearFittingPoints()
bool isSignedMeasurement() const
void signalTabChanged(int tab)
void addMeasurementPoint(const QString &name, float distance)
void signalSaveButtonClicked()
void clearMeasurementPoints()
void signalCloseButtonPressed()
void signalMeasurementModeChanged()
bool isKindOf(CV_CLASS_ENUM type) const
virtual void stop(bool accepted)
Stops process/dialog.
virtual bool start()
Starts process.
virtual bool linkWith(QWidget *win)
Links the overlay dialog with a MDI window.
void removeListener(ccPickingListener *listener, bool autoStopPickingIfLast=true)
Removes a listener.
bool addListener(ccPickingListener *listener, bool exclusive=false, bool autoStartPicking=true, ecvDisplayTools::PICKING_MODE mode=ecvDisplayTools::POINT_OR_TRIANGLE_PICKING)
Adds a listener.
void showNormalVector(bool state)
Show normal vector.
A 3D cloud and its associated features (color, normals, scalar fields, etc.)
Main application interface (for plugins)
virtual void updateUI()=0
virtual QMainWindow * getMainWindow()=0
Returns main window.
virtual QWidget * getActiveWindow()=0
virtual void freezeUI(bool state)=0
Freezes/unfreezes UI.
virtual void refreshSelected(bool only2D=false, bool forceRedraw=true)=0
virtual void updateOverlayDialogsPlacement()=0
Forces the update of all registered MDI 'overlay' dialogs.
virtual void refreshAll(bool only2D=false, bool forceRedraw=true)=0
Redraws all GL windows that have the 'refresh' flag on.
virtual void dispToConsole(QString message, ConsoleMessageLevel level=STD_CONSOLE_MESSAGE)=0
virtual ccPickingHub * pickingHub()
virtual void registerOverlayDialog(ccOverlayDialog *dlg, Qt::Corner pos)=0
Registers a MDI area 'overlay' dialog.
virtual void unregisterOverlayDialog(ccOverlayDialog *dlg)=0
Unregisters a MDI area 'overlay' dialog.
QTextStream & endl(QTextStream &stream)