diff options
author | bubnikv <bubnikv@gmail.com> | 2017-08-02 17:05:18 +0300 |
---|---|---|
committer | bubnikv <bubnikv@gmail.com> | 2017-08-02 17:05:18 +0300 |
commit | 31085fb1d70510e3d73c64c0b7fc7a394b6e6f72 (patch) | |
tree | d530f611f63ed407cdff8cef6779274378dfccb6 /xs/src/libslic3r/TriangleMesh.cpp | |
parent | 777023c7a8f09754d158df39bf79c23e44b90a2f (diff) |
Ported some ModelObject methods from Perl to C++.
Added some utility functions to TriangleMesh, thanks to @alexrj
Some porting to C++ based on work by @alexrj.
Diffstat (limited to 'xs/src/libslic3r/TriangleMesh.cpp')
-rw-r--r-- | xs/src/libslic3r/TriangleMesh.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/xs/src/libslic3r/TriangleMesh.cpp b/xs/src/libslic3r/TriangleMesh.cpp index ee1dc7315..f2f05a841 100644 --- a/xs/src/libslic3r/TriangleMesh.cpp +++ b/xs/src/libslic3r/TriangleMesh.cpp @@ -215,6 +215,47 @@ TriangleMesh::repair() { BOOST_LOG_TRIVIAL(debug) << "TriangleMesh::repair() finished"; } + +float TriangleMesh::volume() +{ + if (this->stl.stats.volume == -1) + stl_calculate_volume(&this->stl); + return this->stl.stats.volume; +} + +void TriangleMesh::check_topology() +{ + // checking exact + stl_check_facets_exact(&stl); + stl.stats.facets_w_1_bad_edge = (stl.stats.connected_facets_2_edge - stl.stats.connected_facets_3_edge); + stl.stats.facets_w_2_bad_edge = (stl.stats.connected_facets_1_edge - stl.stats.connected_facets_2_edge); + stl.stats.facets_w_3_bad_edge = (stl.stats.number_of_facets - stl.stats.connected_facets_1_edge); + + // checking nearby + //int last_edges_fixed = 0; + float tolerance = stl.stats.shortest_edge; + float increment = stl.stats.bounding_diameter / 10000.0; + int iterations = 2; + if (stl.stats.connected_facets_3_edge < stl.stats.number_of_facets) { + for (int i = 0; i < iterations; i++) { + if (stl.stats.connected_facets_3_edge < stl.stats.number_of_facets) { + //printf("Checking nearby. Tolerance= %f Iteration=%d of %d...", tolerance, i + 1, iterations); + stl_check_facets_nearby(&stl, tolerance); + //printf(" Fixed %d edges.\n", stl.stats.edges_fixed - last_edges_fixed); + //last_edges_fixed = stl.stats.edges_fixed; + tolerance += increment; + } else { + break; + } + } + } +} + +bool TriangleMesh::is_manifold() const +{ + return this->stl.stats.connected_facets_3_edge == this->stl.stats.number_of_facets; +} + void TriangleMesh::reset_repair_stats() { this->stl.stats.degenerate_facets = 0; |