1 #include "MainWindow.h"
2 #include "Scene.h"
3 #include <CGAL/Qt/debug.h>
4 
5 #include <QDragEnterEvent>
6 #include <QDropEvent>
7 #include <QTextStream>
8 #include <QUrl>
9 #include <QFileDialog>
10 #include <QSettings>
11 #include <QHeaderView>
12 #include <QClipboard>
13 
14 #include "ui_MainWindow.h"
15 
MainWindow(QWidget * parent)16 MainWindow::MainWindow(QWidget* parent)
17 : CGAL::Qt::DemosMainWindow(parent)
18 {
19   ui = new Ui::MainWindow;
20   ui->setupUi(this);
21 
22   // saves some pointers from ui, for latter use.
23   m_pViewer = ui->viewer;
24 
25 
26   // accepts drop events
27   setAcceptDrops(true);
28   // setups scene
29         m_pScene = new Scene();
30   m_pViewer->setScene(m_pScene);
31         m_pViewer->setManipulatedFrame(m_pScene->manipulatedFrame());
32 
33   // connects actionQuit (Ctrl+Q) and qApp->quit()
34   connect(ui->actionQuit, SIGNAL(triggered()),
35     this, SLOT(quit()));
36 
37   this->addRecentFiles(ui->menuFile, ui->actionQuit);
38   connect(this, SIGNAL(openRecentFile(QString)),
39     this, SLOT(open(QString)));
40 
41   readSettings();
42 }
43 
~MainWindow()44 MainWindow::~MainWindow()
45 {
46   m_pViewer->makeCurrent();
47   delete ui;
48 }
49 
dragEnterEvent(QDragEnterEvent * event)50 void MainWindow::dragEnterEvent(QDragEnterEvent *event)
51 {
52   if (event->mimeData()->hasFormat("text/uri-list"))
53     event->acceptProposedAction();
54 }
55 
dropEvent(QDropEvent * event)56 void MainWindow::dropEvent(QDropEvent *event)
57 {
58   Q_FOREACH(QUrl url, event->mimeData()->urls()) {
59     QString filename = url.toLocalFile();
60     if(!filename.isEmpty()) {
61       QTextStream(stderr) << QString("dropEvent(\"%1\")\n").arg(filename);
62       open(filename);
63     }
64   }
65   event->acceptProposedAction();
66 }
67 
updateViewerBBox()68 void MainWindow::updateViewerBBox()
69 {
70   m_pScene->update_bbox();
71   const Scene::Bbox bbox = m_pScene->bbox();
72   const double xmin = bbox.xmin();
73   const double ymin = bbox.ymin();
74   const double zmin = bbox.zmin();
75   const double xmax = bbox.xmax();
76   const double ymax = bbox.ymax();
77   const double zmax = bbox.zmax();
78   CGAL::qglviewer::Vec
79     vec_min(xmin, ymin, zmin),
80     vec_max(xmax, ymax, zmax);
81   m_pViewer->setSceneBoundingBox(vec_min,vec_max);
82   m_pViewer->camera()->showEntireScene();
83 }
84 
open(QString filename)85 void MainWindow::open(QString filename)
86 {
87   QFileInfo fileinfo(filename);
88   if(fileinfo.isFile() && fileinfo.isReadable())
89   {
90     int index = m_pScene->open(filename);
91     if(index >= 0)
92     {
93       QSettings settings;
94       settings.setValue("OFF open directory",
95         fileinfo.absoluteDir().absolutePath());
96       this->addToRecentFiles(filename);
97 
98       // update bbox
99       updateViewerBBox();
100       m_pViewer->update();
101     }
102   }
103 }
104 
readSettings()105 void MainWindow::readSettings()
106 {
107   this->readState("MainWindow", Size|State);
108 }
109 
writeSettings()110 void MainWindow::writeSettings()
111 {
112   this->writeState("MainWindow");
113   std::cerr << "Write setting... done.\n";
114 }
115 
quit()116 void MainWindow::quit()
117 {
118   writeSettings();
119   close();
120 }
121 
closeEvent(QCloseEvent * event)122 void MainWindow::closeEvent(QCloseEvent *event)
123 {
124   writeSettings();
125   event->accept();
126 }
127 
on_actionLoadPolyhedron_triggered()128 void MainWindow::on_actionLoadPolyhedron_triggered()
129 {
130   QSettings settings;
131   QString directory = settings.value("OFF open directory",
132     QDir::current().dirName()).toString();
133   QStringList filenames =
134     QFileDialog::getOpenFileNames(this,
135     tr("Load polyhedron..."),
136     directory,
137     tr("OFF files (*.off)\n"
138     "All files (*)"));
139   if(!filenames.isEmpty()) {
140     Q_FOREACH(QString filename, filenames) {
141       open(filename);
142     }
143   }
144 }
145 
146 
setAddKeyFrameKeyboardModifiers(::Qt::KeyboardModifiers m)147 void MainWindow::setAddKeyFrameKeyboardModifiers(::Qt::KeyboardModifiers m)
148 {
149   m_pViewer->setAddKeyFrameKeyboardModifiers(m);
150 }
151 
on_actionInside_points_triggered()152 void MainWindow::on_actionInside_points_triggered()
153 {
154   bool ok;
155 
156   const unsigned int nb_points = (unsigned)
157     QInputDialog::getInt(nullptr, "#Points",
158     "#Points:",10000,1,100000000,9,&ok);
159 
160   if(!ok)
161     return;
162 
163   QApplication::setOverrideCursor(Qt::WaitCursor);
164   m_pScene->generate_inside_points(nb_points);
165   QApplication::restoreOverrideCursor();
166   m_pViewer->update();
167 }
168 
on_actionPoints_in_interval_triggered()169 void MainWindow::on_actionPoints_in_interval_triggered()
170 {
171   bool ok;
172 
173   const unsigned int nb_points = (unsigned)
174                 QInputDialog::getInt(nullptr, "#Points",
175     "#Points:",10000,1,100000000,9,&ok);
176 
177   if(!ok)
178     return;
179 
180   const double min =
181     QInputDialog::getDouble(nullptr, "min",
182     "Min:",-0.1,-1000.0,1000.0,9,&ok);
183   if(!ok)
184     return;
185   const double max =
186     QInputDialog::getDouble(nullptr, "max",
187     "Max:",0.1,-1000.0,1000.0,9,&ok);
188   if(!ok)
189     return;
190 
191   QApplication::setOverrideCursor(Qt::WaitCursor);
192   m_pScene->generate_points_in(nb_points,min,max);
193   QApplication::restoreOverrideCursor();
194   m_pViewer->update();
195 }
196 
on_actionBoundary_segments_triggered()197 void MainWindow::on_actionBoundary_segments_triggered()
198 {
199   bool ok;
200 
201   const unsigned int nb_slices = (unsigned)
202     QInputDialog::getInt(nullptr, "#Slices",
203     "Slices:",100,1,1000000,8,&ok);
204 
205   if(!ok)
206     return;
207 
208   QApplication::setOverrideCursor(Qt::WaitCursor);
209   m_pScene->generate_boundary_segments(nb_slices);
210   QApplication::restoreOverrideCursor();
211   m_pViewer->update();
212 }
213 
on_actionBoundary_points_triggered()214 void MainWindow::on_actionBoundary_points_triggered()
215 {
216   bool ok;
217 
218   const unsigned int nb_points = (unsigned)
219     QInputDialog::getInt(nullptr, "#Points",
220     "Points:",1000,1,10000000,8,&ok);
221 
222   if(!ok)
223     return;
224 
225   QApplication::setOverrideCursor(Qt::WaitCursor);
226   m_pScene->generate_boundary_points(nb_points);
227   QApplication::restoreOverrideCursor();
228   m_pViewer->update();
229 }
230 
on_actionEdge_points_triggered()231 void MainWindow::on_actionEdge_points_triggered()
232 {
233   bool ok;
234 
235   const unsigned int nb_points = (unsigned)
236     QInputDialog::getInt(nullptr, "#Points",
237     "Points:",1000,1,10000000,8,&ok);
238 
239   if(!ok)
240     return;
241 
242   QApplication::setOverrideCursor(Qt::WaitCursor);
243   m_pScene->generate_edge_points(nb_points);
244   QApplication::restoreOverrideCursor();
245   m_pViewer->update();
246 }
247 
on_actionBench_distances_triggered()248 void MainWindow::on_actionBench_distances_triggered()
249 {
250   bool ok;
251   const double duration = QInputDialog::getDouble(nullptr, "Duration",
252     "Duration (s):",1.0,0.01,1000,8,&ok);
253   if(!ok)
254     return;
255 
256   QApplication::setOverrideCursor(Qt::WaitCursor);
257   std::cout << std::endl << "Benchmark distances" << std::endl;
258   m_pScene->benchmark_distances(duration);
259   QApplication::restoreOverrideCursor();
260 }
261 
on_actionBench_intersections_triggered()262 void MainWindow::on_actionBench_intersections_triggered()
263 {
264   bool ok;
265   const double duration = QInputDialog::getDouble(nullptr, "Duration",
266     "Duration (s):",1.0,0.01,1000.0,8,&ok);
267   if(!ok)
268     return;
269 
270   QApplication::setOverrideCursor(Qt::WaitCursor);
271   std::cout << std::endl << "Benchmark intersections" << std::endl;
272   m_pScene->benchmark_intersections(duration);
273   QApplication::restoreOverrideCursor();
274 }
275 
on_actionUnsigned_distance_function_to_facets_triggered()276 void MainWindow::on_actionUnsigned_distance_function_to_facets_triggered()
277 {
278   QApplication::setOverrideCursor(Qt::WaitCursor);
279     m_pScene->activate_cutting_plane();
280   m_pScene->unsigned_distance_function();
281   QApplication::restoreOverrideCursor();
282   m_pViewer->update();
283 }
284 
on_actionUnsigned_distance_function_to_edges_triggered()285 void MainWindow::on_actionUnsigned_distance_function_to_edges_triggered()
286 {
287   QApplication::setOverrideCursor(Qt::WaitCursor);
288     m_pScene->activate_cutting_plane();
289   m_pScene->unsigned_distance_function_to_edges();
290   QApplication::restoreOverrideCursor();
291   m_pViewer->update();
292 }
293 
on_actionSigned_distance_function_to_facets_triggered()294 void MainWindow::on_actionSigned_distance_function_to_facets_triggered()
295 {
296   QApplication::setOverrideCursor(Qt::WaitCursor);
297     m_pScene->activate_cutting_plane();
298   m_pScene->signed_distance_function();
299   QApplication::restoreOverrideCursor();
300   m_pViewer->update();
301 }
302 
on_actionIntersection_cutting_plane_triggered()303 void MainWindow::on_actionIntersection_cutting_plane_triggered()
304 {
305   QApplication::setOverrideCursor(Qt::WaitCursor);
306   m_pScene->activate_cutting_plane();
307   m_pScene->cut_segment_plane();
308   QApplication::restoreOverrideCursor();
309   m_pViewer->update();
310 }
311 
on_actionCutting_plane_none_triggered()312 void MainWindow::on_actionCutting_plane_none_triggered()
313 {
314   m_pScene->clear_cutting_plane();
315   m_pViewer->update();
316 }
317 
on_actionView_polyhedron_triggered()318 void MainWindow::on_actionView_polyhedron_triggered()
319 {
320   m_pScene->toggle_view_poyhedron();
321   m_pViewer->update();
322 }
323 
on_actionView_points_triggered()324 void MainWindow::on_actionView_points_triggered()
325 {
326   m_pScene->toggle_view_points();
327   m_pViewer->update();
328 }
329 
on_actionView_segments_triggered()330 void MainWindow::on_actionView_segments_triggered()
331 {
332   m_pScene->toggle_view_segments();
333   m_pViewer->update();
334 }
335 
on_actionView_cutting_plane_triggered()336 void MainWindow::on_actionView_cutting_plane_triggered()
337 {
338   m_pScene->toggle_view_plane();
339   m_pViewer->update();
340 }
341 
on_actionClear_points_triggered()342 void MainWindow::on_actionClear_points_triggered()
343 {
344   m_pScene->clear_points();
345   m_pViewer->update();
346 }
347 
on_actionClear_segments_triggered()348 void MainWindow::on_actionClear_segments_triggered()
349 {
350   m_pScene->clear_segments();
351   m_pViewer->update();
352 }
353 
on_actionClear_cutting_plane_triggered()354 void MainWindow::on_actionClear_cutting_plane_triggered()
355 {
356   m_pScene->clear_cutting_plane();
357   m_pViewer->update();
358 }
359 
on_actionRefine_bisection_triggered()360 void MainWindow::on_actionRefine_bisection_triggered()
361 {
362   bool ok;
363   const double max_len =
364     QInputDialog::getDouble(nullptr, "Max edge len",
365     "Max edge len:",0.1,0.001,100.0,9,&ok);
366   if(!ok)
367     return;
368 
369   QApplication::setOverrideCursor(Qt::WaitCursor);
370   m_pScene->refine_bisection(max_len * max_len);
371   QApplication::restoreOverrideCursor();
372   m_pViewer->update();
373 }
374 
on_actionBench_memory_triggered()375 void MainWindow::on_actionBench_memory_triggered()
376 {
377   QApplication::setOverrideCursor(Qt::WaitCursor);
378   m_pScene->bench_memory();
379   QApplication::restoreOverrideCursor();
380 }
381 
on_actionBench_construction_triggered()382 void MainWindow::on_actionBench_construction_triggered()
383 {
384   QApplication::setOverrideCursor(Qt::WaitCursor);
385   m_pScene->bench_construction();
386   QApplication::restoreOverrideCursor();
387 }
388 
on_actionBench_intersections_vs_nbt_triggered()389 void MainWindow::on_actionBench_intersections_vs_nbt_triggered()
390 {
391   QApplication::setOverrideCursor(Qt::WaitCursor);
392   m_pScene->bench_intersections_vs_nbt();
393   QApplication::restoreOverrideCursor();
394 }
395 
on_actionBench_distances_vs_nbt_triggered()396 void MainWindow::on_actionBench_distances_vs_nbt_triggered()
397 {
398   QApplication::setOverrideCursor(Qt::WaitCursor);
399   m_pScene->bench_distances_vs_nbt();
400   QApplication::restoreOverrideCursor();
401 }
402 
on_actionRefine_loop_triggered()403 void MainWindow::on_actionRefine_loop_triggered()
404 {
405   QApplication::setOverrideCursor(Qt::WaitCursor);
406   m_pScene->refine_loop();
407   QApplication::restoreOverrideCursor();
408   m_pViewer->update();
409 }
410 
on_actionSave_snapshot_triggered()411 void MainWindow::on_actionSave_snapshot_triggered()
412 {
413   return;
414 }
on_actionCopy_snapshot_triggered()415 void MainWindow::on_actionCopy_snapshot_triggered()
416 {
417   // copy snapshot to clipboard
418   QApplication::setOverrideCursor(Qt::WaitCursor);
419   QClipboard *qb = QApplication::clipboard();
420   m_pViewer->makeCurrent();
421   m_pViewer->raise();
422   QImage snapshot = m_pViewer->grabFramebuffer();
423   qb->setImage(snapshot);
424   QApplication::restoreOverrideCursor();
425 }
426 
427 
428 
429 
430