mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-14 01:25:59 +08:00
Use property map instead of std::map
This commit is contained in:
parent
3685c59e3e
commit
83e62bbd28
@ -260,19 +260,24 @@ void create_reduce_map(ReductionMap &reduction_map,
|
|||||||
const FaceTypeMap &face_type_map,
|
const FaceTypeMap &face_type_map,
|
||||||
const VertexShapeMap &vert_shape_map);
|
const VertexShapeMap &vert_shape_map);
|
||||||
|
|
||||||
|
using ConvertMap = CutMesh::Property_map<VI, SurfaceCut::Index>;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Create surface cuts from mesh model
|
/// Create surface cuts from mesh model
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="mesh">Model</param>
|
/// <param name="mesh">Model</param>
|
||||||
/// <param name="shapes">Cutted shapes</param>
|
/// <param name="shapes">Cutted shapes</param>
|
||||||
/// <param name="face_type_map">Define Triangle of interest - Edge between
|
/// <param name="reduction_map">Reduction of vertices</param>
|
||||||
/// inside / outside NOTE: Not const because it need to flag proccessed
|
/// <param name="face_type_map">Define Triangles of interest.
|
||||||
/// faces</param> <param name="vert_shape_map">Info about source of vertices
|
/// Edge between inside / outside.
|
||||||
/// in mesh</param> <returns>Created surface cuts</returns>
|
/// NOTE: Not const because it need to flag proccessed faces</param>
|
||||||
|
/// <param name="convert_map">Used only inside function.
|
||||||
|
/// Store conversion from mesh to result.</param>
|
||||||
|
/// <returns>Created surface cuts</returns>
|
||||||
SurfaceCuts create_surface_cut(const CutMesh &mesh,
|
SurfaceCuts create_surface_cut(const CutMesh &mesh,
|
||||||
const ExPolygons &shapes,
|
const ExPolygons &shapes,
|
||||||
FaceTypeMap &face_type_map,
|
const ReductionMap &reduction_map,
|
||||||
const VertexShapeMap &vert_shape_map);
|
FaceTypeMap &face_type_map,
|
||||||
|
ConvertMap &convert_map);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Collect connected inside faces
|
/// Collect connected inside faces
|
||||||
@ -297,12 +302,12 @@ void collect_surface_data(std::queue<FI> &process,
|
|||||||
/// <param name="faces">Faces to copy</param>
|
/// <param name="faces">Faces to copy</param>
|
||||||
/// <param name="count_outlines">Count of outlines</param>
|
/// <param name="count_outlines">Count of outlines</param>
|
||||||
/// <param name="mesh">Source CGAL mesh</param>
|
/// <param name="mesh">Source CGAL mesh</param>
|
||||||
/// <param name="v2v">[Output] map to convert CGAL vertex to its::vertex</param>
|
/// <param name="v2v">[Output] map to convert CGAL vertex to its::vertex index</param>
|
||||||
/// <returns>Surface cut (Partialy filled - only index triangle set)</returns>
|
/// <returns>Surface cut (Partialy filled - only index triangle set)</returns>
|
||||||
SurfaceCut create_index_triangle_set(const std::vector<FI> &faces,
|
SurfaceCut create_index_triangle_set(const std::vector<FI> &faces,
|
||||||
size_t count_outlines,
|
size_t count_outlines,
|
||||||
const CutMesh &mesh,
|
const CutMesh &mesh,
|
||||||
std::map<VI, size_t> &v2v);
|
ConvertMap &v2v);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Connect outlines into closed loops
|
/// Connect outlines into closed loops
|
||||||
@ -311,9 +316,9 @@ SurfaceCut create_index_triangle_set(const std::vector<FI> &faces,
|
|||||||
/// <param name="mesh">Source CGAL mesh</param>
|
/// <param name="mesh">Source CGAL mesh</param>
|
||||||
/// <param name="v2v">Map to convert CGAL vertex to its::vertex</param>
|
/// <param name="v2v">Map to convert CGAL vertex to its::vertex</param>
|
||||||
/// <returns>Cuts - outlines of surface</returns>
|
/// <returns>Cuts - outlines of surface</returns>
|
||||||
SurfaceCut::CutType create_cut(const std::vector<HI> &outlines,
|
SurfaceCut::CutType create_cut(const std::vector<HI> &outlines,
|
||||||
const CutMesh &mesh,
|
const CutMesh &mesh,
|
||||||
const std::map<VI, size_t> &v2v);
|
const ConvertMap &v2v);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Debug purpose store of mesh with colored face by face type
|
/// Debug purpose store of mesh with colored face by face type
|
||||||
@ -324,6 +329,7 @@ SurfaceCut::CutType create_cut(const std::vector<HI> &outlines,
|
|||||||
/// <param name="file">File to store</param>
|
/// <param name="file">File to store</param>
|
||||||
void store(CutMesh &mesh, const FaceTypeMap &face_type_map, const std::string &file);
|
void store(CutMesh &mesh, const FaceTypeMap &face_type_map, const std::string &file);
|
||||||
void store(CutMesh &mesh, const ReductionMap &reduction_map, const std::string &file);
|
void store(CutMesh &mesh, const ReductionMap &reduction_map, const std::string &file);
|
||||||
|
void store(const SurfaceCuts &cut, const std::string &file_prefix);
|
||||||
} // namespace privat
|
} // namespace privat
|
||||||
|
|
||||||
void Slic3r::append(SurfaceCut &sc, SurfaceCut &&sc_add)
|
void Slic3r::append(SurfaceCut &sc, SurfaceCut &&sc_add)
|
||||||
@ -390,12 +396,14 @@ SurfaceCuts Slic3r::cut_surface(const indexed_triangle_set &model,
|
|||||||
priv::create_reduce_map(vertex_reduction_map, cgal_model, face_type_map, vert_shape_map);
|
priv::create_reduce_map(vertex_reduction_map, cgal_model, face_type_map, vert_shape_map);
|
||||||
priv::store(cgal_model, vertex_reduction_map, "C:/data/temp/reduction.off"); // only debug
|
priv::store(cgal_model, vertex_reduction_map, "C:/data/temp/reduction.off"); // only debug
|
||||||
|
|
||||||
SurfaceCuts result = priv::create_surface_cut(cgal_model, shapes, face_type_map, vert_shape_map);
|
// conversion map between vertex index in cgal_model and indices in result
|
||||||
for (auto &r : result) {
|
// used instead of std::map
|
||||||
size_t index = &r - &result.front();
|
std::string vertec_convert_map_name = "v:convert";
|
||||||
std::string file = "C:/data/temp/cut" + std::to_string(index) + ".obj";
|
priv::ConvertMap vertex_convert_map = cgal_model.add_property_map<priv::VI, SurfaceCut::Index>(vertec_convert_map_name).first;
|
||||||
its_write_obj(r, file.c_str());
|
SurfaceCuts result = priv::create_surface_cut(cgal_model, shapes, vertex_reduction_map, face_type_map, vertex_convert_map);
|
||||||
}
|
|
||||||
|
|
||||||
|
priv::store(result, "C:/data/temp/cut"); // only debug
|
||||||
|
|
||||||
// TODO: Filter surfaceCuts to only the top most.
|
// TODO: Filter surfaceCuts to only the top most.
|
||||||
return result;
|
return result;
|
||||||
@ -815,7 +823,7 @@ void priv::create_reduce_map(ReductionMap &reduction_map,
|
|||||||
SurfaceCut priv::create_index_triangle_set(const std::vector<FI> &faces,
|
SurfaceCut priv::create_index_triangle_set(const std::vector<FI> &faces,
|
||||||
size_t count_outlines,
|
size_t count_outlines,
|
||||||
const CutMesh &mesh,
|
const CutMesh &mesh,
|
||||||
std::map<VI, size_t> &v2v)
|
ConvertMap &v2v)
|
||||||
{
|
{
|
||||||
size_t indices_size = faces.size();
|
size_t indices_size = faces.size();
|
||||||
size_t vertices_size = (indices_size * 3 - count_outlines / 2) / 2;
|
size_t vertices_size = (indices_size * 3 - count_outlines / 2) / 2;
|
||||||
@ -833,20 +841,16 @@ SurfaceCut priv::create_index_triangle_set(const std::vector<FI> &faces,
|
|||||||
// index into its_face
|
// index into its_face
|
||||||
int its_face_id = 0;
|
int its_face_id = 0;
|
||||||
do {
|
do {
|
||||||
// copy its
|
VI vi = mesh.source(hi);
|
||||||
VI reduction_from = mesh.source(hi);
|
size_t index = v2v[vi];
|
||||||
auto it = v2v.find(reduction_from);
|
if (index == std::numeric_limits<SurfaceCut::Index>::max()) {
|
||||||
|
|
||||||
size_t index = -1;
|
|
||||||
if (it != v2v.end()) {
|
|
||||||
index = it->second;
|
|
||||||
} else {
|
|
||||||
index = sc.vertices.size();
|
index = sc.vertices.size();
|
||||||
const auto &p = mesh.point(reduction_from);
|
const auto &p = mesh.point(vi);
|
||||||
|
// create vertex in result
|
||||||
sc.vertices.emplace_back(p.x(), p.y(), p.z());
|
sc.vertices.emplace_back(p.x(), p.y(), p.z());
|
||||||
v2v[reduction_from] = index;
|
v2v[vi] = index;
|
||||||
}
|
}
|
||||||
assert(index != -1);
|
assert(index != std::numeric_limits<SurfaceCut::Index>::max());
|
||||||
its_face[its_face_id++] = index;
|
its_face[its_face_id++] = index;
|
||||||
hi = mesh.next(hi);
|
hi = mesh.next(hi);
|
||||||
} while (hi != hi_end);
|
} while (hi != hi_end);
|
||||||
@ -856,9 +860,9 @@ SurfaceCut priv::create_index_triangle_set(const std::vector<FI> &faces,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
SurfaceCut::CutType priv::create_cut(const std::vector<HI> &outlines,
|
SurfaceCut::CutType priv::create_cut(const std::vector<HI> &outlines,
|
||||||
const CutMesh &mesh,
|
const CutMesh &mesh,
|
||||||
const std::map<VI, size_t> &v2v)
|
const ConvertMap &v2v)
|
||||||
{
|
{
|
||||||
SurfaceCut::CutType cut;
|
SurfaceCut::CutType cut;
|
||||||
using Index = SurfaceCut::Index;
|
using Index = SurfaceCut::Index;
|
||||||
@ -866,12 +870,12 @@ SurfaceCut::CutType priv::create_cut(const std::vector<HI> &outlines,
|
|||||||
for (HI hi : outlines) {
|
for (HI hi : outlines) {
|
||||||
// source vertex (from)
|
// source vertex (from)
|
||||||
VI vi_s = mesh.source(hi);
|
VI vi_s = mesh.source(hi);
|
||||||
assert(v2v.find(vi_s) != v2v.end());
|
Index vi_from = v2v[vi_s];
|
||||||
Index vi_from = v2v.at(vi_s);
|
assert(vi_from != std::numeric_limits<Index>::max());
|
||||||
// target vertex (to)
|
// target vertex (to)
|
||||||
VI vi_t = mesh.target(hi);
|
VI vi_t = mesh.target(hi);
|
||||||
assert(v2v.find(vi_t) != v2v.end());
|
Index vi_to = v2v[vi_t];
|
||||||
Index vi_to = v2v.at(vi_t);
|
assert(vi_to != std::numeric_limits<Index>::max());
|
||||||
|
|
||||||
std::vector<Index> *cut_move = nullptr;
|
std::vector<Index> *cut_move = nullptr;
|
||||||
std::vector<Index> *cut_connect = nullptr;
|
std::vector<Index> *cut_connect = nullptr;
|
||||||
@ -929,10 +933,11 @@ SurfaceCut::CutType priv::create_cut(const std::vector<HI> &outlines,
|
|||||||
return cut;
|
return cut;
|
||||||
}
|
}
|
||||||
|
|
||||||
SurfaceCuts priv::create_surface_cut(const CutMesh &mesh,
|
SurfaceCuts priv::create_surface_cut(const CutMesh &mesh,
|
||||||
const ExPolygons &shapes,
|
const ExPolygons &shapes,
|
||||||
FaceTypeMap &face_type_map,
|
const ReductionMap &reduction_map,
|
||||||
const VertexShapeMap &vert_shape_map)
|
FaceTypeMap &face_type_map,
|
||||||
|
ConvertMap &convert_map)
|
||||||
{
|
{
|
||||||
// faces from one surface cut
|
// faces from one surface cut
|
||||||
std::vector<FI> faces;
|
std::vector<FI> faces;
|
||||||
@ -943,6 +948,10 @@ SurfaceCuts priv::create_surface_cut(const CutMesh &mesh,
|
|||||||
size_t max_outline_count = mesh.faces().size()/2;
|
size_t max_outline_count = mesh.faces().size()/2;
|
||||||
outlines.reserve(max_outline_count);
|
outlines.reserve(max_outline_count);
|
||||||
|
|
||||||
|
// initialize convert_map to MAX values
|
||||||
|
for (VI vi : mesh.vertices())
|
||||||
|
convert_map[vi] = std::numeric_limits<SurfaceCut::Index>::max();
|
||||||
|
|
||||||
std::queue<FI> process;
|
std::queue<FI> process;
|
||||||
|
|
||||||
SurfaceCuts result;
|
SurfaceCuts result;
|
||||||
@ -957,12 +966,10 @@ SurfaceCuts priv::create_surface_cut(const CutMesh &mesh,
|
|||||||
process.push(fi);
|
process.push(fi);
|
||||||
collect_surface_data(process, faces, outlines, face_type_map, mesh);
|
collect_surface_data(process, faces, outlines, face_type_map, mesh);
|
||||||
|
|
||||||
// convert vertex index from mesh to index of vertices in result
|
SurfaceCut sc = create_index_triangle_set(faces, outlines.size(), mesh, convert_map);
|
||||||
std::map<VI, size_t> v2v;
|
|
||||||
SurfaceCut sc = create_index_triangle_set(faces, outlines.size(), mesh, v2v);
|
|
||||||
|
|
||||||
// connect outlines
|
// connect outlines
|
||||||
sc.cut = create_cut(outlines, mesh, v2v);
|
sc.cut = create_cut(outlines, mesh, convert_map);
|
||||||
|
|
||||||
// TODO: create vertex2contour map
|
// TODO: create vertex2contour map
|
||||||
|
|
||||||
@ -1007,4 +1014,12 @@ void priv::store(CutMesh &mesh, const ReductionMap &reduction_map, const std::st
|
|||||||
}
|
}
|
||||||
CGAL::IO::write_OFF(file, mesh);
|
CGAL::IO::write_OFF(file, mesh);
|
||||||
mesh.remove_property_map(vertex_colors);
|
mesh.remove_property_map(vertex_colors);
|
||||||
|
}
|
||||||
|
|
||||||
|
void priv::store(const SurfaceCuts &cut, const std::string &file_prefix) {
|
||||||
|
for (auto &c : cut) {
|
||||||
|
size_t index = &c - &cut.front();
|
||||||
|
std::string file = file_prefix + std::to_string(index) + ".obj";
|
||||||
|
its_write_obj(c, file.c_str());
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user