Ver Fonte

Add export

Johannes Kreutz há 3 anos atrás
pai
commit
d8bddea246

+ 1 - 0
trackpoint-app/include/EditWidget.hpp

@@ -31,6 +31,7 @@ private slots:
   void resetNormalModifier();
   void updateOptiTrackSettings();
   void resetOptiTrackSettings();
+  void exportProject();
 
 private:
   Ui::EditWidget* ui;

+ 4 - 2
trackpoint-app/include/OpenScadRenderer.hpp

@@ -1,10 +1,12 @@
 #pragma once
 
-#include "TrackPoint.hpp"
+// Include modules
+#include "OptiTrackPoint.hpp"
 
+// Include dependencies
 #include <vector>
 
 class OpenScadRenderer {
 public:
-  void render(std::vector<TrackPoint*> points);
+  void renderOptiTrack(std::vector<OptiTrackPoint*> points);
 };

+ 13 - 0
trackpoint-app/include/PlatformSupport.hpp

@@ -0,0 +1,13 @@
+#pragma once
+
+#if __APPLE__
+  static std::string openScadPath = "/Applications/OpenSCAD.app/Contents/MacOS/OpenSCAD";
+  static std::string fileDelimiter = "/";
+#elif __unix__
+  static std::string openScadPath = "openscad";
+  static std::string fileDelimiter = "/";
+#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__) || defined(_WIN64)
+  // Currently unsupported
+  static std::string openScadPath = "";
+  static std::string fileDelimiter = "\\";
+#endif

+ 1 - 0
trackpoint-app/include/ProjectStore.hpp

@@ -4,6 +4,7 @@
 #include "lib3mf_implicit.hpp"
 #include "OptiTrackPoint.hpp"
 #include "TrackSystemSettingsStructs.hpp"
+#include "OpenScadRenderer.hpp"
 
 // Include dependencies
 #include <string>

+ 1 - 1
trackpoint-app/include/TrackPoint.hpp

@@ -9,9 +9,9 @@ public:
   TrackPoint(const osg::Vec3 point, const osg::Vec3 normal, const osg::Vec3 normalModifier);
   osg::Vec3 getTranslation();
   osg::Vec3 getRotation();
-  osg::Vec3 getTrackPoint();
   osg::Vec3 getNormal();
   osg::Vec3 getNormalModifier();
+  osg::Vec3 getTrackPoint();
 
 protected:
   osg::ref_ptr<osg::MatrixTransform> _translationGroup;

+ 15 - 0
trackpoint-app/src/EditWidget.cpp

@@ -6,6 +6,9 @@
 #include "OSGWidget.hpp"
 #include "PickHandler.hpp"
 
