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
2020-09-02 23:04:21 +08:00
class BALLANCE_OT_rail_uv ( bpy . types . Operator ):
2020-07-20 10:13:18 +08:00
"""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 ,
)
2020-07-20 10:13:18 +08:00
@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 )
2020-07-20 10:13:18 +08:00
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" )
2020-07-20 10:13:18 +08:00
# ====================== method
def check_rail_target ():
2020-07-12 21:04:38 +08:00
for obj in bpy . context . selected_objects :
if obj . type != 'MESH' :
continue
2020-07-20 10:13:18 +08:00
if obj . mode != 'OBJECT' :
continue
return True
return False
def create_rail_uv ():
meshList = []
ignoredObj = []
for obj in bpy . context . selected_objects :
if obj . type != 'MESH' :
ignoredObj . append ( obj . name )
continue
if obj . mode != 'OBJECT' :
ignoredObj . append ( obj . name )
continue
2020-08-31 21:56:08 +08:00
if obj . data . uv_layers . active is None :
2020-09-02 23:04:21 +08:00
# 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]
2020-07-20 10:13:18 +08:00
if len ( ignoredObj ) != 0 :
2020-09-02 23:04:21 +08:00
utils . ShowMessageBox ( "Following objects are not processed due to they are not suit for this function now: " + ', ' . join ( ignoredObj ), "Execution result" , 'INFO' )