From de220ea3788be11308b4a3bf0fc78faf14481d2c Mon Sep 17 00:00:00 2001 From: Joel Palmius Date: Fri, 23 Dec 2022 13:29:10 +0100 Subject: [PATCH] Handle targets with deleted helpers, for issue #72 --- src/mpfb/services/targetservice.py | 31 +++++++++++++------ .../ui/basemeshops/operators/deletehelpers.py | 5 +++ 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/mpfb/services/targetservice.py b/src/mpfb/services/targetservice.py index 1c55c8cd..f6705c4a 100644 --- a/src/mpfb/services/targetservice.py +++ b/src/mpfb/services/targetservice.py @@ -258,16 +258,17 @@ def _target_string_to_shape_key_info(target_string, shape_key_name, blender_obje profiler.leave("-- parse_target_line") profiler.enter("-- insert_target_line") if not blender_object is None: - vert = blender_object.data.vertices[index] + if index < len(blender_object.data.vertices): + vert = blender_object.data.vertices[index] - diff = vert_info["coordinate_difference"] - profiler.enter("copy_vert") - bco = vert.co.copy() - tco = [bco[0] + diff[0], bco[1] + diff[1], bco[2] + diff[2]] - profiler.leave("copy_vert") + diff = vert_info["coordinate_difference"] + profiler.enter("copy_vert") + bco = vert.co.copy() + tco = [bco[0] + diff[0], bco[1] + diff[1], bco[2] + diff[2]] + profiler.leave("copy_vert") - vert_info["basis_coordinates"] = bco - vert_info["target_coordinates"] = tco + vert_info["basis_coordinates"] = bco + vert_info["target_coordinates"] = tco else: vert_info["basis_coordinates"] = [0.0, 0.0, 0.0] # We have no info about the mesh here vert_info["target_coordinates"] = [0.0, 0.0, 0.0] # We have no info about the mesh here @@ -309,7 +310,8 @@ def target_string_to_shape_key(target_string, shape_key_name, blender_object): profiler.enter("-- apply_verts") for vertex in shape_key_info["vertices"]: index = vertex["index"] - mesh.verts[index][target] = vertex["target_coordinates"] + if index < len(mesh.verts): + mesh.verts[index][target] = vertex["target_coordinates"] profiler.leave("-- apply_verts") profiler.enter("-- apply_bmesh") @@ -510,7 +512,8 @@ def bulk_load_targets(blender_object, target_stack, encode_target_names=False): _LOG.debug("bmesh, target", (mesh, target)) for vertex in shape_key_info["vertices"]: index = vertex["index"] - mesh.verts[index][target] = vertex["target_coordinates"] + if index < len(mesh.verts): + mesh.verts[index][target] = vertex["target_coordinates"] profiler.leave(" -- bulk load -> populate shape keys") profiler.enter("- apply_shape_key_info") @@ -818,6 +821,14 @@ def get_current_macro_targets(basemesh, decode_names=True): _MACLOG.dump("get_current_macro_targets", macro_targets) return macro_targets + @staticmethod + def reapply_all_details(basemesh, remove_zero_weight_targets=True): + target_stack = TargetService.get_target_stack(basemesh, exclude_starts_with="$md") + TargetService.reapply_macro_details(basemesh, remove_zero_weight_targets) + for tinfo in target_stack: + TargetService.set_target_value(basemesh, tinfo['target'], 0.0, delete_target_on_zero=True) + TargetService.bulk_load_targets(basemesh, target_stack, encode_target_names=False) + @staticmethod def reapply_macro_details(basemesh, remove_zero_weight_targets=True): profiler = PrimitiveProfiler("TargetService") diff --git a/src/mpfb/ui/basemeshops/operators/deletehelpers.py b/src/mpfb/ui/basemeshops/operators/deletehelpers.py index 5a1c8b7d..ce78efb1 100644 --- a/src/mpfb/ui/basemeshops/operators/deletehelpers.py +++ b/src/mpfb/ui/basemeshops/operators/deletehelpers.py @@ -85,6 +85,11 @@ def execute(self, context): self.report({'INFO'}, "Helper geometry deleted") + TargetService.reapply_all_details(obj) + + obj.select_set(True) + ObjectService.activate_blender_object(obj) + return {'FINISHED'} ClassManager.add_class(MPFB_OT_Delete_Helpers_Operator)