ProjectStore.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. // Include own headers
  2. #include "ProjectStore.hpp"
  3. // Include modules
  4. #include "MainWindow.hpp"
  5. #include "StringBasics.hpp"
  6. #include <typeinfo>
  7. #include <iostream>
  8. ProjectStore::ProjectStore() {
  9. projectLoaded = false;
  10. load3mfLib();
  11. }
  12. ProjectStore::~ProjectStore() {
  13. }
  14. void ProjectStore::loadMesh(std::string meshFile) {
  15. if (StringBasics::endsWithCaseInsensitive(meshFile, ".STL")) {
  16. printf("Currently unsupported.\n");
  17. } else if (StringBasics::endsWithCaseInsensitive(meshFile, ".3MF")) {
  18. projectLoaded = true;
  19. // Read 3MF file
  20. Lib3MF::PReader reader = _project->QueryReader("3mf");
  21. reader->ReadFromFile(meshFile);
  22. // Get meshes
  23. Lib3MF::PMeshObjectIterator meshIterator = _project->GetMeshObjects();
  24. // Our use case supports just a single mesh per project
  25. if (meshIterator->Count() != 1) {
  26. // TODO: Show error popup
  27. printf("Not 1 mesh: %llu\n", meshIterator->Count());
  28. return;
  29. }
  30. meshIterator->MoveNext();
  31. Lib3MF::PMeshObject mesh = meshIterator->GetCurrentMeshObject();
  32. // Load vertices and triangles and render them
  33. std::vector<Lib3MF::sPosition> verticesBuffer;
  34. mesh->GetVertices(verticesBuffer);
  35. std::vector<Lib3MF::sTriangle> triangleBuffer;
  36. mesh->GetTriangleIndices(triangleBuffer);
  37. render3MFMesh(verticesBuffer, triangleBuffer);
  38. } else {
  39. // TODO: Show error popup
  40. printf("Unsupported file type.\n");
  41. }
  42. }
  43. bool ProjectStore::loadProject(std::string projectFile) {
  44. if (!projectLoaded) {
  45. Lib3MF::PReader reader = _project->QueryReader("3mf");
  46. reader->ReadFromFile(projectFile);
  47. projectLoaded = true;
  48. return true;
  49. }
  50. return false;
  51. }
  52. bool ProjectStore::saveProject() {
  53. if (_projectFile != "") {
  54. Lib3MF::PWriter writer = _project->QueryWriter("3mf");
  55. writer->WriteToFile(_projectFile);
  56. return true;
  57. }
  58. return false;
  59. }
  60. bool ProjectStore::saveProject(std::string path) {
  61. Lib3MF::PWriter writer = _project->QueryWriter("3mf");
  62. writer->WriteToFile(path);
  63. return true;
  64. }
  65. bool ProjectStore::exportProject(std::string path, ExportSettings settings) {
  66. return false; // TODO
  67. }
  68. void ProjectStore::load3mfLib() {
  69. _wrapper = Lib3MF::CWrapper::loadLibrary();
  70. _project = _wrapper->CreateModel();
  71. }
  72. void ProjectStore::render3MFMesh(const std::vector<Lib3MF::sPosition> verticesBuffer, const std::vector<Lib3MF::sTriangle> triangleBuffer) {
  73. // Create osg style arrays
  74. osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array;
  75. osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array;
  76. // Convert data to osg format and calculate vertex normals
  77. for (const Lib3MF::sTriangle triangle: triangleBuffer) {
  78. // Create osg vectors
  79. osg::Vec3 vertex[3] = {};
  80. for (char i = 0; i < 3; i++) {
  81. vertex[i] = osg::Vec3(verticesBuffer[triangle.m_Indices[i]].m_Coordinates[0], verticesBuffer[triangle.m_Indices[i]].m_Coordinates[1], verticesBuffer[triangle.m_Indices[i]].m_Coordinates[2]);
  82. }
  83. // Calculate normal
  84. osg::Vec3 edgeOne = vertex[1].operator-(vertex[0]);
  85. osg::Vec3 edgeTwo = vertex[2].operator-(vertex[0]);
  86. osg::Vec3 normal = edgeOne.operator^(edgeTwo);
  87. normal.normalize();
  88. // Store them
  89. for (int i = 0; i < 3; i++) {
  90. vertices->push_back(vertex[i]);
  91. normals->push_back(normal);
  92. }
  93. }
  94. // Call renderer
  95. MainWindow* mainWindow = MainWindow::getInstance();
  96. mainWindow->getOsgWidget()->renderBaseMesh(vertices, normals);
  97. }
  98. void ProjectStore::exportMetaData() {
  99. }