OpenScadRenderer.cpp 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. // Include own headers
  2. #include "OpenScadRenderer.hpp"
  3. // Include modules
  4. #include "PlatformSupport.hpp"
  5. #include "scad.hpp"
  6. // Include dependencies
  7. #include <iostream>
  8. #include <fstream>
  9. #include <filesystem>
  10. #include <cstdio>
  11. #include <memory>
  12. #include <stdexcept>
  13. #include <string>
  14. #include <array>
  15. const char* openScadBase =
  16. "$fn = 100;\n"
  17. "use <threads.scad>\n"
  18. "module optiTrackPointBase(translation, rotation, length, radius) {\n"
  19. "translate(translation) rotate(rotation) cylinder(length, radius, radius, false);\n"
  20. "}\n"
  21. "module steamVrTrackPointBase(translation, rotation, length) {\n"
  22. "translate(translation) rotate(rotation) {\n"
  23. "cylinder(length, 3.5, 3.5, false);\n"
  24. "translate([0, 0, length]) english_thread(diameter=1/4, threads_per_inch=20, length=0.393701);\n"
  25. "}\n"
  26. "}\n";
  27. bool OpenScadRenderer::openScadAvailable() {
  28. std::string path = openScadPath + " -v";
  29. int result = system(path.c_str());
  30. return result == 0;
  31. }
  32. void OpenScadRenderer::renderOptiTrack(std::vector<OptiTrackPoint*> points) {
  33. std::ofstream scadFile;
  34. scadFile.open(std::filesystem::temp_directory_path().u8string() + fileDelimiter + "trackpointapp_export_optitrack.scad");
  35. scadFile << openScadBase;
  36. scadFile << "import(\"trackpointapp_export.3mf\");\n";
  37. for (OptiTrackPoint* point: points) {
  38. osg::Vec3 translation = point->getTranslation();
  39. osg::Vec3 rotation = point->getRotation();
  40. scadFile << "optiTrackPointBase([" << translation.x() << "," << translation.y() << "," << translation.z() << "], [" << rotation.x() << "," << rotation.y() << "," << rotation.z() << "], " << point->getLength() << ", " << point->getRadius() << ");\n";
  41. }
  42. scadFile.close();
  43. 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";
  44. system(command.c_str());
  45. }
  46. void OpenScadRenderer::renderSteamVRTrack(std::vector<SteamVRTrackPoint*> points) {
  47. enableSteamvrThread();
  48. std::ofstream scadFile;
  49. scadFile.open(std::filesystem::temp_directory_path().u8string() + fileDelimiter + "trackpointapp_export_steamvrtrack.scad");
  50. scadFile << openScadBase;
  51. scadFile << "import(\"trackpointapp_export.3mf\");\n";
  52. for (SteamVRTrackPoint* point: points) {
  53. osg::Vec3 translation = point->getTranslation();
  54. osg::Vec3 rotation = point->getRotation();
  55. scadFile << "steamVrTrackPointBase([" << translation.x() << "," << translation.y() << "," << translation.z() << "], [" << rotation.x() << "," << rotation.y() << "," << rotation.z() << "], " << point->getLength() << ");\n";
  56. }
  57. scadFile.close();
  58. std::string command = openScadPath + " -o " + std::filesystem::temp_directory_path().u8string() + fileDelimiter + "trackpointapp_render_steamvrtrack.3mf " + std::filesystem::temp_directory_path().u8string() + fileDelimiter + "trackpointapp_export_steamvrtrack.scad";
  59. system(command.c_str());
  60. }
  61. void OpenScadRenderer::enableSteamvrThread() {
  62. std::ofstream resourceFile;
  63. resourceFile.open(std::filesystem::temp_directory_path().u8string() + fileDelimiter + "threads.scad");
  64. resourceFile << threads_SCAD;
  65. resourceFile.close();
  66. }