Hi all, I’m having a hard time finding what is going on when I change a property value in the redo panel.
Here’s where I’m stuck. I have a simple addon that takes a textured object:
And uses the remesh modifier, data transfer modifier, and some UV editing to produce a voxel version of the object:
When changing the octree depth after the fact though, it loses its UV information as if the Data Transfer part of the function is not working. However, I don’t get any error and according to a print statement it is indeed running.
One weird thing I’ve found: When I comment out lines 108-131, the mesh simply disappears. It’s not hidden or disabled, I’m still in Object mode, none of the mesh components are hidden in Edit mode, and I can see it in the outliner, but it’s otherwise gone. If I toggle into edit mode and back into object mode it comes back, but doing that in the function doesn’t seem to help. Any ideas would be appreciated!
class Voxelfy(Operator):
bl_idname = "object.voxelfy"
bl_label = "Voxelfy"
bl_description = "Convert active object to voxelized mesh"
bl_options = {'REGISTER', 'UNDO'}
sourceName = bpy.props.StringProperty(
name = "Source Object",
options = {'HIDDEN'},
)
targetName = bpy.props.StringProperty(
name = "Target Object",
options = {'HIDDEN'}
)
voxelfyResolution = bpy.props.IntProperty(
name = "Voxel Resolution",
default = 6,
min = 1,
max = 20,
description = "Octree Depth used for the Remesh modifier",
)
@classmethod
def poll(cls, context):
return context.object.select_get() and context.object.type == 'MESH' or context.object.type == 'CURVE'
def invoke(self, context, event):
return context.window_manager.invoke_props_dialog(self)
def execute(self, context):
#set source and create target object
self.sourceName = bpy.context.object.name
source = bpy.data.objects[self.sourceName]
bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
bpy.ops.object.duplicate_move(OBJECT_OT_duplicate={"linked":False, "mode":'TRANSLATION'})
bpy.context.object.name = source.name + "_voxelfied"
bpy.ops.object.convert(target='MESH')
self.targetName = bpy.context.object.name
target = bpy.data.objects[self.targetName]
#turn the target object into blocks
bpy.ops.object.modifier_add(type='REMESH')
target.modifiers["Remesh"].mode = 'BLOCKS'
target.modifiers["Remesh"].octree_depth = self.voxelfyResolution
target.modifiers["Remesh"].use_remove_disconnected = False
bpy.ops.object.convert(target='MESH')
bpy.ops.object.mode_set(mode='EDIT', toggle=False)
bpy.ops.mesh.select_all(action='SELECT')
bpy.ops.uv.reset()
bpy.ops.mesh.select_all(action='DESELECT')
bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
#transfer the source UV's to the target object
bpy.ops.object.modifier_add(type='DATA_TRANSFER')
target.modifiers["DataTransfer"].object = source
target.modifiers["DataTransfer"].use_loop_data = True
target.modifiers["DataTransfer"].loop_mapping = 'POLYINTERP_LNORPROJ'
target.modifiers["DataTransfer"].data_types_loops = {'UV'}
bpy.ops.object.datalayout_transfer(modifier="DataTransfer")
bpy.ops.object.modifier_apply(apply_as='DATA', modifier="DataTransfer")
#reduce each face to a single color
bpy.ops.object.mode_set(mode='EDIT', toggle=False)
bpy.ops.mesh.select_mode(use_extend=False, use_expand=False, type='FACE')
bpy.context.area.ui_type = 'UV'
bpy.context.scene.tool_settings.use_uv_select_sync = False
bpy.context.space_data.pivot_point = 'INDIVIDUAL_ORIGINS'
count = 0
while count < 100:
bpy.ops.mesh.select_all(action='DESELECT')
bpy.ops.mesh.select_random(percent=count, seed=count)
bpy.ops.uv.select_all(action='SELECT')
bpy.context.area.ui_type = 'UV'
bpy.ops.transform.resize(value=(0.0001, 0.0001, 0.0001))
bpy.ops.mesh.hide(unselected=False)
count += 1
#return to previous context
bpy.ops.mesh.reveal()
bpy.ops.screen.space_type_set_or_cycle(space_type='VIEW_3D')
bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
source.hide_viewport = True
return {'FINISHED'}
EDIT: I’ve updated the class and property names to conform to the 2.8 conventions, but that does not affect this issue.