Remove text configuration for splited volumes

Sort splitted volumes
This commit is contained in:
Filip Sykala - NTB T15p 2023-01-12 12:17:56 +01:00
parent f961fe8c2f
commit af3984b356

View File

@ -1641,6 +1641,34 @@ ModelObjectPtrs ModelObject::cut(size_t instance, const Transform3d& cut_matrix,
return res;
}
/// <summary>
/// Compare TriangleMeshes by Bounding boxes (mainly for sort)
/// From Front(Z) Upper(Y) TopLeft(X) corner.
/// 1. Seraparate group not overlaped i Z axis
/// 2. Seraparate group not overlaped i Y axis
/// 3. Start earlier in X (More on left side)
/// </summary>
/// <param name="triangle_mesh1">Compare from</param>
/// <param name="triangle_mesh2">Compare to</param>
/// <returns>True when triangle mesh 1 is closer, upper or lefter than triangle mesh 2 other wise false</returns>
static bool is_front_up_left(const TriangleMesh &trinagle_mesh1, const TriangleMesh &triangle_mesh2)
{
// stats form t1
const Vec3f &min1 = trinagle_mesh1.stats().min;
const Vec3f &max1 = trinagle_mesh1.stats().max;
// stats from t2
const Vec3f &min2 = triangle_mesh2.stats().min;
const Vec3f &max2 = triangle_mesh2.stats().max;
// priority Z, Y, X
for (int axe = 2; axe > 0; --axe) {
if (max1[axe] < min2[axe])
return true;
if (min1[axe] > max2[axe])
return false;
}
return min1.x() < min2.x();
}
void ModelObject::split(ModelObjectPtrs* new_objects)
{
for (ModelVolume* volume : this->volumes) {
@ -1652,25 +1680,7 @@ void ModelObject::split(ModelObjectPtrs* new_objects)
volume->text_configuration.reset();
std::vector<TriangleMesh> meshes = volume->mesh().split();
// sort splitted meshes by Z, Y and X
auto sort_fnc = [](const TriangleMesh &t1, const TriangleMesh &t2)->bool {
// stats form t1
const Vec3f &min1 = t1.stats().min;
const Vec3f &max1 = t1.stats().max;
// stats from t2
const Vec3f &min2 = t2.stats().min;
const Vec3f &max2 = t2.stats().max;
// priority Z, Y, X
for (int axe = 2; axe >= 0; --axe) {
if (max1[axe] < min2[axe])
return true;
if (min1[axe] > max2[axe])
return false;
}
return min1.x() < min2.x();
};
std::sort(meshes.begin(), meshes.end(), sort_fnc);
std::sort(meshes.begin(), meshes.end(), is_front_up_left);
size_t counter = 1;
for (TriangleMesh &mesh : meshes) {
@ -2155,9 +2165,15 @@ size_t ModelVolume::split(unsigned int max_extruders)
if (meshes.size() <= 1)
return 1;
std::sort(meshes.begin(), meshes.end(), is_front_up_left);
// splited volume should not be text object
if (text_configuration.has_value())
text_configuration.reset();
size_t idx = 0;
size_t ivolume = std::find(this->object->volumes.begin(), this->object->volumes.end(), this) - this->object->volumes.begin();
const std::string name = this->name;
const std::string& name = this->name;
unsigned int extruder_counter = 0;
const Vec3d offset = this->get_offset();