Fix adding cut surface on torus by right panel

Fix (partialy) position of add text on torus by right panel
This commit is contained in:
Filip Sykala - NTB T15p 2022-12-12 13:28:17 +01:00
parent 7edc2acfc0
commit c254d09667
2 changed files with 36 additions and 22 deletions

View file

@ -235,6 +235,7 @@ void GLGizmoEmboss::create_volume(ModelVolumeType volume_type, const Vec2d& mous
priv::start_create_object_job(emboss_data, mouse_pos);
}
// Designed for create volume without information of mouse in scene
void GLGizmoEmboss::create_volume(ModelVolumeType volume_type)
{
if (!priv::is_valid(volume_type)) return;
@ -248,29 +249,41 @@ void GLGizmoEmboss::create_volume(ModelVolumeType volume_type)
Size s = m_parent.get_canvas_size();
Vec2d screen_center(s.get_width() / 2., s.get_height() / 2.);
DataBase emboss_data = priv::create_emboss_data_base(m_text, m_style_manager);
if (!selection.is_empty() && object_idx >= 0) {
// create volume inside of object
const Plater &plater = *wxGetApp().plater();
const Camera &camera = plater.get_camera();
const ModelObjectPtrs &objects = wxGetApp().model().objects;
Vec2d coor;
const GLVolume *vol = nullptr;
priv::find_closest_volume(selection, screen_center, camera, objects, &coor, &vol);
if (!priv::start_create_volume_on_surface_job(emboss_data, volume_type, coor, vol, m_raycast_manager)) {
assert(vol != nullptr);
// in centroid of convex hull is not hit with object
// soo create transfomation on border of object
const ModelObject *obj = objects[vol->object_idx()];
const BoundingBoxf3& bb = obj->bounding_box();
Transform3d volume_trmat(Eigen::Translation3d(bb.max.x(), 0., 0.));
priv::start_create_volume_job(obj, volume_trmat, emboss_data, volume_type);
}
} else {
DataBase emboss_data = priv::create_emboss_data_base(m_text, m_style_manager);
const ModelObjectPtrs &objects = selection.get_model()->objects;
// No selected object so create new object
if (selection.is_empty() || object_idx < 0 || object_idx >= objects.size()) {
// create Object on center of screen
// when ray throw center of screen not hit bed it create object on center of bed
// when ray throw center of screen not hit bed it create object on center of bed
priv::start_create_object_job(emboss_data, screen_center);
return;
}
// create volume inside of selected object
Vec2d coor;
const GLVolume *vol = nullptr;
const Camera &camera = wxGetApp().plater()->get_camera();
priv::find_closest_volume(selection, screen_center, camera, objects, &coor, &vol);
if (!priv::start_create_volume_on_surface_job(emboss_data, volume_type, coor, vol, m_raycast_manager)) {
assert(vol != nullptr);
// in centroid of convex hull is not hit with object
// soo create transfomation on border of object
// there is no point on surface so no use of surface will be applied
if (emboss_data.text_configuration.style.prop.use_surface)
emboss_data.text_configuration.style.prop.use_surface = false;
// Transformation is inspired add generic volumes in ObjectList::load_generic_subobject
const ModelObject *obj = objects[vol->object_idx()];
BoundingBoxf3 instance_bb = obj->instance_bounding_box(vol->instance_idx());
// Translate the new modifier to be pickable: move to the left front corner of the instance's bounding box, lift to print bed.
Vec3d offset(instance_bb.max.x(), instance_bb.min.y(), instance_bb.min.z());
// offset += 0.5 * mesh_bb.size(); // No size of text volume at this position
offset -= vol->get_instance_offset();
Transform3d tr = vol->get_instance_transformation().get_matrix_no_offset().inverse();
Vec3d offset_tr = tr * offset;
Transform3d volume_trmat = tr.translate(offset_tr);
priv::start_create_volume_job(obj, volume_trmat, emboss_data, volume_type);
}
}

View file

@ -729,7 +729,8 @@ TriangleMesh priv::cut_surface(DataBase& input1, const SurfaceVolumeData& input2
s_to_itss[&s - &sources.front()] = itss.size();
itss.emplace_back(std::move(its));
}
if (itss.empty()) throw JobException(_u8L("There is no volume in projection direction.").c_str());
if (itss.empty())
throw JobException(_u8L("There is no volume in projection direction.").c_str());
Transform3d tr_inv = biggest->tr.inverse();
size_t itss_index = s_to_itss[biggest - &sources.front()];