Fixed wrong refactoring of perimeter tree traversal. #1832

This commit is contained in:
Alessandro Ranellucci 2014-03-15 02:16:04 +01:00
parent b71d28bd5a
commit 52de292a48
6 changed files with 31 additions and 11 deletions

View File

@ -233,7 +233,7 @@ sub make_perimeters {
# use a nearest neighbor search to order these children
# TODO: supply second argument to chained_path() too?
my $sorted_collection = $collection->chained_path(0);
my $sorted_collection = $collection->chained_path_indices(0);
my @orig_indices = @{$sorted_collection->orig_indices};
my @loops = ();

View File

@ -1,4 +1,5 @@
#include "ExtrusionEntityCollection.hpp"
#include <map>
namespace Slic3r {
@ -34,25 +35,30 @@ ExtrusionEntityCollection::last_point() const
}
ExtrusionEntityCollection*
ExtrusionEntityCollection::chained_path(bool no_reverse) const
ExtrusionEntityCollection::chained_path(bool no_reverse, std::vector<size_t>* orig_indices) const
{
if (this->entities.empty()) {
return new ExtrusionEntityCollection ();
}
return this->chained_path_from(this->entities.front()->first_point(), no_reverse);
return this->chained_path_from(this->entities.front()->first_point(), no_reverse, orig_indices);
}
ExtrusionEntityCollection*
ExtrusionEntityCollection::chained_path_from(Point* start_near, bool no_reverse) const
ExtrusionEntityCollection::chained_path_from(Point* start_near, bool no_reverse, std::vector<size_t>* orig_indices) const
{
if (this->no_sort) return this->clone();
ExtrusionEntityCollection* retval = new ExtrusionEntityCollection;
retval->entities.reserve(this->entities.size());
retval->orig_indices.reserve(this->entities.size());
// if we're asked to return the original indices, build a map
std::map<ExtrusionEntity*,size_t> indices_map;
ExtrusionEntitiesPtr my_paths;
for (ExtrusionEntitiesPtr::const_iterator it = this->entities.begin(); it != this->entities.end(); ++it) {
my_paths.push_back((*it)->clone());
ExtrusionEntity* entity = (*it)->clone();
my_paths.push_back(entity);
if (orig_indices != NULL) indices_map[entity] = it - this->entities.begin();
}
Points endpoints;
@ -69,11 +75,12 @@ ExtrusionEntityCollection::chained_path_from(Point* start_near, bool no_reverse)
// find nearest point
int start_index = start_near->nearest_point_index(endpoints);
int path_index = start_index/2;
ExtrusionEntity* entity = my_paths.at(path_index);
if (start_index % 2 && !no_reverse) {
my_paths.at(path_index)->reverse();
entity->reverse();
}
retval->entities.push_back(my_paths.at(path_index));
retval->orig_indices.push_back(path_index);
if (orig_indices != NULL) orig_indices->push_back(indices_map[entity]);
my_paths.erase(my_paths.begin() + path_index);
endpoints.erase(endpoints.begin() + 2*path_index, endpoints.begin() + 2*path_index + 2);
start_near = retval->entities.back()->last_point();

View File

@ -11,11 +11,11 @@ class ExtrusionEntityCollection : public ExtrusionEntity
public:
ExtrusionEntityCollection* clone() const;
ExtrusionEntitiesPtr entities;
std::vector<int> orig_indices;
std::vector<size_t> orig_indices; // handy for XS
bool no_sort;
ExtrusionEntityCollection(): no_sort(false) {};
ExtrusionEntityCollection* chained_path(bool no_reverse) const;
ExtrusionEntityCollection* chained_path_from(Point* start_near, bool no_reverse) const;
ExtrusionEntityCollection* chained_path(bool no_reverse, std::vector<size_t>* orig_indices = NULL) const;
ExtrusionEntityCollection* chained_path_from(Point* start_near, bool no_reverse, std::vector<size_t>* orig_indices = NULL) const;
void reverse();
Point* first_point() const;
Point* last_point() const;

View File

@ -20,7 +20,7 @@
%code{% const char* CLASS = "Slic3r::Point"; RETVAL = THIS->last_point(); %};
int count()
%code{% RETVAL = THIS->entities.size(); %};
std::vector<int> orig_indices()
std::vector<size_t> orig_indices()
%code{% RETVAL = THIS->orig_indices; %};
%{
@ -79,5 +79,16 @@ ExtrusionEntityCollection::no_sort(...)
OUTPUT:
RETVAL
ExtrusionEntityCollection*
ExtrusionEntityCollection::chained_path_indices(bool no_reverse)
PREINIT:
const char* CLASS = "Slic3r::ExtrusionPath::Collection";
CODE:
std::vector<size_t> indices;
RETVAL = THIS->chained_path(no_reverse, &indices);
RETVAL->orig_indices = indices;
OUTPUT:
RETVAL
%}
};

View File

@ -1,4 +1,5 @@
std::vector<Points::size_type> T_STD_VECTOR_INT
std::vector<size_t> T_STD_VECTOR_INT
t_config_option_key T_STD_STRING
BoundingBox* O_OBJECT

View File

@ -2,6 +2,7 @@
%typemap{std::string};
%typemap{t_config_option_key};
%typemap{std::vector<int>};
%typemap{std::vector<size_t>};
%typemap{std::vector<unsigned int>*};
%typemap{std::vector<double>};
%typemap{std::vector<double>*};