2025-07-01
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
# UVToolkit for Blender
|
||||
|
||||
## Synopsis
|
||||
This repository is a re-upload of UV Toolkit, a paid Blender add-on originally created by Alexander Belyakov. Unfortunately, the add-on is no longer available for purchase through online stores, making arguably one of the best generic UV add-ons inaccessible to new users.
|
||||
|
||||
Version 2.1.0 of UV Toolkit was the latest version we had access to, if there are any newer versions known do feel free to submit it as a pull request or reach out to ethan.simon.3d@gmail.com for it to be implemented.
|
||||
|
||||
Ethan note: As a tool dev I am entirely qualified to maintain any bug reports, pull requests, or otherwise sent in but it's unlikely that I'll be making any improvements or new additions to the tools functionality. This page ultimately exists for archival reasons.
|
||||
|
||||
## Acknowledgements
|
||||
Please note that this repository may be removed or made private if/when Alex reinstates their storefronts, as the aim of this page is not to undermine the paid nature of the add-on but rather to provide a tool no longer accessible through conventional methods. Additionally, this repository is well within the rights of GPL licensing to be created, but as stated earlier respect to the tool developer will be upheld in the event of the store pages returning. All help, resource, and original store page links for this tool can be found within the `Help/Links` tab in the add-on preferences after installing.
|
||||
@@ -0,0 +1,215 @@
|
||||
import bpy
|
||||
|
||||
from .operators.find_shattered_islands import FindShatteredIslands
|
||||
from .operators.align_uv import AlignUv
|
||||
from .operators.border_seam import BorderSeam
|
||||
from .operators.toggle_grid_type import ToggleGridType
|
||||
from .operators.clear_all_pins import ClearAllPins
|
||||
from .operators.clear_all_seams import ClearAllSeams
|
||||
from .operators.create_checker_material import CheckerMaterial
|
||||
from .operators.create_new_uv_layer import CreateNewUvLayer
|
||||
from .operators.delete_uv_layer import DeleteUvLayer
|
||||
from .operators.distribute import Distribute
|
||||
from .operators.execute_custom_op import ExecuteCustomOp
|
||||
from .operators.export_setting import ExportSettings
|
||||
from .operators.import_settings import ImportSettings
|
||||
from .operators.find_udim_crossing import FindUdimCrossing
|
||||
from .operators.fit_to_bounds import FitToBounds
|
||||
from .operators.hotkeys import Hotkeys
|
||||
from .operators.invert_selection import InvertSelection
|
||||
from .operators.match_islands import MatchIslands
|
||||
from .operators.mirror_seam import MirrorSeam
|
||||
from .operators.open_addon_settings import OpenAddonSettings
|
||||
from .operators.orient_islands import OrientIslands
|
||||
from .operators.orient_to_edge import OrientToEdge
|
||||
from .operators.move_island import MoveIsland
|
||||
from .operators.randomize_islands import RandomizeIslands
|
||||
from .operators.remove_all_checker_materials import RemoveAllCheckerMaterials
|
||||
from .operators.rename_uv_layers import RenameUvLayers
|
||||
from .operators.rotate_islands import RotateIslands
|
||||
from .operators.scale_individual_origins import ScaleIndividualOrigins
|
||||
from .operators.scale_islands import ScaleIslands
|
||||
from .operators.select_island_border import SelectIslandBorder
|
||||
from .operators.select_similar_islands import SelectSimilarIslands
|
||||
from .operators.set_active_uv_layer import SetActiveUvLayer
|
||||
from .operators.select_flipped_islands import SelectFlippedIslands
|
||||
from .operators.sharp_edges_from_uv_islands import SharpEdgesFromUvIslands
|
||||
from .operators.split_faces_move import SplitFacesMove
|
||||
from .operators.stack_islands import StackIslands
|
||||
from .operators.stack_similar_islands import StackSimilarIslands
|
||||
from .operators.straighten_island import StraightenIsland
|
||||
from .operators.straighten_uv import Straighten
|
||||
from .operators.test_op import TestOp
|
||||
from .operators.toggle_color_mode import ToggleColorMode
|
||||
from .operators.toggle_material import ToggleMaterial
|
||||
from .operators.udim_packing import UdimPacking
|
||||
from .operators.unstack_islands import UntackIslands
|
||||
from .operators.unstack_overlapped_uvs import UnstackOverlappedUvs
|
||||
from .operators.unwrap_selected import UnwrapSelected
|
||||
from .operators.uv_sync_mode import UvSyncMode
|
||||
from .operators.center_cursor_and_view_all import CenterCursorFrameAll
|
||||
|
||||
from .addon_preferences import UvToolkitPreferences
|
||||
|
||||
from .properties import UvToolkitProperties
|
||||
from .functions import get_addon_preferences
|
||||
|
||||
from .ui.pie_3dview import Pie3dView
|
||||
from .ui.pie_uv_editor import PieUvEditor
|
||||
|
||||
from .ui.panel import (
|
||||
UVTOOLKIT_PT_uv_sync,
|
||||
UVTOOLKIT_PT_uv_sync_settings,
|
||||
UVTOOLKIT_PT_tools,
|
||||
UVTOOLKIT_PT_pins,
|
||||
UVTOOLKIT_PT_transform,
|
||||
UVTOOLKIT_PT_unwrap,
|
||||
UVTOOLKIT_PT_align,
|
||||
UVTOOLKIT_PT_arrange,
|
||||
UVTOOLKIT_PT_select,
|
||||
UVTOOLKIT_PT_display,
|
||||
UVTOOLKIT_PT_uv_maps,
|
||||
UVTOOLKIT_PT_checker_map,
|
||||
UVTOOLKIT_PT_quick_presets,
|
||||
UVTOOLKIT_PT_checker_map_square,
|
||||
UVTOOLKIT_PT_checker_map_horizontal_rectangle,
|
||||
UVTOOLKIT_PT_checker_map_vertical_rectangle,
|
||||
UVTOOLKIT_PT_cleanup,
|
||||
UVTOOLKIT_PT_help,
|
||||
)
|
||||
|
||||
|
||||
from .register import (
|
||||
keymap_register,
|
||||
addon_keymaps,
|
||||
icons_register,
|
||||
icons_unregister,
|
||||
)
|
||||
|
||||
from .addon_preferences import update_addon_category
|
||||
|
||||
|
||||
classes = (
|
||||
FindShatteredIslands,
|
||||
AlignUv,
|
||||
BorderSeam,
|
||||
ToggleGridType,
|
||||
ClearAllPins,
|
||||
ClearAllSeams,
|
||||
CheckerMaterial,
|
||||
CreateNewUvLayer,
|
||||
DeleteUvLayer,
|
||||
Distribute,
|
||||
ExecuteCustomOp,
|
||||
ExportSettings,
|
||||
ImportSettings,
|
||||
FindUdimCrossing,
|
||||
FitToBounds,
|
||||
Hotkeys,
|
||||
InvertSelection,
|
||||
MatchIslands,
|
||||
MirrorSeam,
|
||||
OpenAddonSettings,
|
||||
OrientIslands,
|
||||
OrientToEdge,
|
||||
MoveIsland,
|
||||
RandomizeIslands,
|
||||
RotateIslands,
|
||||
RemoveAllCheckerMaterials,
|
||||
RenameUvLayers,
|
||||
ScaleIndividualOrigins,
|
||||
ScaleIslands,
|
||||
SelectIslandBorder,
|
||||
SelectSimilarIslands,
|
||||
SetActiveUvLayer,
|
||||
SelectFlippedIslands,
|
||||
SharpEdgesFromUvIslands,
|
||||
StraightenIsland,
|
||||
SplitFacesMove,
|
||||
StackIslands,
|
||||
Straighten,
|
||||
StackSimilarIslands,
|
||||
ToggleColorMode,
|
||||
ToggleMaterial,
|
||||
UdimPacking,
|
||||
UnwrapSelected,
|
||||
UvSyncMode,
|
||||
UntackIslands,
|
||||
UnstackOverlappedUvs,
|
||||
CenterCursorFrameAll,
|
||||
TestOp,
|
||||
UVTOOLKIT_PT_uv_sync,
|
||||
UVTOOLKIT_PT_uv_sync_settings,
|
||||
UVTOOLKIT_PT_tools,
|
||||
UVTOOLKIT_PT_pins,
|
||||
UVTOOLKIT_PT_transform,
|
||||
UVTOOLKIT_PT_unwrap,
|
||||
UVTOOLKIT_PT_align,
|
||||
UVTOOLKIT_PT_arrange,
|
||||
UVTOOLKIT_PT_select,
|
||||
UVTOOLKIT_PT_display,
|
||||
UVTOOLKIT_PT_uv_maps,
|
||||
UVTOOLKIT_PT_checker_map,
|
||||
UVTOOLKIT_PT_quick_presets,
|
||||
UVTOOLKIT_PT_checker_map_square,
|
||||
UVTOOLKIT_PT_checker_map_horizontal_rectangle,
|
||||
UVTOOLKIT_PT_checker_map_vertical_rectangle,
|
||||
UVTOOLKIT_PT_cleanup,
|
||||
UVTOOLKIT_PT_help,
|
||||
Pie3dView,
|
||||
PieUvEditor,
|
||||
UvToolkitPreferences,
|
||||
UvToolkitProperties,
|
||||
)
|
||||
|
||||
def register():
|
||||
for cls in classes:
|
||||
bpy.utils.register_class(cls)
|
||||
|
||||
bpy.types.Scene.uv_toolkit = bpy.props.PointerProperty(type=UvToolkitProperties)
|
||||
|
||||
wm = bpy.context.window_manager
|
||||
|
||||
if wm.keyconfigs.addon:
|
||||
keymap_register(wm)
|
||||
|
||||
icons_register()
|
||||
|
||||
update_addon_category(get_addon_preferences(), bpy.context)
|
||||
|
||||
def unregister():
|
||||
for cls in classes:
|
||||
bpy.utils.unregister_class(cls)
|
||||
|
||||
del bpy.types.Scene.uv_toolkit
|
||||
|
||||
wm = bpy.context.window_manager
|
||||
kc = wm.keyconfigs.addon
|
||||
if kc:
|
||||
for km, kmi in addon_keymaps:
|
||||
km.keymap_items.remove(kmi)
|
||||
addon_keymaps.clear()
|
||||
|
||||
icons_unregister()
|
||||
|
||||
if __name__ == "__main__":
|
||||
register()
|
||||
|
||||
|
||||
# ##### BEGIN GPL LICENSE BLOCK #####
|
||||
#
|
||||
# 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 2
|
||||
# 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
|
||||
# MERCHANTABILITY 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, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
#
|
||||
# ##### END GPL LICENSE BLOCK #####
|
||||
@@ -0,0 +1,420 @@
|
||||
import os
|
||||
|
||||
import bpy
|
||||
import rna_keymap_ui
|
||||
from bpy.types import AddonPreferences
|
||||
from bpy.props import (
|
||||
EnumProperty,
|
||||
StringProperty,
|
||||
)
|
||||
from .keymap import keymap_items
|
||||
from .utils.ui_utils import (
|
||||
view3d_items,
|
||||
uv_editor_items,
|
||||
get_icons_set,
|
||||
)
|
||||
|
||||
|
||||
def update_addon_category(self, _context):
|
||||
panels = (
|
||||
"UVTOOLKIT_PT_uv_sync",
|
||||
"UVTOOLKIT_PT_tools",
|
||||
"UVTOOLKIT_PT_pins",
|
||||
"UVTOOLKIT_PT_transform",
|
||||
"UVTOOLKIT_PT_unwrap",
|
||||
"UVTOOLKIT_PT_align",
|
||||
"UVTOOLKIT_PT_arrange",
|
||||
"UVTOOLKIT_PT_select",
|
||||
"UVTOOLKIT_PT_display",
|
||||
"UVTOOLKIT_PT_uv_maps",
|
||||
"UVTOOLKIT_PT_checker_map",
|
||||
"UVTOOLKIT_PT_quick_presets",
|
||||
"UVTOOLKIT_PT_cleanup",
|
||||
"UVTOOLKIT_PT_help",
|
||||
)
|
||||
sub_panels = (
|
||||
"UVTOOLKIT_PT_uv_sync_settings",
|
||||
"UVTOOLKIT_PT_checker_map_square",
|
||||
"UVTOOLKIT_PT_checker_map_horizontal_rectangle",
|
||||
"UVTOOLKIT_PT_checker_map_vertical_rectangle",
|
||||
)
|
||||
for panel_id in panels:
|
||||
panel_class = getattr(bpy.types, panel_id)
|
||||
bpy.utils.unregister_class(panel_class)
|
||||
panel_class.bl_category = self.category
|
||||
bpy.utils.register_class(panel_class)
|
||||
for sub_panel_id in sub_panels:
|
||||
sub_panel_class = getattr(bpy.types, sub_panel_id)
|
||||
bpy.utils.unregister_class(sub_panel_class)
|
||||
bpy.utils.register_class(sub_panel_class)
|
||||
|
||||
|
||||
class UvToolkitPreferences(AddonPreferences):
|
||||
bl_idname = __package__
|
||||
# Pie 3d View
|
||||
pie_3dview_left: EnumProperty(
|
||||
name="Left",
|
||||
items=view3d_items,
|
||||
default="CLEAR_SEAM"
|
||||
)
|
||||
pie_3dview_right: EnumProperty(
|
||||
name="Right",
|
||||
items=view3d_items,
|
||||
default="MARK_SEAM"
|
||||
)
|
||||
pie_3dview_bottom: EnumProperty(
|
||||
name="Bottom",
|
||||
items=view3d_items,
|
||||
default="UV_MENU"
|
||||
)
|
||||
pie_3dview_top: EnumProperty(
|
||||
name="Top",
|
||||
items=view3d_items,
|
||||
default="uv.unwrap"
|
||||
)
|
||||
pie_3dview_top_left: EnumProperty(
|
||||
name="Top Left",
|
||||
items=view3d_items,
|
||||
default="uv.toolkit_clear_all_seams"
|
||||
)
|
||||
pie_3dview_top_right: EnumProperty(
|
||||
name="Top Right",
|
||||
items=view3d_items,
|
||||
default="uv.toolkit_border_seam"
|
||||
)
|
||||
pie_3dview_bottom_left: EnumProperty(
|
||||
name="Bottom Left",
|
||||
items=view3d_items,
|
||||
default="uv.toolkit_toggle_color_mode"
|
||||
)
|
||||
pie_3dview_bottom_right: EnumProperty(
|
||||
name="Bottom Right",
|
||||
items=view3d_items,
|
||||
default="uv.toolkit_mirror_seam"
|
||||
)
|
||||
pie_3dview_custom_op_left: StringProperty(default="")
|
||||
pie_3dview_custom_op_name_left: StringProperty(default="")
|
||||
|
||||
pie_3dview_custom_op_right: StringProperty(default="")
|
||||
pie_3dview_custom_op_name_right: StringProperty(default="")
|
||||
|
||||
pie_3dview_custom_op_top: StringProperty(default="")
|
||||
pie_3dview_custom_op_name_top: StringProperty(default="")
|
||||
|
||||
pie_3dview_custom_op_bottom: StringProperty(default="")
|
||||
pie_3dview_custom_op_name_bottom: StringProperty(default="")
|
||||
|
||||
pie_3dview_custom_op_top_left: StringProperty(default="")
|
||||
pie_3dview_custom_op_name_top_left: StringProperty(default="")
|
||||
|
||||
pie_3dview_custom_op_top_right: StringProperty(default="")
|
||||
pie_3dview_custom_op_name_top_right: StringProperty(default="")
|
||||
|
||||
pie_3dview_custom_op_bottom_left: StringProperty(default="")
|
||||
pie_3dview_custom_op_name_bottom_left: StringProperty(default="")
|
||||
|
||||
pie_3dview_custom_op_bottom_right: StringProperty(default="")
|
||||
pie_3dview_custom_op_name_bottom_right: StringProperty(default="")
|
||||
# Pie UV Editor
|
||||
pie_uv_editor_left: EnumProperty(
|
||||
name="Left",
|
||||
items=uv_editor_items,
|
||||
default="uv.toolkit_split_faces_move"
|
||||
)
|
||||
pie_uv_editor_right: EnumProperty(
|
||||
name="Right",
|
||||
items=uv_editor_items,
|
||||
default="uv.toolkit_align_uv"
|
||||
)
|
||||
pie_uv_editor_bottom: EnumProperty(
|
||||
name="Bottom",
|
||||
items=uv_editor_items,
|
||||
default="uv.toolkit_invert_selection"
|
||||
)
|
||||
pie_uv_editor_top: EnumProperty(
|
||||
name="Top",
|
||||
items=uv_editor_items,
|
||||
default="uv.toolkit_unwrap_selected"
|
||||
)
|
||||
pie_uv_editor_top_left: EnumProperty(
|
||||
name="Top Left",
|
||||
items=uv_editor_items,
|
||||
default="uv.toolkit_distribute"
|
||||
)
|
||||
pie_uv_editor_top_right: EnumProperty(
|
||||
name="Top Right",
|
||||
items=uv_editor_items,
|
||||
default="uv.toolkit_straighten"
|
||||
)
|
||||
pie_uv_editor_bottom_left: EnumProperty(
|
||||
name="Bottom Left",
|
||||
items=uv_editor_items,
|
||||
default="uv.toolkit_unstack_islands"
|
||||
)
|
||||
pie_uv_editor_bottom_right: EnumProperty(
|
||||
name="Bottom Right",
|
||||
items=uv_editor_items,
|
||||
default="uv.toolkit_stack_islands"
|
||||
)
|
||||
pie_uv_editor_custom_op_left: StringProperty(default="")
|
||||
pie_uv_editor_custom_op_name_left: StringProperty(default="")
|
||||
|
||||
pie_uv_editor_custom_op_right: StringProperty(default="")
|
||||
pie_uv_editor_custom_op_name_right: StringProperty(default="")
|
||||
|
||||
pie_uv_editor_custom_op_top: StringProperty(default="")
|
||||
pie_uv_editor_custom_op_name_top: StringProperty(default="")
|
||||
|
||||
pie_uv_editor_custom_op_bottom: StringProperty(default="")
|
||||
pie_uv_editor_custom_op_name_bottom: StringProperty(default="")
|
||||
|
||||
pie_uv_editor_custom_op_top_left: StringProperty(default="")
|
||||
pie_uv_editor_custom_op_name_top_left: StringProperty(default="")
|
||||
|
||||
pie_uv_editor_custom_op_top_right: StringProperty(default="")
|
||||
pie_uv_editor_custom_op_name_top_right: StringProperty(default="")
|
||||
|
||||
pie_uv_editor_custom_op_bottom_left: StringProperty(default="")
|
||||
pie_uv_editor_custom_op_name_bottom_left: StringProperty(default="")
|
||||
|
||||
pie_uv_editor_custom_op_bottom_right: StringProperty(default="")
|
||||
pie_uv_editor_custom_op_name_bottom_right: StringProperty(default="")
|
||||
|
||||
chekcer_maps_path: StringProperty(
|
||||
name="",
|
||||
description="Path to Directory",
|
||||
default=os.path.join(os.path.split(__file__)[0], "checker_maps"),
|
||||
maxlen=2000,
|
||||
subtype='DIR_PATH'
|
||||
)
|
||||
icon_style: EnumProperty(
|
||||
items=[
|
||||
("LIGHT", "Light", ""),
|
||||
("DARK", "Dark", ""),
|
||||
],
|
||||
default="LIGHT"
|
||||
)
|
||||
checker_map: EnumProperty(
|
||||
items=[
|
||||
("BUILT-IN", "Built-in", ""),
|
||||
("CUSTOM", "Custom", ""),
|
||||
]
|
||||
)
|
||||
checker_type: EnumProperty(
|
||||
description="Choose image type",
|
||||
items=[
|
||||
("UV_GRID", "Checker Grid", ""),
|
||||
("COLOR_GRID", "Color Grid", ""),
|
||||
]
|
||||
)
|
||||
assign_image_in_uv_editor: EnumProperty(
|
||||
items=[
|
||||
("ENABLE", "Enable", ""),
|
||||
("DISABLE", "Disable", "")
|
||||
],
|
||||
default="DISABLE"
|
||||
)
|
||||
sync_selection: EnumProperty(
|
||||
name="Sync Selected Elements",
|
||||
items=[
|
||||
("enable", "Enable", ""),
|
||||
("disable", "Disable", "")
|
||||
],
|
||||
default="enable"
|
||||
)
|
||||
sync_uv_selction_mode: EnumProperty(
|
||||
name="Sync Selection Mode",
|
||||
items=[
|
||||
("enable", "Enable", ""),
|
||||
("disable", "Disable", "")
|
||||
],
|
||||
default="enable"
|
||||
)
|
||||
tab: EnumProperty(
|
||||
items=[
|
||||
("GENERAL", "General", ""),
|
||||
("KEYMAP", "Keymap", ""),
|
||||
("PIE_MENU", "Pie Menu", ""),
|
||||
("HELP", "Help/Links", ""),
|
||||
],
|
||||
default="GENERAL"
|
||||
)
|
||||
pie_tab: EnumProperty(
|
||||
items=[
|
||||
("PIE_3D_VIEW", "3D View", ""),
|
||||
("PIE_UV_EDITOR", "UV Editor", ""),
|
||||
],
|
||||
)
|
||||
category: StringProperty(
|
||||
description="Choose a name for the category of the panel",
|
||||
default="UV Toolkit",
|
||||
update=update_addon_category
|
||||
)
|
||||
|
||||
def draw_keymap(self, context):
|
||||
def get_pie_menu_hotkey(km, kmi_name, kmi_value):
|
||||
for i, km_item in enumerate(km.keymap_items):
|
||||
if km.keymap_items.keys()[i] == kmi_name:
|
||||
if km.keymap_items[i].properties.name == kmi_value:
|
||||
return km_item
|
||||
|
||||
def get_operator_hotkey(km, kmi_name):
|
||||
for i, km_item in enumerate(km.keymap_items):
|
||||
if km.keymap_items.keys()[i] == kmi_name:
|
||||
return km_item
|
||||
|
||||
wm = context.window_manager
|
||||
kc = wm.keyconfigs.user
|
||||
layout = self.layout
|
||||
box = layout.box()
|
||||
split = box.split()
|
||||
col = split.column()
|
||||
|
||||
for km_item in keymap_items:
|
||||
km = kc.keymaps[km_item[0]]
|
||||
operator = km_item[2]
|
||||
if operator == 'wm.call_menu_pie':
|
||||
value = km_item[-1]
|
||||
kmi = get_pie_menu_hotkey(km, 'wm.call_menu_pie', value)
|
||||
else:
|
||||
kmi = get_operator_hotkey(km, operator)
|
||||
if kmi:
|
||||
col.context_pointer_set("keymap", km)
|
||||
rna_keymap_ui.draw_kmi([], kc, km, kmi, col, 0)
|
||||
|
||||
def draw(self, context):
|
||||
icons_coll = get_icons_set(context)
|
||||
layout = self.layout
|
||||
row = layout.row()
|
||||
row.prop(self, "tab", expand=True)
|
||||
if self.tab == 'GENERAL':
|
||||
layout = layout.box()
|
||||
split = layout.split()
|
||||
# First column
|
||||
col = split.column()
|
||||
col.label(text="Panel Category:")
|
||||
col.separator()
|
||||
col.label(text="Always set checker image in the UV Editor:")
|
||||
col.separator()
|
||||
col.label(text="Icon set:")
|
||||
col.separator()
|
||||
col.label(text="Checker maps folder:")
|
||||
# Second column
|
||||
col = split.column()
|
||||
col.prop(self, "category", text="")
|
||||
col.separator()
|
||||
row = col.row()
|
||||
row.prop(self, "assign_image_in_uv_editor", expand=True)
|
||||
col.separator()
|
||||
row = col.row()
|
||||
row.prop(self, "icon_style", expand=True)
|
||||
col.separator()
|
||||
col.prop(self, "chekcer_maps_path")
|
||||
|
||||
layout.separator()
|
||||
row = layout.row()
|
||||
row.operator("uv.toolkit_import_settings", icon_value=icons_coll["import_settings"].icon_id)
|
||||
row.operator("uv.toolkit_export_settings", icon_value=icons_coll["export_settings"].icon_id)
|
||||
|
||||
if self.tab == 'PIE_MENU':
|
||||
layout = layout.box()
|
||||
row = layout.row()
|
||||
row.prop(self, "pie_tab", expand=True)
|
||||
if self.pie_tab == 'PIE_3D_VIEW':
|
||||
layout.prop(self, "pie_3dview_left")
|
||||
if self.pie_3dview_left == "CUSTOM_OP":
|
||||
layout.prop(self, "pie_3dview_custom_op_left", text=" Operator")
|
||||
layout.prop(self, "pie_3dview_custom_op_name_left", text=" Name")
|
||||
layout.prop(self, "pie_3dview_right")
|
||||
if self.pie_3dview_right == "CUSTOM_OP":
|
||||
layout.prop(self, "pie_3dview_custom_op_right", text=" Operator")
|
||||
layout.prop(self, "pie_3dview_custom_op_name_right", text=" Name")
|
||||
layout.prop(self, "pie_3dview_top")
|
||||
if self.pie_3dview_top == "CUSTOM_OP":
|
||||
layout.prop(self, "pie_3dview_custom_op_top", text=" Operator")
|
||||
layout.prop(self, "pie_3dview_custom_op_name_top", text=" Name")
|
||||
layout.prop(self, "pie_3dview_bottom")
|
||||
if self.pie_3dview_bottom == "CUSTOM_OP":
|
||||
layout.prop(self, "pie_3dview_custom_op_bottom", text=" Operator")
|
||||
layout.prop(self, "pie_3dview_custom_op_name_bottom", text=" Name")
|
||||
layout.prop(self, "pie_3dview_top_left")
|
||||
if self.pie_3dview_top_left == "CUSTOM_OP":
|
||||
layout.prop(self, "pie_3dview_custom_op_top_left", text=" Operator")
|
||||
layout.prop(self, "pie_3dview_custom_op_name_top_left", text=" Name")
|
||||
layout.prop(self, "pie_3dview_top_right")
|
||||
if self.pie_3dview_top_right == "CUSTOM_OP":
|
||||
layout.prop(self, "pie_3dview_custom_op_top_right", text=" Operator")
|
||||
layout.prop(self, "pie_3dview_custom_op_name_top_right", text=" Name")
|
||||
layout.prop(self, "pie_3dview_bottom_left")
|
||||
if self.pie_3dview_bottom_left == "CUSTOM_OP":
|
||||
layout.prop(self, "pie_3dview_custom_op_bottom_left", text=" Operator")
|
||||
layout.prop(self, "pie_3dview_custom_op_name_bottom_left", text=" Name")
|
||||
layout.prop(self, "pie_3dview_bottom_right")
|
||||
if self.pie_3dview_bottom_right == "CUSTOM_OP":
|
||||
layout.prop(self, "pie_3dview_custom_op_bottom_right", text=" Operator")
|
||||
layout.prop(self, "pie_3dview_custom_op_name_bottom_right", text=" Name")
|
||||
if self.pie_tab == 'PIE_UV_EDITOR':
|
||||
layout.prop(self, "pie_uv_editor_left")
|
||||
if self.pie_uv_editor_left == "CUSTOM_OP":
|
||||
layout.prop(self, "pie_uv_editor_custom_op_left", text=" Operator")
|
||||
layout.prop(self, "pie_uv_editor_custom_op_name_left", text=" Name")
|
||||
layout.prop(self, "pie_uv_editor_right")
|
||||
if self.pie_uv_editor_right == "CUSTOM_OP":
|
||||
layout.prop(self, "pie_uv_editor_custom_op_right", text=" Operator")
|
||||
layout.prop(self, "pie_uv_editor_custom_op_name_right", text=" Name")
|
||||
layout.prop(self, "pie_uv_editor_top")
|
||||
if self.pie_uv_editor_top == "CUSTOM_OP":
|
||||
layout.prop(self, "pie_uv_editor_custom_op_top", text=" Operator")
|
||||
layout.prop(self, "pie_uv_editor_custom_op_name_top", text=" Name")
|
||||
layout.prop(self, "pie_uv_editor_bottom")
|
||||
if self.pie_uv_editor_bottom == "CUSTOM_OP":
|
||||
layout.prop(self, "pie_uv_editor_custom_op_bottom", text=" Operator")
|
||||
layout.prop(self, "pie_uv_editor_custom_op_name_bottom", text=" Name")
|
||||
layout.prop(self, "pie_uv_editor_top_left")
|
||||
if self.pie_uv_editor_top_left == "CUSTOM_OP":
|
||||
layout.prop(self, "pie_uv_editor_custom_op_top_left", text=" Operator")
|
||||
layout.prop(self, "pie_uv_editor_custom_op_name_top_left", text=" Name")
|
||||
layout.prop(self, "pie_uv_editor_top_right")
|
||||
if self.pie_uv_editor_top_right == "CUSTOM_OP":
|
||||
layout.prop(self, "pie_uv_editor_custom_op_top_right", text=" Operator")
|
||||
layout.prop(self, "pie_uv_editor_custom_op_name_top_right", text=" Name")
|
||||
layout.prop(self, "pie_uv_editor_bottom_left")
|
||||
if self.pie_uv_editor_bottom_left == "CUSTOM_OP":
|
||||
layout.prop(self, "pie_uv_editor_custom_op_bottom_left", text=" Operator")
|
||||
layout.prop(self, "pie_uv_editor_custom_op_name_bottom_left", text=" Name")
|
||||
layout.prop(self, "pie_uv_editor_bottom_right")
|
||||
if self.pie_uv_editor_bottom_right == "CUSTOM_OP":
|
||||
layout.prop(self, "pie_uv_editor_custom_op_bottom_right", text=" Operator")
|
||||
layout.prop(self, "pie_uv_editor_custom_op_name_bottom_right", text=" Name")
|
||||
if self.tab == 'KEYMAP':
|
||||
self.draw_keymap(context)
|
||||
if self.tab == 'HELP':
|
||||
documentation = "https://alexbelyakov.gitlab.io/uv-toolkit-docs/"
|
||||
tutorials = "https://www.youtube.com/playlist?list=PLex7IjhY06w63StowG501tBbEyZrzHa00"
|
||||
gumroad = "https://gumroad.com/alexbel"
|
||||
blender_market = "https://blendermarket.com/creators/alexdev"
|
||||
twitter = "https://twitter.com/AIexanderBel"
|
||||
youtube = "https://www.youtube.com/channel/UCplYEvDn4G92ykGEKcyVaHw/featured"
|
||||
blender_artists = "https://blenderartists.org/t/uv-toolkit-for-blender-2-8x/1165216"
|
||||
polycount = "https://polycount.com/discussion/212218/uv-toolkit-for-blender-2-8"
|
||||
|
||||
row = layout.row(align=True)
|
||||
row.operator("wm.url_open", text="Documentation",
|
||||
icon_value=icons_coll["documentation"].icon_id).url = documentation
|
||||
row.operator("wm.url_open", text="Tutorials",
|
||||
icon_value=icons_coll["tutorials"].icon_id).url = tutorials
|
||||
row = layout.row(align=True)
|
||||
row.operator("wm.url_open", text="Blender Market",
|
||||
icon_value=icons_coll["blender_market"].icon_id).url = blender_market
|
||||
row.operator("wm.url_open", text="Gumroad",
|
||||
icon_value=icons_coll["gumroad"].icon_id).url = gumroad
|
||||
row = layout.row(align=True)
|
||||
row.operator("wm.url_open", text="Twitter",
|
||||
icon_value=icons_coll["twitter"].icon_id).url = twitter
|
||||
row.operator("wm.url_open", text="YouTube",
|
||||
icon_value=icons_coll["youtube"].icon_id).url = youtube
|
||||
row = layout.row(align=True)
|
||||
row.operator("wm.url_open", text="Blender Artists",
|
||||
icon_value=icons_coll["blender_artists"].icon_id).url = blender_artists
|
||||
row.operator("wm.url_open", text="Polycount",
|
||||
icon_value=icons_coll["polycount"].icon_id).url = polycount
|
||||
@@ -0,0 +1,23 @@
|
||||
schema_version = "1.0.0"
|
||||
|
||||
id = "uv_toolkit"
|
||||
version = "2.1.3"
|
||||
name = "UVToolkit"
|
||||
tagline = "A collection of UV editing tools for Blender"
|
||||
maintainer = "Ethan Simon-Law <ethan.simon.3d@gmail.com>"
|
||||
type = "add-on"
|
||||
|
||||
website = "https://github.com/oRazeD/UVToolkit"
|
||||
|
||||
tags = ["UV", "Material"]
|
||||
|
||||
blender_version_min = "4.2.0"
|
||||
blender_version_max = "4.7.0"
|
||||
|
||||
license = [
|
||||
"SPDX:GPL-3.0-or-later",
|
||||
]
|
||||
|
||||
# [permissions]
|
||||
files = "Read/Write Images"
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
C:\BlenderBuilds\4.4.3\blender.exe --command extension build
|
||||
explorer %~dp0
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,5 @@
|
||||
import bpy
|
||||
|
||||
|
||||
def get_addon_preferences():
|
||||
return bpy.context.preferences.addons[__package__].preferences
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user