| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- //##########################################################################
- //# #
- //# CLOUDCOMPARE #
- //# #
- //# This program is free software; you can redistribute it and/or modify #
- //# it under the terms of the GNU General Public License as published by #
- //# the Free Software Foundation; version 2 or later of the License. #
- //# #
- //# This program is distributed in the hope that it will be useful, #
- //# but WITHOUT ANY WARRANTY; without even the implied warranty of #
- //# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
- //# GNU General Public License for more details. #
- //# #
- //# COPYRIGHT: EDF R&D / TELECOM ParisTech (ENST-TSI) #
- //# #
- //##########################################################################
- #include "ccPointPickingGenericInterface.h"
- //Local
- #include "mainwindow.h"
- #include "db_tree/ccDBRoot.h"
- //common
- #include <ccPickingHub.h>
- //qCC_db
- #include <ccLog.h>
- #include <ccPointCloud.h>
- //qCCC_gl
- #include <ccGLWindowInterface.h>
- ccPointPickingGenericInterface::ccPointPickingGenericInterface(ccPickingHub* pickingHub, QWidget* parent/*=nullptr*/)
- : ccOverlayDialog(parent)
- , m_pickingHub(pickingHub)
- {
- assert(m_pickingHub);
- }
- bool ccPointPickingGenericInterface::linkWith(ccGLWindowInterface* win)
- {
- if (win == m_associatedWin)
- {
- //nothing to do
- return false;
- }
- ccGLWindowInterface* oldWin = m_associatedWin;
- //just in case
- if (m_pickingHub)
- {
- m_pickingHub->removeListener(this);
- }
- if (!ccOverlayDialog::linkWith(win))
- {
- return false;
- }
- //if the dialog is already linked to a window, we must disconnect the 'point picked' signal
- if (oldWin)
- {
- oldWin->signalEmitter()->disconnect(this);
- }
- return true;
- }
- bool ccPointPickingGenericInterface::start()
- {
- if (!m_pickingHub)
- {
- ccLog::Error("[Point picking] No associated display!");
- return false;
- }
- //activate "point picking mode" in associated GL window
- if (!m_pickingHub->addListener(this, true, true, ccGLWindowInterface::POINT_PICKING))
- {
- ccLog::Error("Picking mechanism already in use. Close the tool using it first.");
- return false;
- }
- //the user must not close this window!
- m_associatedWin->setUnclosable(true);
- m_associatedWin->redraw(true, false);
- ccOverlayDialog::start();
- return true;
- }
- void ccPointPickingGenericInterface::stop(bool state)
- {
- if (m_pickingHub)
- {
- //deactivate "point picking mode" in all GL windows
- m_pickingHub->removeListener(this);
- if ( m_associatedWin != nullptr )
- {
- m_associatedWin->setUnclosable(false);
- m_associatedWin->redraw(true, false);
- }
- }
- ccOverlayDialog::stop(state);
- }
- void ccPointPickingGenericInterface::onItemPicked(const PickedItem& pi)
- {
- if (m_processing && pi.entity)
- {
- processPickedPoint(pi);
- }
- }
|