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