1 //Copyright (c) 2019 Ultimaker B.V.
2 //CuraEngine is released under the terms of the AGPLv3 or higher.
3 
4 #include "Application.h"
5 #include "FffProcessor.h" //To start a slice.
6 #include "Scene.h"
7 #include "sliceDataStorage.h"
8 #include "Weaver.h"
9 #include "Wireframe2gcode.h"
10 #include "communication/Communication.h" //To flush g-code and layer view when we're done.
11 #include "progress/Progress.h"
12 #include "utils/logoutput.h"
13 
14 namespace cura
15 {
16 
Scene(const size_t num_mesh_groups)17 Scene::Scene(const size_t num_mesh_groups)
18 : mesh_groups(num_mesh_groups)
19 , current_mesh_group(mesh_groups.begin())
20 {
21     for (MeshGroup& mesh_group : mesh_groups)
22     {
23         mesh_group.settings.setParent(&settings);
24     }
25 }
26 
getAllSettingsString() const27 const std::string Scene::getAllSettingsString() const
28 {
29     std::stringstream output;
30     output << settings.getAllSettingsString(); //Global settings.
31 
32     //Per-extruder settings.
33     for (size_t extruder_nr = 0; extruder_nr < extruders.size(); extruder_nr++)
34     {
35         output << " -e" << extruder_nr << extruders[extruder_nr].settings.getAllSettingsString();
36     }
37 
38     for (size_t mesh_group_index = 0; mesh_group_index < mesh_groups.size(); mesh_group_index++)
39     {
40         if (mesh_group_index == 0)
41         {
42             output << " -g";
43         }
44         else
45         {
46             output << " --next";
47         }
48 
49         //Per-mesh-group settings.
50         const MeshGroup& mesh_group = mesh_groups[mesh_group_index];
51         output << mesh_group.settings.getAllSettingsString();
52 
53         //Per-object settings.
54         for (size_t mesh_index = 0; mesh_index < mesh_group.meshes.size(); mesh_index++)
55         {
56             const Mesh& mesh = mesh_group.meshes[mesh_index];
57             output << " -e" << mesh.settings.get<size_t>("extruder_nr") << " -l \"" << mesh_index << "\"" << mesh.settings.getAllSettingsString();
58         }
59     }
60     output << "\n";
61 
62     return output.str();
63 }
64 
processMeshGroup(MeshGroup & mesh_group)65 void Scene::processMeshGroup(MeshGroup& mesh_group)
66 {
67     FffProcessor* fff_processor = FffProcessor::getInstance();
68     fff_processor->time_keeper.restart();
69 
70     TimeKeeper time_keeper_total;
71 
72     bool empty = true;
73     for (Mesh& mesh : mesh_group.meshes)
74     {
75         if (!mesh.settings.get<bool>("infill_mesh") && !mesh.settings.get<bool>("anti_overhang_mesh"))
76         {
77             empty = false;
78             break;
79         }
80     }
81     if (empty)
82     {
83         Progress::messageProgress(Progress::Stage::FINISH, 1, 1); // 100% on this meshgroup
84         log("Total time elapsed %5.2fs.\n", time_keeper_total.restart());
85         return;
86     }
87 
88     if (mesh_group.settings.get<bool>("wireframe_enabled"))
89     {
90         log("Starting Neith Weaver...\n");
91 
92         Weaver weaver;
93         weaver.weave(&mesh_group);
94 
95         log("Starting Neith Gcode generation...\n");
96         Wireframe2gcode gcoder(weaver, fff_processor->gcode_writer.gcode);
97         gcoder.writeGCode();
98         log("Finished Neith Gcode generation...\n");
99     }
100     else //Normal operation (not wireframe).
101     {
102         SliceDataStorage storage;
103 
104         if (!fff_processor->polygon_generator.generateAreas(storage, &mesh_group, fff_processor->time_keeper))
105         {
106             return;
107         }
108 
109         Progress::messageProgressStage(Progress::Stage::EXPORT, &fff_processor->time_keeper);
110         fff_processor->gcode_writer.writeGCode(storage, fff_processor->time_keeper);
111     }
112 
113     Progress::messageProgress(Progress::Stage::FINISH, 1, 1); // 100% on this meshgroup
114     Application::getInstance().communication->flushGCode();
115     Application::getInstance().communication->sendOptimizedLayerData();
116     log("Total time elapsed %5.2fs.\n", time_keeper_total.restart());
117 }
118 
119 } //namespace cura