EditWidget.cpp 16 KB

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