From cfead10d1d49006ca5685c653fdb58731f6aa62e Mon Sep 17 00:00:00 2001 From: UuuNyaa Date: Mon, 1 Mar 2021 20:26:25 +0900 Subject: [PATCH 1/2] Release preparation --- mmd_uuunyaa_tools/__init__.py | 2 +- mmd_uuunyaa_tools/asset_search/panels.py | 1 + mmd_uuunyaa_tools/tuners/__init__.py | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/mmd_uuunyaa_tools/__init__.py b/mmd_uuunyaa_tools/__init__.py index acef8eb..37c40bc 100644 --- a/mmd_uuunyaa_tools/__init__.py +++ b/mmd_uuunyaa_tools/__init__.py @@ -24,7 +24,7 @@ "name": "mmd_uuunyaa_tools", "description": "Utility tools for MMD model & scene editing by Uuu(/>ω<)/Nyaa!.", "author": "UuuNyaa", - "version": (0, 0, 6), + "version": (0, 1, 0), "blender": (2, 80, 0), "warning": "", "location": "View3D > Tool Shelf > MMD Tools Panel", diff --git a/mmd_uuunyaa_tools/asset_search/panels.py b/mmd_uuunyaa_tools/asset_search/panels.py index 62b102d..ccad44b 100644 --- a/mmd_uuunyaa_tools/asset_search/panels.py +++ b/mmd_uuunyaa_tools/asset_search/panels.py @@ -8,6 +8,7 @@ from typing import List, Set, Union import bpy +import bpy.utils.previews from mmd_uuunyaa_tools.asset_search.assets import ASSETS, AssetDescription from mmd_uuunyaa_tools.asset_search.cache import CONTENT_CACHE, Content, Task from mmd_uuunyaa_tools.utilities import to_human_friendly_text, to_int32 diff --git a/mmd_uuunyaa_tools/tuners/__init__.py b/mmd_uuunyaa_tools/tuners/__init__.py index 6a6cc10..6e3c74e 100644 --- a/mmd_uuunyaa_tools/tuners/__init__.py +++ b/mmd_uuunyaa_tools/tuners/__init__.py @@ -7,6 +7,7 @@ from typing import Dict, NamedTuple import bpy +import bpy.utils.previews from mmd_uuunyaa_tools import PACKAGE_PATH From afd9d41706be64dcb966895e0ed8711ccbe7d3ab Mon Sep 17 00:00:00 2001 From: UuuNyaa Date: Tue, 2 Mar 2021 06:44:31 +0900 Subject: [PATCH 2/2] Specify the default encoding. #8 --- mmd_uuunyaa_tools/__init__.py | 2 +- mmd_uuunyaa_tools/asset_search/assets.py | 10 ++++++--- mmd_uuunyaa_tools/asset_search/panels.py | 15 +------------ mmd_uuunyaa_tools/operators.py | 27 ++++++++++++++++++++++-- mmd_uuunyaa_tools/tuners/__init__.py | 3 --- mmd_uuunyaa_tools/utilities.py | 13 ++++++++++++ 6 files changed, 47 insertions(+), 23 deletions(-) diff --git a/mmd_uuunyaa_tools/__init__.py b/mmd_uuunyaa_tools/__init__.py index 37c40bc..8ec3c12 100644 --- a/mmd_uuunyaa_tools/__init__.py +++ b/mmd_uuunyaa_tools/__init__.py @@ -24,7 +24,7 @@ "name": "mmd_uuunyaa_tools", "description": "Utility tools for MMD model & scene editing by Uuu(/>ω<)/Nyaa!.", "author": "UuuNyaa", - "version": (0, 1, 0), + "version": (0, 1, 1), "blender": (2, 80, 0), "warning": "", "location": "View3D > Tool Shelf > MMD Tools Panel", diff --git a/mmd_uuunyaa_tools/asset_search/assets.py b/mmd_uuunyaa_tools/asset_search/assets.py index 24762fd..8337dda 100644 --- a/mmd_uuunyaa_tools/asset_search/assets.py +++ b/mmd_uuunyaa_tools/asset_search/assets.py @@ -95,8 +95,11 @@ def unrar(rar_file_path, password=None, asset=None): loader = importlib.machinery.SourceFileLoader(namespace, os.path.join(PACKAGE_PATH, 'externals', 'rarfile', 'rarfile.py')) rarfile = loader.load_module(namespace) - with rarfile.RarFile(rar_file_path) as rar: - rar.extractall(path=asset_path, pwd=password) + try: + with rarfile.RarFile(rar_file_path) as rar: + rar.extractall(path=asset_path, pwd=password) + except rarfile.RarCannotExec: + raise rarfile.RarCannotExec('Failed to execute unrar or WinRAR\nPlease install unrar or WinRAR and setup the PATH properly.') _Utilities.write_json(asset) _Utilities.chmod_recursively(asset_path, stat.S_IWRITE) @@ -251,6 +254,7 @@ def execute_import_action(asset: AssetDescription, target_file: Union[str, None] tree = ast.parse(asset.import_action) _Utilities.Visitor().visit(tree) + exec(compile(tree, '', 'exec'), {'__builtins__': {}}, { 'unzip': functools.partial(_Utilities.unzip, asset=asset), 'unrar': functools.partial(_Utilities.unrar, asset=asset), @@ -283,7 +287,7 @@ def reload(self, asset_jsons_folder: str): for json_path in glob.glob(os.path.join(asset_jsons_folder, '*.json')): try: - with open(json_path) as f: + with open(json_path, encoding='utf-8') as f: for asset in json.load(f)['assets']: self.add(_Utilities.from_dict(asset)) except: diff --git a/mmd_uuunyaa_tools/asset_search/panels.py b/mmd_uuunyaa_tools/asset_search/panels.py index ccad44b..1fdf1e7 100644 --- a/mmd_uuunyaa_tools/asset_search/panels.py +++ b/mmd_uuunyaa_tools/asset_search/panels.py @@ -11,7 +11,7 @@ import bpy.utils.previews from mmd_uuunyaa_tools.asset_search.assets import ASSETS, AssetDescription from mmd_uuunyaa_tools.asset_search.cache import CONTENT_CACHE, Content, Task -from mmd_uuunyaa_tools.utilities import to_human_friendly_text, to_int32 +from mmd_uuunyaa_tools.utilities import label_multiline, to_human_friendly_text, to_int32 class AssetState(Enum): @@ -136,19 +136,6 @@ def execute(self, context): return {'FINISHED'} -def label_multiline(layout, text='', width=0): - if text.strip() == '': - return - - threshold = int(width / 5.5) if width > 0 else 35 - for line in text.split('\n'): - while len(line) > threshold: - space_index = line.rfind(' ', 0, threshold) - layout.label(text=line[:space_index]) - line = line[space_index:].lstrip() - layout.label(text=line) - - class AssetDownload(bpy.types.Operator): bl_idname = 'mmd_uuunyaa_tools.asset_download' bl_label = 'Download Asset' diff --git a/mmd_uuunyaa_tools/operators.py b/mmd_uuunyaa_tools/operators.py index 0c482ac..72111ae 100644 --- a/mmd_uuunyaa_tools/operators.py +++ b/mmd_uuunyaa_tools/operators.py @@ -6,6 +6,7 @@ import os import bpy +from mmd_uuunyaa_tools.utilities import label_multiline class ConvertMaterialsForEevee(bpy.types.Operator): @@ -90,9 +91,31 @@ def execute(self, context): eevee.gi_irradiance_smoothing = 0.50 # Film > Transparent - bpy.data.scenes["Scene"].render.film_transparent = self.film_transparent + bpy.data.scenes['Scene'].render.film_transparent = self.film_transparent # Color Management > Look: High Contrast - bpy.data.scenes["Scene"].view_settings.look = 'High Contrast' + bpy.data.scenes['Scene'].view_settings.look = 'High Contrast' return {'FINISHED'} + + +class ShowMessageBox(bpy.types.Operator): + bl_idname = 'mmd_uuunyaa_tools.show_message_box' + bl_label = 'Show Message Box' + bl_description = 'Show message box.' + bl_options = {'INTERNAL'} + + icon: bpy.props.StringProperty(default='INFO') + title: bpy.props.StringProperty(default='') + message: bpy.props.StringProperty(default='') + width: bpy.props.IntProperty(default=400) + + def execute(self, context): + self.report({'INFO'}, message=self.message) + return context.window_manager.invoke_popup(self, width=self.width) + + def draw(self, context): + layout = self.layout + layout.label(text=self.title, icon=self.icon) + col = layout.column(align=True) + label_multiline(col, text=self.message, width=self.width) diff --git a/mmd_uuunyaa_tools/tuners/__init__.py b/mmd_uuunyaa_tools/tuners/__init__.py index 6e3c74e..a692196 100644 --- a/mmd_uuunyaa_tools/tuners/__init__.py +++ b/mmd_uuunyaa_tools/tuners/__init__.py @@ -41,9 +41,6 @@ def __init__(self, *tuners: TunerABC): for t in tuners: self.add(t) - def __del__(self): - del self.previews - def __getitem__(self, tuner_id: str) -> TunerABC: return self.tuners[tuner_id].tuner diff --git a/mmd_uuunyaa_tools/utilities.py b/mmd_uuunyaa_tools/utilities.py index aacd728..ada4172 100644 --- a/mmd_uuunyaa_tools/utilities.py +++ b/mmd_uuunyaa_tools/utilities.py @@ -65,6 +65,19 @@ def sanitize_path_fragment(path_fragment: str) -> str: ) +def label_multiline(layout, text='', width=0): + if text.strip() == '': + return + + threshold = int(width / 5.5) if width > 0 else 35 + for line in text.split('\n'): + while len(line) > threshold: + space_index = line.rfind(' ', 0, threshold) + layout.label(text=line[:space_index]) + line = line[space_index:].lstrip() + layout.label(text=line) + + class ObjectMarker: def __init__(self, mark_id: str): self.mark_id = mark_id