ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
ccCompass.h
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 #pragma once
9 
10 #include <QObject>
11 #include <QXmlStreamWriter>
12 #include <cmath>
13 #include <random>
14 
15 // qCC
16 #include <ecvPickingListener.h>
17 #include <qbuffer.h>
18 
19 #include "ecvStdPluginInterface.h"
20 
21 class ccCompassDlg;
22 class ccFitPlaneTool;
23 class ccGeoObject;
24 class ccLineationTool;
25 class ccMapDlg;
26 class ccNoteTool;
27 class ccPinchNodeTool;
28 class ccThicknessTool;
29 class ccTool;
30 class ccTopologyTool;
31 class ccTraceTool;
32 class ccSNECloud;
33 
34 class ccCompass : public QObject,
35  public ccStdPluginInterface,
36  public ccPickingListener {
37  Q_OBJECT
39  Q_PLUGIN_METADATA(IID "ecvcorp.cloudviewer.plugin.ccCompass" FILE
40  "../info.json")
41 
42 public:
44  explicit ccCompass(QObject* parent = nullptr);
45 
46  // deconstructor
47  virtual ~ccCompass();
48 
49  // inherited from ccPluginInterface
50  virtual void stop() override {
51  stopMeasuring(true);
52  m_dlg = nullptr;
54  } // called when the plugin is being stopped
55 
56  // inherited from ccStdPluginInterface
57  void onNewSelection(const ccHObject::Container& selectedEntities) override;
58  virtual QList<QAction*> getActions() override;
59 
60 protected slots:
61 
62  // initialise the plugin
63  void doAction();
64 
65  // start picking mode
66  bool startMeasuring();
67 
68  // stop picking mode
69  bool stopMeasuring(bool finalStop = false);
70 
71  // inherited from ccPickingListener
72  virtual void onItemPicked(const ccPickingListener::PickedItem& pi) override;
73 
74  // picked point callback (called by the above function)
75  void pointPicked(ccHObject* entity,
76  unsigned itemIdx,
77  int x,
78  int y,
79  const CCVector3& P);
80 
81  //**************
82  // GUI actions:
83  //**************
84  // general
85  void onClose();
86  void onAccept();
87  void onSave();
88  void onUndo();
89 
90  // modes
91  void enableMapMode(); // turns on/off map mode
92  void enableMeasureMode(); // turns on/off map mode
93 
94  // tools
95  void setPick(); // activates the picking tool
96  void setLineation(); // activates the lineation tool
97  void setPlane(); // activates the plane tool
98  void setTrace(); // activates the trace tool
99 
100  // extra tools
101  void addPinchNode(); // activates the pinch node tool
102  void setThickness(); // activates the thickness tool
103  void setThickness2(); // activates the thickness tool in two-point mode
104  void setYoungerThan(); // activates topology tool in "younger-than" mode
105  void setFollows(); // activates topology tool in "follows" mode
106  void setEquivalent(); // activates topology mode in "equivalent" mode
107  void setNote(); // activates the note tool
108  void
109  recalculateSelectedTraces(); // recalculate any selected traces (for
110  // updating with a different cost function)
111  void mergeGeoObjects(); // merges the selected GeoObjects
112  void fitPlaneToGeoObject(); // calculates best-fit plane for the upper and
113  // lower surfaces of the selected GeoObject
114  void recalculateFitPlanes(); // recalcs fit planes for traces and
115  // GeoObjects
116  void estimateStructureNormals(); // Estimate the normal vector to the
117  // structure this trace represents at each
118  // point in this trace.
119  void estimateP21(); // Calculate the intensity of selected structures
120  void estimateStrain(); // Estimate strain from Mode-I dykes and veins
121  void convertToPointCloud(); // converts selected traces or geoObjects to
122  // point clouds
123  void distributeSelection(); // distributes selected objects into GeoObjects
124  // with the same name
125  void importFoliations(); // import foliation data
126  void importLineations(); // import lineation data
127  void exportToSVG(); // exports current view to SVG
128 
129  // map mode dialog
130  void writeToInterior(); // new digitization will be added to the GeoObjects
131  // interior
132  void writeToUpper(); // new digitization will be added to the GeoObjects
133  // upper boundary
134  void writeToLower(); // new digitiziation will be added to the GeoObjects
135  // lower boundary
136  void addGeoObject(bool singleSurface = false); // creates a new GeoObject
137  void addGeoObjectSS(); // creates a new single surface GeoObject
138 
139  // drawing options
140  void hideAllPointClouds(ccHObject* o); // hides all point clouds and adds
141  // them to the m_hiddenObjects list
142  void toggleStipple(bool checked);
143  void recurseStipple(ccHObject* object, bool checked);
144  void toggleLabels(bool checked);
145  void recurseLabels(ccHObject* object, bool checked);
146  void toggleNormals(bool checked);
147  void recurseNormals(ccHObject* object, bool checked);
148 
149  // display the help dialog
150  void showHelp();
151 
152 protected:
153  // event to get mouse-move updates & trigger repaint of overlay circle
154  virtual bool eventFilter(QObject* obj, QEvent* event) override;
155 
156  // used to get the place/object that new measurements or interpretation
157  // should be stored
159 
160  // cleans up pointers etc before changing tools
161  void cleanupBeforeToolChange(bool autoRestartPicking = true);
162 
163  // registers this plugin with the picking hub
164  bool startPicking();
165 
166  // removes this plugin from the picking hub
167  void stopPicking();
168 
169  // checks if the passed object, or any of it's children, represent unloaded
170  // ccCompass objects (e.g. traces, fitplanes etc).
171  void tryLoading();
172  void tryLoading(ccHObject* obj,
173  std::vector<int>* originals,
174  std::vector<ccHObject*>* replacements);
175 
176  // Action to start ccCompass
177  QAction* m_action = nullptr;
178 
179  // link to application windows
180  QMainWindow* m_main_window = nullptr;
181 
182  // picking or not?
183  bool m_picking = false;
184  bool m_active = false;
185 
186  // ccCompass toolbar gui
187  ccCompassDlg* m_dlg = nullptr;
188  ccMapDlg* m_mapDlg = nullptr;
189 
190  // tools
191  ccTool* m_activeTool = nullptr;
199 
200  // currently selected/active geoObject
202  nullptr; // the GeoObject currently being written to
203  int m_geoObject_id = -1; // used to check if m_geoObject has been deleted
204  std::vector<int> m_hiddenObjects; // used to hide objects (for picking)
205 
206  // used to 'guess' the name of new GeoObjects
207  QString m_lastGeoObjectName = "GeoObject";
208 
209  // used while exporting data
210  int writePlanes(ccHObject* object,
211  QTextStream* out,
212  const QString& parentName = QString());
213  int writeTraces(ccHObject* object,
214  QTextStream* out,
215  const QString& parentName = QString());
216  int writeLineations(
217  ccHObject* object,
218  QTextStream* out,
219  const QString& parentName = QString(),
220  bool thickness =
221  false); // if thickness is true this will write "thickness
222  // lineations" rather than orientation lineations
223 
224  int writeTracesSVG(ccHObject* object,
225  QTextStream* out,
226  int height,
227  float zoom);
228 
229  int writeToXML(const QString& filename); // exports Compass interpretation
230  // tree to xml
231  int writeObjectXML(
232  ccHObject* object,
233  QXmlStreamWriter* out); // writes the provided object (recursive)
234 
235  // checks if an object was made by this app (i.e. returns true if we are
236  // responsible for a given layer)
237  bool madeByMe(ccHObject* object);
238 
239  // used by the SNE algorithms
240  // static double prior(double phi, double theta, double nx, double ny,
241  // double nz); //prior distribution for orientations (depends on outcrop
242  // orientation) static double logWishSF(double X[3][3], int nobserved);
243  // //calculate log scale-factor for wishart dist. This only needs to be done
244  // once per X, so is pulled out of the wish function for performance static
245  // double logWishart(double X[3][3], int nobserved, double phi, double
246  // theta, double alpha, double e1, double e2, double e3, double lsf);
247  // //calculate log wishart probability density for an observed covariance
248  // and proposed eigen system static double wishartExp1D(double X[3][3], int
249  // nobserved, double phi, double theta, double e1, double e2, double e3,
250  // double lsf, unsigned steps=500); //integrate over alpha static double**
251  // sampleMCMC(double icov[3][3], int nobserved, CCVector3* normal, int
252  // nsamples = 1000, double proposalWidth = 0.075); //sample posterior with
253  // MCMC
254 
255  // static flags used to define simple behaviours
256 public:
257  // drawing properties
258  static bool drawName;
259  static bool drawStippled;
260  static bool drawNormals;
261 
262  // calculation properties
263  static bool fitPlanes;
264  static int costMode;
265 
266  // digitization mode
267  static bool mapMode; // true if map mode, false if measure mode
268  static int mapTo; // see flags in ccGeoObject.h for definition of different
269  // mapping locations
270 };
MouseEvent event
std::string filename
int height
#define slots
void addPinchNode()
Definition: ccCompass.cpp:880
void toggleStipple(bool checked)
Definition: ccCompass.cpp:3501
void cleanupBeforeToolChange(bool autoRestartPicking=true)
Definition: ccCompass.cpp:772
bool m_picking
Definition: ccCompass.h:183
void showHelp()
Definition: ccCompass.cpp:3567
void addGeoObject(bool singleSurface=false)
Definition: ccCompass.cpp:3608
ccTool * m_activeTool
Definition: ccCompass.h:191
virtual bool eventFilter(QObject *obj, QEvent *event) override
Definition: ccCompass.cpp:725
static int costMode
Definition: ccCompass.h:264
void exportToSVG()
Definition: ccCompass.cpp:3962
bool m_active
Definition: ccCompass.h:184
void estimateStructureNormals()
Definition: ccCompass.cpp:1312
bool startMeasuring()
Definition: ccCompass.cpp:481
ccFitPlaneTool * m_fitPlaneTool
Definition: ccCompass.h:192
void setLineation()
Definition: ccCompass.cpp:809
void recurseStipple(ccHObject *object, bool checked)
Definition: ccCompass.cpp:3509
void onUndo()
Definition: ccCompass.cpp:765
ccCompassDlg * m_dlg
Definition: ccCompass.h:187
bool madeByMe(ccHObject *object)
Definition: ccCompass.cpp:759
void writeToInterior()
Definition: ccCompass.cpp:3677
static bool drawNormals
Definition: ccCompass.h:260
void pointPicked(ccHObject *entity, unsigned itemIdx, int x, int y, const CCVector3 &P)
Definition: ccCompass.cpp:675
void toggleLabels(bool checked)
Definition: ccCompass.cpp:3524
bool stopMeasuring(bool finalStop=false)
Definition: ccCompass.cpp:511
void setPlane()
Definition: ccCompass.cpp:827
void mergeGeoObjects()
Definition: ccCompass.cpp:971
void doAction()
Definition: ccCompass.cpp:176
void setThickness()
Definition: ccCompass.cpp:894
int writeToXML(const QString &filename)
Definition: ccCompass.cpp:4475
static int mapTo
Definition: ccCompass.h:268
static bool fitPlanes
Definition: ccCompass.h:263
void tryLoading()
Definition: ccCompass.cpp:315
ccHObject * getInsertPoint()
Definition: ccCompass.cpp:590
void addGeoObjectSS()
Definition: ccCompass.cpp:3675
void distributeSelection()
Definition: ccCompass.cpp:3399
void importLineations()
Definition: ccCompass.cpp:3851
ccLineationTool * m_lineationTool
Definition: ccCompass.h:194
void recalculateFitPlanes()
Definition: ccCompass.cpp:1127
int m_geoObject_id
Definition: ccCompass.h:203
ccTopologyTool * m_topologyTool
Definition: ccCompass.h:196
void setTrace()
Definition: ccCompass.cpp:845
void recurseLabels(ccHObject *object, bool checked)
Definition: ccCompass.cpp:3531
void hideAllPointClouds(ccHObject *o)
Definition: ccCompass.cpp:3488
void setFollows()
Definition: ccCompass.cpp:941
void setNote()
Definition: ccCompass.cpp:956
void writeToUpper()
Definition: ccCompass.cpp:3686
void enableMapMode()
Definition: ccCompass.cpp:3574
void stopPicking()
Definition: ccCompass.cpp:580
QAction * m_action
Definition: ccCompass.h:177
void onSave()
Definition: ccCompass.cpp:4118
int writeObjectXML(ccHObject *object, QXmlStreamWriter *out)
Definition: ccCompass.cpp:4523
void writeToLower()
Definition: ccCompass.cpp:3695
std::vector< int > m_hiddenObjects
Definition: ccCompass.h:204
void estimateP21()
Definition: ccCompass.cpp:3027
void estimateStrain()
Definition: ccCompass.cpp:2449
void recurseNormals(ccHObject *object, bool checked)
Definition: ccCompass.cpp:3552
void importFoliations()
Definition: ccCompass.cpp:3706
int writeTracesSVG(ccHObject *object, QTextStream *out, int height, float zoom)
Definition: ccCompass.cpp:4058
void toggleNormals(bool checked)
Definition: ccCompass.cpp:3545
ccGeoObject * m_geoObject
Definition: ccCompass.h:201
int writeLineations(ccHObject *object, QTextStream *out, const QString &parentName=QString(), bool thickness=false)
Definition: ccCompass.cpp:4434
void setEquivalent()
Definition: ccCompass.cpp:948
void setThickness2()
Definition: ccCompass.cpp:914
void convertToPointCloud()
Definition: ccCompass.cpp:3274
void enableMeasureMode()
Definition: ccCompass.cpp:3592
ccThicknessTool * m_thicknessTool
Definition: ccCompass.h:195
int writeTraces(ccHObject *object, QTextStream *out, const QString &parentName=QString())
Definition: ccCompass.cpp:4370
ccPinchNodeTool * m_pinchNodeTool
Definition: ccCompass.h:198
QString m_lastGeoObjectName
Definition: ccCompass.h:207
static bool drawName
Definition: ccCompass.h:258
virtual void onItemPicked(const ccPickingListener::PickedItem &pi) override
Definition: ccCompass.cpp:669
bool startPicking()
Definition: ccCompass.cpp:555
ccTraceTool * m_traceTool
Definition: ccCompass.h:193
static bool mapMode
Definition: ccCompass.h:267
ccNoteTool * m_noteTool
Definition: ccCompass.h:197
void setPick()
Definition: ccCompass.cpp:864
void fitPlaneToGeoObject()
Definition: ccCompass.cpp:1031
void onAccept()
Definition: ccCompass.cpp:752
QMainWindow * m_main_window
Definition: ccCompass.h:180
ccMapDlg * m_mapDlg
Definition: ccCompass.h:188
static bool drawStippled
Definition: ccCompass.h:259
void setYoungerThan()
Definition: ccCompass.cpp:920
void onClose()
Definition: ccCompass.cpp:742
void recalculateSelectedTraces()
Definition: ccCompass.cpp:3474
int writePlanes(ccHObject *object, QTextStream *out, const QString &parentName=QString())
Definition: ccCompass.cpp:4257
Hierarchical CLOUDVIEWER Object.
Definition: ecvHObject.h:25
std::vector< ccHObject * > Container
Standard instances container (for children, etc.)
Definition: ecvHObject.h:337
Point/triangle picking listener interface.
Standard ECV plugin interface.
virtual void stop()
Stops the plugin.
Standard ECV plugin interface.
Definition: ccTool.h:18