from bpy.types import Panel import os from ..functions import get_addon_preferences from ..utils.ui_utils import get_icons_set class UVTOOLKIT_PT_uv_sync(Panel): bl_label = "UV Sync" bl_idname = "UVTOOLKIT_PT_uv_sync" bl_space_type = 'IMAGE_EDITOR' bl_region_type = 'UI' bl_category = "UV Toolkit" bl_options = {'DEFAULT_CLOSED'} def draw(self, context): layout = self.layout layout.operator("uv.toolkit_sync_mode", text="Toggle UV Sync", icon='UV_SYNC_SELECT') class UVTOOLKIT_PT_uv_sync_settings(Panel): bl_label = "UV Sync Settings" bl_parent_id = "UVTOOLKIT_PT_uv_sync" bl_space_type = 'IMAGE_EDITOR' bl_region_type = 'UI' bl_options = {'DEFAULT_CLOSED'} def draw(self, context): layout = self.layout addon_prefs = get_addon_preferences() layout.label(text="Sync Selected Elements") layout.prop(addon_prefs, "sync_selection", expand=True) layout.label(text="Sync Selection Mode") layout.prop(addon_prefs, "sync_uv_selction_mode", expand=True) class UVTOOLKIT_PT_tools(Panel): bl_label = "Tools" bl_idname = "UVTOOLKIT_PT_tools" bl_space_type = 'IMAGE_EDITOR' bl_region_type = 'UI' bl_category = "UV Toolkit" def draw(self, context): icons_coll = get_icons_set(context) layout = self.layout layout.operator("uv.toolkit_sharp_edges_from_uv_islands", icon_value=icons_coll["sharp_edges_from_uv_islands"].icon_id) prop = layout.operator("uv.seams_from_islands", icon_value=icons_coll["seams_from_islands"].icon_id) prop.mark_seams, prop.mark_sharp = True, False row = layout.row(align=True) row.operator("uv.toolkit_border_seam", icon_value=icons_coll["border_seam"].icon_id) row.operator("uv.toolkit_mirror_seam", icon_value=icons_coll["mirror_seam"].icon_id) row = layout.row(align=True) row.operator("uv.toolkit_split_faces_move", text="Split Faces", icon_value=icons_coll["split_faces_move"].icon_id) row.operator("uv.toolkit_clear_all_seams", icon_value=icons_coll["clear_all_seams"].icon_id) row = layout.row(align=True) row.operator("uv.toolkit_udim_packing", icon_value=icons_coll["udim_packing"].icon_id) row.label(text="") # layout.label(text="Debug") # layout.scale_y = 2 # layout.operator("uv.toolkit_test_op", icon='SHADERFX') class UVTOOLKIT_PT_unwrap(Panel): bl_label = "Unwrap" bl_idname = "UVTOOLKIT_PT_unwrap" bl_space_type = 'IMAGE_EDITOR' bl_region_type = 'UI' bl_category = "UV Toolkit" def draw(self, context): icons_coll = get_icons_set(context) layout = self.layout row = layout.row(align=True) row.operator("uv.toolkit_unwrap_selected", icon_value=icons_coll["unwrap_selected"].icon_id) row.operator("uv.toolkit_straighten_island", icon_value=icons_coll["straighten_island"].icon_id) row = layout.row(align=True) row.operator('uv.toolkit_straighten', icon_value=icons_coll["straighten"].icon_id).gridify = False row.operator('uv.toolkit_straighten', text="Gridify", icon_value=icons_coll["gridify"].icon_id).gridify = True # row = layout.row(align=True) # row.operator("uv.toolkit_lazy_unwrap") # row.label(text="") class UVTOOLKIT_PT_align(Panel): bl_label = "Align" bl_idname = "UVTOOLKIT_PT_align" bl_space_type = 'IMAGE_EDITOR' bl_region_type = 'UI' bl_category = "UV Toolkit" def draw(self, context): scene = context.scene icons_coll = get_icons_set(context) layout = self.layout row = layout.row(align=True) # First column col = row.column(align=True) col.label(text="") col.operator('uv.toolkit_align_uv', text='', icon_value=icons_coll["align_uv_min_x"].icon_id).align_uv = 'MIN_U' # Second column col = row.column(align=True) col.scale_x = 3.15 col.operator('uv.toolkit_align_uv', text='', icon_value=icons_coll["align_uv_max_y"].icon_id).align_uv = 'MAX_V' col.operator('uv.toolkit_align_uv', text='', icon_value=icons_coll["align_uv_min_y"].icon_id).align_uv = 'MIN_V' # Third column col = row.column(align=True) col.label(text="") col.operator('uv.toolkit_align_uv', text='', icon_value=icons_coll["align_uv_max_x"].icon_id).align_uv = 'MAX_U' row = layout.row(align=True) row.label(text="Mode") row.prop(scene.uv_toolkit, "align_mode", expand=True) class UVTOOLKIT_PT_arrange(Panel): bl_label = "Arrange" bl_idname = "UVTOOLKIT_PT_arrange" bl_space_type = 'IMAGE_EDITOR' bl_region_type = 'UI' bl_category = "UV Toolkit" def draw(self, context): icons_coll = get_icons_set(context) layout = self.layout row = layout.row(align=True) row.operator("uv.toolkit_orient_islands", icon_value=icons_coll["orient_islands"].icon_id) row.operator("uv.toolkit_orient_to_edge", icon_value=icons_coll["orient_to_edge"].icon_id) row = layout.row(align=True) row.operator("uv.toolkit_stack_islands", icon_value=icons_coll["stack_islands"].icon_id) row.operator("uv.toolkit_stack_similar_islands", text="Stack Similar", icon_value=icons_coll["stack_similar_islands"].icon_id) row = layout.row(align=True) row.operator("uv.toolkit_unstack_islands", text="Unstack", icon_value=icons_coll["unstack_islands"].icon_id) row.operator("uv.toolkit_unstack_overlapped_uvs", icon_value=icons_coll["unstack_overlapped_uvs"].icon_id) row = layout.row(align=True) row.operator("uv.toolkit_distribute", icon_value=icons_coll["distribute"].icon_id) row.operator("uv.toolkit_match_islands", icon_value=icons_coll["match_islands"].icon_id) row = layout.row(align=True) row.operator("uv.toolkit_randomize_islands", text="Randomize", icon_value=icons_coll["randomize_islands"].icon_id) row.operator("uv.toolkit_fit_to_bounds", icon_value=icons_coll["fit_to_bounds"].icon_id) # row.label(text="") class UVTOOLKIT_PT_pins(Panel): bl_label = "Pins" bl_idname = "UVTOOLKIT_PT_pins" bl_space_type = 'IMAGE_EDITOR' bl_region_type = 'UI' bl_category = "UV Toolkit" def draw(self, context): icons_coll = get_icons_set(context) layout = self.layout row = layout.row(align=True) row.operator("uv.pin", text="Pin", icon_value=icons_coll["pin_uv"].icon_id).clear = False row.operator("uv.pin", text="Unpin", icon_value=icons_coll["unpin_uv"].icon_id).clear = True row = layout.row(align=True) row.operator("uv.toolkit_clear_all_pins", icon_value=icons_coll["clear_all_pins"].icon_id) row.label(text="") class UVTOOLKIT_PT_transform(Panel): bl_label = "Transform" bl_idname = "UVTOOLKIT_PT_transform" bl_space_type = 'IMAGE_EDITOR' bl_region_type = 'UI' bl_category = "UV Toolkit" def draw(self, context): scene = context.scene icons_coll = get_icons_set(context) layout = self.layout row = layout.row(align=True) distance = scene.uv_toolkit.move_distance # First column col = row.column(align=True) col.operator_context = 'EXEC_DEFAULT' col.label(text="Move") col.operator("transform.translate", text="", icon_value=icons_coll["move_left"].icon_id).value = (distance * -1, 0, 0) col.label(text="") # Second column col = row.column(align=True) col.operator("transform.translate", text="", icon_value=icons_coll["move_up"].icon_id).value = (0, distance, 0) col.prop(scene.uv_toolkit, "move_distance", text="") col.operator("transform.translate", text="", icon_value=icons_coll["move_down"].icon_id).value = (0, distance * - 1, 0) # Third column col = row.column(align=True) col.label(text="") col.operator("transform.translate", text="", icon_value=icons_coll["move_right"].icon_id).value = (distance, 0, 0) col.label(text="") row = layout.row(align=True) row.scale_x = 2 row.label(text="Rotate") row.scale_x = 2 row.prop(scene.uv_toolkit, "island_rotation_angle", text="") row.prop(scene.uv_toolkit, "island_rotation_mode", expand=True) row = layout.row(align=True) angle = scene.uv_toolkit.island_rotation_angle row.operator("uv.toolkit_rotate_islands", text=f"-{angle}°", icon_value=icons_coll["rotate_ccw"].icon_id).cw = False row.operator("uv.toolkit_rotate_islands", text=f"{angle}°", icon_value=icons_coll["rotate_cw"].icon_id).cw = True # Scale row = layout.row(align=True) row.label(text="Scale") row.prop(scene.uv_toolkit, "island_scale_x") row.prop(scene.uv_toolkit, "island_scale_y") split = layout.split(factor=0.68, align=True) col = split.column(align=True) col.operator("uv.toolkit_scale_islands", icon_value=icons_coll["scale"].icon_id) col = split.column(align=True) row = col.row(align=True) row.prop(scene.uv_toolkit, "island_scale_mode", expand=True) row = layout.row(align=True) row.operator_context = 'EXEC_DEFAULT' row.operator("transform.mirror", text="Flip X", icon_value=icons_coll["mirror_x"].icon_id).constraint_axis = (True, False, False) row.operator("transform.mirror", text="Flip Y", icon_value=icons_coll["mirror_y"].icon_id).constraint_axis = (False, True, False) class UVTOOLKIT_PT_select(Panel): bl_label = "Select" bl_idname = "UVTOOLKIT_PT_select" bl_space_type = 'IMAGE_EDITOR' bl_region_type = 'UI' bl_category = "UV Toolkit" def draw(self, context): icons_coll = get_icons_set(context) layout = self.layout row = layout.row(align=True) row.operator("uv.toolkit_select_island_border", text="Island border", icon_value=icons_coll["select_island_border"].icon_id) row.operator("uv.toolkit_select_similar_islands", text="Similar Islands", icon_value=icons_coll["select_similar_islands"].icon_id) row = layout.row(align=True) row.operator("uv.toolkit_invert_selection", icon_value=icons_coll["invert_selection"].icon_id) row.operator("uv.toolkit_select_flipped_islands", text="Flipped Islands", icon_value=icons_coll["select_flipped_islands"].icon_id) layout.operator("uv.toolkit_find_udim_crossing", icon_value=icons_coll["find_udim_crossing"].icon_id) layout.operator("uv.toolkit_find_shattered_islands", icon_value=icons_coll["find_shattered_islands"].icon_id) class UVTOOLKIT_PT_display(Panel): bl_label = "Display" bl_idname = "UVTOOLKIT_PT_display" bl_space_type = 'IMAGE_EDITOR' bl_region_type = 'UI' bl_category = "UV Toolkit" def draw(self, context): icons_coll = get_icons_set(context) col = self.layout.column(align=True) col.operator("uv.toolkit_toggle_material", icon_value=icons_coll["toggle_material"].icon_id) col.operator("uv.toolkit_toggle_color_mode", icon_value=icons_coll["toggle_color_mode"].icon_id) col.operator("uv.toolkit_toggle_grid_type", icon_value=icons_coll["toggle_grid_type"].icon_id) class UVTOOLKIT_PT_checker_map(Panel): bl_label = "Checker Map" bl_idname = "UVTOOLKIT_PT_checker_map" bl_space_type = 'IMAGE_EDITOR' bl_region_type = 'UI' bl_category = "UV Toolkit" def draw_user_checker_maps(self, context): supported_formats = { ".bmp", ".sgi", ".rgb", ".bw", ".png", ".jpg", ".jpeg", ".jp2", ".j2c", ".tga", ".cin", ".dpx", ".exr", ".hdr", ".tif", ".tiff" } def get_checker_maps_path(): addon_prefs = get_addon_preferences() c_maps_path = addon_prefs.checker_maps_path if os.path.exists(c_maps_path): for path in os.listdir(path=c_maps_path): current_path = os.path.join(c_maps_path, path) if os.path.isfile(current_path): file_format = os.path.splitext(current_path)[-1] if file_format in supported_formats: yield current_path layout = self.layout row = layout.row(align=True) idx = None for idx, path in enumerate(sorted(get_checker_maps_path()), 1): c_map_name = os.path.basename(os.path.splitext(path)[0]) row.operator("uv.toolkit_create_checker_material", text=c_map_name).checker_image_path = path if idx % 2 == 0: row = layout.row(align=True) if idx and idx % 2 != 0: row.label(text="") def draw(self, context): scene = context.scene addon_prefs = get_addon_preferences() icons_coll = get_icons_set(context) layout = self.layout row = layout.row() row.prop(addon_prefs, "checker_map", expand=True) if addon_prefs.checker_map == "BUILT-IN": col = layout.column(align=True) split = col.split(align=True) split.prop(scene.uv_toolkit, "checker_map_width") split.prop(scene.uv_toolkit, "checker_map_height") row = col.row(align=True) row.prop(addon_prefs, "checker_type", expand=True) row = col.row(align=True) row.scale_y = 1.2 prop = row.operator( "uv.toolkit_create_checker_material", icon_value=icons_coll["create_checker_material"].icon_id ) prop.width = scene.uv_toolkit.checker_map_width prop.height = scene.uv_toolkit.checker_map_height else: self.draw_user_checker_maps(context) layout.operator( "uv.toolkit_remove_all_checker_materials", icon_value=icons_coll["remove_all_checker_materials"].icon_id ) class UVTOOLKIT_PT_quick_presets(Panel): bl_label = "Quick Presets" bl_idname = "UVTOOLKIT_PT_quick_presets" bl_parent_id = "UVTOOLKIT_PT_checker_map" bl_space_type = 'IMAGE_EDITOR' bl_region_type = 'UI' bl_category = "UV Toolkit" @classmethod def poll(cls, _context): return get_addon_preferences().checker_map == "BUILT-IN" def draw(self, context): pass class UVTOOLKIT_PT_checker_map_square(Panel): bl_label = "Square" bl_parent_id = "UVTOOLKIT_PT_quick_presets" bl_space_type = 'IMAGE_EDITOR' bl_region_type = 'UI' def draw(self, context): layout = self.layout row = layout.row(align=True) prop = row.operator("uv.toolkit_create_checker_material", text="64x64") prop.width, prop.height = 64, 64 prop = row.operator("uv.toolkit_create_checker_material", text="128x128") prop.width, prop.height = 128, 128 row = layout.row(align=True) prop = row.operator("uv.toolkit_create_checker_material", text="256x256") prop.width, prop.height = 256, 256 prop = row.operator("uv.toolkit_create_checker_material", text="512x512") prop.width, prop.height = 512, 512 row = layout.row(align=True) prop = row.operator("uv.toolkit_create_checker_material", text="1024x1024") prop.width, prop.height = 1024, 1024 prop = row.operator("uv.toolkit_create_checker_material", text="2048x2048") prop.width, prop.height = 2048, 2048 row = layout.row(align=True) prop = row.operator("uv.toolkit_create_checker_material", text="4096x4096") prop.width, prop.height = 4096, 4096 prop = row.operator("uv.toolkit_create_checker_material", text="8192x8192") prop.width, prop.height = 8192, 8192 class UVTOOLKIT_PT_checker_map_horizontal_rectangle(Panel): bl_label = "Horizontal Rectangle" bl_parent_id = "UVTOOLKIT_PT_quick_presets" bl_space_type = 'IMAGE_EDITOR' bl_region_type = 'UI' bl_options = {'DEFAULT_CLOSED'} def draw(self, context): layout = self.layout row = layout.row(align=True) prop = row.operator("uv.toolkit_create_checker_material", text="64x32") prop.width, prop.height = 64, 32 prop = row.operator("uv.toolkit_create_checker_material", text="128x64") prop.width, prop.height = 128, 64 row = layout.row(align=True) prop = row.operator("uv.toolkit_create_checker_material", text="256x128") prop.width, prop.height = 256, 128 prop = row.operator("uv.toolkit_create_checker_material", text="512x256") prop.width, prop.height = 512, 256 row = layout.row(align=True) prop = row.operator("uv.toolkit_create_checker_material", text="1024x512") prop.width, prop.height = 1024, 512 prop = row.operator("uv.toolkit_create_checker_material", text="2048x1024") prop.width, prop.height = 2048, 1024 row = layout.row(align=True) prop = row.operator("uv.toolkit_create_checker_material", text="4096x2048") prop.width, prop.height = 4096, 2048 prop = row.operator("uv.toolkit_create_checker_material", text="8192x4096") prop.width, prop.height = 8192, 4096 class UVTOOLKIT_PT_checker_map_vertical_rectangle(Panel): bl_label = "Vertical Rectangle" bl_parent_id = "UVTOOLKIT_PT_quick_presets" bl_space_type = 'IMAGE_EDITOR' bl_region_type = 'UI' bl_options = {'DEFAULT_CLOSED'} def draw(self, context): layout = self.layout row = layout.row(align=True) prop = row.operator("uv.toolkit_create_checker_material", text="32x64") prop.width, prop.height = 32, 64 prop = row.operator("uv.toolkit_create_checker_material", text="64x128") prop.width, prop.height = 64, 128 row = layout.row(align=True) prop = row.operator("uv.toolkit_create_checker_material", text="128x256") prop.width, prop.height = 128, 256 prop = row.operator("uv.toolkit_create_checker_material", text="256x512") prop.width, prop.height = 256, 512 row = layout.row(align=True) prop = row.operator("uv.toolkit_create_checker_material", text="512x1024") prop.width, prop.height = 512, 1024 prop = row.operator("uv.toolkit_create_checker_material", text="1024x2048") prop.width, prop.height = 1024, 2048 row = layout.row(align=True) prop = row.operator("uv.toolkit_create_checker_material", text="2048x4096") prop.width, prop.height = 2048, 4096 prop = row.operator("uv.toolkit_create_checker_material", text="4096x8192") prop.width, prop.height = 4096, 8192 class UVTOOLKIT_PT_uv_maps(Panel): bl_label = "UV Maps" bl_idname = "UVTOOLKIT_PT_uv_maps" bl_space_type = 'IMAGE_EDITOR' bl_region_type = 'UI' bl_category = "UV Toolkit" def draw(self, context): scene = context.scene icons_coll = get_icons_set(context) layout = self.layout row = layout.row() row.prop(scene.uv_toolkit, "uv_layer_name", text="Name") split = layout.split(factor=0.4) col = split.column() col.label(text="UV Set Index:") col = split.column() col.prop(scene.uv_toolkit, "uv_layer_index") row = layout.row(align=True) row.operator("uv.toolkit_set_active_uv_layer", text="Set Active", icon_value=icons_coll["set_active_uv_layer"].icon_id) row.operator("uv.toolkit_create_new_uv_layer", text="Create New", icon_value=icons_coll["create_new_uv_layer"].icon_id) row = layout.row(align=True) row.operator("uv.toolkit_rename_uv_layers", text="Rename", icon_value=icons_coll["rename_uv_layers"].icon_id) row.operator("uv.toolkit_delete_uv_layer", text="Delete", icon_value=icons_coll["delete_uv_layer"].icon_id) class UVTOOLKIT_PT_help(Panel): bl_label = "Help/Settings" bl_idname = "UVTOOLKIT_PT_help" bl_space_type = 'IMAGE_EDITOR' bl_region_type = 'UI' bl_category = "UV Toolkit" bl_options = {'DEFAULT_CLOSED'} documentation = "https://alexbelyakov.gitlab.io/uv-toolkit-docs/" tutorials = "https://www.youtube.com/playlist?list=PLex7IjhY06w63StowG501tBbEyZrzHa00" def draw(self, context): icons_coll = get_icons_set(context) col = self.layout.column(align=True) col.operator( "uv.toolkit_open_addon_settings", icon_value=icons_coll["settings"].icon_id ) col.operator( "uv.toolkit_hotkeys", text="List of Hotkeys", icon_value=icons_coll["hotkeys"].icon_id ) col.operator( "wm.url_open", text="Documentation", icon_value=icons_coll["documentation"].icon_id ).url = self.documentation col.operator( "wm.url_open", text="Tutorials", icon_value=icons_coll["tutorials"].icon_id ).url = self.tutorials