mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-31 12:41:20 -06:00 
			
		
		
		
	TriangleMesh::slice() now accepts a vector of floats instead of doubles for consistency with mesh coordinates
This commit is contained in:
		
							parent
							
								
									69f1f65a8b
								
							
						
					
					
						commit
						3637ca39df
					
				
					 4 changed files with 21 additions and 13 deletions
				
			
		|  | @ -165,7 +165,7 @@ void TriangleMesh::rotate(double angle, Point* center) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| TriangleMesh::slice(const std::vector<double> &z, std::vector<Polygons>* layers) | TriangleMesh::slice(const std::vector<float> &z, std::vector<Polygons>* layers) | ||||||
| { | { | ||||||
|     /*
 |     /*
 | ||||||
|        This method gets called with a list of unscaled Z coordinates and outputs |        This method gets called with a list of unscaled Z coordinates and outputs | ||||||
|  | @ -190,6 +190,9 @@ TriangleMesh::slice(const std::vector<double> &z, std::vector<Polygons>* layers) | ||||||
|         At the end, we free the tables generated by analyze() as we don't  |         At the end, we free the tables generated by analyze() as we don't  | ||||||
|         need them anymore. |         need them anymore. | ||||||
|         FUTURE: parallelize slice_facet() and make_loops() |         FUTURE: parallelize slice_facet() and make_loops() | ||||||
|  |          | ||||||
|  |         NOTE: this method accepts a vector of floats because the mesh coordinate | ||||||
|  |         type is float. | ||||||
|     */ |     */ | ||||||
|      |      | ||||||
|     // build a table to map a facet_idx to its three edge indices
 |     // build a table to map a facet_idx to its three edge indices
 | ||||||
|  | @ -256,8 +259,8 @@ TriangleMesh::slice(const std::vector<double> &z, std::vector<Polygons>* layers) | ||||||
|         stl_facet* facet = &this->stl.facet_start[facet_idx]; |         stl_facet* facet = &this->stl.facet_start[facet_idx]; | ||||||
|          |          | ||||||
|         // find facet extents
 |         // find facet extents
 | ||||||
|         double min_z = fminf(facet->vertex[0].z, fminf(facet->vertex[1].z, facet->vertex[2].z)); |         float min_z = fminf(facet->vertex[0].z, fminf(facet->vertex[1].z, facet->vertex[2].z)); | ||||||
|         double max_z = fmaxf(facet->vertex[0].z, fmaxf(facet->vertex[1].z, facet->vertex[2].z)); |         float max_z = fmaxf(facet->vertex[0].z, fmaxf(facet->vertex[1].z, facet->vertex[2].z)); | ||||||
|          |          | ||||||
|         #ifdef SLIC3R_DEBUG |         #ifdef SLIC3R_DEBUG | ||||||
|         printf("\n==> FACET %d (%f,%f,%f - %f,%f,%f - %f,%f,%f):\n", facet_idx, |         printf("\n==> FACET %d (%f,%f,%f - %f,%f,%f - %f,%f,%f):\n", facet_idx, | ||||||
|  | @ -275,16 +278,16 @@ TriangleMesh::slice(const std::vector<double> &z, std::vector<Polygons>* layers) | ||||||
|         } |         } | ||||||
|          |          | ||||||
|         // find layer extents
 |         // find layer extents
 | ||||||
|         std::vector<double>::const_iterator min_layer, max_layer; |         std::vector<float>::const_iterator min_layer, max_layer; | ||||||
|         min_layer = std::lower_bound(z.begin(), z.end(), min_z - EPSILON); // first layer whose slice_z is >= min_z
 |         min_layer = std::lower_bound(z.begin(), z.end(), min_z); // first layer whose slice_z is >= min_z
 | ||||||
|         max_layer = std::upper_bound(z.begin() + (min_layer - z.begin()), z.end(), max_z + EPSILON) - 1; // last layer whose slice_z is <= max_z
 |         max_layer = std::upper_bound(z.begin() + (min_layer - z.begin()), z.end(), max_z) - 1; // last layer whose slice_z is <= max_z
 | ||||||
|         #ifdef SLIC3R_DEBUG |         #ifdef SLIC3R_DEBUG | ||||||
|         printf("layers: min = %d, max = %d\n", (int)(min_layer - z.begin()), (int)(max_layer - z.begin())); |         printf("layers: min = %d, max = %d\n", (int)(min_layer - z.begin()), (int)(max_layer - z.begin())); | ||||||
|         #endif |         #endif | ||||||
|          |          | ||||||
|         for (std::vector<double>::const_iterator it = min_layer; it != max_layer + 1; ++it) { |         for (std::vector<float>::const_iterator it = min_layer; it != max_layer + 1; ++it) { | ||||||
|             std::vector<double>::size_type layer_idx = it - z.begin(); |             std::vector<float>::size_type layer_idx = it - z.begin(); | ||||||
|             double slice_z = *it / SCALING_FACTOR; |             float slice_z = *it / SCALING_FACTOR; | ||||||
|             std::vector<IntersectionPoint> points; |             std::vector<IntersectionPoint> points; | ||||||
|             std::vector< std::vector<IntersectionPoint>::size_type > points_on_layer; |             std::vector< std::vector<IntersectionPoint>::size_type > points_on_layer; | ||||||
|             bool found_horizontal_edge = false; |             bool found_horizontal_edge = false; | ||||||
|  | @ -521,7 +524,7 @@ class _area_comp { | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| TriangleMesh::slice(const std::vector<double> &z, std::vector<ExPolygons>* layers) | TriangleMesh::slice(const std::vector<float> &z, std::vector<ExPolygons>* layers) | ||||||
| { | { | ||||||
|     std::vector<Polygons> layers_p; |     std::vector<Polygons> layers_p; | ||||||
|     this->slice(z, &layers_p); |     this->slice(z, &layers_p); | ||||||
|  |  | ||||||
|  | @ -30,8 +30,8 @@ class TriangleMesh | ||||||
|     void translate(float x, float y, float z); |     void translate(float x, float y, float z); | ||||||
|     void align_to_origin(); |     void align_to_origin(); | ||||||
|     void rotate(double angle, Point* center); |     void rotate(double angle, Point* center); | ||||||
|     void slice(const std::vector<double> &z, std::vector<Polygons>* layers); |     void slice(const std::vector<float> &z, std::vector<Polygons>* layers); | ||||||
|     void slice(const std::vector<double> &z, std::vector<ExPolygons>* layers); |     void slice(const std::vector<float> &z, std::vector<ExPolygons>* layers); | ||||||
|     TriangleMeshPtrs split() const; |     TriangleMeshPtrs split() const; | ||||||
|     void merge(const TriangleMesh* mesh); |     void merge(const TriangleMesh* mesh); | ||||||
|     void horizontal_projection(ExPolygons &retval) const; |     void horizontal_projection(ExPolygons &retval) const; | ||||||
|  |  | ||||||
|  | @ -23,6 +23,7 @@ extern "C" { | ||||||
| #define PI 3.141592653589793238 | #define PI 3.141592653589793238 | ||||||
| #define scale_(val) (val / SCALING_FACTOR) | #define scale_(val) (val / SCALING_FACTOR) | ||||||
| #define unscale(val) (val * SCALING_FACTOR) | #define unscale(val) (val * SCALING_FACTOR) | ||||||
|  | #define SCALED_EPSILON scale_(EPSILON) | ||||||
| typedef long coord_t; | typedef long coord_t; | ||||||
| typedef double coordf_t; | typedef double coordf_t; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -137,8 +137,12 @@ SV* | ||||||
| TriangleMesh::slice(z) | TriangleMesh::slice(z) | ||||||
|     std::vector<double>* z |     std::vector<double>* z | ||||||
|     CODE: |     CODE: | ||||||
|  |         // convert doubles to floats | ||||||
|  |         std::vector<float> z_f(z->begin(), z->end()); | ||||||
|  |         delete z; | ||||||
|  |          | ||||||
|         std::vector<ExPolygons> layers; |         std::vector<ExPolygons> layers; | ||||||
|         THIS->slice(*z, &layers); |         THIS->slice(z_f, &layers); | ||||||
|          |          | ||||||
|         AV* layers_av = newAV(); |         AV* layers_av = newAV(); | ||||||
|         av_extend(layers_av, layers.size()-1); |         av_extend(layers_av, layers.size()-1); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Alessandro Ranellucci
						Alessandro Ranellucci