EditWidget.cpp 23 KB

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