mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-30 20:21:12 -06:00 
			
		
		
		
	Added calculation of the material consumption
This commit is contained in:
		
							parent
							
								
									589ac889a3
								
							
						
					
					
						commit
						88f04e0fae
					
				
					 3 changed files with 64 additions and 13 deletions
				
			
		|  | @ -1033,16 +1033,52 @@ bool SLAPrint::invalidate_state_by_config_options(const std::vector<t_config_opt | |||
| 
 | ||||
| void SLAPrint::fill_statistics() | ||||
| { | ||||
|     float supports_volume = 0.0; | ||||
|     float models_volume = 0.0; | ||||
| 
 | ||||
|     int max_layers_cnt = 0; | ||||
| 
 | ||||
|     const float init_layer_height = m_material_config.initial_layer_height.getFloat(); | ||||
|     const float layer_height = m_default_object_config.layer_height.getFloat(); | ||||
| 
 | ||||
|     // Used material
 | ||||
|     for (SLAPrintObject * po : m_objects) { | ||||
|         // Calculate full volume of the supports (+pad) 
 | ||||
|         for (const ExPolygons& polygons : po->get_support_slices()) | ||||
|             for (const ExPolygon& polygon : polygons) | ||||
|                 supports_volume += polygon.area() *layer_height; | ||||
| 
 | ||||
|         // Calculate full volume of the object 
 | ||||
|         for (const ExPolygons& polygons : po->get_model_slices()) | ||||
|             for (const ExPolygon& polygon : polygons) | ||||
|                 models_volume += polygon.area() *layer_height; | ||||
| 
 | ||||
|         const SLAPrintObject::SliceIndex& slice_index = po->get_slice_index(); | ||||
| 
 | ||||
|         // If init_layer_height isn't equivalent to the layer_height,
 | ||||
|         // let correct volume of the first(initial) layer
 | ||||
|         if (init_layer_height != layer_height)  | ||||
|         { | ||||
|             const auto index = slice_index.begin(); | ||||
|             if (index->second.support_slices_idx != SLAPrintObject::SliceRecord::NONE) | ||||
|                 for (const ExPolygon& polygon : po->get_support_slices().front()) | ||||
|                     supports_volume += polygon.area() *(init_layer_height - layer_height); | ||||
|             if (index->second.model_slices_idx != SLAPrintObject::SliceRecord::NONE) | ||||
|                 for (const ExPolygon& polygon : po->get_model_slices().front()) | ||||
|                     models_volume += polygon.area() *(init_layer_height - layer_height); | ||||
|         } | ||||
| 
 | ||||
|         if (max_layers_cnt < slice_index.size()) | ||||
|             max_layers_cnt = slice_index.size(); | ||||
|     } | ||||
| 
 | ||||
|     m_print_statistics.support_used_material = supports_volume * SCALING_FACTOR * SCALING_FACTOR; | ||||
|     m_print_statistics.objects_used_material = models_volume  * SCALING_FACTOR * SCALING_FACTOR; | ||||
| 
 | ||||
|     // Estimated printing time
 | ||||
|     // A layers count o the highest object 
 | ||||
|     int max_layers_cnt = 0; | ||||
|     for (SLAPrintObject * po : m_objects) { | ||||
|         if (max_layers_cnt < po->get_slice_index().size()) | ||||
|             max_layers_cnt = po->get_slice_index().size(); | ||||
|     } | ||||
|     if (max_layers_cnt == 0) | ||||
|         return; | ||||
| 
 | ||||
|         m_print_statistics.estimated_print_time = "N/A"; | ||||
|     float init_exp_time = m_material_config.initial_exposure_time.getFloat();//35;
 | ||||
|     float exp_time = m_material_config.exposure_time.getFloat();//8;
 | ||||
| 
 | ||||
|  | @ -1308,7 +1344,8 @@ DynamicConfig SLAPrintStatistics::config() const | |||
|     DynamicConfig config; | ||||
|     const std::string print_time = Slic3r::short_time(this->estimated_print_time); | ||||
|     config.set_key_value("print_time", new ConfigOptionString(print_time)); | ||||
|     config.set_key_value("used_material", new ConfigOptionFloat(this->total_used_material/* / 1000.*/)); | ||||
|     config.set_key_value("objects_used_material", new ConfigOptionFloat(this->objects_used_material)); | ||||
|     config.set_key_value("support_used_material", new ConfigOptionFloat(this->support_used_material)); | ||||
|     config.set_key_value("total_cost", new ConfigOptionFloat(this->total_cost)); | ||||
|     config.set_key_value("total_weight", new ConfigOptionFloat(this->total_weight)); | ||||
|     return config; | ||||
|  | @ -1318,7 +1355,8 @@ DynamicConfig SLAPrintStatistics::placeholders() | |||
| { | ||||
|     DynamicConfig config; | ||||
|     for (const std::string &key : { | ||||
|         "print_time", "used_material", "total_cost", "total_weight" }) | ||||
|         "print_time", "total_cost", "total_weight", | ||||
|         "objects_used_material", "support_used_material" }) | ||||
|         config.set_key_value(key, new ConfigOptionString(std::string("{") + key + "}")); | ||||
|         return config; | ||||
| } | ||||
|  |  | |||
|  | @ -175,7 +175,8 @@ struct SLAPrintStatistics | |||
| { | ||||
|     SLAPrintStatistics() { clear(); } | ||||
|     std::string                     estimated_print_time; | ||||
|     double                          total_used_material; | ||||
|     double                          objects_used_material; | ||||
|     double                          support_used_material; | ||||
|     double                          total_cost; | ||||
|     double                          total_weight; | ||||
| 
 | ||||
|  | @ -188,7 +189,8 @@ struct SLAPrintStatistics | |||
| 
 | ||||
|     void clear() { | ||||
|         estimated_print_time.clear(); | ||||
|         total_used_material = 0.; | ||||
|         objects_used_material = 0.; | ||||
|         support_used_material = 0.; | ||||
|         total_cost = 0.; | ||||
|         total_weight = 0.; | ||||
|     } | ||||
|  |  | |||
|  | @ -822,8 +822,19 @@ void Sidebar::show_sliced_info_sizer(const bool show) | |||
|         if (p->plater->printer_technology() == ptSLA) | ||||
|         { | ||||
|             const SLAPrintStatistics& ps = p->plater->sla_print().print_statistics(); | ||||
|             p->sliced_info->SetTextAndShow(siMateril_unit, wxString::Format("%.2f", ps.total_used_material)); | ||||
|             p->sliced_info->SetTextAndShow(siCost, wxString::Format("%.2f", ps.total_cost)); | ||||
|             wxString new_label = _(L("Used Material (mm³)")) + " :"; | ||||
|             const bool is_supports = ps.support_used_material > 0.0; | ||||
|             if (is_supports) | ||||
|                 new_label += wxString::Format("\n    - %s\n    - %s", _(L("object(s)")), _(L("supports and pad"))); | ||||
| 
 | ||||
|             wxString info_text = is_supports ? | ||||
|                 wxString::Format("%.2f \n%.2f \n%.2f", ps.objects_used_material + ps.support_used_material/* / 1000*/, | ||||
|                                                        ps.objects_used_material/* / 1000*/, | ||||
|                                                        ps.support_used_material/* / 1000*/) : | ||||
|                 wxString::Format("%.2f", ps.objects_used_material + ps.support_used_material/* / 1000*/); | ||||
|             p->sliced_info->SetTextAndShow(siMateril_unit, info_text, new_label); | ||||
| 
 | ||||
|             p->sliced_info->SetTextAndShow(siCost, "N/A"/*wxString::Format("%.2f", ps.total_cost)*/); | ||||
|             p->sliced_info->SetTextAndShow(siEstimatedTime, ps.estimated_print_time, _(L("Estimated printing time")) + " :"); | ||||
| 
 | ||||
|             // Hide non-SLA sliced info parameters
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 YuSanka
						YuSanka