[Bf-extensions-cvs] [2532b968] master: Magic UV: Release v5.2
Nutti
noreply at git.blender.org
Sat Nov 17 13:14:22 CET 2018
Commit: 2532b96844c121b710e1a1973d2a5ff824ab3be4
Author: Nutti
Date: Sat Nov 17 21:11:55 2018 +0900
Branches: master
https://developer.blender.org/rBA2532b96844c121b710e1a1973d2a5ff824ab3be4
Magic UV: Release v5.2
* Bulit-in menu preferences
* Add-on updater
* Copy/Paste UV
* Add option "[New]" for pasting to newly allocated UV map
* Add option "[All]" for pasting all UV maps at once
* Align UV
* Add option "Mesh Influence"
* World Scale UV
* Add mode option "Manual" to allow the user specify the density manually
* Improve UI
* Cleanup documents
* Fix bugs
===================================================================
M uv_magic_uv/__init__.py
A uv_magic_uv/addon_updater.py
A uv_magic_uv/addon_updater_ops.py
M uv_magic_uv/common.py
M uv_magic_uv/op/__init__.py
M uv_magic_uv/op/align_uv.py
M uv_magic_uv/op/align_uv_cursor.py
M uv_magic_uv/op/copy_paste_uv.py
M uv_magic_uv/op/copy_paste_uv_object.py
M uv_magic_uv/op/copy_paste_uv_uvedit.py
M uv_magic_uv/op/flip_rotate_uv.py
M uv_magic_uv/op/mirror_uv.py
M uv_magic_uv/op/move_uv.py
M uv_magic_uv/op/pack_uv.py
M uv_magic_uv/op/preserve_uv_aspect.py
A uv_magic_uv/op/select_uv.py
M uv_magic_uv/op/smooth_uv.py
M uv_magic_uv/op/texture_lock.py
M uv_magic_uv/op/texture_projection.py
M uv_magic_uv/op/texture_wrap.py
M uv_magic_uv/op/transfer_uv.py
M uv_magic_uv/op/unwrap_constraint.py
M uv_magic_uv/op/uv_bounding_box.py
M uv_magic_uv/op/uv_inspection.py
M uv_magic_uv/op/uv_sculpt.py
M uv_magic_uv/op/uvw.py
M uv_magic_uv/op/world_scale_uv.py
M uv_magic_uv/preferences.py
M uv_magic_uv/properites.py
A uv_magic_uv/ui/IMAGE_MT_uvs.py
A uv_magic_uv/ui/VIEW3D_MT_object.py
A uv_magic_uv/ui/VIEW3D_MT_uv_map.py
M uv_magic_uv/ui/__init__.py
M uv_magic_uv/ui/uvedit_copy_paste_uv.py
D uv_magic_uv/ui/uvedit_editor_enhance.py
A uv_magic_uv/ui/uvedit_editor_enhancement.py
M uv_magic_uv/ui/uvedit_uv_manipulation.py
M uv_magic_uv/ui/view3d_copy_paste_uv_editmode.py
M uv_magic_uv/ui/view3d_copy_paste_uv_objectmode.py
M uv_magic_uv/ui/view3d_uv_manipulation.py
M uv_magic_uv/ui/view3d_uv_mapping.py
===================================================================
diff --git a/uv_magic_uv/__init__.py b/uv_magic_uv/__init__.py
index 080d2414..20709e79 100644
--- a/uv_magic_uv/__init__.py
+++ b/uv_magic_uv/__init__.py
@@ -20,15 +20,15 @@
__author__ = "Nutti <nutti.metro at gmail.com>"
__status__ = "production"
-__version__ = "5.1"
-__date__ = "24 Feb 2018"
+__version__ = "5.2"
+__date__ = "17 Nov 2018"
bl_info = {
"name": "Magic UV",
"author": "Nutti, Mifth, Jace Priester, kgeogeo, mem, imdjs"
"Keith (Wahooney) Boshoff, McBuff, MaxRobinot, Alexander Milovsky",
- "version": (5, 1, 0),
+ "version": (5, 2, 0),
"blender": (2, 79, 0),
"location": "See Add-ons Preferences",
"description": "UV Toolset. See Add-ons Preferences for details",
@@ -47,24 +47,36 @@ if "bpy" in locals():
importlib.reload(common)
importlib.reload(preferences)
importlib.reload(properites)
+ importlib.reload(addon_updater_ops)
+ importlib.reload(addon_updater)
else:
from . import op
from . import ui
from . import common
from . import preferences
from . import properites
+ from . import addon_updater_ops
+ from . import addon_updater
import bpy
def register():
- bpy.utils.register_module(__name__)
+ if not common.is_console_mode():
+ addon_updater_ops.register(bl_info)
properites.init_props(bpy.types.Scene)
+ bpy.utils.register_module(__name__)
+ if preferences.Preferences.enable_builtin_menu:
+ preferences.add_builtin_menu()
def unregister():
+ if preferences.Preferences.enable_builtin_menu:
+ preferences.remove_builtin_menu()
bpy.utils.unregister_module(__name__)
properites.clear_props(bpy.types.Scene)
+ if not common.is_console_mode():
+ addon_updater_ops.unregister()
if __name__ == "__main__":
diff --git a/uv_magic_uv/addon_updater.py b/uv_magic_uv/addon_updater.py
new file mode 100644
index 00000000..70b6a287
--- /dev/null
+++ b/uv_magic_uv/addon_updater.py
@@ -0,0 +1,1501 @@
+# ##### 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 #####
+
+
+"""
+See documentation for usage
+https://github.com/CGCookie/blender-addon-updater
+
+"""
+
+import ssl
+import urllib.request
+import urllib
+import os
+import json
+import zipfile
+import shutil
+import asyncio
+import threading
+import time
+import fnmatch
+from datetime import datetime, timedelta
+
+# blender imports, used in limited cases
+import bpy
+import addon_utils
+
+# -----------------------------------------------------------------------------
+# Define error messages/notices & hard coded globals
+# -----------------------------------------------------------------------------
+
+# currently not used
+DEFAULT_TIMEOUT = 10
+DEFAULT_PER_PAGE = 30
+
+
+# -----------------------------------------------------------------------------
+# The main class
+# -----------------------------------------------------------------------------
+
+class Singleton_updater(object):
+ """
+ This is the singleton class to reference a copy from,
+ it is the shared module level class
+ """
+ def __init__(self):
+
+ self._engine = GithubEngine()
+ self._user = None
+ self._repo = None
+ self._website = None
+ self._current_version = None
+ self._subfolder_path = None
+ self._tags = []
+ self._tag_latest = None
+ self._tag_names = []
+ self._latest_release = None
+ self._use_releases = False
+ self._include_branches = False
+ self._include_branch_list = ['master']
+ self._include_branch_autocheck = False
+ self._manual_only = False
+ self._version_min_update = None
+ self._version_max_update = None
+
+ # by default, backup current addon if new is being loaded
+ self._backup_current = True
+ self._backup_ignore_patterns = None
+
+ # set patterns for what files to overwrite on update
+ self._overwrite_patterns = ["*.py","*.pyc"]
+ self._remove_pre_update_patterns = []
+
+ # by default, don't auto enable/disable the addon on update
+ # as it is slightly less stable/won't always fully reload module
+ self._auto_reload_post_update = False
+
+ # settings relating to frequency and whether to enable auto background check
+ self._check_interval_enable = False
+ self._check_interval_months = 0
+ self._check_interval_days = 7
+ self._check_interval_hours = 0
+ self._check_interval_minutes = 0
+
+ # runtime variables, initial conditions
+ self._verbose = False
+ self._fake_install = False
+ self._async_checking = False # only true when async daemon started
+ self._update_ready = None
+ self._update_link = None
+ self._update_version = None
+ self._source_zip = None
+ self._check_thread = None
+ self.skip_tag = None
+ self.select_link = None
+
+ # get from module data
+ self._addon = __package__.lower()
+ self._addon_package = __package__ # must not change
+ self._updater_path = os.path.join(os.path.dirname(__file__),
+ self._addon+"_updater")
+ self._addon_root = os.path.dirname(__file__)
+ self._json = {}
+ self._error = None
+ self._error_msg = None
+ self._prefiltered_tag_count = 0
+
+ # UI code only, ie not used within this module but still useful
+ # properties to have
+
+ # to verify a valid import, in place of placeholder import
+ self.showpopups = True # used in UI to show or not show update popups
+ self.invalidupdater = False
+
+
+ # -------------------------------------------------------------------------
+ # Getters and setters
+ # -------------------------------------------------------------------------
+
+ @property
+ def engine(self):
+ return self._engine.name
+ @engine.setter
+ def engine(self, value):
+ if value.lower()=="github":
+ self._engine = GithubEngine()
+ elif value.lower()=="gitlab":
+ self._engine = GitlabEngine()
+ elif value.lower()=="bitbucket":
+ self._engine = BitbucketEngine()
+ else:
+ raise ValueError("Invalid engine selection")
+
+ @property
+ def private_token(self):
+ return self._engine.token
+ @private_token.setter
+ def private_token(self, value):
+ if value==None:
+ self._engine.token = None
+ else:
+ self._engine.token = str(value)
+
+ @property
+ def addon(self):
+ return self._addon
+ @addon.setter
+ def addon(self, value):
+ self._addon = str(value)
+
+ @property
+ def verbose(self):
+ return self._verbose
+ @verbose.setter
+ def verbose(self, value):
+ try:
+ self._verbose = bool(value)
+ if self._verbose == True:
+ print(self._addon+" updater verbose is enabled")
+ except:
+ raise ValueError("Verbose must be a boolean value")
+
+ @property
+ def include_branches(self):
+ return self._include_branches
+ @include_branches.setter
+ def include_branches(self, value):
+ try:
+ self._include_branches = bool(value)
+ except:
+ raise ValueError("include_branches must be a boolean value")
+
+ @property
+ def use_releases(self):
+ return self._use_releases
+ @use_releases.setter
+ def use_releases(self, value):
+ try:
+ self._use_releases = bool(value)
+ except:
+ raise ValueError("use_releases must be a boolean value")
+
+ @property
+ def include_branch_list(self):
+ return self._include_branch_list
+ @include_branch_list.setter
+ def include_branch_list(self, value):
+ try:
+ if value == None:
+ self._include_branch_list = ['master']
+ elif type(value) != type(['master']) or value==[]:
+ raise ValueError("include_branch_list should be a list of valid branches")
+ else:
+ self._include_branch_list = value
+ except:
+ raise ValueError("include_branch_list should be a list of valid branches")
+
+ @property
+ def overwrite_patterns(self):
+ return self._overwrite_patterns
+ @overwrite_patterns.setter
+ def overwrite_patterns(self, value):
+ if value == None:
+ self._overwrite_patterns = ["*.py","*.pyc"]
+ elif type(value) != type(['']):
+ raise ValueError("overwrite_patterns needs to be in a list format")
+ else:
+ self._overwrite_patterns = value
+
+ @property
+ def remove_pre_update_patterns(self):
+ return self._remove_pre_update_patterns
+ @remove_pre_update_patterns.setter
+ def remove_pre_update_patterns(self, value):
+ if value == None:
+ self._remove_pre_update_patterns = []
+ elif type(value) != type(['']):
+ raise ValueError("remove_pre_update_patterns needs to be in a list format")
+ else:
+ self._remove_pre_update_patterns = value
+
+ # not currently used
+ @property
+ def include_branch_autocheck(self):
+ return self._include_branch_autocheck
+ @include_branch_autocheck.setter
+ def include_branch_autocheck(self, value):
+ try:
+ self._include_branch_autocheck = bool(value)
+ except:
+ raise ValueError("include_branch_autocheck must be a boolean value")
+
+ @property
+ def manual_only(self):
+ return self._manual_only
+ @manual_only.setter
+ def manual_only(self, value):
+ try:
+ self._manual_only = bool(value)
+ except:
+ raise ValueError("manual_only must be a boolean value")
+
+ @property
+ def auto_reload_post_update(self):
+ return self._auto_reload_post_update
+ @auto_reload_post_update.setter
+ def auto_reload_post_update(self, value):
+ try:
+ self._auto_reload_post_update = bool(value)
+ except:
+ raise ValueError("Must be a boolean value")
+
+ @property
+ def fake_install(self):
+ return self._fake_install
+ @fake_install.setter
+ def fake_install(self, value):
+ if type(value) != type(False):
+ raise ValueError("fake_install must be a boolean value")
+ self._fake_install = bool(value)
+
+ @property
+ def user(self):
+ return self._user
+ @user.setter
+ def user(self, va
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-extensions-cvs
mailing list