+// Include dependencies
+#include <QFileDialog>
+
 EditWidget::EditWidget(QWidget* parent): QWidget(parent), ui(new Ui::EditWidget) {
   ui->setupUi(this);
   ui->insertionToolButton->setCheckable(true);
@@ -22,6 +25,8 @@ EditWidget::EditWidget(QWidget* parent): QWidget(parent), ui(new Ui::EditWidget)
   QObject::connect(ui->optiTrackLength, &QDoubleSpinBox::valueChanged, this, &EditWidget::updateOptiTrackSettings);
   QObject::connect(ui->optiTrackRadius, &QDoubleSpinBox::valueChanged, this, &EditWidget::updateOptiTrackSettings);
   QObject::connect(ui->optiTrackLoadDefaults, &QPushButton::clicked, this, &EditWidget::resetOptiTrackSettings);
+  // Export button
+  QObject::connect(ui->exportButton, &QPushButton::clicked, this, &EditWidget::exportProject);
 }
 
 EditWidget::~EditWidget() {
@@ -116,3 +121,13 @@ void EditWidget::resetOptiTrackSettings() {
   MainWindow::getInstance()->getStore()->updateOptiTrackSettings(settings);
   MainWindow::getInstance()->getOsgWidget()->getPicker()->updateRenderer();
 }
+
+void EditWidget::exportProject() {
+  Qt::CheckState optiTrackSelected = ui->optiTrackCkeckbox->checkState();
+  Qt::CheckState emfTrackSelected = ui->emfTrackCheckbox->checkState();
+  Qt::CheckState steamVrTrackSelected = ui->steamVrCheckbox->checkState();
+  ExportSettings settings = {optiTrackSelected == Qt::Checked, emfTrackSelected == Qt::Checked, steamVrTrackSelected == Qt::Checked};
+  QString fileName = QFileDialog::getSaveFileName(this, tr("Export your TrackpointApp Project"), "", tr("3MF Files (*.3mf)"));
+  std::string exportFile = fileName.toUtf8().constData();
+  MainWindow::getInstance()->getStore()->exportProject(exportFile, settings);
+}

+ 12 - 18
trackpoint-app/src/OpenScadRenderer.cpp

@@ -1,36 +1,30 @@
 // Include own headers
 #include "OpenScadRenderer.hpp"
 
+// Include modules
+#include "PlatformSupport.hpp"
+
 // Include dependencies
 #include <iostream>
 #include <fstream>
-#include <sstream>
 
 const char* openScadBase =
   "$fn = 100;\n"
-  "module optiTrackPointBase(translation, rotation) {\n"
-  "translate(translation) rotate(rotation) cylinder(10, 1, 1, false);\n"
+  "module optiTrackPointBase(translation, rotation, length, radius) {\n"
+  "translate(translation) rotate(rotation) cylinder(length, radius, radius, false);\n"
   "}\n";
 
-#if __APPLE__
-  std::string openScadPath = "/Applications/OpenSCAD.app/Contents/MacOS/OpenSCAD";
-#elif __unix__
-  std::string openScadPath = "openscad";
-#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__) || defined(_WIN64)
-  // Currently unsupported
-#endif
-
-void OpenScadRenderer::render(std::vector<TrackPoint*> points) {
+void OpenScadRenderer::renderOptiTrack(std::vector<OptiTrackPoint*> points) {
   std::ofstream scadFile;
-  scadFile.open("/tmp/output.scad");
+  scadFile.open(std::filesystem::temp_directory_path().u8string() + fileDelimiter + "trackpointapp_export_optitrack.scad");
   scadFile << openScadBase;
-  scadFile << "import(\"testbutton.stl\");\n";
-  for (TrackPoint* point: points) {
+  scadFile << "import(\"trackpointapp_export.3mf\");\n";
+  for (OptiTrackPoint* point: points) {
     osg::Vec3 translation = point->getTranslation();
     osg::Vec3 rotation = point->getRotation();
-    scadFile << "optiTrackPointBase([" << translation.x() << "," << translation.y() << "," << translation.z() << "], [" << rotation.x() << "," << rotation.y() << "," << rotation.z() << "]);\n";
+    scadFile << "optiTrackPointBase([" << translation.x() << "," << translation.y() << "," << translation.z() << "], [" << rotation.x() << "," << rotation.y() << "," << rotation.z() << "], " << point->getLength() << ", " << point->getRadius() << ");\n";
   }
   scadFile.close();
-  //std::string command = openScadPath + " -o " + std::filesystem::temp_directory_path() + "/output.3mf " + std::filesystem::temp_directory_path() + "/output.scad";
-  //system(command);
+  std::string command = openScadPath + " -o " + std::filesystem::temp_directory_path().u8string() + fileDelimiter + "trackpointapp_render_optitrack.3mf " + std::filesystem::temp_directory_path().u8string() + fileDelimiter + "trackpointapp_export_optitrack.scad";
+  system(command.c_str());
 }

+ 48 - 1
trackpoint-app/src/ProjectStore.cpp

@@ -5,10 +5,12 @@
 #include "MainWindow.hpp"
 #include "StringBasics.hpp"
 #include "TrackPointRenderer.hpp"
+#include "PlatformSupport.hpp"
 
 // Include dependencies
 #include <typeinfo>
 #include <iostream>
+#include <filesystem>
 
 #define META_NAMESPACE "tk-ar-tracking"
 
@@ -65,7 +67,52 @@ bool ProjectStore::saveProject(std::string path) {
 }
 
 bool ProjectStore::exportProject(std::string path, ExportSettings settings) {
-  return false; // TODO
+  OpenScadRenderer* renderer = new OpenScadRenderer();
+  // Base for rendering mesh
+  Lib3MF::PWriter writer = _project->QueryWriter("3mf");
+  writer->WriteToFile(std::filesystem::temp_directory_path().u8string() + fileDelimiter + "trackpointapp_export.3mf");
+  // Export file
+  Lib3MF::PModel exportModel = _wrapper->CreateModel();
+  Lib3MF::PMetaDataGroup metaData = exportModel->GetMetaDataGroup();
+  if (settings.OptiTrack) {
+    renderer->renderOptiTrack(_optiTrackPoints);
+    Lib3MF::PModel optiTrackModel = _wrapper->CreateModel();
+    Lib3MF::PReader reader = optiTrackModel->QueryReader("3mf");
+    reader->ReadFromFile(std::filesystem::temp_directory_path().u8string() + fileDelimiter + "trackpointapp_render_optitrack.3mf");
+    Lib3MF::PMeshObjectIterator meshIterator = optiTrackModel->GetMeshObjects();
+    if (meshIterator->Count() != 1) {
+      return false;
+    }
+    meshIterator->MoveNext();
+    Lib3MF::PMeshObject renderedMesh = meshIterator->GetCurrentMeshObject();
+    Lib3MF::PMeshObject exportMesh = exportModel->AddMeshObject();
+    std::vector<Lib3MF::sPosition> verticesBuffer;
+    std::vector<Lib3MF::sTriangle> triangleBuffer;
+    renderedMesh->GetVertices(verticesBuffer);
+    renderedMesh->GetTriangleIndices(triangleBuffer);
+    exportMesh->SetGeometry(verticesBuffer, triangleBuffer);
+    std::vector<std::vector<float>> pointsList;
+    for (OptiTrackPoint* point: _optiTrackPoints) {
+      std::vector<float> pointData;
+      osg::Vec3 trackPoint = point->getTrackPoint();
+      pointData.push_back(trackPoint.x());
+      pointData.push_back(trackPoint.y());
+      pointData.push_back(trackPoint.z());
+      pointsList.push_back(pointData);
+    }
+    json trackpointData = pointsList;
+    metaData->AddMetaData("tk-ar-tracking", "trackpoints-optitrack", trackpointData.dump(), "string", true);
+  }
+  if (settings.EMFTrack) {
+
+  }
+  if (settings.SteamVRTrack) {
+
+  }
+  delete renderer;
+  Lib3MF::PWriter exportWriter = exportModel->QueryWriter("3mf");
+  exportWriter->WriteToFile(path);
+  return true;
 }
 
 void ProjectStore::updateNormalModifier(osg::Vec3 modifier) {

+ 0 - 34
trackpoint-app/src/ThreeMFWriter.cpp

@@ -1,34 +0,0 @@
-// Include own headers
-#include "ThreeMFWriter.hpp"
-
-ThreeMFWriter::ThreeMFWriter() {
-  _wrapper = Lib3MF::CWrapper::loadLibrary();
-}
-
-void ThreeMFWriter::writeTrackPoints(std::vector<TrackPoint*> points, std::string path) {
-  // Load the file created by OpenSCAD
-  Lib3MF::PModel model = _wrapper->CreateModel();
-  Lib3MF::PReader reader = model->QueryReader("3mf");
-  reader->ReadFromFile("/tmp/output.3mf");
-
-  Lib3MF::PMetaDataGroup metaData = model->GetMetaDataGroup();
-
-  json trackpointData;
-  std::vector<std::vector<float>> pointsList;
-  for (TrackPoint* point: points) {
-    std::vector<float> pointData;
-    osg::Vec3 trackPoint = point->getTrackPoint();
-    pointData.push_back(trackPoint.x());
-    pointData.push_back(trackPoint.y());
-    pointData.push_back(trackPoint.z());
-    pointsList.push_back(pointData);
-  }
-  trackpointData["trackpoints"] = {
-    {"tracking-system", "optitrack"},
-    {"trackpoints", pointsList}
-  };
-  metaData->AddMetaData("tk-ar-tracking", "trackpoints", trackpointData.dump(), "string", true);
-
-  Lib3MF::PWriter writer = model->QueryWriter("3mf");
-  writer->WriteToFile(path);
-}

+ 4 - 0
trackpoint-app/src/TrackPoint.cpp

@@ -47,3 +47,7 @@ osg::Vec3 TrackPoint::getNormal() {
 osg::Vec3 TrackPoint::getNormalModifier() {
   return _normalModifier;
 }
+
+osg::Vec3 TrackPoint::getTrackPoint() {
+  return _trackOrigin;
+}