|
3 | 3 | import bmesh |
4 | 4 | import bpy |
5 | 5 |
|
6 | | -from .helpers import new_vgroup, new_modifier, edit_mesh_elements, bmesh_vertex_group_bleed |
| 6 | +from .helpers import new_vgroup, new_modifier, TempModifier, edit_mesh_elements, bmesh_vertex_group_bleed |
7 | 7 | from ..helpers import get_context, link_properties, load_selection, save_selection |
8 | 8 |
|
9 | 9 | class GRET_OT_graft(bpy.types.Operator): |
@@ -206,39 +206,38 @@ def _execute(self, context): |
206 | 206 |
|
207 | 207 | ctx = get_context(obj) |
208 | 208 | if self.transfer_normals: |
209 | | - mod = new_modifier(obj, type='DATA_TRANSFER', at_top=True) |
210 | | - mod.object = dst_obj |
211 | | - mod.vertex_group = boundary_vg.name |
212 | | - mod.use_object_transform = True |
213 | | - mod.use_loop_data = True |
214 | | - mod.data_types_loops = {'CUSTOM_NORMAL'} |
215 | | - mod.loop_mapping = 'POLYINTERP_NEAREST' |
216 | 209 | obj.data.use_auto_smooth = True |
217 | 210 | obj.data.auto_smooth_angle = pi |
218 | 211 | bpy.ops.mesh.customdata_custom_splitnormals_clear(ctx) |
219 | | - bpy.ops.object.modifier_apply(ctx, modifier=mod.name) |
| 212 | + |
| 213 | + with TempModifier(obj, type='DATA_TRANSFER') as data_mod: |
| 214 | + data_mod.object = dst_obj |
| 215 | + data_mod.vertex_group = boundary_vg.name |
| 216 | + data_mod.use_object_transform = True |
| 217 | + data_mod.use_loop_data = True |
| 218 | + data_mod.data_types_loops = {'CUSTOM_NORMAL'} |
| 219 | + data_mod.loop_mapping = 'POLYINTERP_NEAREST' |
220 | 220 |
|
221 | 221 | if self.transfer_vertex_groups or self.transfer_uv: |
222 | | - mod = new_modifier(obj, type='DATA_TRANSFER', at_top=True) |
223 | | - mod.object = dst_obj |
224 | | - mod.use_object_transform = True |
225 | | - if self.transfer_vertex_groups: |
226 | | - mod.use_vert_data = True |
227 | | - mod.data_types_verts = {'VGROUP_WEIGHTS'} |
228 | | - mod.vert_mapping = 'EDGEINTERP_NEAREST' |
229 | | - if self.transfer_uv: |
230 | | - mod.use_loop_data = True |
231 | | - mod.data_types_loops = {'UV'} # Automatically turns on use_poly_data |
232 | | - mod.loop_mapping = 'POLYINTERP_NEAREST' |
233 | | - bpy.ops.object.datalayout_transfer(ctx, modifier=mod.name) |
234 | | - bpy.ops.object.modifier_apply(ctx, modifier=mod.name) |
| 222 | + with TempModifier(obj, type='DATA_TRANSFER') as data_mod: |
| 223 | + data_mod.object = dst_obj |
| 224 | + data_mod.use_object_transform = True |
| 225 | + if self.transfer_vertex_groups: |
| 226 | + data_mod.use_vert_data = True |
| 227 | + data_mod.data_types_verts = {'VGROUP_WEIGHTS'} |
| 228 | + data_mod.vert_mapping = 'EDGEINTERP_NEAREST' |
| 229 | + if self.transfer_uv: |
| 230 | + data_mod.use_loop_data = True |
| 231 | + data_mod.data_types_loops = {'UV'} # Automatically turns on use_poly_data |
| 232 | + data_mod.loop_mapping = 'POLYINTERP_NEAREST' |
| 233 | + bpy.ops.object.datalayout_transfer(ctx, modifier=data_mod.name) |
235 | 234 |
|
236 | 235 | # If requested, create a mask modifier that will hide the intersection's inner verts |
237 | 236 | if self.create_mask: |
238 | 237 | mask_vg = new_vgroup(orig_dst_obj, f"_mask_{obj.name}") |
239 | 238 | intersecting_verts = (dst_mesh.vertices[i] for i in intersecting_vert_indices) |
240 | 239 | mask_vg.add([v.index for v in intersecting_verts if not v.select], 1.0, 'REPLACE') |
241 | | - mask_mod = new_modifier(orig_dst_obj, type='MASK', name=mask_vg.name, at_top=True) |
| 240 | + mask_mod = new_modifier(orig_dst_obj, type='MASK', name=mask_vg.name) |
242 | 241 | mask_mod.vertex_group = mask_vg.name |
243 | 242 | mask_mod.invert_vertex_group = True |
244 | 243 | mod_dp = f'modifiers["{mask_mod.name}"]' |
|
0 commit comments