update message box and rail_uv

This commit is contained in:
yyc12345 2020-10-07 15:20:51 +08:00
parent a8203dcb9c
commit 35655a671d
4 changed files with 53 additions and 18 deletions

View File

@ -105,7 +105,7 @@ def import_bm(context,filepath,externalTexture,blenderTempFolder, textureOpt, ma
# judge version first # judge version first
gotten_version = read_uint32(findex) gotten_version = read_uint32(findex)
if (gotten_version != bm_current_version): if (gotten_version != bm_current_version):
utils.ShowMessageBox("Unsupported BM spec. Expect: {} Gotten: {}".format(bm_current_version, gotten_version), "Unsupported BM spec", 'WARNING') utils.ShowMessageBox(("Unsupported BM spec. Expect: {} Gotten: {}".format(bm_current_version, gotten_version), ), "Unsupported BM spec", 'ERROR')
findex.close() findex.close()
tempFolderObj.cleanup() tempFolderObj.cleanup()
return return

View File

@ -33,13 +33,16 @@ def check_target():
if obj.data.uv_layers.active is None: if obj.data.uv_layers.active is None:
noUVObject.append(obj.name) noUVObject.append(obj.name)
result = ("All objects: {}, Skipped: {}, No UV Count: {}. Following object don't have UV: ".format(len(bpy.context.selected_objects), invalidObjectCount, len(noUVObject)) +
", ".join(noUVObject[:4]) +
(". Too much objects don't have UV. Please open terminal to browse them." if len(noUVObject) > 4 else ""))
if len(noUVObject) > 4: if len(noUVObject) > 4:
print("Following object don't have UV:") print("Following object don't have UV:")
for item in noUVObject: for item in noUVObject:
print(item) print(item)
utils.ShowMessageBox(result, "Check result", 'INFO') utils.ShowMessageBox((
"All objects: {}".format(len(bpy.context.selected_objects)),
"Skipped: {}".format(invalidObjectCount),
"No UV Count: {}".format(len(noUVObject)),
"",
"Following object don't have UV: "
) + tuple(noUVObject[:4]) +
(("Too much objects don't have UV. Please open terminal to browse them." if len(noUVObject) > 4 else "") ,), "Check result", 'INFO')

View File

@ -1,4 +1,5 @@
import bpy,bmesh import bpy,bmesh
import mathutils
import bpy.types import bpy.types
from . import utils, preferences from . import utils, preferences
@ -34,7 +35,10 @@ class BALLANCE_OT_rail_uv(bpy.types.Operator):
return wm.invoke_props_dialog(self) return wm.invoke_props_dialog(self)
def execute(self, context): def execute(self, context):
create_rail_uv() if context.scene.BallanceBlenderPluginProperty.material_picker == None:
utils.ShowMessageBox(("No specific material", ), "Lost parameter", 'ERROR')
else:
create_rail_uv(self.uv_type, context.scene.BallanceBlenderPluginProperty.material_picker, self.uv_scale)
return {'FINISHED'} return {'FINISHED'}
def draw(self, context): def draw(self, context):
@ -55,8 +59,8 @@ def check_rail_target():
return True return True
return False return False
def create_rail_uv(): def create_rail_uv(rail_type, material_pointer, scale_size):
meshList = [] objList = []
ignoredObj = [] ignoredObj = []
for obj in bpy.context.selected_objects: for obj in bpy.context.selected_objects:
if obj.type != 'MESH': if obj.type != 'MESH':
@ -69,16 +73,42 @@ def create_rail_uv():
# create a empty uv for it. # create a empty uv for it.
obj.data.uv_layers.new(do_init=False) obj.data.uv_layers.new(do_init=False)
meshList.append(obj.data) objList.append(obj)
for mesh in meshList: for obj in objList:
# vecList = mesh.vertices[:] mesh = obj.data
# clean it material and set rail first
obj.data.materials.clear()
obj.data.materials.append(material_pointer)
real_scale = 1.0
if rail_type == 'SCALE':
real_scale = scale_size
elif rail_type == 'UNIFORM':
# calc proper scale
targetObjBbox = [mathutils.Vector(corner) for corner in obj.bound_box]
maxLength = max(
max([vec.x for vec in targetObjBbox]) - min([vec.x for vec in targetObjBbox]),
max([vec.y for vec in targetObjBbox]) - min([vec.y for vec in targetObjBbox])
)
real_scale = 1.0 / maxLength
# copy mesh vec for scale or uniform mode
vecList = mesh.vertices[:]
uv_layer = mesh.uv_layers.active.data uv_layer = mesh.uv_layers.active.data
for poly in mesh.polygons: for poly in mesh.polygons:
for loop_index in range(poly.loop_start, poly.loop_start + poly.loop_total): for loop_index in range(poly.loop_start, poly.loop_start + poly.loop_total):
# index = mesh.loops[loop_index].vertex_index # get correspond vec index
uv_layer[loop_index].uv[0] = 0 # vecList[index].co[0] index = mesh.loops[loop_index].vertex_index
uv_layer[loop_index].uv[1] = 1 # vecList[index].co[1] if rail_type == 'POINT':
# set to 1 point
uv_layer[loop_index].uv[0] = 0
uv_layer[loop_index].uv[1] = 1
else:
# following xy -> uv scale
uv_layer[loop_index].uv[0] = vecList[index].co[0] * real_scale
uv_layer[loop_index].uv[1] = vecList[index].co[1] * real_scale
if len(ignoredObj) != 0: if len(ignoredObj) != 0:
utils.ShowMessageBox("Following objects are not processed due to they are not suit for this function now: " + ', '.join(ignoredObj), "Execution result", 'INFO') utils.ShowMessageBox(("Following objects are not processed due to they are not suit for this function now: ", ) + tuple(ignoredObj), "Execution result", 'INFO')

View File

@ -1,9 +1,11 @@
import bpy import bpy
from bpy_extras.io_utils import unpack_list from bpy_extras.io_utils import unpack_list
def ShowMessageBox(message = "", title = "Message Box", icon = 'INFO'): def ShowMessageBox(message, title, icon):
def draw(self, context): def draw(self, context):
self.layout.label(text=message) layout = self.layout
for item in message:
layout.label(text=item, translate=False)
bpy.context.window_manager.popup_menu(draw, title = title, icon = icon) bpy.context.window_manager.popup_menu(draw, title = title, icon = icon)