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 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236
|
//##########################################################################
//# #
//# 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) #
//# #
//##########################################################################
#ifndef CC_SECTION_EXTRACTION_TOOL_HEADER
#define CC_SECTION_EXTRACTION_TOOL_HEADER
//Local
#include "ccContourExtractor.h"
#include "ccOverlayDialog.h"
//qCC_db
#include <ccHObject.h>
class ccGenericPointCloud;
class ccPointCloud;
class ccGLWindow;
namespace Ui
{
class SectionExtractionDlg;
}
//! Section extraction tool
class ccSectionExtractionTool : public ccOverlayDialog
{
Q_OBJECT
public:
//! Default constructor
explicit ccSectionExtractionTool(QWidget* parent);
//! Destructor
~ccSectionExtractionTool() override;
//! Adds a cloud to the 'clouds' pool
bool addCloud(ccGenericPointCloud* cloud, bool alreadyInDB = true);
//! Adds a polyline to the 'sections' pool
/** \warning: if this method returns true, the class takes the ownership of the cloud!
**/
bool addPolyline(ccPolyline* poly, bool alreadyInDB = true);
//! Removes all registered entities (clouds & polylines)
void removeAllEntities();
//inherited from ccOverlayDialog
bool linkWith(ccGLWindow* win) override;
bool start() override;
void stop(bool accepted) override;
protected:
void undo();
bool reset(bool askForConfirmation = true);
void apply();
void cancel();
void addPointToPolyline(int x, int y);
void closePolyLine(int x=0, int y=0); //arguments for compatibility with ccGlWindow::rightButtonClicked signal
void updatePolyLine(int x, int y, Qt::MouseButtons buttons);
void enableSectionEditingMode(bool);
void doImportPolylinesFromDB();
void setVertDimension(int);
void entitySelected(ccHObject*);
void generateOrthoSections();
void extractPoints();
void unfoldPoints();
void exportSections();
//! To capture overridden shortcuts (pause button, etc.)
void onShortcutTriggered(int);
protected:
//! Projects a 2D (screen) point to 3D
//CCVector3 project2Dto3D(int x, int y) const;
//! Cancels currently edited polyline
void cancelCurrentPolyline();
//! Deletes currently selected polyline
void deleteSelectedPolyline();
//! Adds a 'step' on the undo stack
void addUndoStep();
//! Convert one or several ReferenceCloud instances to a single cloud and add it to the main DB
bool extractSectionCloud( const std::vector<CCLib::ReferenceCloud*>& refClouds,
unsigned sectionIndex,
bool& cloudGenerated);
//! Extract the contour from a set of 2D points and add it to the main DB
bool extractSectionContour( const ccPolyline* originalSection,
const ccPointCloud* originalSectionCloud,
ccPointCloud* unrolledSectionCloud, //'2D' cloud with Z = 0
unsigned sectionIndex,
ccContourExtractor::ContourType type,
PointCoordinateType maxEdgeLength,
bool multiPass,
bool splitContour,
bool& contourGenerated,
bool visualDebugMode = false);
//! Creates (if necessary) and returns a group to store entities in the main DB
ccHObject* getExportGroup(unsigned& defaultGroupID, const QString& defaultName);
//! Imported entity
template<class EntityType> struct ImportedEntity
{
//! Default constructor
ImportedEntity()
: entity(0)
, originalDisplay(nullptr)
, isInDB(false)
, backupColorShown(false)
, backupWidth(1)
{}
//! Copy constructor
ImportedEntity(const ImportedEntity& section)
: entity(section.entity)
, originalDisplay(section.originalDisplay)
, isInDB(section.isInDB)
, backupColorShown(section.backupColorShown)
, backupWidth(section.backupWidth)
{
backupColor = section.backupColor;
}
//! Constructor from an entity
ImportedEntity(EntityType* e, bool alreadyInDB)
: entity(e)
, originalDisplay(e->getDisplay())
, isInDB(alreadyInDB)
{
//specific case: polylines
if (e->isA(CC_TYPES::POLY_LINE))
{
ccPolyline* poly = reinterpret_cast<ccPolyline*>(e);
//backup color
backupColor = poly->getColor();
backupColorShown = poly->colorsShown();
//backup thickness
backupWidth = poly->getWidth();
}
}
bool operator ==(const ImportedEntity& ie) { return entity == ie.entity; }
EntityType* entity;
ccGenericGLDisplay* originalDisplay;
bool isInDB;
//backup info (for polylines only)
ccColor::Rgb backupColor;
bool backupColorShown;
PointCoordinateType backupWidth;
};
//! Section
using Section = ImportedEntity<ccPolyline>;
//! Releases a polyline
/** The polyline is removed from display. Then it is
deleted if the polyline is not already in DB.
**/
void releasePolyline(Section* section);
//! Cloud
using Cloud = ImportedEntity<ccGenericPointCloud>;
//! Type of the pool of active sections
using SectionPool = QList<Section>;
//! Type of the pool of clouds
using CloudPool = QList<Cloud>;
//! Process states
enum ProcessStates
{
//... = 1,
//... = 2,
//... = 4,
//... = 8,
//... = 16,
PAUSED = 32,
STARTED = 64,
RUNNING = 128,
};
//! Deselects the currently selected polyline
void selectPolyline(Section* poly, bool autoRefreshDisplay = true);
//! Updates the global clouds bounding-box
void updateCloudsBox();
private: //members
Ui::SectionExtractionDlg *m_UI;
//! Pool of active sections
SectionPool m_sections;
//! Selected polyline (if any)
Section* m_selectedPoly;
//! Pool of clouds
CloudPool m_clouds;
//! Current process state
unsigned m_state;
//! Last 'undo' count
std::vector<size_t> m_undoCount;
//! Currently edited polyline
ccPolyline* m_editedPoly;
//! Segmentation polyline vertices
ccPointCloud* m_editedPolyVertices;
//! Global clouds bounding-box
ccBBox m_cloudsBox;
};
#endif //CC_SECTION_EXTRACTION_TOOL_HEADER
|