ENH: improving the efficiency of “groupingVolumesForBrim”
tbb parallelization is used to improved the efficiency of for_each_volume and for_each_polygon loop JIRA ID: STUDIO-2866 Change-Id: Id5b3a536e3162b148417cbee803bcede3b62a651 (cherry picked from commit 15a6f7ef2f575eaa4b4694ad357d881b39b82f5b)
This commit is contained in:
parent
9392e3a9f1
commit
d132ad2d9d
|
@ -486,14 +486,28 @@ bool groupingVolumes(std::vector<VolumeSlices> objSliceByVolume, std::vector<gro
|
||||||
std::vector<int> groupIndex(objSliceByVolume.size(), -1);
|
std::vector<int> groupIndex(objSliceByVolume.size(), -1);
|
||||||
double offsetValue = 0.05 / SCALING_FACTOR;
|
double offsetValue = 0.05 / SCALING_FACTOR;
|
||||||
|
|
||||||
|
std::vector<std::vector<int>> osvIndex;
|
||||||
for (int i = 0; i != objSliceByVolume.size(); ++i) {
|
for (int i = 0; i != objSliceByVolume.size(); ++i) {
|
||||||
for (int j = 0; j != objSliceByVolume[i].slices.size(); ++j) {
|
for (int j = 0; j != objSliceByVolume[i].slices.size(); ++j) {
|
||||||
objSliceByVolume[i].slices[j] = offset_ex(objSliceByVolume[i].slices[j], offsetValue);
|
osvIndex.push_back({ i,j });
|
||||||
for (ExPolygon& poly_ex : objSliceByVolume[i].slices[j])
|
|
||||||
poly_ex.douglas_peucker(resolution);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tbb::parallel_for(tbb::blocked_range<int>(0, osvIndex.size()),
|
||||||
|
[&osvIndex, &objSliceByVolume, &offsetValue, &resolution](const tbb::blocked_range<int>& range) {
|
||||||
|
for (auto k = range.begin(); k != range.end(); ++k) {
|
||||||
|
for (ExPolygon& poly_ex : objSliceByVolume[osvIndex[k][0]].slices[osvIndex[k][1]])
|
||||||
|
poly_ex.douglas_peucker(resolution);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
tbb::parallel_for(tbb::blocked_range<int>(0, osvIndex.size()),
|
||||||
|
[&osvIndex, &objSliceByVolume,&offsetValue, &resolution](const tbb::blocked_range<int>& range) {
|
||||||
|
for (auto k = range.begin(); k != range.end(); ++k) {
|
||||||
|
objSliceByVolume[osvIndex[k][0]].slices[osvIndex[k][1]] = offset_ex(objSliceByVolume[osvIndex[k][0]].slices[osvIndex[k][1]], offsetValue);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
for (int i = 0; i != objSliceByVolume.size(); ++i) {
|
for (int i = 0; i != objSliceByVolume.size(); ++i) {
|
||||||
if (groupIndex[i] < 0) {
|
if (groupIndex[i] < 0) {
|
||||||
groupIndex[i] = i;
|
groupIndex[i] = i;
|
||||||
|
@ -578,27 +592,43 @@ void applyNegtiveVolumes(ModelVolumePtrs model_volumes, const std::vector<Volume
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void reGroupingLayerPolygons(std::vector<groupedVolumeSlices>& gvss, ExPolygons eps)
|
void reGroupingLayerPolygons(std::vector<groupedVolumeSlices>& gvss, ExPolygons &eps, double resolution)
|
||||||
{
|
{
|
||||||
std::vector<int> epsIndex;
|
std::vector<int> epsIndex;
|
||||||
epsIndex.resize(eps.size(), -1);
|
epsIndex.resize(eps.size(), -1);
|
||||||
for (int ie = 0; ie != eps.size(); ie++) {
|
|
||||||
if (eps[ie].area() <= 0)
|
auto gvssc = gvss;
|
||||||
continue;
|
auto epsc = eps;
|
||||||
double minArea = eps[ie].area();
|
|
||||||
for (int iv = 0; iv != gvss.size(); iv++) {
|
for (ExPolygon& poly_ex : epsc)
|
||||||
auto clipedExPolys = diff_ex(eps[ie], gvss[iv].slices);
|
poly_ex.douglas_peucker(resolution);
|
||||||
double area = 0;
|
|
||||||
for (const auto& ce : clipedExPolys) {
|
for (int i = 0; i != gvssc.size(); ++i) {
|
||||||
area += ce.area();
|
for (ExPolygon& poly_ex : gvssc[i].slices)
|
||||||
}
|
poly_ex.douglas_peucker(resolution);
|
||||||
if (area < minArea) {
|
|
||||||
minArea = area;
|
|
||||||
epsIndex[ie] = iv;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tbb::parallel_for(tbb::blocked_range<int>(0, epsc.size()),
|
||||||
|
[&epsc, &gvssc, &epsIndex](const tbb::blocked_range<int>& range) {
|
||||||
|
for (auto ie = range.begin(); ie != range.end(); ++ie) {
|
||||||
|
if (epsc[ie].area() <= 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
double minArea = epsc[ie].area();
|
||||||
|
for (int iv = 0; iv != gvssc.size(); iv++) {
|
||||||
|
auto clipedExPolys = diff_ex(epsc[ie], gvssc[iv].slices);
|
||||||
|
double area = 0;
|
||||||
|
for (const auto& ce : clipedExPolys) {
|
||||||
|
area += ce.area();
|
||||||
|
}
|
||||||
|
if (area < minArea) {
|
||||||
|
minArea = area;
|
||||||
|
epsIndex[ie] = iv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
for (int iv = 0; iv != gvss.size(); iv++)
|
for (int iv = 0; iv != gvss.size(); iv++)
|
||||||
gvss[iv].slices.clear();
|
gvss[iv].slices.clear();
|
||||||
|
|
||||||
|
@ -734,7 +764,7 @@ void groupingVolumesForBrim(PrintObject* object, LayerPtrs& layers, int firstLay
|
||||||
applyNegtiveVolumes(object->model_object()->volumes, object->firstLayerObjSliceMod(), object->firstLayerObjGroupsMod(), scaled_resolution);
|
applyNegtiveVolumes(object->model_object()->volumes, object->firstLayerObjSliceMod(), object->firstLayerObjGroupsMod(), scaled_resolution);
|
||||||
|
|
||||||
// BBS: the actual first layer slices stored in layers are re-sorted by volume group and will be used to generate brim
|
// BBS: the actual first layer slices stored in layers are re-sorted by volume group and will be used to generate brim
|
||||||
reGroupingLayerPolygons(object->firstLayerObjGroupsMod(), layers.front()->lslices);
|
reGroupingLayerPolygons(object->firstLayerObjGroupsMod(), layers.front()->lslices, scaled_resolution);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Called by make_perimeters()
|
// Called by make_perimeters()
|
||||||
|
|
Loading…
Reference in New Issue