BallanceBlenderHelper/ballance_blender_plugin/rail_uv.py

85 lines
2.6 KiB
Python
Raw Normal View History

2020-07-12 21:04:38 +08:00
import bpy,bmesh
2020-10-06 23:57:21 +08:00
import bpy.types
from . import utils, preferences
2020-07-12 21:04:38 +08:00
class BALLANCE_OT_rail_uv(bpy.types.Operator):
"""Create a UV for rail"""
bl_idname = "ballance.rail_uv"
bl_label = "Create Rail UV"
bl_options = {'UNDO'}
2020-10-06 23:57:21 +08:00
uv_type: bpy.props.EnumProperty(
name="Type",
description="Define how to create UV",
items=(
("POINT", "Point", "All UV will be created in a specific point"),
("UNIFORM", "Uniform", "All UV will be created within 1x1"),
("SCALE", "Scale", "Give a scale number to scale UV")
),
)
uv_scale : bpy.props.FloatProperty(
name="Scale",
description="The scale of UV",
min=0.0,
default=1.0,
)
@classmethod
def poll(self, context):
return check_rail_target()
2020-10-06 23:57:21 +08:00
def invoke(self, context, event):
wm = context.window_manager
return wm.invoke_props_dialog(self)
def execute(self, context):
create_rail_uv()
return {'FINISHED'}
2020-10-06 23:57:21 +08:00
def draw(self, context):
layout = self.layout
layout.prop(self, "uv_type")
layout.prop(context.scene.BallanceBlenderPluginProperty, "material_picker")
if self.uv_type == 'SCALE':
layout.prop(self, "uv_scale")
# ====================== method
def check_rail_target():
for obj in bpy.context.selected_objects:
if obj.type != 'MESH':
continue
if obj.mode != 'OBJECT':
continue
return True
return False
2020-07-12 21:04:38 +08:00
def create_rail_uv():
meshList = []
ignoredObj = []
2020-07-12 21:04:38 +08:00
for obj in bpy.context.selected_objects:
if obj.type != 'MESH':
ignoredObj.append(obj.name)
continue
if obj.mode != 'OBJECT':
ignoredObj.append(obj.name)
2020-07-12 21:04:38 +08:00
continue
if obj.data.uv_layers.active is None:
# create a empty uv for it.
obj.data.uv_layers.new(do_init=False)
2020-07-12 21:04:38 +08:00
meshList.append(obj.data)
for mesh in meshList:
# vecList = mesh.vertices[:]
uv_layer = mesh.uv_layers.active.data
for poly in mesh.polygons:
for loop_index in range(poly.loop_start, poly.loop_start + poly.loop_total):
# index = mesh.loops[loop_index].vertex_index
uv_layer[loop_index].uv[0] = 0 # vecList[index].co[0]
uv_layer[loop_index].uv[1] = 1 # vecList[index].co[1]
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')