EditWidget.cpp 15 KB

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