Cut WIP: Set all dowels as a separate objects
ObjectList: Don't show connectors for cut objects
This commit is contained in:
parent
a1b324d1ee
commit
a8919b1e91
@ -1446,37 +1446,26 @@ ModelObjectPtrs ModelObject::cut(size_t instance, const Vec3d& cut_center, const
|
|||||||
cut_id.increase_check_sum(size_t(cut_obj_cnt));
|
cut_id.increase_check_sum(size_t(cut_obj_cnt));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto clone_obj = [this](ModelObject** obj) {
|
||||||
|
(*obj) = ModelObject::new_clone(*this);
|
||||||
|
(*obj)->set_model(nullptr);
|
||||||
|
(*obj)->sla_support_points.clear();
|
||||||
|
(*obj)->sla_drain_holes.clear();
|
||||||
|
(*obj)->sla_points_status = sla::PointsStatus::NoPoints;
|
||||||
|
(*obj)->clear_volumes();
|
||||||
|
(*obj)->input_file.clear();
|
||||||
|
};
|
||||||
|
|
||||||
// Clone the object to duplicate instances, materials etc.
|
// Clone the object to duplicate instances, materials etc.
|
||||||
ModelObject* upper = attributes.has(ModelObjectCutAttribute::KeepUpper) ? ModelObject::new_clone(*this) : nullptr;
|
ModelObject* upper{ nullptr };
|
||||||
ModelObject* lower = attributes.has(ModelObjectCutAttribute::KeepLower) ? ModelObject::new_clone(*this) : nullptr;
|
if (attributes.has(ModelObjectCutAttribute::KeepUpper))
|
||||||
ModelObject* dowels = attributes.has(ModelObjectCutAttribute::CreateDowels) ? ModelObject::new_clone(*this) : nullptr;
|
clone_obj(&upper);
|
||||||
|
|
||||||
if (attributes.has(ModelObjectCutAttribute::KeepUpper)) {
|
ModelObject* lower{ nullptr };
|
||||||
upper->set_model(nullptr);
|
if (attributes.has(ModelObjectCutAttribute::KeepLower))
|
||||||
upper->sla_support_points.clear();
|
clone_obj(&lower);
|
||||||
upper->sla_drain_holes.clear();
|
|
||||||
upper->sla_points_status = sla::PointsStatus::NoPoints;
|
|
||||||
upper->clear_volumes();
|
|
||||||
upper->input_file.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (attributes.has(ModelObjectCutAttribute::KeepLower)) {
|
std::vector<ModelObject*> dowels;
|
||||||
lower->set_model(nullptr);
|
|
||||||
lower->sla_support_points.clear();
|
|
||||||
lower->sla_drain_holes.clear();
|
|
||||||
lower->sla_points_status = sla::PointsStatus::NoPoints;
|
|
||||||
lower->clear_volumes();
|
|
||||||
lower->input_file.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (attributes.has(ModelObjectCutAttribute::CreateDowels)) {
|
|
||||||
dowels->set_model(nullptr);
|
|
||||||
dowels->sla_support_points.clear();
|
|
||||||
dowels->sla_drain_holes.clear();
|
|
||||||
dowels->sla_points_status = sla::PointsStatus::NoPoints;
|
|
||||||
dowels->clear_volumes();
|
|
||||||
dowels->input_file.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
using namespace Geometry;
|
using namespace Geometry;
|
||||||
|
|
||||||
@ -1545,9 +1534,14 @@ ModelObjectPtrs ModelObject::cut(size_t instance, const Vec3d& cut_center, const
|
|||||||
// for lower part change type of connector from NEGATIVE_VOLUME to MODEL_PART if this connector is a plug
|
// for lower part change type of connector from NEGATIVE_VOLUME to MODEL_PART if this connector is a plug
|
||||||
vol->set_type(ModelVolumeType::MODEL_PART);
|
vol->set_type(ModelVolumeType::MODEL_PART);
|
||||||
}
|
}
|
||||||
if (dowels && volume->cut_info.connector_type == CutConnectorType::Dowel) {
|
if (volume->cut_info.connector_type == CutConnectorType::Dowel &&
|
||||||
|
attributes.has(ModelObjectCutAttribute::CreateDowels)) {
|
||||||
|
ModelObject* dowel{ nullptr };
|
||||||
|
// Clone the object to duplicate instances, materials etc.
|
||||||
|
clone_obj(&dowel);
|
||||||
|
|
||||||
// add one more solid part same as connector if this connector is a dowel
|
// add one more solid part same as connector if this connector is a dowel
|
||||||
ModelVolume* vol = dowels->add_volume(*volume);
|
ModelVolume* vol = dowel->add_volume(*volume);
|
||||||
vol->set_type(ModelVolumeType::MODEL_PART);
|
vol->set_type(ModelVolumeType::MODEL_PART);
|
||||||
|
|
||||||
// But discard rotation and Z-offset for this volume
|
// But discard rotation and Z-offset for this volume
|
||||||
@ -1556,6 +1550,8 @@ ModelObjectPtrs ModelObject::cut(size_t instance, const Vec3d& cut_center, const
|
|||||||
|
|
||||||
// Compute the displacement (in instance coordinates) to be applied to place the dowels
|
// Compute the displacement (in instance coordinates) to be applied to place the dowels
|
||||||
local_dowels_displace = lower->full_raw_mesh_bounding_box().size().cwiseProduct(Vec3d(1.0, 1.0, 0.0));
|
local_dowels_displace = lower->full_raw_mesh_bounding_box().size().cwiseProduct(Vec3d(1.0, 1.0, 0.0));
|
||||||
|
|
||||||
|
dowels.push_back(dowel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -1704,35 +1700,37 @@ ModelObjectPtrs ModelObject::cut(size_t instance, const Vec3d& cut_center, const
|
|||||||
res.push_back(lower);
|
res.push_back(lower);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (attributes.has(ModelObjectCutAttribute::CreateDowels) && dowels->volumes.size() > 0) {
|
if (attributes.has(ModelObjectCutAttribute::CreateDowels) && dowels.size() > 0) {
|
||||||
if (!dowels->origin_translation.isApprox(Vec3d::Zero()) && instances[instance]->get_offset().isApprox(Vec3d::Zero())) {
|
for (auto dowel : dowels) {
|
||||||
dowels->center_around_origin();
|
if (!dowel->origin_translation.isApprox(Vec3d::Zero()) && instances[instance]->get_offset().isApprox(Vec3d::Zero())) {
|
||||||
dowels->translate_instances(-dowels->origin_translation);
|
dowel->center_around_origin();
|
||||||
dowels->origin_translation = Vec3d::Zero();
|
dowel->translate_instances(-dowel->origin_translation);
|
||||||
|
dowel->origin_translation = Vec3d::Zero();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
dowel->invalidate_bounding_box();
|
||||||
|
dowel->center_around_origin();
|
||||||
|
}
|
||||||
|
dowel->name += "-Dowel-" + dowel->volumes[0]->name;
|
||||||
|
|
||||||
|
// Reset instance transformation except offset and Z-rotation
|
||||||
|
for (size_t i = 0; i < instances.size(); ++i) {
|
||||||
|
auto& obj_instance = dowel->instances[i];
|
||||||
|
const Vec3d offset = obj_instance->get_offset();
|
||||||
|
Vec3d rotation = Vec3d::Zero();
|
||||||
|
if (i != instance)
|
||||||
|
rotation[Z] = obj_instance->get_rotation().z();
|
||||||
|
|
||||||
|
const Vec3d displace = Geometry::assemble_transform(Vec3d::Zero(), rotation) * local_dowels_displace;
|
||||||
|
|
||||||
|
obj_instance->set_transformation(Geometry::Transformation());
|
||||||
|
obj_instance->set_offset(offset + displace);
|
||||||
|
obj_instance->set_rotation(rotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
local_dowels_displace += dowel->full_raw_mesh_bounding_box().size().cwiseProduct(Vec3d(-1.5, -1.5, 0.0));
|
||||||
|
res.push_back(dowel);
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
dowels->invalidate_bounding_box();
|
|
||||||
dowels->center_around_origin();
|
|
||||||
}
|
|
||||||
|
|
||||||
dowels->name += "-Dowels";
|
|
||||||
|
|
||||||
// Reset instance transformation except offset and Z-rotation
|
|
||||||
for (size_t i = 0; i < instances.size(); ++i) {
|
|
||||||
auto& obj_instance = dowels->instances[i];
|
|
||||||
const Vec3d offset = obj_instance->get_offset();
|
|
||||||
Vec3d rotation = Vec3d::Zero();
|
|
||||||
if (i != instance)
|
|
||||||
rotation[Z] = obj_instance->get_rotation().z();
|
|
||||||
|
|
||||||
const Vec3d displace = Geometry::assemble_transform(Vec3d::Zero(), rotation) * local_dowels_displace;
|
|
||||||
|
|
||||||
obj_instance->set_transformation(Geometry::Transformation());
|
|
||||||
obj_instance->set_offset(offset + displace);
|
|
||||||
obj_instance->set_rotation(rotation);
|
|
||||||
}
|
|
||||||
|
|
||||||
res.push_back(dowels);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_LOG_TRIVIAL(trace) << "ModelObject::cut - end";
|
BOOST_LOG_TRIVIAL(trace) << "ModelObject::cut - end";
|
||||||
|
@ -1882,9 +1882,12 @@ void ObjectList::del_info_item(const int obj_idx, InfoItemType type)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case InfoItemType::Cut:
|
case InfoItemType::Cut:
|
||||||
|
if (0) { // #ysFIXME_Cut
|
||||||
cnv->get_gizmos_manager().reset_all_states();
|
cnv->get_gizmos_manager().reset_all_states();
|
||||||
Plater::TakeSnapshot(plater, _L("Remove cut connectors"));
|
Plater::TakeSnapshot(plater, _L("Remove cut connectors"));
|
||||||
(*m_objects)[obj_idx]->cut_connectors.clear();
|
(*m_objects)[obj_idx]->cut_connectors.clear();
|
||||||
|
} else
|
||||||
|
Slic3r::GUI::show_error(nullptr, _L("Connectors cannot be deleted from cut object."));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case InfoItemType::MmuSegmentation:
|
case InfoItemType::MmuSegmentation:
|
||||||
@ -2583,7 +2586,7 @@ void ObjectList::part_selection_changed()
|
|||||||
}
|
}
|
||||||
case InfoItemType::CustomSupports:
|
case InfoItemType::CustomSupports:
|
||||||
case InfoItemType::CustomSeam:
|
case InfoItemType::CustomSeam:
|
||||||
case InfoItemType::Cut:
|
// case InfoItemType::Cut:
|
||||||
case InfoItemType::MmuSegmentation:
|
case InfoItemType::MmuSegmentation:
|
||||||
{
|
{
|
||||||
GLGizmosManager::EType gizmo_type = info_type == InfoItemType::CustomSupports ? GLGizmosManager::EType::FdmSupports :
|
GLGizmosManager::EType gizmo_type = info_type == InfoItemType::CustomSupports ? GLGizmosManager::EType::FdmSupports :
|
||||||
@ -2772,7 +2775,10 @@ void ObjectList::update_info_items(size_t obj_idx, wxDataViewItemArray* selectio
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case InfoItemType::Cut :
|
case InfoItemType::Cut :
|
||||||
|
if (0) // #ysFIXME_Cut
|
||||||
should_show = !model_object->cut_connectors.empty();
|
should_show = !model_object->cut_connectors.empty();
|
||||||
|
else
|
||||||
|
should_show = model_object->is_cut() && model_object->volumes.size() > 1;
|
||||||
break;
|
break;
|
||||||
case InfoItemType::VariableLayerHeight :
|
case InfoItemType::VariableLayerHeight :
|
||||||
should_show = printer_technology() == ptFFF
|
should_show = printer_technology() == ptFFF
|
||||||
@ -2827,7 +2833,7 @@ void ObjectList::add_object_to_list(size_t obj_idx, bool call_selection_changed)
|
|||||||
update_info_items(obj_idx, nullptr, call_selection_changed);
|
update_info_items(obj_idx, nullptr, call_selection_changed);
|
||||||
|
|
||||||
// add volumes to the object
|
// add volumes to the object
|
||||||
if (model_object->volumes.size() > 1) {
|
if (model_object->volumes.size() > 1 && !model_object->is_cut()) {
|
||||||
for (const ModelVolume* volume : model_object->volumes) {
|
for (const ModelVolume* volume : model_object->volumes) {
|
||||||
const wxDataViewItem& vol_item = m_objects_model->AddVolumeChild(item,
|
const wxDataViewItem& vol_item = m_objects_model->AddVolumeChild(item,
|
||||||
from_u8(volume->name),
|
from_u8(volume->name),
|
||||||
|
Loading…
Reference in New Issue
Block a user