1 #include "Camera_positions_list.h"
2 
3 #include "ui_Camera_positions_list.h"
4 #include <QListView>
5 #include <QStandardItemModel>
6 #include <QFileDialog>
7 #include <QFile>
8 #include <QTextStream>
9 #include <CGAL/number_type_config.h>
10 #include <CGAL/Three/Viewer_interface.h>
11 #include <CGAL/Three/Three.h>
12 
13 
14 
15 #include <cassert>
16 using namespace CGAL::Three;
Camera_positions_list(QWidget * parent)17 Camera_positions_list::Camera_positions_list(QWidget* parent)
18   : QDockWidget(parent), counter(0), m_model(new QStandardItemModel(this))
19 {
20   Ui::Camera_positions_list ui;
21   ui.setupUi(this);
22   m_listView = ui.listView;
23   m_listView->setModel(m_model);
24 
25   m_listView->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::EditKeyPressed);
26   connect(m_listView, SIGNAL(activated(QModelIndex)),
27           this, SLOT(activatedRow(QModelIndex)));
28 }
29 
on_plusButton_pressed()30 void Camera_positions_list::on_plusButton_pressed()
31 {
32   addItem(tr("Camera Position #%1").arg(++counter),
33           Three::activeViewer()->dumpCameraCoordinates());
34 }
35 
addItem(QString text,QString data)36 void Camera_positions_list::addItem(QString text, QString data)
37 {
38   QStandardItem* item = new QStandardItem(text);
39   item->setData(data, Qt::UserRole);
40   m_model->insertRow(m_model->rowCount(), item);
41 }
42 
on_upButton_pressed()43 void Camera_positions_list::on_upButton_pressed()
44 {
45   int row = m_listView->selectionModel()->currentIndex().row();
46   if(row!=0)
47   {
48   m_model->insertRow(row-1, m_model->takeRow(row));
49   m_listView->selectionModel()->setCurrentIndex(m_model->index(row-1, 0),
50                                                 QItemSelectionModel::Clear);
51   }
52 }
53 
on_downButton_pressed()54 void Camera_positions_list::on_downButton_pressed()
55 {
56   int row = m_listView->selectionModel()->currentIndex().row();
57   if(row!= m_listView->model()->rowCount()-1)
58   {
59   m_model->insertRow(row+1, m_model->takeRow(row));
60   m_listView->selectionModel()->setCurrentIndex(m_model->index(row+1, 0),
61                                                 QItemSelectionModel::Clear);
62   }
63 }
64 
on_minusButton_pressed()65 void Camera_positions_list::on_minusButton_pressed()
66 {
67   Q_FOREACH(QModelIndex index,
68             m_listView->selectionModel()->selectedIndexes()) {
69     m_model->removeRows(index.row(), 1);
70   }
71 }
72 
on_clearButton_pressed()73 void Camera_positions_list::on_clearButton_pressed()
74 {
75   m_model->clear();
76 }
77 
78 // void Camera_positions_list::editItem(QListWidgetItem* item)
79 // {
80 //   std::cerr << "is_editable: " << m_listView->flags(item)QListWidget
81 
82 //   m_listView->editItem(item);
83 // }
84 
activatedRow(QModelIndex index)85 void Camera_positions_list::activatedRow(QModelIndex index)
86 {
87   QString s = m_model->data(index, Qt::UserRole).toString();
88   if(s.isNull()) return;
89   Three::activeViewer()->moveCameraToCoordinates(s);
90 }
91 
save(QString filename)92 bool Camera_positions_list::save(QString filename) {
93   if(m_model->rowCount() <1)
94     return false;
95   QFile file(filename);
96   file.open(QIODevice::WriteOnly);
97   QTextStream out(&file);
98   for(int i = 0; i < m_model->rowCount(); ++i)
99   {
100     QStandardItem* item = m_model->item(i);
101     out << item->data(Qt::DisplayRole).toString()
102         << "\n"
103         << item->data(Qt::UserRole).toString()
104         << "\n";
105   }
106   file.close();
107   return true;
108 }
109 
on_saveButton_pressed()110 void Camera_positions_list::on_saveButton_pressed()
111 {
112   QString filename =
113     QFileDialog::getSaveFileName(this,
114                                  tr("Save camera coordinates to file"),
115                                  QString(),
116                                  tr("(*.camera.txt)"));
117   save(filename);
118 }
119 
on_openButton_pressed()120 void Camera_positions_list::on_openButton_pressed()
121 {
122   QString filename =
123     QFileDialog::getOpenFileName(this,
124                                  tr("Read camera coordinates from file"),
125                                  QString(),
126                                  tr("(*.camera.txt)"));
127   load(filename);
128 }
129 
load(QString filename)130 void Camera_positions_list::load(QString filename) {
131   QFile file(filename);
132   std::clog << "Loading camera positions " << qPrintable(filename) << std::endl;
133   file.open(QIODevice::ReadOnly);
134   QTextStream input(&file);
135   while(!input.atEnd()) {
136     QString text = input.readLine(1000);
137     QString coord = input.readLine(1000);
138     if(text.isNull() || coord.isNull()) return;
139     CGAL::qglviewer::Frame frame;
140     if(Three::activeViewer()->readFrame(coord, frame))
141     {
142       addItem(text,
143               Three::activeViewer()->dumpFrame(frame));
144     }
145   }
146 }
147 
on_frontButton_pressed()148 void Camera_positions_list::on_frontButton_pressed()
149 {
150     CGAL::qglviewer::Vec posFront = CGAL::qglviewer::Vec(0,0,Three::activeViewer()->sceneRadius()/(sin (Three::activeViewer()->camera()->fieldOfView()/2)));
151     CGAL::qglviewer::Vec trans = Three::activeViewer()->camera()->pivotPoint();
152     posFront = posFront + trans;
153     CGAL::qglviewer::Quaternion dirFront;
154     dirFront.setAxisAngle(CGAL::qglviewer::Vec(0,1,0),0);
155     QString frontCoord = QString("%1 %2 %3 %4 %5 %6 %7")
156             .arg(posFront[0])
157             .arg(posFront[1])
158             .arg(posFront[2])
159             .arg(dirFront[0])
160             .arg(dirFront[1])
161             .arg(dirFront[2])
162             .arg(dirFront[3]);
163 
164    Three::activeViewer()->moveCameraToCoordinates(frontCoord, 0.5f);
165 }
166 
on_backButton_pressed()167 void Camera_positions_list::on_backButton_pressed()
168 {
169     CGAL::qglviewer::Vec posBack = CGAL::qglviewer::Vec(0,0,-Three::activeViewer()->sceneRadius()/(sin (Three::activeViewer()->camera()->fieldOfView()/2)));
170     CGAL::qglviewer::Vec trans = Three::activeViewer()->camera()->pivotPoint();
171     posBack+= trans;
172     CGAL::qglviewer::Quaternion dirBack;
173     dirBack.setAxisAngle(CGAL::qglviewer::Vec(0,1,0),CGAL_PI);
174     QString backCoord = QString("%1 %2 %3 %4 %5 %6 %7")
175             .arg(posBack[0])
176             .arg(posBack[1])
177             .arg(posBack[2])
178             .arg(dirBack[0])
179             .arg(dirBack[1])
180             .arg(dirBack[2])
181             .arg(dirBack[3]);
182     Three::activeViewer()->moveCameraToCoordinates(backCoord, 0.5f);
183 }
184 
on_topButton_pressed()185 void Camera_positions_list::on_topButton_pressed()
186 {
187     CGAL::qglviewer::Vec posTop = CGAL::qglviewer::Vec(0,Three::activeViewer()->sceneRadius()/(sin (Three::activeViewer()->camera()->fieldOfView()/2)), 0);
188     CGAL::qglviewer::Vec trans = Three::activeViewer()->camera()->pivotPoint();
189     posTop += trans;
190     CGAL::qglviewer::Quaternion dirTop;
191     dirTop.setAxisAngle(CGAL::qglviewer::Vec(1,0,0), -CGAL_PI/2);
192     QString topCoord = QString("%1 %2 %3 %4 %5 %6 %7")
193             .arg(posTop[0])
194             .arg(posTop[1])
195             .arg(posTop[2])
196             .arg(dirTop[0])
197             .arg(dirTop[1])
198             .arg(dirTop[2])
199             .arg(dirTop[3]);
200      Three::activeViewer()->moveCameraToCoordinates(topCoord, 0.5f);
201 }
202 
on_botButton_pressed()203 void Camera_positions_list::on_botButton_pressed()
204 {
205     CGAL::qglviewer::Vec posBot = CGAL::qglviewer::Vec(0,-Three::activeViewer()->sceneRadius()/(sin (Three::activeViewer()->camera()->fieldOfView()/2)), 0);;
206     CGAL::qglviewer::Vec trans = Three::activeViewer()->camera()->pivotPoint();
207     posBot += trans;
208     CGAL::qglviewer::Quaternion dirBot;
209     dirBot.setAxisAngle(CGAL::qglviewer::Vec(1,0,0),CGAL_PI/2);
210     QString botCoord = QString("%1 %2 %3 %4 %5 %6 %7")
211             .arg(posBot[0])
212             .arg(posBot[1])
213             .arg(posBot[2])
214             .arg(dirBot[0])
215             .arg(dirBot[1])
216             .arg(dirBot[2])
217             .arg(dirBot[3]);
218      Three::activeViewer()->moveCameraToCoordinates(botCoord, 0.5f);
219 }
220 
on_leftButton_pressed()221 void Camera_positions_list::on_leftButton_pressed()
222 {
223     CGAL::qglviewer::Vec posLeft = CGAL::qglviewer::Vec(-Three::activeViewer()->sceneRadius()/(sin (Three::activeViewer()->camera()->fieldOfView()/2)), 0, 0);;
224     CGAL::qglviewer::Vec trans = Three::activeViewer()->camera()->pivotPoint();
225     posLeft += trans;
226     CGAL::qglviewer::Quaternion dirLeft;
227     dirLeft.setAxisAngle(CGAL::qglviewer::Vec(0,1,0),-CGAL_PI/2);
228     QString leftCoord = QString("%1 %2 %3 %4 %5 %6 %7")
229             .arg(posLeft[0])
230             .arg(posLeft[1])
231             .arg(posLeft[2])
232             .arg(dirLeft[0])
233             .arg(dirLeft[1])
234             .arg(dirLeft[2])
235             .arg(dirLeft[3]);
236     Three::activeViewer()->moveCameraToCoordinates(leftCoord, 0.5f);
237 }
238 
on_rightButton_pressed()239 void Camera_positions_list::on_rightButton_pressed()
240 {
241     CGAL::qglviewer::Vec posRight = CGAL::qglviewer::Vec(Three::activeViewer()->sceneRadius()/(sin (Three::activeViewer()->camera()->fieldOfView()/2)), 0,0);
242     CGAL::qglviewer::Vec trans = Three::activeViewer()->camera()->pivotPoint();
243     posRight += trans;
244     CGAL::qglviewer::Quaternion dirRight;
245     dirRight.setAxisAngle(CGAL::qglviewer::Vec(0,1,0),CGAL_PI/2);
246     QString rightCoord = QString("%1 %2 %3 %4 %5 %6 %7")
247             .arg(posRight[0])
248             .arg(posRight[1])
249             .arg(posRight[2])
250             .arg(dirRight[0])
251             .arg(dirRight[1])
252             .arg(dirRight[2])
253             .arg(dirRight[3]);
254     Three::activeViewer()->moveCameraToCoordinates(rightCoord, 0.5f);
255 
256 }
257