mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-30 20:21:12 -06:00 
			
		
		
		
	GCodeProcessor collects positions of line ends for GCodeViewer,
GCodeViewer no more parses G-code just to extract line end positions. Removed start_mapping_gcode_window(), void stop_mapping_gcode_window(), they are no more needed.
This commit is contained in:
		
							parent
							
								
									719c91514b
								
							
						
					
					
						commit
						32733b7db9
					
				
					 9 changed files with 30 additions and 92 deletions
				
			
		|  | @ -354,7 +354,7 @@ struct FilePtr { | |||
|     FILE* f = nullptr; | ||||
| }; | ||||
| 
 | ||||
| void GCodeProcessor::TimeProcessor::post_process(const std::string& filename, std::vector<MoveVertex>& moves) | ||||
| void GCodeProcessor::TimeProcessor::post_process(const std::string& filename, std::vector<MoveVertex>& moves, std::vector<size_t>& lines_ends) | ||||
| { | ||||
|     FilePtr in{ boost::nowide::fopen(filename.c_str(), "rb") }; | ||||
|     if (in.f == nullptr) | ||||
|  | @ -567,13 +567,19 @@ void GCodeProcessor::TimeProcessor::post_process(const std::string& filename, st | |||
|     }; | ||||
| 
 | ||||
|     // helper function to write to disk
 | ||||
|     auto write_string = [&export_line, &out, &out_path](const std::string& str) { | ||||
|     size_t out_file_pos = 0; | ||||
|     lines_ends.clear(); | ||||
|     auto write_string = [&export_line, &out, &out_path, &out_file_pos, &lines_ends](const std::string& str) { | ||||
|         fwrite((const void*)export_line.c_str(), 1, export_line.length(), out.f); | ||||
|         if (ferror(out.f)) { | ||||
|             out.close(); | ||||
|             boost::nowide::remove(out_path.c_str()); | ||||
|             throw Slic3r::RuntimeError(std::string("Time estimator post process export failed.\nIs the disk full?\n")); | ||||
|         } | ||||
|         for (size_t i = 0; i < export_line.size(); ++ i) | ||||
|             if (export_line[i] == '\n') | ||||
|                 lines_ends.emplace_back(out_file_pos + i + 1); | ||||
|         out_file_pos += export_line.size(); | ||||
|         export_line.clear(); | ||||
|     }; | ||||
| 
 | ||||
|  | @ -736,7 +742,9 @@ void GCodeProcessor::Result::reset() { | |||
| } | ||||
| #else | ||||
| void GCodeProcessor::Result::reset() { | ||||
|     moves = std::vector<GCodeProcessor::MoveVertex>(); | ||||
| 
 | ||||
|     moves.clear(); | ||||
|     lines_ends.clear(); | ||||
|     bed_shape = Pointfs(); | ||||
|     settings_ids.reset(); | ||||
|     extruders_count = 0; | ||||
|  | @ -1270,7 +1278,7 @@ void GCodeProcessor::process_file(const std::string& filename, bool apply_postpr | |||
| 
 | ||||
|     // post-process to add M73 lines into the gcode
 | ||||
|     if (apply_postprocess) | ||||
|         m_time_processor.post_process(filename, m_result.moves); | ||||
|         m_time_processor.post_process(filename, m_result.moves, m_result.lines_ends); | ||||
| 
 | ||||
| #if ENABLE_GCODE_VIEWER_DATA_CHECKING | ||||
|     std::cout << "\n"; | ||||
|  |  | |||
|  | @ -306,7 +306,7 @@ namespace Slic3r { | |||
| 
 | ||||
|             // post process the file with the given filename to add remaining time lines M73
 | ||||
|             // and updates moves' gcode ids accordingly
 | ||||
|             void post_process(const std::string& filename, std::vector<MoveVertex>& moves); | ||||
|             void post_process(const std::string& filename, std::vector<MoveVertex>& moves, std::vector<size_t>& lines_ends); | ||||
|         }; | ||||
| 
 | ||||
|         struct UsedFilaments  // filaments per ColorChange
 | ||||
|  | @ -350,6 +350,8 @@ namespace Slic3r { | |||
|             std::string filename; | ||||
|             unsigned int id; | ||||
|             std::vector<MoveVertex> moves; | ||||
|             // Positions of ends of lines of the final G-code this->filename after TimeProcessor::post_process() finalizes the G-code.
 | ||||
|             std::vector<size_t> lines_ends; | ||||
|             Pointfs bed_shape; | ||||
|             SettingsIds settings_ids; | ||||
|             size_t extruders_count; | ||||
|  |  | |||
|  | @ -574,11 +574,8 @@ Print::ApplyStatus BackgroundSlicingProcess::apply(const Model &model, const Dyn | |||
| 		// Some FFF status was invalidated, and the G-code was not exported yet.
 | ||||
| 		// Let the G-code preview UI know that the final G-code preview is not valid.
 | ||||
| 		// In addition, this early memory deallocation reduces memory footprint.
 | ||||
| 		if (m_gcode_result != nullptr) { | ||||
| 			//FIXME calling platter from here is not a staple of a good architecture.
 | ||||
| 			GUI::wxGetApp().plater()->stop_mapping_gcode_window(); | ||||
| 		if (m_gcode_result != nullptr) | ||||
| 			m_gcode_result->reset(); | ||||
| 		} | ||||
| 	} | ||||
| 	return invalidated; | ||||
| } | ||||
|  |  | |||
|  | @ -284,45 +284,14 @@ void GCodeViewer::SequentialView::Marker::render() const | |||
|     ImGui::PopStyleVar(); | ||||
| } | ||||
| 
 | ||||
| void GCodeViewer::SequentialView::GCodeWindow::load_gcode() | ||||
| void GCodeViewer::SequentialView::GCodeWindow::load_gcode(const std::string& filename, const std::vector<size_t> &lines_ends) | ||||
| { | ||||
|     if (m_filename.empty()) | ||||
|         return; | ||||
| 
 | ||||
|     assert(! m_file.is_open()); | ||||
|     if (m_file.is_open()) | ||||
|         return; | ||||
| 
 | ||||
|     try | ||||
|     { | ||||
|         // generate mapping for accessing data in file by line number
 | ||||
|         boost::nowide::ifstream f(m_filename); | ||||
| 
 | ||||
|         f.seekg(0, f.end); | ||||
|         uint64_t file_length = static_cast<uint64_t>(f.tellg()); | ||||
|         f.seekg(0, f.beg); | ||||
| 
 | ||||
|         std::string line; | ||||
|         uint64_t offset = 0; | ||||
|         while (std::getline(f, line)) { | ||||
|             uint64_t line_length = static_cast<uint64_t>(line.length()); | ||||
|             m_lines_map.push_back({ offset, line_length }); | ||||
|             offset += static_cast<uint64_t>(line_length) + 1; | ||||
|         } | ||||
| 
 | ||||
|         if (offset != file_length) { | ||||
|             // if the final offset does not match with file length, lines are terminated with CR+LF
 | ||||
|             // so update all offsets accordingly
 | ||||
|             for (size_t i = 0; i < m_lines_map.size(); ++i) { | ||||
|                 m_lines_map[i].first += static_cast<uint64_t>(i); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     catch (...) | ||||
|     { | ||||
|         BOOST_LOG_TRIVIAL(error) << "Unable to load data from " << m_filename << ". Cannot show G-code window."; | ||||
|         reset(); | ||||
|         return; | ||||
|     } | ||||
|     m_filename   = filename; | ||||
|     m_lines_ends = std::move(lines_ends); | ||||
| 
 | ||||
|     m_selected_line_id = 0; | ||||
|     m_last_lines_size = 0; | ||||
|  | @ -345,7 +314,9 @@ void GCodeViewer::SequentialView::GCodeWindow::render(float top, float bottom, u | |||
|         ret.reserve(end_id - start_id + 1); | ||||
|         for (uint64_t id = start_id; id <= end_id; ++id) { | ||||
|             // read line from file
 | ||||
|             std::string gline(m_file.data() + m_lines_map[id - 1].first, m_lines_map[id - 1].second); | ||||
|             const size_t start = id == 1 ? 0 : m_lines_ends[id - 2]; | ||||
|             const size_t len   = m_lines_ends[id - 1] - start; | ||||
|             std::string gline(m_file.data() + start, len); | ||||
| 
 | ||||
|             std::string command; | ||||
|             std::string parameters; | ||||
|  | @ -379,7 +350,7 @@ void GCodeViewer::SequentialView::GCodeWindow::render(float top, float bottom, u | |||
|     static const ImVec4 PARAMETERS_COLOR = { 1.0f, 1.0f, 1.0f, 1.0f }; | ||||
|     static const ImVec4 COMMENT_COLOR = { 0.7f, 0.7f, 0.7f, 1.0f }; | ||||
| 
 | ||||
|     if (!m_visible || m_filename.empty() || m_lines_map.empty() || curr_line_id == 0) | ||||
|     if (!m_visible || m_filename.empty() || m_lines_ends.empty() || curr_line_id == 0) | ||||
|         return; | ||||
| 
 | ||||
|     // window height
 | ||||
|  | @ -397,8 +368,8 @@ void GCodeViewer::SequentialView::GCodeWindow::render(float top, float bottom, u | |||
|     const uint64_t half_lines_count = lines_count / 2; | ||||
|     uint64_t start_id = (curr_line_id >= half_lines_count) ? curr_line_id - half_lines_count : 0; | ||||
|     uint64_t end_id = start_id + lines_count - 1; | ||||
|     if (end_id >= static_cast<uint64_t>(m_lines_map.size())) { | ||||
|         end_id = static_cast<uint64_t>(m_lines_map.size()) - 1; | ||||
|     if (end_id >= static_cast<uint64_t>(m_lines_ends.size())) { | ||||
|         end_id = static_cast<uint64_t>(m_lines_ends.size()) - 1; | ||||
|         start_id = end_id - lines_count + 1; | ||||
|     } | ||||
| 
 | ||||
|  | @ -606,8 +577,7 @@ void GCodeViewer::load(const GCodeProcessor::Result& gcode_result, const Print& | |||
|     // release gpu memory, if used
 | ||||
|     reset();  | ||||
| 
 | ||||
|     m_sequential_view.gcode_window.set_filename(gcode_result.filename); | ||||
|     m_sequential_view.gcode_window.load_gcode(); | ||||
|     m_sequential_view.gcode_window.load_gcode(gcode_result.filename, gcode_result.lines_ends); | ||||
| 
 | ||||
| #if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER | ||||
|     if (wxGetApp().is_gcode_viewer()) | ||||
|  | @ -1146,16 +1116,6 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const | |||
|     fclose(fp); | ||||
| } | ||||
| 
 | ||||
| void GCodeViewer::start_mapping_gcode_window() | ||||
| { | ||||
|     m_sequential_view.gcode_window.load_gcode(); | ||||
| } | ||||
| 
 | ||||
| void GCodeViewer::stop_mapping_gcode_window() | ||||
| { | ||||
|     m_sequential_view.gcode_window.stop_mapping_file(); | ||||
| } | ||||
| 
 | ||||
| void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) | ||||
| { | ||||
|     // max index buffer size, in bytes
 | ||||
|  |  | |||
|  | @ -639,18 +639,17 @@ public: | |||
|             std::string m_filename; | ||||
|             boost::iostreams::mapped_file_source m_file; | ||||
|             // map for accessing data in file by line number
 | ||||
|             std::vector<std::pair<uint64_t, uint64_t>> m_lines_map; | ||||
|             std::vector<size_t> m_lines_ends; | ||||
|             // current visible lines
 | ||||
|             std::vector<Line> m_lines; | ||||
| 
 | ||||
|         public: | ||||
|             GCodeWindow() = default; | ||||
|             ~GCodeWindow() { stop_mapping_file(); } | ||||
|             void set_filename(const std::string& filename) { m_filename = filename; } | ||||
|             void load_gcode(); | ||||
|             void load_gcode(const std::string& filename, const std::vector<size_t> &lines_ends); | ||||
|             void reset() { | ||||
|                 stop_mapping_file(); | ||||
|                 m_lines_map.clear(); | ||||
|                 m_lines_ends.clear(); | ||||
|                 m_lines.clear(); | ||||
|                 m_filename.clear(); | ||||
|             } | ||||
|  | @ -777,8 +776,6 @@ public: | |||
| 
 | ||||
|     void export_toolpaths_to_obj(const char* filename) const; | ||||
| 
 | ||||
|     void start_mapping_gcode_window(); | ||||
|     void stop_mapping_gcode_window(); | ||||
|     void toggle_gcode_window_visibility() { m_sequential_view.gcode_window.toggle_visibility(); } | ||||
| 
 | ||||
| #if ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER | ||||
|  |  | |||
|  | @ -1114,16 +1114,6 @@ int GLCanvas3D::check_volumes_outside_state() const | |||
|     return (int)state; | ||||
| } | ||||
| 
 | ||||
| void GLCanvas3D::start_mapping_gcode_window() | ||||
| { | ||||
|     m_gcode_viewer.start_mapping_gcode_window(); | ||||
| } | ||||
| 
 | ||||
| void GLCanvas3D::stop_mapping_gcode_window() | ||||
| { | ||||
|     m_gcode_viewer.stop_mapping_gcode_window(); | ||||
| } | ||||
| 
 | ||||
| void GLCanvas3D::toggle_sla_auxiliaries_visibility(bool visible, const ModelObject* mo, int instance_idx) | ||||
| { | ||||
|     m_render_sla_auxiliaries = visible; | ||||
|  |  | |||
|  | @ -621,9 +621,6 @@ public: | |||
|     const GCodeViewer::SequentialView& get_gcode_sequential_view() const { return m_gcode_viewer.get_sequential_view(); } | ||||
|     void update_gcode_sequential_view_current(unsigned int first, unsigned int last) { m_gcode_viewer.update_sequential_view_current(first, last); } | ||||
| 
 | ||||
|     void start_mapping_gcode_window(); | ||||
|     void stop_mapping_gcode_window(); | ||||
| 
 | ||||
|     void toggle_sla_auxiliaries_visibility(bool visible, const ModelObject* mo = nullptr, int instance_idx = -1); | ||||
|     void toggle_model_objects_visibility(bool visible, const ModelObject* mo = nullptr, int instance_idx = -1); | ||||
|     void update_instance_printable_state_for_object(size_t obj_idx); | ||||
|  |  | |||
|  | @ -6143,16 +6143,6 @@ BoundingBoxf Plater::bed_shape_bb() const | |||
|     return p->bed_shape_bb(); | ||||
| } | ||||
| 
 | ||||
| void Plater::start_mapping_gcode_window() | ||||
| { | ||||
|     p->preview->get_canvas3d()->start_mapping_gcode_window(); | ||||
| } | ||||
| 
 | ||||
| void Plater::stop_mapping_gcode_window() | ||||
| { | ||||
|     p->preview->get_canvas3d()->stop_mapping_gcode_window(); | ||||
| } | ||||
| 
 | ||||
| void Plater::arrange() | ||||
| { | ||||
|     p->m_ui_jobs.arrange(); | ||||
|  |  | |||
|  | @ -282,9 +282,6 @@ public: | |||
|     GLCanvas3D* get_current_canvas3D(); | ||||
|     BoundingBoxf bed_shape_bb() const; | ||||
|      | ||||
|     void start_mapping_gcode_window(); | ||||
|     void stop_mapping_gcode_window(); | ||||
| 
 | ||||
|     void arrange(); | ||||
|     void find_new_position(const ModelInstancePtrs  &instances); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Vojtech Bubnik
						Vojtech Bubnik