2025-07-01

This commit is contained in:
2026-03-17 14:30:01 -06:00
parent f9a22056dd
commit 62b5978595
4579 changed files with 1257472 additions and 0 deletions
@@ -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
@@ -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.

Some files were not shown because too many files have changed in this diff Show More