Files
blender-portable-repo/scripts/addons/legolizer/__init__.py
T
2026-03-17 14:30:01 -06:00

874 lines
50 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTIBILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
bl_info = {
"name" : "Legolizer",
"author" : "Alberrvfx, Al-Dezel",
"description" : " Convert all your 3D models into Lego brick style.",
"blender" : (4, 0, 0),
"version" : (2, 0, 1),
"location" : "",
"warning" : "",
"doc_url": "",
"tracker_url": "",
"category" : "3D View"
}
import bpy
import bpy.utils.previews
import os
from bpy.app.handlers import persistent
addon_keymaps = {}
_icons = None
visual_scripting_editor = {'sna_new_variable': False, }
def property_exists(prop_path, glob, loc):
try:
eval(prop_path, glob, loc)
return True
except:
return False
def find_user_keyconfig(key):
km, kmi = addon_keymaps[key]
for item in bpy.context.window_manager.keyconfigs.user.keymaps[km.name].keymap_items:
found_item = False
if kmi.idname == item.idname:
found_item = True
for name in dir(kmi.properties):
if not name in ["bl_rna", "rna_type"] and not name[0] == "_":
if name in kmi.properties and name in item.properties and not kmi.properties[name] == item.properties[name]:
found_item = False
if found_item:
return item
print(f"Couldn't find keymap item for {key}, using addon keymap instead. This won't be saved across sessions!")
return kmi
def ShowMessageBoxer(title, icon, message):
scene = bpy.context.scene
# Access the 2D cursor location
cursor_location = scene.cursor.location
def draw(self, context):
self.layout.label(text=message)
bpy.context.window_manager.popup_menu(draw, title=title, icon=icon)
def sna_update_sna_legolizer_material_9D59F(self, context):
sna_updated_prop = self.sna_legolizer_material
bpy.data.node_groups[bpy.context.object.modifiers.active.node_group.name].nodes['Set Material'].inputs[2].default_value = sna_updated_prop
bpy.context.view_layer.objects.active.update_tag(refresh={'DATA'}, )
def sna_update_sna_landscape_material_E64B9(self, context):
sna_updated_prop = self.sna_landscape_material
bpy.data.node_groups[bpy.context.object.modifiers.active.node_group.name].nodes['Switch'].inputs[23].default_value = sna_updated_prop
bpy.context.view_layer.objects.active.update_tag(refresh={'DATA'}, )
class SNA_OT_Operator_88521(bpy.types.Operator):
bl_idname = "sna.operator_88521"
bl_label = "Operator"
bl_description = ""
bl_options = {"REGISTER", "UNDO"}
@classmethod
def poll(cls, context):
if bpy.app.version >= (3, 0, 0) and True:
cls.poll_message_set('')
return not False
def execute(self, context):
for i_F4E5A in range(len(bpy.context.screen.areas)):
if (bpy.context.screen.areas[i_F4E5A].type == 'PROPERTIES'):
for i_EE2BD in range(len(bpy.context.screen.areas[i_F4E5A].regions)):
if (bpy.context.screen.areas[i_F4E5A].regions[i_EE2BD].type == 'WINDOW'):
area_07961 = bpy.context.screen.areas[i_F4E5A]
region_07961 = bpy.context.screen.areas[i_F4E5A].regions[i_EE2BD]
with bpy.context.temp_override(area=area_07961, region=region_07961, ):
bpy.context.scene.cycles.bake_type = 'DIFFUSE'
bpy.context.scene.render.bake.use_pass_direct = False
bpy.context.scene.render.bake.use_pass_indirect = False
bpy.context.scene.render.bake.margin = 4
bpy.ops.object.bake('INVOKE_DEFAULT', type='DIFFUSE')
bpy.ops.object.light_add('INVOKE_DEFAULT', type='SUN', location=(1.0, 1.0, 10.0))
bpy.ops.object.delete()
if bpy.context and bpy.context.screen:
for a in bpy.context.screen.areas:
a.tag_redraw()
return {"FINISHED"}
def invoke(self, context, event):
return self.execute(context)
def sna_function_interface_7D9FC(layout_function, ):
op = layout_function.operator('sna.operator_88521', text='Bake', icon_value=192, emboss=True, depress=False)
class SNA_PT_LEGOLIZER_D7609(bpy.types.Panel):
bl_label = 'Legolizer'
bl_idname = 'SNA_PT_LEGOLIZER_D7609'
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
bl_context = ''
bl_category = 'Legolizer'
bl_order = 0
bl_ui_units_x=0
@classmethod
def poll(cls, context):
return not (False)
def draw_header(self, context):
layout = self.layout
def draw(self, context):
layout = self.layout
col_CDA22 = layout.column(heading='', align=False)
col_CDA22.alert = False
col_CDA22.enabled = bool(len(bpy.context.view_layer.objects.selected))
col_CDA22.active = True
col_CDA22.use_property_split = False
col_CDA22.use_property_decorate = False
col_CDA22.scale_x = 1.0
col_CDA22.scale_y = 1.0
col_CDA22.alignment = 'Expand'.upper()
if not True: col_CDA22.operator_context = "EXEC_DEFAULT"
op = col_CDA22.operator('sna.operator_79c5b', text='Legolize', icon_value=0, emboss=True, depress=False)
op = col_CDA22.operator('sna.operator002_5e694', text='Lego Landscape Generator', icon_value=0, emboss=True, depress=False)
col_3E229 = layout.column(heading='', align=False)
col_3E229.alert = False
col_3E229.enabled = True
col_3E229.active = True
col_3E229.use_property_split = False
col_3E229.use_property_decorate = False
col_3E229.scale_x = 1.0
col_3E229.scale_y = 1.149999976158142
col_3E229.alignment = 'Expand'.upper()
if not True: col_3E229.operator_context = "EXEC_DEFAULT"
if (not bpy.context.scene.sna_new_property):
col_70AAD = col_3E229.column(heading='', align=False)
col_70AAD.alert = False
col_70AAD.enabled = True
col_70AAD.active = True
col_70AAD.use_property_split = False
col_70AAD.use_property_decorate = False
col_70AAD.scale_x = 1.0
col_70AAD.scale_y = 1.0
col_70AAD.alignment = 'Expand'.upper()
if not True: col_70AAD.operator_context = "EXEC_DEFAULT"
op = col_70AAD.operator('sna.add_legolizer_setup_b16ae', text='Add Setup', icon_value=0, emboss=True, depress=True)
col_70AAD.separator(factor=2.049999952316284)
class SNA_OT_Operator_79C5B(bpy.types.Operator):
bl_idname = "sna.operator_79c5b"
bl_label = "Operator"
bl_description = ""
bl_options = {"REGISTER", "UNDO"}
@classmethod
def poll(cls, context):
if bpy.app.version >= (3, 0, 0) and True:
cls.poll_message_set('')
return not False
def execute(self, context):
if property_exists("bpy.data.node_groups['Legolizer']", globals(), locals()):
modifier_EC83B = bpy.context.active_object.modifiers.new(name='Legolizer', type='NODES', )
modifier_EC83B.node_group = bpy.data.node_groups['Legolizer']
else:
before_data = list(bpy.data.node_groups)
bpy.ops.wm.append(directory=os.path.join(os.path.dirname(__file__), 'assets', 'Legolizer_Full_Version3 main.blend') + r'\NodeTree', filename='Legolizer', link=False)
new_data = list(filter(lambda d: not d in before_data, list(bpy.data.node_groups)))
appended_54BCA = None if not new_data else new_data[0]
modifier_45945 = bpy.context.active_object.modifiers.new(name='Legolizer', type='NODES', )
modifier_45945.node_group = appended_54BCA
sna_legolizer_function_AA320()
bpy.context.view_layer.objects.active.modifiers['Legolizer']['Input_6'] = bpy.context.view_layer.objects.active.data.uv_layers.active.name
bpy.context.view_layer.objects.active.active_material.node_tree.nodes['Attribute'].attribute_name = bpy.context.view_layer.objects.active.data.uv_layers.active.name
return {"FINISHED"}
def invoke(self, context, event):
return self.execute(context)
class SNA_OT_Operator002_5E694(bpy.types.Operator):
bl_idname = "sna.operator002_5e694"
bl_label = "Operator.002"
bl_description = ""
bl_options = {"REGISTER", "UNDO"}
@classmethod
def poll(cls, context):
if bpy.app.version >= (3, 0, 0) and True:
cls.poll_message_set('')
return not False
def execute(self, context):
if property_exists("bpy.data.node_groups['Lego_Landscape_Generator']", globals(), locals()):
modifier_095E3 = bpy.context.active_object.modifiers.new(name='Lego_Landscape_Generator', type='NODES', )
modifier_095E3.node_group = bpy.data.node_groups['Lego_Landscape_Generator']
else:
before_data = list(bpy.data.node_groups)
bpy.ops.wm.append(directory=os.path.join(os.path.dirname(__file__), 'assets', 'Legolizer_Full_Version3 main.blend') + r'\NodeTree', filename='Lego_Landscape_Generator', link=False)
new_data = list(filter(lambda d: not d in before_data, list(bpy.data.node_groups)))
appended_1A324 = None if not new_data else new_data[0]
modifier_3345B = bpy.context.active_object.modifiers.new(name='Lego_Landscape_Generator', type='NODES', )
modifier_3345B.node_group = appended_1A324
sna_landscape_material_function_5D422()
return {"FINISHED"}
def invoke(self, context, event):
return self.execute(context)
class SNA_AddonPreferences_2E6BD(bpy.types.AddonPreferences):
bl_idname = 'legolizer'
def draw(self, context):
if not (False):
layout = self.layout
row_A16F5 = layout.row(heading='', align=False)
row_A16F5.alert = False
row_A16F5.enabled = True
row_A16F5.active = True
row_A16F5.use_property_split = False
row_A16F5.use_property_decorate = False
row_A16F5.scale_x = 1.0
row_A16F5.scale_y = 1.0
row_A16F5.alignment = 'Expand'.upper()
if not True: row_A16F5.operator_context = "EXEC_DEFAULT"
op = row_A16F5.operator('wm.url_open', text='Alberrvfx (Blender Market)', icon_value=72, emboss=True, depress=False)
op.url = 'https://blendermarket.com/creators/alberrvfx'
op = row_A16F5.operator('wm.url_open', text='Addon Developer (Al-Dezel)', icon_value=72, emboss=True, depress=False)
op.url = 'https://blendermarket.com/creators/13lfh3mn4gnlm7q_umj3vf34yueooo8q8'
col_ACBFB = layout.column(heading='', align=True)
col_ACBFB.alert = False
col_ACBFB.enabled = True
col_ACBFB.active = True
col_ACBFB.use_property_split = False
col_ACBFB.use_property_decorate = False
col_ACBFB.scale_x = 1.0
col_ACBFB.scale_y = 1.0
col_ACBFB.alignment = 'Expand'.upper()
if not True: col_ACBFB.operator_context = "EXEC_DEFAULT"
col_ACBFB.prop(find_user_keyconfig('27F5F'), 'type', text='Apply Legolizer Shortcut', full_event=True)
col_ACBFB.prop(find_user_keyconfig('94A0F'), 'type', text='Apply Lego Landscape Gen. Shortcut', full_event=True)
col_ACBFB.prop(find_user_keyconfig('4D60F'), 'type', text='Add Set Up Shortcut', full_event=True)
class SNA_OT_Material_Properties_A10D8(bpy.types.Operator):
bl_idname = "sna.material_properties_a10d8"
bl_label = "Material Properties"
bl_description = ""
bl_options = {"REGISTER", "UNDO"}
@classmethod
def poll(cls, context):
if bpy.app.version >= (3, 0, 0) and True:
cls.poll_message_set('')
return not False
def execute(self, context):
ShowMessageBoxer('Info',
'NONE',
'The properties of the Materials will appear if you select the object that has the Material applied to it.')
return {"FINISHED"}
def invoke(self, context, event):
return self.execute(context)
class SNA_OT_Geometry_Properties_87F4A(bpy.types.Operator):
bl_idname = "sna.geometry_properties_87f4a"
bl_label = "Geometry Properties"
bl_description = ""
bl_options = {"REGISTER", "UNDO"}
@classmethod
def poll(cls, context):
if bpy.app.version >= (3, 0, 0) and True:
cls.poll_message_set('')
return not False
def execute(self, context):
ShowMessageBoxer('Info',
'NONE',
'The properties of the Geometry node will appear if you select the object that has the Geo Modifier applied to it.')
return {"FINISHED"}
def invoke(self, context, event):
return self.execute(context)
@persistent
def load_post_handler_E1A6F(dummy):
visual_scripting_editor['sna_new_variable'] = False
class SNA_OT_Add_Legolizer_Setup_B16Ae(bpy.types.Operator):
bl_idname = "sna.add_legolizer_setup_b16ae"
bl_label = "Add Legolizer Setup?"
bl_description = ""
bl_options = {"REGISTER", "UNDO"}
@classmethod
def poll(cls, context):
if bpy.app.version >= (3, 0, 0) and True:
cls.poll_message_set('')
return not visual_scripting_editor['sna_new_variable']
def execute(self, context):
before_data = list(bpy.data.node_groups)
bpy.ops.wm.append(directory=os.path.join(os.path.dirname(__file__), 'assets', 'Legolizer_Full_Version.blend') + r'\NodeTree', filename='Legolizer', link=False)
new_data = list(filter(lambda d: not d in before_data, list(bpy.data.node_groups)))
appended_67BC6 = None if not new_data else new_data[0]
bpy.ops.object.move_to_collection('INVOKE_DEFAULT', collection_index=0, is_new=True, new_collection_name='Bricks')
bpy.ops.object.hide_view_set()
bpy.context.view_layer.layer_collection.children['Bricks'].exclude = True
visual_scripting_editor['sna_new_variable'] = True
before_data = list(bpy.data.node_groups)
bpy.ops.wm.append(directory=os.path.join(os.path.dirname(__file__), 'assets', 'Legolizer_Full_Version.blend') + r'\NodeTree', filename='Lego_Landscape_Generator', link=False)
new_data = list(filter(lambda d: not d in before_data, list(bpy.data.node_groups)))
appended_34A26 = None if not new_data else new_data[0]
bpy.ops.object.delete()
bpy.context.scene.sna_new_property = True
before_data = list(bpy.data.materials)
bpy.ops.wm.append(directory=os.path.join(os.path.dirname(__file__), 'assets', 'Legolizer_Full_Version.blend') + r'\Material', filename='PBR_Plastic_Material', link=False)
new_data = list(filter(lambda d: not d in before_data, list(bpy.data.materials)))
appended_2A67E = None if not new_data else new_data[0]
before_data = list(bpy.data.materials)
bpy.ops.wm.append(directory=os.path.join(os.path.dirname(__file__), 'assets', 'Legolizer_Full_Version3 main.blend') + r'\Material', filename='PBR_Trans_Plastic_Material_v03', link=False)
new_data = list(filter(lambda d: not d in before_data, list(bpy.data.materials)))
appended_85DEE = None if not new_data else new_data[0]
before_data = list(bpy.data.materials)
bpy.ops.wm.append(directory=os.path.join(os.path.dirname(__file__), 'assets', 'Legolizer_Full_Version.blend') + r'\Material', filename='legolizer_tools', link=False)
new_data = list(filter(lambda d: not d in before_data, list(bpy.data.materials)))
appended_3381B = None if not new_data else new_data[0]
ShowMessageBoxer('Info',
'INFO',
'Completed')
return {"FINISHED"}
def invoke(self, context, event):
return context.window_manager.invoke_confirm(self, event)
def sna_landscape_material_function_5D422():
if False:
bpy.context.scene.sna_landscape_material = bpy.data.node_groups[bpy.context.object.modifiers.active.node_group.name].nodes['Switch'].inputs[23].default_value
def sna_legolizer_function_AA320():
if False:
bpy.context.scene.sna_legolizer_material = bpy.data.node_groups[bpy.context.object.modifiers.active.node_group.name].nodes['Set Material'].inputs[2].default_value
class SNA_OT_Operator001_67831(bpy.types.Operator):
bl_idname = "sna.operator001_67831"
bl_label = "Operator.001"
bl_description = ""
bl_options = {"REGISTER", "UNDO"}
@classmethod
def poll(cls, context):
if bpy.app.version >= (3, 0, 0) and True:
cls.poll_message_set('')
return not False
def execute(self, context):
bpy.ops.object.mode_set('INVOKE_DEFAULT', mode='EDIT')
bpy.ops.mesh.select_all('INVOKE_DEFAULT', action='SELECT')
bpy.ops.uv.smart_project(angle_limit=66.0, margin_method='SCALED', island_margin=0.0010000000474974513, area_weight=0.0, correct_aspect=True, scale_to_bounds=False)
bpy.ops.object.mode_set('INVOKE_DEFAULT', mode='OBJECT')
return {"FINISHED"}
def invoke(self, context, event):
return self.execute(context)
class SNA_OT_Operator_E20D3(bpy.types.Operator):
bl_idname = "sna.operator_e20d3"
bl_label = "Operator"
bl_description = ""
bl_options = {"REGISTER", "UNDO"}
@classmethod
def poll(cls, context):
if bpy.app.version >= (3, 0, 0) and True:
cls.poll_message_set('')
return not False
def execute(self, context):
exec('bpy.ops.node.add_node(use_transform=True, type="ShaderNodeTexImage")')
image_0DB6A = bpy.data.images.new(name=bpy.context.active_object.name, width=bpy.context.scene.sna_resolution_width, height=bpy.context.scene.sna_resolution_height, alpha=True, )
bpy.ops.transform.translate('INVOKE_DEFAULT', )
bpy.context.scene.render.engine = 'CYCLES'
bpy.context.scene.cycles.device = 'GPU'
bpy.context.scene.cycles.samples = 10
return {"FINISHED"}
def invoke(self, context, event):
return self.execute(context)
class SNA_PT_BAKE_79642(bpy.types.Panel):
bl_label = 'Bake'
bl_idname = 'SNA_PT_BAKE_79642'
bl_space_type = 'NODE_EDITOR'
bl_region_type = 'UI'
bl_context = ''
bl_category = 'Bake Legolizer'
bl_order = 1
bl_ui_units_x=0
@classmethod
def poll(cls, context):
return not (False)
def draw_header(self, context):
layout = self.layout
def draw(self, context):
layout = self.layout
col_F1A82 = layout.column(heading='', align=False)
col_F1A82.alert = False
col_F1A82.enabled = True
col_F1A82.active = True
col_F1A82.use_property_split = False
col_F1A82.use_property_decorate = False
col_F1A82.scale_x = 1.0
col_F1A82.scale_y = 1.5
col_F1A82.alignment = 'Expand'.upper()
if not True: col_F1A82.operator_context = "EXEC_DEFAULT"
op = col_F1A82.operator('sna.operator_e20d3', text='Add Texture', icon_value=126, emboss=True, depress=False)
op = col_F1A82.operator('sna.operator001_67831', text='Smart UV', icon_value=128, emboss=True, depress=False)
layout_function = col_F1A82
sna_function_interface_7D9FC(layout_function, )
col_7419D = layout.column(heading='', align=False)
col_7419D.alert = False
col_7419D.enabled = True
col_7419D.active = True
col_7419D.use_property_split = False
col_7419D.use_property_decorate = False
col_7419D.scale_x = 1.0
col_7419D.scale_y = 1.2000000476837158
col_7419D.alignment = 'Center'.upper()
if not True: col_7419D.operator_context = "EXEC_DEFAULT"
col_7419D.label(text='Resolution', icon_value=0)
col_7419D.prop(bpy.context.scene, 'sna_resolution_width', text='Resolution Width', icon_value=0, emboss=True)
col_7419D.prop(bpy.context.scene, 'sna_resolution_height', text='Resolution Height', icon_value=0, emboss=True)
class SNA_PT_MATERIAL_PROPERTIES_63A83(bpy.types.Panel):
bl_label = 'Material Properties'
bl_idname = 'SNA_PT_MATERIAL_PROPERTIES_63A83'
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
bl_context = ''
bl_order = 2
bl_options = {'DEFAULT_CLOSED'}
bl_parent_id = 'SNA_PT_LEGOLIZER_D7609'
bl_ui_units_x=0
@classmethod
def poll(cls, context):
return not (False)
def draw_header(self, context):
layout = self.layout
def draw(self, context):
layout = self.layout
box_5AE89 = layout.box()
box_5AE89.alert = False
box_5AE89.enabled = True
box_5AE89.active = True
box_5AE89.use_property_split = False
box_5AE89.use_property_decorate = False
box_5AE89.alignment = 'Expand'.upper()
box_5AE89.scale_x = 1.0
box_5AE89.scale_y = 1.0
if not True: box_5AE89.operator_context = "EXEC_DEFAULT"
if (bpy.context.view_layer.objects.active and bpy.context.object.active_material):
if bpy.context.object.active_material.use_nodes:
for i_53F1C in range(len(bpy.context.active_object.active_material.node_tree.nodes)):
if (bpy.context.active_object.active_material.node_tree.nodes[i_53F1C].type == 'GROUP'):
box_5AE89.separator(factor=0.10000000149011612)
col_9F17B = box_5AE89.column(heading='', align=False)
col_9F17B.alert = False
col_9F17B.enabled = True
col_9F17B.active = True
col_9F17B.use_property_split = False
col_9F17B.use_property_decorate = False
col_9F17B.scale_x = 1.0
col_9F17B.scale_y = 1.0
col_9F17B.alignment = 'Center'.upper()
if not True: col_9F17B.operator_context = "EXEC_DEFAULT"
for i_99B79 in range(len(bpy.context.active_object.active_material.node_tree.nodes[i_53F1C].inputs)):
row_7FA06 = col_9F17B.row(heading='', align=True)
row_7FA06.alert = False
row_7FA06.enabled = True
row_7FA06.active = True
row_7FA06.use_property_split = False
row_7FA06.use_property_decorate = False
row_7FA06.scale_x = 1.0
row_7FA06.scale_y = 1.0
row_7FA06.alignment = 'Expand'.upper()
if not True: row_7FA06.operator_context = "EXEC_DEFAULT"
row_7FA06.label(text=bpy.context.active_object.active_material.node_tree.nodes[i_53F1C].inputs[i_99B79].name, icon_value=0)
if ((bpy.context.active_object.active_material.node_tree.nodes[i_53F1C].inputs[i_99B79].type == 'VALUE') or (bpy.context.active_object.active_material.node_tree.nodes[i_53F1C].inputs[i_99B79].type == 'RGB') or (bpy.context.active_object.active_material.node_tree.nodes[i_53F1C].inputs[i_99B79].type == 'VECTOR') or (bpy.context.active_object.active_material.node_tree.nodes[i_53F1C].inputs[i_99B79].type == 'STRING') or (bpy.context.active_object.active_material.node_tree.nodes[i_53F1C].inputs[i_99B79].type == 'BOOLEAN') or (bpy.context.active_object.active_material.node_tree.nodes[i_53F1C].inputs[i_99B79].type == 'INT') or (bpy.context.active_object.active_material.node_tree.nodes[i_53F1C].inputs[i_99B79].type == 'RGBA') or (bpy.context.active_object.active_material.node_tree.nodes[i_53F1C].inputs[i_99B79].type == 'SHADER')):
row_7FA06.prop(bpy.context.active_object.active_material.node_tree.nodes[i_53F1C].inputs[i_99B79], 'default_value', text='', icon_value=0, emboss=True, expand=False)
row_1B3AF = box_5AE89.row(heading='', align=False)
row_1B3AF.alert = False
row_1B3AF.enabled = True
row_1B3AF.active = True
row_1B3AF.use_property_split = False
row_1B3AF.use_property_decorate = False
row_1B3AF.scale_x = 1.0
row_1B3AF.scale_y = 1.0
row_1B3AF.alignment = 'Center'.upper()
if not True: row_1B3AF.operator_context = "EXEC_DEFAULT"
row_1B3AF.label(text='Material Properties', icon_value=0)
op = row_1B3AF.operator('sna.material_properties_a10d8', text='', icon_value=1, emboss=False, depress=False)
class SNA_PT_PROPERTIES_1DA39(bpy.types.Panel):
bl_label = 'Properties'
bl_idname = 'SNA_PT_PROPERTIES_1DA39'
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
bl_context = ''
bl_order = 1
bl_parent_id = 'SNA_PT_LEGOLIZER_D7609'
bl_ui_units_x=0
@classmethod
def poll(cls, context):
return not ((not ((len(bpy.context.active_object.modifiers) > 0) and bool(len(bpy.context.view_layer.objects.selected)))))
def draw_header(self, context):
layout = self.layout
def draw(self, context):
layout = self.layout
box_A3043 = layout.box()
box_A3043.alert = False
box_A3043.enabled = True
box_A3043.active = True
box_A3043.use_property_split = False
box_A3043.use_property_decorate = False
box_A3043.alignment = 'Expand'.upper()
box_A3043.scale_x = 1.0
box_A3043.scale_y = 1.0
if not True: box_A3043.operator_context = "EXEC_DEFAULT"
if (len(bpy.context.active_object.modifiers) > 0):
if (bpy.context.active_object.modifiers.active.name == 'Legolizer'):
col_F7B09 = box_A3043.column(heading='', align=False)
col_F7B09.alert = False
col_F7B09.enabled = True
col_F7B09.active = True
col_F7B09.use_property_split = False
col_F7B09.use_property_decorate = False
col_F7B09.scale_x = 1.0
col_F7B09.scale_y = 1.0
col_F7B09.alignment = 'Expand'.upper()
if not True: col_F7B09.operator_context = "EXEC_DEFAULT"
row_D7469 = col_F7B09.row(heading='', align=False)
row_D7469.alert = False
row_D7469.enabled = True
row_D7469.active = True
row_D7469.use_property_split = False
row_D7469.use_property_decorate = False
row_D7469.scale_x = 1.0
row_D7469.scale_y = 0.949999988079071
row_D7469.alignment = 'Center'.upper()
if not True: row_D7469.operator_context = "EXEC_DEFAULT"
row_D7469.label(text='Legolizer', icon_value=0)
col_F7B09.prop(bpy.context.scene, 'sna_legolizer_material', text='Material', icon_value=0, emboss=True)
attr_C45D9 = '["' + str('Input_5' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_C45D9, text='Brick Size (Render)', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_E30E8 = '["' + str('Input_2' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_E30E8, text='Brick Size (Viewport)', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_533AF = '["' + str('Input_46' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_533AF, text='Mesh Resolution', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_2308D = '["' + str('Input_29' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_2308D, text='Brick Length X', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_56D47 = '["' + str('Input_30' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_56D47, text='Brick Length Y', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_5BBD2 = '["' + str('Input_31' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_5BBD2, text='Brick Length Z', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_FED9E = '["' + str('Input_10' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_FED9E, text='Fill Volume', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_3700D = '["' + str('Input_6' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_3700D, text='UV´s Name', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_DCF90 = '["' + str('Input_8' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_DCF90, text='LAYERS DESINTEGRATION', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_C7F28 = '["' + str('Input_9' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_C7F28, text='Animate Layers', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_D11ED = '["' + str('Input_44' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_D11ED, text='Randomness', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_F5B3C = '["' + str('Input_43' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_F5B3C, text='Animation Axis', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_58C85 = '["' + str('Input_45' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_58C85, text='Switch Direction', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_1EB3A = '["' + str('Input_47' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_1EB3A, text='Seed', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_A9DB5 = '["' + str('Input_25' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_A9DB5, text='Animation Speed', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_1BC78 = '["' + str('Input_32' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_1BC78, text='LEGO BRICKS ASSEMBLY', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_A3B13 = '["' + str('Input_38' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_A3B13, text='Anim. Effector', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_36233 = '["' + str('Input_40' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_36233, text='Animate Assembly', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_E7A47 = '["' + str('Input_35' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_E7A47, text='Randomness', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_B380A = '["' + str('Input_37' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_B380A, text='Spread Max. Distance', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_9A02E = '["' + str('Input_42' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_9A02E, text='Animation Axis', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_D9D9B = '["' + str('Input_39' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_D9D9B, text='Switch Direction', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_EA9D3 = '["' + str('Input_48' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_EA9D3, text='Seed', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_FEF16 = '["' + str('Input_41' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_FEF16, text='Animation Speed', icon_value=0, emboss=True)
else:
if (bpy.context.active_object.modifiers.active.name == 'Lego_Landscape_Generator'):
col_258B7 = box_A3043.column(heading='', align=False)
col_258B7.alert = False
col_258B7.enabled = True
col_258B7.active = True
col_258B7.use_property_split = False
col_258B7.use_property_decorate = False
col_258B7.scale_x = 1.0
col_258B7.scale_y = 1.0
col_258B7.alignment = 'Expand'.upper()
if not True: col_258B7.operator_context = "EXEC_DEFAULT"
row_9BF52 = col_258B7.row(heading='', align=False)
row_9BF52.alert = False
row_9BF52.enabled = True
row_9BF52.active = True
row_9BF52.use_property_split = False
row_9BF52.use_property_decorate = False
row_9BF52.scale_x = 1.0
row_9BF52.scale_y = 0.949999988079071
row_9BF52.alignment = 'Center'.upper()
if not True: row_9BF52.operator_context = "EXEC_DEFAULT"
row_9BF52.label(text='Lego_Landscape_Generator', icon_value=0)
col_258B7.prop(bpy.context.scene, 'sna_landscape_material', text='Material', icon_value=0, emboss=True)
attr_3DD35 = '["' + str('Input_2' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_3DD35, text='Brick Length X', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_FD116 = '["' + str('Input_3' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_FD116, text='Brick Length Y', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_7E942 = '["' + str('Input_4' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_7E942, text='Brick Length Z', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_9808F = '["' + str('Input_8' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_9808F, text='Landscape Size', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_4476E = '["' + str('Input_40' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_4476E, text='Biome Toggle', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_622A9 = '["' + str('Input_12' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_622A9, text='Scale', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_9DCE5 = '["' + str('Input_11' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_9DCE5, text='Seed', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_F166A = '["' + str('Input_10' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_F166A, text='Base Level', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_CFFC7 = '["' + str('Input_13' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_CFFC7, text='Depression', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_A2D6E = '["' + str('Input_42' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_A2D6E, text='Maximum Height', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_7041F = '["' + str('Input_14' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_7041F, text='Micro-relief', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_A591F = '["' + str('Socket_2' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_A591F, text='Rotate', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_9B939 = '["' + str('Input_43' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_9B939, text='Material Replace', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_54B13 = '["' + str('Input_17' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_54B13, text='LANDSCAPE ANIMATION', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_CA5F6 = '["' + str('Input_16' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_CA5F6, text='Animate Landscape', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_5F8CE = '["' + str('Input_19' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_5F8CE, text='Switch Direction', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_B33FE = '["' + str('Input_18' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_B33FE, text='Animation Speed', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_5394A = '["' + str('Input_36' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_5394A, text='LAYER DESINTEGRATION', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_BE2B6 = '["' + str('Input_30' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_BE2B6, text='Animate Layers', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_A0D48 = '["' + str('Input_31' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_A0D48, text='Randomness', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_B3B38 = '["' + str('Input_32' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_B3B38, text='Animation Axis', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_B19C2 = '["' + str('Input_33' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_B19C2, text='Switch Direction', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_DEAF4 = '["' + str('Input_34' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_DEAF4, text='Seed', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_247D8 = '["' + str('Input_35' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_247D8, text='Animation Speed', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_33F3D = '["' + str('Input_23' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_33F3D, text='BRICKS ASSEMBLY', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_80F00 = '["' + str('Input_38' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_80F00, text='Anim. Effector', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_6353D = '["' + str('Input_24' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_6353D, text='Animate Assembly', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_5996A = '["' + str('Input_37' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_5996A, text='Randomness', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_36F9C = '["' + str('Input_25' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_36F9C, text='Spread Max. Distance', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_95ECF = '["' + str('Input_26' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_95ECF, text='Animation Axis', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_FBB2C = '["' + str('Input_27' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_FBB2C, text='Switch Direction', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_B5DAF = '["' + str('Input_28' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_B5DAF, text='Seed', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_75D9A = '["' + str('Input_29' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_75D9A, text='Animation Speed', icon_value=0, emboss=True)
else:
box_A3043.label(text='Please Select Legolizer/Landscape Modifier', icon_value=0)
else:
box_A3043.label(text='Please Add Legolizer/Landscape Modifier', icon_value=0)
def register():
global _icons
_icons = bpy.utils.previews.new()
bpy.types.Scene.sna_new_property = bpy.props.BoolProperty(name='New Property', description='', default=False)
bpy.types.Scene.sna_resolution_width = bpy.props.IntProperty(name='Resolution Width', description='', default=1024, subtype='NONE')
bpy.types.Scene.sna_aldezel_properties = bpy.props.StringProperty(name='Al-Dezel Properties', description='Al-Dezel Properties', default='', subtype='NONE', maxlen=0)
bpy.types.Scene.sna_resolution_height = bpy.props.IntProperty(name='Resolution Height', description='', default=1024, subtype='NONE')
bpy.types.Scene.sna_legolizer_material = bpy.props.PointerProperty(name='Legolizer Material', description='', type=bpy.types.Material, update=sna_update_sna_legolizer_material_9D59F)
bpy.types.Scene.sna_landscape_material = bpy.props.PointerProperty(name='Landscape Material', description='', type=bpy.types.Material, update=sna_update_sna_landscape_material_E64B9)
bpy.utils.register_class(SNA_OT_Operator_88521)
bpy.utils.register_class(SNA_PT_LEGOLIZER_D7609)
bpy.utils.register_class(SNA_OT_Operator_79C5B)
bpy.utils.register_class(SNA_OT_Operator002_5E694)
bpy.utils.register_class(SNA_AddonPreferences_2E6BD)
bpy.utils.register_class(SNA_OT_Material_Properties_A10D8)
bpy.utils.register_class(SNA_OT_Geometry_Properties_87F4A)
bpy.app.handlers.load_post.append(load_post_handler_E1A6F)
bpy.utils.register_class(SNA_OT_Add_Legolizer_Setup_B16Ae)
bpy.utils.register_class(SNA_OT_Operator001_67831)
bpy.utils.register_class(SNA_OT_Operator_E20D3)
bpy.utils.register_class(SNA_PT_BAKE_79642)
bpy.utils.register_class(SNA_PT_MATERIAL_PROPERTIES_63A83)
bpy.utils.register_class(SNA_PT_PROPERTIES_1DA39)
kc = bpy.context.window_manager.keyconfigs.addon
km = kc.keymaps.new(name='Window', space_type='EMPTY')
kmi = km.keymap_items.new('sna.operator_79c5b', 'L', 'PRESS',
ctrl=False, alt=False, shift=False, repeat=False)
addon_keymaps['27F5F'] = (km, kmi)
kc = bpy.context.window_manager.keyconfigs.addon
km = kc.keymaps.new(name='Window', space_type='EMPTY')
kmi = km.keymap_items.new('sna.operator002_5e694', 'P', 'PRESS',
ctrl=False, alt=False, shift=False, repeat=False)
addon_keymaps['94A0F'] = (km, kmi)
kc = bpy.context.window_manager.keyconfigs.addon
km = kc.keymaps.new(name='Window', space_type='EMPTY')
kmi = km.keymap_items.new('sna.add_legolizer_setup_b16ae', 'A', 'PRESS',
ctrl=True, alt=False, shift=True, repeat=False)
addon_keymaps['4D60F'] = (km, kmi)
def unregister():
global _icons
bpy.utils.previews.remove(_icons)
wm = bpy.context.window_manager
kc = wm.keyconfigs.addon
for km, kmi in addon_keymaps.values():
km.keymap_items.remove(kmi)
addon_keymaps.clear()
del bpy.types.Scene.sna_landscape_material
del bpy.types.Scene.sna_legolizer_material
del bpy.types.Scene.sna_resolution_height
del bpy.types.Scene.sna_aldezel_properties
del bpy.types.Scene.sna_resolution_width
del bpy.types.Scene.sna_new_property
bpy.utils.unregister_class(SNA_OT_Operator_88521)
bpy.utils.unregister_class(SNA_PT_LEGOLIZER_D7609)
bpy.utils.unregister_class(SNA_OT_Operator_79C5B)
bpy.utils.unregister_class(SNA_OT_Operator002_5E694)
bpy.utils.unregister_class(SNA_AddonPreferences_2E6BD)
bpy.utils.unregister_class(SNA_OT_Material_Properties_A10D8)
bpy.utils.unregister_class(SNA_OT_Geometry_Properties_87F4A)
bpy.app.handlers.load_post.remove(load_post_handler_E1A6F)
bpy.utils.unregister_class(SNA_OT_Add_Legolizer_Setup_B16Ae)
bpy.utils.unregister_class(SNA_OT_Operator001_67831)
bpy.utils.unregister_class(SNA_OT_Operator_E20D3)
bpy.utils.unregister_class(SNA_PT_BAKE_79642)
bpy.utils.unregister_class(SNA_PT_MATERIAL_PROPERTIES_63A83)
bpy.utils.unregister_class(SNA_PT_PROPERTIES_1DA39)