优化下这段代码 并去除中文
# !/usr/bin/env python
# -*- coding: utf-8 -*-
import maya.cmds as cmds
class ArnoldLightAOVTool:
def __init__(self):
self.window_name = "arnoldLightAOVTool"
self.title = "Arnold 灯光工具"
self.size = (300, 800)
# 检查并删除已有窗口
if cmds.window(self.window_name, exists=True):
cmds.deleteUI(self.window_name)
# 创建主窗口
self.window = cmds.window(self.window_name, title=self.title, widthHeight=self.size)
# 创建主布局
self.main_layout = cmds.columnLayout(adjustableColumn=True, parent=self.window)
# 添加UI元素
self.createUI()
# 显示窗口
cmds.showWindow(self.window)
def createUI(self):
"""创建UI元素"""
# 灯光属性部分
cmds.separator(height=15, style='in', parent=self.main_layout)
cmds.text("Light Attributes", align='left', font='boldLabelFont', parent=self.main_layout)
cmds.separator(height=5, style='none', parent=self.main_layout)
# Color属性
self.color_rgb = cmds.colorSliderGrp(label='Color:', rgb=(1,1,1), columnWidth3=[70,60,60], parent=self.main_layout)
cmds.button(label='Apply Color', command=self.applyColor, parent=self.main_layout, backgroundColor=[0.2, 0.2, 0])
# Intensity属性
self.intensity = cmds.floatSliderGrp(label='Intensity:', minValue=0, maxValue=10, field=True, value=1, columnWidth3=[70,60,60], parent=self.main_layout)
cmds.button(label='Apply Intensity', command=self.applyIntensity, parent=self.main_layout, backgroundColor=[0.2, 0.2, 0])
# Exposure属性
self.exposure = cmds.floatSliderGrp(label='Exposure:', minValue=0, maxValue=25, field=True, value=0, columnWidth3=[70,60,60], parent=self.main_layout)
cmds.button(label='Apply Exposure', command=self.applyExposure, parent=self.main_layout, backgroundColor=[0.2, 0.2, 0])
cmds.separator(height=5, style='none', parent=self.main_layout, )
cmds.separator(height=10, style='none', parent=self.main_layout, backgroundColor=[0.5, 0.2, 0])
#aiCamera
self.aiCamera = cmds.floatSliderGrp(label='Camera:', minValue=0, maxValue=1, field=True, value=0, columnWidth3=[80,60,60], parent=self.main_layout)
cmds.button(label='Camera (相机)', command=self.applyAiCamera, parent=self.main_layout, backgroundColor=[0.1, 0.3, 0])
#aiTransmission
self.aiTransmission = cmds.floatSliderGrp(label='Transmission:', minValue=0, maxValue=1, field=True, value=0, columnWidth3=[80,60,60], parent=self.main_layout)
cmds.button(label='Transmission (透明)', command=self.applyAiTransmission, parent=self.main_layout, backgroundColor=[0.1, 0.3, 0])
#aiDiffuse
self.aiDiffuse = cmds.floatSliderGrp(label='Diffuse:', minValue=0, maxValue=1, field=True, value=1, columnWidth3=[80,60,60], parent=self.main_layout)
cmds.button(label='Diffuse (漫反射)', command=self.applyAiDiffuse, parent=self.main_layout, backgroundColor=[0.1, 0.3, 0])
#aiSpecular
self.aiSpecular = cmds.floatSliderGrp(label='Specular:', minValue=0, maxValue=1, field=True, value=1, columnWidth3=[80,60,60], parent=self.main_layout)
cmds.button(label='Specular (高光)', command=self.applyAiSpecular, parent=self.main_layout, backgroundColor=[0.1, 0.3, 0])
#aiSss
self.aiSss = cmds.floatSliderGrp(label='Sss:', minValue=0, maxValue=1, field=True, value=1, columnWidth3=[80,60,60], parent=self.main_layout)
cmds.button(label='Sss (透射)', command=self.applyAiSss, parent=self.main_layout, backgroundColor=[0.1, 0.3, 0])
#aiIndirect
self.aiIndirect = cmds.floatSliderGrp(label='Indirect:', minValue=0, maxValue=1, field=True, value=1, columnWidth3=[80,60,60], parent=self.main_layout)
cmds.button(label='Indirect (间接照明)', command=self.applyAiIndirect, parent=self.main_layout, backgroundColor=[0.1, 0.3, 0])
#aiVolume
self.aiVolume = cmds.floatSliderGrp(label='Volume:', minValue=0, maxValue=1, field=True, value=1, columnWidth3=[80,60,60], parent=self.main_layout)
cmds.button(label='Volume (体积)', command=self.applyAiVolume, parent=self.main_layout, backgroundColor=[0.1, 0.3, 0])
#最大反弹次数
cmds.separator(height=15, style='none', parent=self.main_layout, )
cmds.text(l="最大反弹次数:")
self.num_Max_fantan = cmds.intField("num_of_fantan", min=1, v=999, step=1)
cmds.button(label='Updated Max_fantan (反弹次数)', command=self.max_fantan_setup, parent=self.main_layout, backgroundColor=[0.2, 0.3, 0])
# AOV_light_grp
cmds.separator(height=15, style='none', parent=self.main_layout, )
prefixText = cmds.text(l="重 命 组 名:")
self.prefixField = cmds.textField("prefix", pht="name_grp")
cmds.button(label='Updated AOV_light_grp (修改灯光组名_lingt_grp)', command=self.aov_compositing_setup, parent=self.main_layout, backgroundColor=[0.2, 0.3, 0])
def getSelectedArnoldLights(self):
"""获取选中的Arnold灯光 - 改进版"""
selected = cmds.ls(selection=True, long=True) or []
arnold_lights = []
# Arnold灯光类型列表
arnold_light_types = [
'aiAreaLight',
'aiSkyDomeLight',
'aiPhotometricLight',
'aiMeshLight',
'aiLightPortal'
]
for obj in selected:
# 检查是否是transform节点
if cmds.objectType(obj) == 'transform':
shapes = cmds.listRelatives(obj, shapes=True, fullPath=True) or []
for shape in shapes:
if cmds.objectType(shape) in arnold_light_types:
arnold_lights.append(shape)
# 直接检查是否是灯光shape节点
elif cmds.objectType(obj) in arnold_light_types:
arnold_lights.append(obj)
return arnold_lights
def applyColor(self, *args):
"""应用颜色属性"""
color = cmds.colorSliderGrp(self.color_rgb, query=True, rgb=True)
lights = self.getSelectedArnoldLights()
if not lights:
cmds.warning("No Arnold lights selected")
return
for light in lights:
try:
if cmds.attributeQuery('color', node=light, exists=True):
cmds.setAttr(light + ".color", color[0], color[1], color[2], type='double3')
print("Applied color to {}".format(light))
except Exception as e:
cmds.warning("Failed to set color on {}: {}".format(light, str(e)))
cmds.inViewMessage(amg="Color applied to %d light(s)" % len(lights), pos='midCenter', fade=True)
def applyIntensity(self, *args):
"""应用强度属性"""
intensity = cmds.floatSliderGrp(self.intensity, query=True, value=True)
lights = self.getSelectedArnoldLights()
if not lights:
cmds.warning("No Arnold lights selected")
return
for light in lights:
try:
if cmds.attributeQuery('intensity', node=light, exists=True):
cmds.setAttr(light + ".intensity", intensity)
print("Applied intensity to {}".format(light))
except Exception as e:
cmds.warning("Failed to set intensity on {}: {}".format(light, str(e)))
cmds.inViewMessage(amg="Intensity applied to %d light(s)" % len(lights), pos='midCenter', fade=True)
def applyExposure(self, *args):
"""应用曝光属性"""
exposure = cmds.floatSliderGrp(self.exposure, query=True, value=True)
lights = self.getSelectedArnoldLights()
if not lights:
cmds.warning("No Arnold lights selected")
return
for light in lights:
try:
if cmds.attributeQuery('exposure', node=light, exists=True):
cmds.setAttr(light + ".exposure", exposure)
print("Applied exposure to {}".format(light))
except Exception as e:
cmds.warning("Failed to set exposure on {}: {}".format(light, str(e)))
cmds.inViewMessage(amg="Exposure applied to %d light(s)" % len(lights), pos='midCenter', fade=True)
def applyAiTransmission(self, *args):
"""透明属性"""
aiTransmission = cmds.floatSliderGrp(self.aiTransmission, query=True, value=True)
lights = self.getSelectedArnoldLights()
if not lights:
cmds.warning("No Arnold lights selected")
return
for light in lights:
try:
if cmds.attributeQuery('aiTransmission', node=light, exists=True):
cmds.setAttr(light + ".aiTransmission", aiTransmission)
print("Applied Transmission to {}".format(light))
except Exception as e:
cmds.warning("Failed to set Transmission on {}: {}".format(light, str(e)))
cmds.inViewMessage(amg="Transmission applied to %d light(s)" % len(lights), pos='midCenter', fade=True)
def applyAiCamera(self, *args):
"""透明属性"""
aiCamera = cmds.floatSliderGrp(self.aiCamera, query=True, value=True)
lights = self.getSelectedArnoldLights()
if not lights:
cmds.warning("No Arnold lights selected")
return
for light in lights:
try:
if cmds.attributeQuery('aiCamera', node=light, exists=True):
cmds.setAttr(light + ".aiCamera", aiCamera)
print("Applied Camera to {}".format(light))
except Exception as e:
cmds.warning("Failed to set Camera on {}: {}".format(light, str(e)))
cmds.inViewMessage(amg="Camera applied to %d light(s)" % len(lights), pos='midCenter', fade=True)
def applyAiDiffuse(self, *args):
"""漫反射属性"""
aiDiffuse = cmds.floatSliderGrp(self.aiDiffuse, query=True, value=True)
lights = self.getSelectedArnoldLights()
if not lights:
cmds.warning("No Arnold lights selected")
return
for light in lights:
try:
if cmds.attributeQuery('aiDiffuse', node=light, exists=True):
cmds.setAttr(light + ".aiDiffuse", aiDiffuse)
print("Applied Diffuse to {}".format(light))
except Exception as e:
cmds.warning("Failed to set Diffuse on {}: {}".format(light, str(e)))
cmds.inViewMessage(amg="Diffuse applied to %d light(s)" % len(lights), pos='midCenter', fade=True)
def applyAiSpecular(self, *args):
"""高光属性"""
aiSpecular = cmds.floatSliderGrp(self.aiSpecular, query=True, value=True)
lights = self.getSelectedArnoldLights()
if not lights:
cmds.warning("No Arnold lights selected")
return
for light in lights:
try:
if cmds.attributeQuery('aiSpecular', node=light, exists=True):
cmds.setAttr(light + ".aiSpecular", aiSpecular)
print("Applied Specular to {}".format(light))
except Exception as e:
cmds.warning("Failed to set Specular on {}: {}".format(light, str(e)))
cmds.inViewMessage(amg="Specular applied to %d light(s)" % len(lights), pos='midCenter', fade=True)
def applyAiSss(self, *args):
"""透射属性"""
aiSss = cmds.floatSliderGrp(self.aiSss, query=True, value=True)
lights = self.getSelectedArnoldLights()
if not lights:
cmds.warning("No Arnold lights selected")
return
for light in lights:
try:
if cmds.attributeQuery('aiSss', node=light, exists=True):
cmds.setAttr(light + ".aiSss", aiSss)
print("Applied Sss to {}".format(light))
except Exception as e:
cmds.warning("Failed to set Sss on {}: {}".format(light, str(e)))
cmds.inViewMessage(amg="Sss applied to %d light(s)" % len(lights), pos='midCenter', fade=True)
def applyAiIndirect(self, *args):
"""间接属性"""
aiIndirect = cmds.floatSliderGrp(self.aiIndirect, query=True, value=True)
lights = self.getSelectedArnoldLights()
if not lights:
cmds.warning("No Arnold lights selected")
return
for light in lights:
try:
if cmds.attributeQuery('aiIndirect', node=light, exists=True):
cmds.setAttr(light + ".aiIndirect", aiIndirect)
print("Applied Indirect to {}".format(light))
except Exception as e:
cmds.warning("Failed to set Indirect on {}: {}".format(light, str(e)))
cmds.inViewMessage(amg="Indirect applied to %d light(s)" % len(lights), pos='midCenter', fade=True)
def applyAiVolume(self, *args):
"""体积属性"""
aiVolume = cmds.floatSliderGrp(self.aiVolume, query=True, value=True)
lights = self.getSelectedArnoldLights()
if not lights:
cmds.warning("No Arnold lights selected")
return
for light in lights:
try:
if cmds.attributeQuery('aiVolume', node=light, exists=True):
cmds.setAttr(light + ".aiVolume", aiVolume)
print("Applied Volume to {}".format(light))
except Exception as e:
cmds.warning("Failed to set Volume on {}: {}".format(light, str(e)))
cmds.inViewMessage(amg="Volume applied to %d light(s)" % len(lights), pos='midCenter', fade=True)
def max_fantan_setup(self, *args):
aiMaxBounces = cmds.intField(self.num_Max_fantan, q=True, v=True)
lights = self.getSelectedArnoldLights()
if not lights:
cmds.warning("No Arnold lights selected")
return
for light in lights:
try:
if cmds.attributeQuery('aiMaxBounces', node=light, exists=True):
cmds.setAttr(light + ".aiMaxBounces", aiMaxBounces)
print("Applied MaxBounces to {}".format(light))
except Exception as e:
cmds.warning("Failed to set MaxBounces on {}: {}".format(light, str(e)))
cmds.inViewMessage(amg="MaxBounces applied to %d light(s)" % len(lights), pos='midCenter', fade=True)
def aov_compositing_setup(self, *args):
import maya.cmds as cmds
from mtoa.core import createOptions
if cmds.objExists("defaultArnoldRenderOptions") == 0:
cmds.warning("Render Settings not initialised. Initialising...")
createOptions()
import mtoa.aovs as aovs
import maya.mel as mel
selection = cmds.ls(sl=1, long=1)
if not selection:
cmds.confirmDialog(title='Light Group Setup',
message="Nothing was selected.",
button='Ok',
icon="warning")
return
# Setting selected light's AOV group to it's name
light_names = cmds.listRelatives(selection, shapes=1)
failed_lights = []
prefix = cmds.textField(self.prefixField, q=True, tx=True)
for light_name in light_names:
print("light_name", light_name)
aov_name = 'setAttr -type "string" {}.aiAov {};'.format(light_name, prefix)
try:
mel.eval(aov_name)
except RuntimeError:
cmds.warning("Light not supported for Arnold AOVs: {}".format(light_name))
failed_lights.append(light_name)
# Check if the AOV already Exists.
if cmds.objExists("aiAOV_RGBA"):
message = "Update of aiAOV_RGBA was successful."
else:
aovs.AOVInterface().addAOV('RGBA', aovType='rgba')
message = "aiAOV_RGBA has been created."
cmds.setAttr("aiAOV_RGBA.lightGroups", 1)
if failed_lights:
message += "\n\nThese lights could not be setup:\n"
for _light in failed_lights:
message += _light + "\n"
cmds.confirmDialog(title='Confirm',
message=message,
button='Confirm',
icon="information")
print("Updated aiAOV_RGBA")
# 创建并显示工具窗口