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