Xinqi Bao's Git

XbSlicer, re-organized the entire project
[XbSlicer.git] / src / Slicer.cc
1 #include "Slicer.hh"
2
3 #include <fstream>
4
5 #include "BufferWrite.hh"
6 #include "Slicing.hh"
7 using namespace std;
8
9 void Slicer::slicing()
10 {
11 double zmax = stl.getZmax();
12 double zmin = stl.getZmin();
13 numLayer = (zmax - zmin - zStart) / zgap + 1;
14 layers.reserve(numLayer);
15 checkLayers = new bool[numLayer];
16 for (int i = 0; i < numLayer; i++) checkLayers[i] = false;
17 for (double z = zmin + zStart; z < zmax; z += zgap)
18 {
19 layers.push_back(Layer(z));
20 }
21 cout << finishedCount << "/" << numLayer;
22 for (int i = 0; i < NUM_THREADS; i++)
23 {
24 threads[i] = thread(&Slicer::threadLayer, this);
25 }
26 for (int i = 0; i < NUM_THREADS; i++)
27 {
28 threads[i].join();
29 }
30 cout << "\nWriting...";
31 #if 0 // Write to gcode file directly
32 ofstream f(gcode_target, ios_base::out | ios_base::app);
33 for (const auto& layer : layers)
34 layer.commandsOut(f);
35 #endif
36 #if 1 // Write to writing buffer
37 BufferWrite buffer(gcode_target);
38 for (const auto& layer : layers) layer.commandsOut(buffer);
39 buffer.flush();
40 #endif
41 cout << "\nDone!\n";
42 }
43
44 // mult-threads management function
45 void Slicer::threadLayer()
46 {
47 for (int index = 0; index < numLayer; index++)
48 {
49 checkMutex.lock();
50 if (checkLayers[index])
51 {
52 checkMutex.unlock();
53 continue;
54 }
55 checkLayers[index] = true;
56 checkMutex.unlock();
57
58 Slicing cl(stl, layers[index]);
59
60 countMutex.lock();
61 finishedCount++;
62 cout << "\r" << finishedCount << "/" << numLayer;
63 countMutex.unlock();
64 }
65 }
66
67 Slicer::Slicer(std::string& filename) : Slicer(filename.c_str()) {}
68
69 Slicer::Slicer(const char* filename)
70 {
71 #if 0 // Make directory for Windows
72 _mkdir(gcode_filePath.c_str()); //make directory for storing gcode
73 #endif
74 #if 1
75 std::string mkdir = "mkdir -p ";
76 int res = system(mkdir.append(gcode_filePath.c_str()).c_str());
77 #endif
78
79 // TODO: STL file extensions: .stl, .stlb, .bif.
80 // This can work for .stl and .stlb, but not good.
81 int extensionLen = 3;
82 bool isBinary;
83 if (filename[strlen(filename) - 1] == 'b')
84 {
85 isBinary = true;
86 extensionLen++;
87 }
88 else
89 isBinary = false;
90
91 // change the file extension from ".stl" to ".gcode"
92 stl_target = stl_filePath;
93 stl_target.append(filename);
94 gcode_target = gcode_filePath;
95 gcode_target.append(filename, strlen(filename) - extensionLen);
96 gcode_target.append("gcode");
97 remove(gcode_target.c_str()); // remove old gcode file
98 std::cout << "\tFile: " << filename << "\nReading...";
99 std::cout << "\nNumber of triangles: " << stl.read(stl_target, isBinary);
100 std::cout << "\nRead finish\n";
101 }