FIX: Multiple text generated failed. STUDIO-2522
And support generate text on the outer surface of the assembly. Change-Id: Iebe0b47b3f85c3800c799c4b5800514c0f2838fb
This commit is contained in:
parent
1ac8013fa5
commit
752c145384
1 changed files with 28 additions and 27 deletions
|
@ -228,13 +228,6 @@ bool GLGizmoText::gizmo_event(SLAGizmoEventType action, const Vec2d &mouse_posit
|
|||
const ModelInstance *mi = mo->instances[selection.get_instance_idx()];
|
||||
const Camera & camera = wxGetApp().plater()->get_camera();
|
||||
|
||||
// Precalculate transformations of individual meshes.
|
||||
std::vector<Transform3d> trafo_matrices;
|
||||
for (const ModelVolume *mv : mo->volumes) {
|
||||
if (mv->is_model_part()) {
|
||||
trafo_matrices.emplace_back(mi->get_transformation().get_matrix() * mv->get_matrix());
|
||||
}
|
||||
}
|
||||
if (action == SLAGizmoEventType::Moving) {
|
||||
if (shift_down && !alt_down && !control_down) {
|
||||
float angle = m_rotate_angle + 0.5 * (m_mouse_position - mouse_position).y();
|
||||
|
@ -265,6 +258,23 @@ bool GLGizmoText::gizmo_event(SLAGizmoEventType action, const Vec2d &mouse_posit
|
|||
if (m_is_modify)
|
||||
return true;
|
||||
|
||||
Plater *plater = wxGetApp().plater();
|
||||
if (!plater)
|
||||
return true;
|
||||
|
||||
ModelObject *model_object = selection.get_model()->objects[m_object_idx];
|
||||
if (m_preview_text_volume_id > 0) {
|
||||
model_object->delete_volume(m_preview_text_volume_id);
|
||||
plater->update();
|
||||
m_preview_text_volume_id = -1;
|
||||
}
|
||||
|
||||
// Precalculate transformations of individual meshes.
|
||||
std::vector<Transform3d> trafo_matrices;
|
||||
for (const ModelVolume *mv : mo->volumes) {
|
||||
if (mv->is_model_part()) { trafo_matrices.emplace_back(mi->get_transformation().get_matrix() * mv->get_matrix()); }
|
||||
}
|
||||
|
||||
Vec3f normal = Vec3f::Zero();
|
||||
Vec3f hit = Vec3f::Zero();
|
||||
size_t facet = 0;
|
||||
|
@ -275,9 +285,6 @@ bool GLGizmoText::gizmo_event(SLAGizmoEventType action, const Vec2d &mouse_posit
|
|||
|
||||
// Cast a ray on all meshes, pick the closest hit and save it for the respective mesh
|
||||
for (int mesh_id = 0; mesh_id < int(trafo_matrices.size()); ++mesh_id) {
|
||||
if (mesh_id == m_preview_text_volume_id)
|
||||
continue;
|
||||
|
||||
MeshRaycaster mesh_raycaster = MeshRaycaster(mo->volumes[mesh_id]->mesh());
|
||||
|
||||
if (mesh_raycaster.unproject_on_mesh(mouse_position, trafo_matrices[mesh_id], camera, hit, normal,
|
||||
|
@ -302,17 +309,6 @@ bool GLGizmoText::gizmo_event(SLAGizmoEventType action, const Vec2d &mouse_posit
|
|||
|
||||
m_rr = {mouse_position, closest_hit_mesh_id, closest_hit, closest_normal};
|
||||
|
||||
Plater *plater = wxGetApp().plater();
|
||||
if (!plater)
|
||||
return true;
|
||||
|
||||
ModelObject *model_object = selection.get_model()->objects[m_object_idx];
|
||||
if (m_preview_text_volume_id > 0) {
|
||||
model_object->delete_volume(m_preview_text_volume_id);
|
||||
plater->update();
|
||||
m_preview_text_volume_id = -1;
|
||||
}
|
||||
|
||||
m_is_modify = true;
|
||||
generate_text_volume(false);
|
||||
plater->update();
|
||||
|
@ -978,20 +974,25 @@ bool GLGizmoText::update_text_positions(const std::vector<std::string>& texts)
|
|||
|
||||
TriangleMesh slice_meshs;
|
||||
int mesh_index = 0;
|
||||
int volume_index = 0;
|
||||
for (int i = 0; i < mo->volumes.size(); ++i) {
|
||||
// skip the editing text volume
|
||||
if (m_is_modify && m_volume_idx == i)
|
||||
continue;
|
||||
|
||||
ModelVolume *mv = mo->volumes[i];
|
||||
if (mv->is_model_part()) {
|
||||
if (mesh_index == m_rr.mesh_id) {
|
||||
TriangleMesh vol_mesh(mv->mesh());
|
||||
vol_mesh.transform(mv->get_matrix());
|
||||
slice_meshs = vol_mesh;
|
||||
break;
|
||||
volume_index = i;
|
||||
}
|
||||
TriangleMesh vol_mesh(mv->mesh());
|
||||
vol_mesh.transform(mv->get_matrix());
|
||||
slice_meshs.merge(vol_mesh);
|
||||
mesh_index++;
|
||||
}
|
||||
}
|
||||
|
||||
ModelVolume* volume = mo->volumes[mesh_index];
|
||||
ModelVolume* volume = mo->volumes[volume_index];
|
||||
|
||||
Vec3d temp_position = m_mouse_position_world;
|
||||
Vec3d temp_normal = m_mouse_normal_world;
|
||||
|
@ -1093,7 +1094,7 @@ bool GLGizmoText::update_text_positions(const std::vector<std::string>& texts)
|
|||
// for debug
|
||||
//export_regions_to_svg(Point(m_mouse_position_world.x(), m_mouse_position_world.y()), temp_polys);
|
||||
|
||||
Polygons polys = temp_polys;
|
||||
Polygons polys = union_(temp_polys);
|
||||
|
||||
auto point_in_line_rectange = [](const Line &line, const Point &point, double& distance) {
|
||||
distance = abs((point.x() - line.a.x()) * (line.b.y() - line.a.y()) - (line.b.x() - line.a.x()) * (point.y() - line.a.y()));
|
||||
|
|
Loading…
Reference in a new issue