EditWidget.cpp 20 KB

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