OpenScadRenderer.cpp 2.9 KB

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