EditWidget.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. // Include own headers
  2. #include "EditWidget.hpp"
  3. #include "../gui/ui_EditWidget.h"
  4. // Include modules
  5. #include "OSGWidget.hpp"
  6. #include "PickHandler.hpp"
  7. #include "TrackPointRenderer.hpp"
  8. #include "OpenScadRenderer.hpp"
  9. // Include dependencies
  10. #include <QFileDialog>
  11. EditWidget::EditWidget(QWidget* parent): QWidget(parent), ui(new Ui::EditWidget) {
  12. ui->setupUi(this);
  13. ui->actionPointDoubleIdentifier->setVisible(false);
  14. ui->insertionToolButton->setCheckable(true);
  15. ui->insertionToolButton->setChecked(true);
  16. QObject::connect(ui->insertionToolButton, &QToolButton::clicked, this, [=](){ this->selectTool(InsertionTool); });
  17. ui->selectionToolButton->setCheckable(true);
  18. QObject::connect(ui->selectionToolButton, &QToolButton::clicked, this, [=](){ this->selectTool(SelectionTool); });
  19. QObject::connect(ui->tabWidget, &QTabWidget::currentChanged, this, &EditWidget::tabChanged);
  20. // Modifiers
  21. QObject::connect(ui->anchorX, &QDoubleSpinBox::valueChanged, this, &EditWidget::changePositions);
  22. QObject::connect(ui->anchorY, &QDoubleSpinBox::valueChanged, this, &EditWidget::changePositions);
  23. QObject::connect(ui->anchorZ, &QDoubleSpinBox::valueChanged, this, &EditWidget::changePositions);
  24. QObject::connect(ui->normalModX, &QDoubleSpinBox::valueChanged, this, &EditWidget::updateNormalModifier);
  25. QObject::connect(ui->normalModY, &QDoubleSpinBox::valueChanged, this, &EditWidget::updateNormalModifier);
  26. QObject::connect(ui->normalModZ, &QDoubleSpinBox::valueChanged, this, &EditWidget::updateNormalModifier);
  27. QObject::connect(ui->rotateAroundNormal, &QDoubleSpinBox::valueChanged, this, [=](){ this->updateNormalRotation(false); });
  28. QObject::connect(ui->compensation, &QCheckBox::stateChanged, this, [=](){ this->updateCompensation(false); });
  29. QObject::connect(ui->modifierReset, &QPushButton::clicked, this, &EditWidget::resetNormalModifier);
  30. // OptiTrack settings
  31. QObject::connect(ui->optiTrackLength, &QDoubleSpinBox::valueChanged, this, [=](){ this->updateOptiTrackSettings(false); });
  32. QObject::connect(ui->optiTrackRadius, &QDoubleSpinBox::valueChanged, this, [=](){ this->updateOptiTrackSettings(false); });
  33. QObject::connect(ui->optiTrackLoadDefaults, &QPushButton::clicked, this, [=](){ this->updateOptiTrackSettings(true); });
  34. // EMF Track settings
  35. QObject::connect(ui->emfTrackWidth, &QDoubleSpinBox::valueChanged, this, [=](){ this->updateEMFTrackSettings(false); });
  36. QObject::connect(ui->emfTrackHeight, &QDoubleSpinBox::valueChanged, this, [=](){ this->updateEMFTrackSettings(false); });
  37. QObject::connect(ui->emfTrackDepth, &QDoubleSpinBox::valueChanged, this, [=](){ this->updateEMFTrackSettings(false); });
  38. QObject::connect(ui->emfTrackLoadDefaults, &QPushButton::clicked, this, [=](){ this->updateEMFTrackSettings(true); });
  39. // StramVRTrack settings
  40. QObject::connect(ui->steamVrTrackLength, &QDoubleSpinBox::valueChanged, this, [=](){ this->updateSteamVRTrackSettings(false); });
  41. QObject::connect(ui->steamVrTrackLoadDefaults, &QPushButton::clicked, this, [=](){ this->updateSteamVRTrackSettings(true); });
  42. // Action point settings
  43. QObject::connect(ui->actionPointIdentifier, &QLineEdit::textChanged, this, &EditWidget::updateActionPointSettings);
  44. QObject::connect(ui->actionPointLoadDefaults, &QPushButton::clicked, this, &EditWidget::resetActionPointSettings);
  45. // Delete button
  46. QObject::connect(ui->deleteTrackPoint, &QPushButton::clicked, this, &EditWidget::deleteCurrentTrackPoint);
  47. // Export button
  48. QObject::connect(ui->exportButton, &QPushButton::clicked, this, &EditWidget::exportProject);
  49. if (!OpenScadRenderer::openScadAvailable()) {
  50. ui->exportGroup->setEnabled(false);
  51. }
  52. ui->exportProgress->setVisible(false);
  53. ui->exportLabel->setVisible(false);
  54. }
  55. EditWidget::~EditWidget() {
  56. delete ui;
  57. }
  58. void EditWidget::updatePositions(osg::Vec3 point) {
  59. ui->anchorX->setValue(point.x());
  60. ui->anchorY->setValue(point.y());
  61. ui->anchorZ->setValue(point.z());
  62. }
  63. void EditWidget::updateNormals(osg::Vec3 normal) {
  64. ui->normalX->setText(QString::number(normal.x()));
  65. ui->normalY->setText(QString::number(normal.y()));
  66. ui->normalZ->setText(QString::number(normal.z()));
  67. }
  68. void EditWidget::invalidatePositions() {
  69. ui->deleteTrackPoint->setEnabled(false);
  70. ui->anchorX->setValue(0.0f);
  71. ui->anchorY->setValue(0.0f);
  72. ui->anchorZ->setValue(0.0f);
  73. ui->normalX->setText("-");
  74. ui->normalY->setText("-");
  75. ui->normalZ->setText("-");
  76. }
  77. ActiveTrackingSystem EditWidget::getSelectedTrackingSystem() {
  78. switch(ui->tabWidget->currentIndex()) {
  79. case 0: {
  80. return OptiTrack;
  81. }
  82. case 1: {
  83. return EMFTrack;
  84. }
  85. case 2: {
  86. return SteamVRTrack;
  87. }
  88. default: {
  89. return ActionPoints;
  90. }
  91. }
  92. }
  93. void EditWidget::setSelection(int id) {
  94. selectedPoint = id;
  95. ui->deleteTrackPoint->setEnabled(true);
  96. TrackPoint* point;
  97. switch(ui->tabWidget->currentIndex()) {
  98. case 0: {
  99. OptiTrackPoint* optiPoint = MainWindow::getInstance()->getStore()->getOptiTrackPoints()[id];
  100. setOptiTrackSettings(optiPoint->getLength(), optiPoint->getRadius());
  101. point = static_cast<TrackPoint*>(optiPoint);
  102. break;
  103. }
  104. case 1: {
  105. EMFTrackPoint* emfPoint = MainWindow::getInstance()->getStore()->getEMFTrackPoints()[id];
  106. setEMFTrackSettings(emfPoint->getWidth(), emfPoint->getHeight(), emfPoint->getDepth());
  107. point = static_cast<TrackPoint*>(emfPoint);
  108. break;
  109. }
  110. case 2: {
  111. SteamVRTrackPoint* steamVrPoint = MainWindow::getInstance()->getStore()->getSteamVRTrackPoints()[id];
  112. setSteamVRTrackSettings(steamVrPoint->getLength());
  113. point = static_cast<TrackPoint*>(steamVrPoint);
  114. break;
  115. }
  116. default: {
  117. ActionPoint* actionPoint = MainWindow::getInstance()->getStore()->getActionPoints()[id];
  118. setActionPointSettings(actionPoint->getIdentifier());
  119. point = static_cast<TrackPoint*>(actionPoint);
  120. break;
  121. }
  122. }
  123. updatePositions(point->getTranslation());
  124. updateNormals(point->getNormal());
  125. setNormalModifier(point->getNormalModifier());
  126. }
  127. int EditWidget::getSelectedPoint() {
  128. return selectedPoint;
  129. }
  130. void EditWidget::updateTrackpointCount() {
  131. int count;
  132. count = MainWindow::getInstance()->getStore()->getCount(OptiTrack);
  133. {
  134. QString countString("TRACKPOINTS SET: ");
  135. countString.append(QString::number(count));
  136. ui->optiTrackCount->setText(countString);
  137. }
  138. count = MainWindow::getInstance()->getStore()->getCount(EMFTrack);
  139. {
  140. QString countString("TRACKPOINTS SET: ");
  141. countString.append(QString::number(count));
  142. ui->emfTrackCount->setText(countString);
  143. }
  144. count = MainWindow::getInstance()->getStore()->getCount(SteamVRTrack);
  145. {
  146. QString countString("TRACKPOINTS SET: ");
  147. countString.append(QString::number(count));
  148. ui->steamVrTrackCount->setText(countString);
  149. }
  150. count = MainWindow::getInstance()->getStore()->getCount(ActionPoints);
  151. {
  152. QString countString("ACTION POINTS SET: ");
  153. countString.append(QString::number(count));
  154. ui->actionPointCount->setText(countString);
  155. }
  156. }
  157. void EditWidget::showEvent(QShowEvent* event) {
  158. QWidget::showEvent(event);
  159. resetAllSettings();
  160. }
  161. void EditWidget::resetAllSettings() {
  162. selectedPoint = -1;
  163. resetNormalModifier();
  164. updateOptiTrackSettings(true);
  165. updateEMFTrackSettings(true);
  166. updateSteamVRTrackSettings(true);
  167. resetActionPointSettings();
  168. }
  169. void EditWidget::selectTool(Tool tool) {
  170. switch(tool) {
  171. case InsertionTool: {
  172. ui->insertionToolButton->setChecked(true);
  173. ui->selectionToolButton->setChecked(false);
  174. MainWindow::getInstance()->getOsgWidget()->getPicker()->setSelection(true);
  175. resetAllSettings();
  176. invalidatePositions();
  177. setPositionEditing(true);
  178. break;
  179. }
  180. case SelectionTool: {
  181. ui->insertionToolButton->setChecked(false);
  182. ui->selectionToolButton->setChecked(true);
  183. MainWindow::getInstance()->getOsgWidget()->getPicker()->setSelection(false);
  184. setPositionEditing(false);
  185. break;
  186. }
  187. }
  188. }
  189. void EditWidget::tabChanged(int index) {
  190. if (selectedPoint < 0) {
  191. MainWindow::getInstance()->getOsgWidget()->getPicker()->updateRenderer();
  192. }
  193. selectedPoint = -1;
  194. ActiveTrackingSystem activeTrackingSystem = getSelectedTrackingSystem();
  195. MainWindow::getInstance()->getOsgWidget()->getPointRenderer()->render(activeTrackingSystem);
  196. }
  197. void EditWidget::updateNormalModifier() {
  198. osg::Vec3 modifier = osg::Vec3(ui->normalModX->value(), ui->normalModY->value(), ui->normalModZ->value());
  199. if (selectedPoint < 0) {
  200. MainWindow::getInstance()->getStore()->updateNormalModifier(modifier);
  201. MainWindow::getInstance()->getOsgWidget()->getPicker()->updateRenderer();
  202. } else {
  203. ActiveTrackingSystem activeTrackingSystem = getSelectedTrackingSystem();
  204. MainWindow::getInstance()->getStore()->getTrackPointById(selectedPoint, activeTrackingSystem)->updateNormalModifier(modifier);
  205. MainWindow::getInstance()->getOsgWidget()->getPointRenderer()->render(activeTrackingSystem);
  206. MainWindow::getInstance()->getStore()->projectModified();
  207. }
  208. }
  209. void EditWidget::resetNormalModifier() {
  210. osg::Vec3 modifier = osg::Vec3(0.0f, 0.0f, 0.0f);
  211. ui->normalModX->setValue(0.0f);
  212. ui->normalModY->setValue(0.0f);
  213. ui->normalModZ->setValue(0.0f);
  214. if (selectedPoint < 0) {
  215. MainWindow::getInstance()->getStore()->updateNormalModifier(modifier);
  216. MainWindow::getInstance()->getOsgWidget()->getPicker()->updateRenderer();
  217. } else {
  218. ActiveTrackingSystem activeTrackingSystem = getSelectedTrackingSystem();
  219. MainWindow::getInstance()->getStore()->getTrackPointById(selectedPoint, activeTrackingSystem)->updateNormalModifier(modifier);
  220. MainWindow::getInstance()->getOsgWidget()->getPointRenderer()->render(activeTrackingSystem);
  221. MainWindow::getInstance()->getStore()->projectModified();
  222. }
  223. }
  224. void EditWidget::setNormalModifier(osg::Vec3 normalModifier) {
  225. ui->normalModX->setValue(normalModifier.x());
  226. ui->normalModY->setValue(normalModifier.y());
  227. ui->normalModZ->setValue(normalModifier.z());
  228. }
  229. void EditWidget::updateNormalRotation(bool reset) {
  230. float normalRotation;
  231. if (reset) {
  232. normalRotation = 0.0f;
  233. } else {
  234. normalRotation = ui->rotateAroundNormal->value();
  235. }
  236. if (selectedPoint < 0) {
  237. MainWindow::getInstance()->getStore()->updateNormalRotation(normalRotation);
  238. MainWindow::getInstance()->getOsgWidget()->getPicker()->updateRenderer();
  239. } else {
  240. ActiveTrackingSystem activeTrackingSystem = getSelectedTrackingSystem();
  241. MainWindow::getInstance()->getStore()->getTrackPointById(selectedPoint, activeTrackingSystem)->updateNormalRotation(normalRotation);
  242. MainWindow::getInstance()->getOsgWidget()->getPointRenderer()->render(activeTrackingSystem);
  243. MainWindow::getInstance()->getStore()->projectModified();
  244. }
  245. }
  246. void EditWidget::setNormalRotation(float normalRotation) {
  247. ui->rotateAroundNormal->value();
  248. }
  249. void EditWidget::updateCompensation(bool reset) {
  250. bool compensation;
  251. if (reset) {
  252. compensation = true;
  253. } else {
  254. compensation = ui->compensation->checkState() == Qt::Checked ? true : false;
  255. }
  256. if (selectedPoint < 0) {
  257. MainWindow::getInstance()->getStore()->updateCompensation(compensation);
  258. MainWindow::getInstance()->getOsgWidget()->getPicker()->updateRenderer();
  259. } else {
  260. ActiveTrackingSystem activeTrackingSystem = getSelectedTrackingSystem();
  261. MainWindow::getInstance()->getStore()->getTrackPointById(selectedPoint, activeTrackingSystem)->updateCompensation(compensation);
  262. MainWindow::getInstance()->getOsgWidget()->getPointRenderer()->render(activeTrackingSystem);
  263. MainWindow::getInstance()->getStore()->projectModified();
  264. }
  265. }
  266. void EditWidget::setCompensation(bool compensation) {
  267. if (compensation) {
  268. ui->compensation->setCheckState(Qt::Checked);
  269. } else {
  270. ui->compensation->setCheckState(Qt::Unchecked);
  271. }
  272. }
  273. void EditWidget::updateOptiTrackSettings(bool reset) {
  274. OptiTrackSettings settings;
  275. if (reset) {
  276. settings = {OPTITRACK_DEFAULT_LENGTH, OPTITRACK_DEFAULT_RADIUS};
  277. setOptiTrackSettings(OPTITRACK_DEFAULT_LENGTH, OPTITRACK_DEFAULT_RADIUS);
  278. } else {
  279. settings = {ui->optiTrackLength->value(), ui->optiTrackRadius->value()};
  280. }
  281. if (selectedPoint < 0) {
  282. MainWindow::getInstance()->getStore()->updateOptiTrackSettings(settings);
  283. MainWindow::getInstance()->getOsgWidget()->getPicker()->updateRenderer();
  284. } else {
  285. MainWindow::getInstance()->getStore()->getOptiTrackPoints()[selectedPoint]->updateOptiTrackSettings(settings);
  286. MainWindow::getInstance()->getOsgWidget()->getPointRenderer()->render(OptiTrack);
  287. MainWindow::getInstance()->getStore()->projectModified();
  288. }
  289. }
  290. void EditWidget::setOptiTrackSettings(double length, double radius) {
  291. ui->optiTrackLength->setValue(length);
  292. ui->optiTrackRadius->setValue(radius);
  293. }
  294. void EditWidget::updateEMFTrackSettings(bool reset) {
  295. EMFTrackSettings settings;
  296. if (reset) {
  297. settings = {EMFTRACK_DEFAULT_WIDTH, EMFTRACK_DEFAULT_HEIGHT, EMFTRACK_DEFAULT_DEPTH};
  298. setEMFTrackSettings(EMFTRACK_DEFAULT_WIDTH, EMFTRACK_DEFAULT_HEIGHT, EMFTRACK_DEFAULT_DEPTH);
  299. } else {
  300. settings = {ui->emfTrackWidth->value(), ui->emfTrackHeight->value(), ui->emfTrackDepth->value()};
  301. }
  302. if (selectedPoint < 0) {
  303. MainWindow::getInstance()->getStore()->updateEMFTrackSettings(settings);
  304. MainWindow::getInstance()->getOsgWidget()->getPicker()->updateRenderer();
  305. } else {
  306. MainWindow::getInstance()->getStore()->getEMFTrackPoints()[selectedPoint]->updateEMFTrackSettings(settings);
  307. MainWindow::getInstance()->getOsgWidget()->getPointRenderer()->render(EMFTrack);
  308. MainWindow::getInstance()->getStore()->projectModified();
  309. }
  310. }
  311. void EditWidget::setEMFTrackSettings(double width, double height, double depth) {
  312. ui->emfTrackWidth->setValue(width);
  313. ui->emfTrackHeight->setValue(height);
  314. ui->emfTrackDepth->setValue(depth);
  315. }
  316. void EditWidget::updateSteamVRTrackSettings(bool reset) {
  317. SteamVRTrackSettings settings;
  318. if (reset) {
  319. settings = {STEAMVR_DEFAULT_LENGTH};
  320. setSteamVRTrackSettings(STEAMVR_DEFAULT_LENGTH);
  321. } else {
  322. settings = {ui->steamVrTrackLength->value()};
  323. }
  324. if (selectedPoint < 0) {
  325. MainWindow::getInstance()->getStore()->updateSteamVRTrackSettings(settings);
  326. MainWindow::getInstance()->getOsgWidget()->getPicker()->updateRenderer();
  327. } else {
  328. MainWindow::getInstance()->getStore()->getSteamVRTrackPoints()[selectedPoint]->updateSteamVRTrackSettings(settings);
  329. MainWindow::getInstance()->getOsgWidget()->getPointRenderer()->render(SteamVRTrack);
  330. MainWindow::getInstance()->getStore()->projectModified();
  331. }
  332. }
  333. void EditWidget::setSteamVRTrackSettings(double length) {
  334. ui->steamVrTrackLength->setValue(length);
  335. }
  336. void EditWidget::updateActionPointSettings(QString qinput) {
  337. std::string input = qinput.toUtf8().constData();
  338. if (MainWindow::getInstance()->getStore()->actionPointIdentifierInUse(input, selectedPoint) > 0) {
  339. ui->actionPointDoubleIdentifier->setVisible(true);
  340. } else {
  341. ui->actionPointDoubleIdentifier->setVisible(false);
  342. QString qtext = ui->actionPointIdentifier->text();
  343. ActionPointSettings settings = {qtext.toUtf8().constData()};
  344. if (selectedPoint < 0) {
  345. MainWindow::getInstance()->getStore()->updateActionPointSettings(settings);
  346. } else {
  347. MainWindow::getInstance()->getStore()->getActionPoints()[selectedPoint]->updateActionPointSettings(settings);
  348. MainWindow::getInstance()->getStore()->projectModified();
  349. }
  350. }
  351. }
  352. void EditWidget::resetActionPointSettings() {
  353. int iterator = 0;
  354. ActionPointSettings settings;
  355. std::string candidate;
  356. while (true) {
  357. candidate = "point";
  358. candidate += std::to_string(iterator);
  359. unsigned int result = MainWindow::getInstance()->getStore()->actionPointIdentifierInUse(candidate, selectedPoint);
  360. if (result == 0) {
  361. settings = {candidate};
  362. break;
  363. }
  364. iterator++;
  365. }
  366. ui->actionPointIdentifier->setText(QString::fromStdString(candidate));
  367. if (selectedPoint < 0) {
  368. MainWindow::getInstance()->getStore()->updateActionPointSettings(settings);
  369. } else {
  370. MainWindow::getInstance()->getStore()->getActionPoints()[selectedPoint]->updateActionPointSettings(settings);
  371. MainWindow::getInstance()->getStore()->projectModified();
  372. }
  373. }
  374. void EditWidget::setActionPointSettings(std::string identifier) {
  375. ui->actionPointIdentifier->setText(QString::fromStdString(identifier));
  376. if (MainWindow::getInstance()->getStore()->actionPointIdentifierInUse(identifier, selectedPoint) > 0) {
  377. ui->actionPointDoubleIdentifier->setVisible(true);
  378. } else {
  379. ui->actionPointDoubleIdentifier->setVisible(false);
  380. }
  381. }
  382. void EditWidget::deleteCurrentTrackPoint() {
  383. ActiveTrackingSystem activeTrackingSystem = getSelectedTrackingSystem();
  384. MainWindow::getInstance()->getStore()->removeTrackPoint(selectedPoint, activeTrackingSystem);
  385. selectedPoint = -1;
  386. switch(activeTrackingSystem) {
  387. case OptiTrack: {
  388. updateOptiTrackSettings(true);
  389. break;
  390. }
  391. case EMFTrack: {
  392. updateEMFTrackSettings(true);
  393. break;
  394. }
  395. case SteamVRTrack: {
  396. updateSteamVRTrackSettings(true);
  397. break;
  398. }
  399. case ActionPoints: {
  400. resetActionPointSettings();
  401. break;
  402. }
  403. }
  404. resetNormalModifier();
  405. invalidatePositions();
  406. MainWindow::getInstance()->getOsgWidget()->getPointRenderer()->render(activeTrackingSystem);
  407. }
  408. void EditWidget::exportProject() {
  409. Qt::CheckState optiTrackSelected = ui->optiTrackCkeckbox->checkState();
  410. Qt::CheckState emfTrackSelected = ui->emfTrackCheckbox->checkState();
  411. Qt::CheckState steamVrTrackSelected = ui->steamVrCheckbox->checkState();
  412. ExportSettings settings = {optiTrackSelected == Qt::Checked, emfTrackSelected == Qt::Checked, steamVrTrackSelected == Qt::Checked};
  413. QString fileName = QFileDialog::getSaveFileName(this, tr("Export your TrackpointApp Project"), "", tr("3MF Files (*.3mf)"));
  414. std::string exportFile = fileName.toUtf8().constData();
  415. MainWindow::getInstance()->getStore()->exportProject(exportFile, settings);
  416. }
  417. void EditWidget::changePositions() {
  418. osg::Vec3 origin = osg::Vec3(ui->anchorX->value(), ui->anchorY->value(), ui->anchorZ->value());
  419. if (selectedPoint >= 0) {
  420. ActiveTrackingSystem activeTrackingSystem = getSelectedTrackingSystem();
  421. MainWindow::getInstance()->getStore()->getTrackPointById(selectedPoint, activeTrackingSystem)->updatePositions(origin);
  422. MainWindow::getInstance()->getOsgWidget()->getPointRenderer()->render(activeTrackingSystem);
  423. MainWindow::getInstance()->getStore()->projectModified();
  424. }
  425. }
  426. void EditWidget::setPositionEditing(bool mode) {
  427. ui->anchorX->setReadOnly(mode);
  428. ui->anchorY->setReadOnly(mode);
  429. ui->anchorZ->setReadOnly(mode);
  430. }