Browse Source

Store update, some cross platform improvements

Johannes Kreutz 3 năm trước cách đây
mục cha
commit
2e507c1e8c

+ 18 - 2
trackpoint-app/include/ProjectStore.hpp

@@ -1,24 +1,40 @@
 #pragma once
 
 #include "lib3mf_implicit.hpp"
+#include "OptiTrackPoint.hpp"
 
 #include <string>
 
+typedef struct {
+  bool OptiTrack;
+  bool EMFTrack;
+  bool SteamVRTrack;
+} ExportSettings;
+
 class ProjectStore {
 public:
   // Create an empty project
   ProjectStore();
-  // Load an existing project
-  ProjectStore(std::string projectFile);
   // Destructor
   ~ProjectStore();
   // Load a mesh
   void loadMesh(std::string meshFile);
+  // Load a project
+  bool loadProject(std::string projectFile);
+  // Save the project to the loaded file
+  bool saveProject();
+  // Save the project to a new file
+  bool saveProject(std::string projectFile);
+  // Export the project
+  bool exportProject(std::string path, ExportSettings settings);
 
 private:
   bool projectLoaded;
   Lib3MF::PWrapper _wrapper;
   Lib3MF::PModel _project;
+  std::string _projectFile;
+  std::vector<OptiTrackPoint> _optiTrackPoints;
   void load3mfLib();
   void render3MFMesh(const std::vector<Lib3MF::sPosition> verticesBuffer, const std::vector<Lib3MF::sTriangle> triangleBuffer);
+  void exportMetaData();
 };

+ 11 - 1
trackpoint-app/src/OpenScadRenderer.cpp

@@ -4,6 +4,7 @@
 // Include dependencies
 #include <iostream>
 #include <fstream>
+#include <sstream>
 
 const char* openScadBase =
   "$fn = 100;\n"
@@ -11,6 +12,14 @@ const char* openScadBase =
   "translate(translation) rotate(rotation) cylinder(10, 1, 1, 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) {
   std::ofstream scadFile;
   scadFile.open("/tmp/output.scad");
@@ -22,5 +31,6 @@ void OpenScadRenderer::render(std::vector<TrackPoint*> points) {
     scadFile << "optiTrackPointBase([" << translation.x() << "," << translation.y() << "," << translation.z() << "], [" << rotation.x() << "," << rotation.y() << "," << rotation.z() << "]);\n";
   }
   scadFile.close();
-  system("openscad -o /tmp/output.3mf /tmp/output.scad");
+  //std::string command = openScadPath + " -o " + std::filesystem::temp_directory_path() + "/output.3mf " + std::filesystem::temp_directory_path() + "/output.scad";
+  //system(command);
 }

+ 35 - 7
trackpoint-app/src/ProjectStore.cpp

@@ -13,10 +13,6 @@ ProjectStore::ProjectStore() {
   load3mfLib();
 }
 
-ProjectStore::ProjectStore(std::string projectFile) {
-
-}
-
 ProjectStore::~ProjectStore() {
 
 }
@@ -25,8 +21,7 @@ void ProjectStore::loadMesh(std::string meshFile) {
   if (StringBasics::endsWithCaseInsensitive(meshFile, ".STL")) {
     printf("Currently unsupported.\n");
   } else if (StringBasics::endsWithCaseInsensitive(meshFile, ".3MF")) {
-    // Create new project model (because we don't have one if we load a mesh)
-    _project = _wrapper->CreateModel();
+    projectLoaded = true;
     // Read 3MF file
     Lib3MF::PReader reader = _project->QueryReader("3mf");
     reader->ReadFromFile(meshFile);
@@ -52,8 +47,38 @@ void ProjectStore::loadMesh(std::string meshFile) {
   }
 }
 
+bool ProjectStore::loadProject(std::string projectFile) {
+  if (!projectLoaded) {
+    Lib3MF::PReader reader = _project->QueryReader("3mf");
+    reader->ReadFromFile(projectFile);
+    projectLoaded = true;
+    return true;
+  }
+  return false;
+}
+
+bool ProjectStore::saveProject() {
+  if (_projectFile != "") {
+    Lib3MF::PWriter writer = _project->QueryWriter("3mf");
+    writer->WriteToFile(_projectFile);
+    return true;
+  }
+  return false;
+}
+
+bool ProjectStore::saveProject(std::string path) {
+  Lib3MF::PWriter writer = _project->QueryWriter("3mf");
+  writer->WriteToFile(path);
+  return true;
+}
+
+bool ProjectStore::exportProject(std::string path, ExportSettings settings) {
+  return false; // TODO
+}
+
 void ProjectStore::load3mfLib() {
   _wrapper = Lib3MF::CWrapper::loadLibrary();
+  _project = _wrapper->CreateModel();
 }
 
 void ProjectStore::render3MFMesh(const std::vector<Lib3MF::sPosition> verticesBuffer, const std::vector<Lib3MF::sTriangle> triangleBuffer) {
@@ -74,7 +99,6 @@ void ProjectStore::render3MFMesh(const std::vector<Lib3MF::sPosition> verticesBu
     normal.normalize();
     // Store them
     for (int i = 0; i < 3; i++) {
-      printf("%f %f %f\n", vertex[i].x(), vertex[i].y(), vertex[i].z());
       vertices->push_back(vertex[i]);
       normals->push_back(normal);
     }
@@ -83,3 +107,7 @@ void ProjectStore::render3MFMesh(const std::vector<Lib3MF::sPosition> verticesBu
   MainWindow* mainWindow = MainWindow::getInstance();
   mainWindow->getOsgWidget()->renderBaseMesh(vertices, normals);
 }
+
+void ProjectStore::exportMetaData() {
+
+}