去掉Icon高光

iphone上一个个带有玻璃质感的小按钮,给了大家很好的体验。可是,有些时候,玻璃质感(高光效果)又会让我们的icon/logo看起来模糊,不清楚,不能让我们的icon独树一帜,那么现在我们要去高光(icon玻璃质感)。
在项目的info.plist里面有这么一项用来去除高光效果,不过很可惜,总是不能实现我们想要的效果。这段时间,同事用的很多,所以,将这段代码分享给大家,屡试不爽的哦! 
------------------------------------

<key>UIPrerenderedIcon</key>

<true/>

<key>iconalready includesgloss andbevel effects</key>

<true/>

------------------------------------------


以source形式打开项目中的info.plist。在里面添加上这段代码,保存,接下来有两步很重要


1:删除iphone/itouch上已经存在的app

2:项目做一次build clean ,或者直接点,删除项目所在文件夹中的build文件夹


这两步做完之后,编译运行就可以实现icon 去高光了。


出现这个错误

/dyld: Library not loaded: @rpath/SenTestingKit.framework/Versions/A/SenTestingKit
Referenced from: /Users/hua/Library/Application Support/iPhone Simulator/5.1/Applications/F1E34907-2D16-410F-B8D3-D4348D7B9416/PhotoWall.app/PhotoWall
Reason: image not found

解决方法


优化下这段代码 并去除中文 # !/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") # 创建并显示工具窗口
最新发布
08-21
非常好!你提供了一段用于控制 **Arnold 灯光属性和 AOV 设置** 的 Maya Python 工具脚本,功能非常完整。不过代码结构上有些冗余、可读性差、重复代码多、注释混乱,而且你希望: --- ## ✅ 优化目标: 1. **去除中文标签**,全部使用英文; 2. **统一命名风格**,符合 PEP8; 3. **结构清晰,可维护性强**; 4. **减少重复代码**,使用函数抽象; 5. **将属性面板封装为可折叠的 frameLayout**; 6. **将 AOV 设置部分封装为独立面板**; 7. **保持原有功能不变**。 --- ## ✅ 优化后的代码如下: ```python # !/usr/bin/env python # -*- coding: utf-8 -*- import maya.cmds as cmds import maya.mel as mel from mtoa.core import createOptions import mtoa.aovs as aovs class ArnoldLightAOVTool: def __init__(self): self.window_name = "arnoldLightAOVTool" self.title = "Arnold Light & AOV Tool" self.size = (300, 600) self._delete_existing_window() self.window = cmds.window(self.window_name, title=self.title, widthHeight=self.size) self.main_layout = cmds.columnLayout(adjustableColumn=True) self._create_light_attributes_ui() self._create_aov_setup_ui() cmds.showWindow(self.window) def _delete_existing_window(self): if cmds.window(self.window_name, exists=True): cmds.deleteUI(self.window_name) def _create_light_attributes_ui(self): cmds.frameLayout(label="Light Attributes", collapsable=True, collapse=False, width=300) layout = cmds.columnLayout(adjustableColumn=True) self.color_rgb = cmds.colorSliderGrp(label="Color", rgb=(1, 1, 1), columnWidth3=[70, 60, 60]) cmds.button(label="Apply Color", command=self.apply_color, backgroundColor=[0.2, 0.2, 0]) self.intensity = cmds.floatSliderGrp(label="Intensity", minValue=0, maxValue=10, field=True, value=1, columnWidth3=[70, 60, 60]) cmds.button(label="Apply Intensity", command=self.apply_intensity, backgroundColor=[0.2, 0.2, 0]) self.exposure = cmds.floatSliderGrp(label="Exposure", minValue=0, maxValue=25, field=True, value=0, columnWidth3=[70, 60, 60]) cmds.button(label="Apply Exposure", command=self.apply_exposure, backgroundColor=[0.2, 0.2, 0]) cmds.separator(height=10, style="none") self.ai_camera = cmds.floatSliderGrp(label="Camera", minValue=0, maxValue=1, field=True, value=0, columnWidth3=[80, 60, 60]) cmds.button(label="Apply Camera", command=self.apply_ai_camera, backgroundColor=[0.1, 0.3, 0]) self.ai_transmission = cmds.floatSliderGrp(label="Transmission", minValue=0, maxValue=1, field=True, value=0, columnWidth3=[80, 60, 60]) cmds.button(label="Apply Transmission", command=self.apply_ai_transmission, backgroundColor=[0.1, 0.3, 0]) self.ai_diffuse = cmds.floatSliderGrp(label="Diffuse", minValue=0, maxValue=1, field=True, value=1, columnWidth3=[80, 60, 60]) cmds.button(label="Apply Diffuse", command=self.apply_ai_diffuse, backgroundColor=[0.1, 0.3, 0]) self.ai_specular = cmds.floatSliderGrp(label="Specular", minValue=0, maxValue=1, field=True, value=1, columnWidth3=[80, 60, 60]) cmds.button(label="Apply Specular", command=self.apply_ai_specular, backgroundColor=[0.1, 0.3, 0]) self.ai_sss = cmds.floatSliderGrp(label="Sss", minValue=0, maxValue=1, field=True, value=1, columnWidth3=[80, 60, 60]) cmds.button(label="Apply Sss", command=self.apply_ai_sss, backgroundColor=[0.1, 0.3, 0]) self.ai_indirect = cmds.floatSliderGrp(label="Indirect", minValue=0, maxValue=1, field=True, value=1, columnWidth3=[80, 60, 60]) cmds.button(label="Apply Indirect", command=self.apply_ai_indirect, backgroundColor=[0.1, 0.3, 0]) self.ai_volume = cmds.floatSliderGrp(label="Volume", minValue=0, maxValue=1, field=True, value=1, columnWidth3=[80, 60, 60]) cmds.button(label="Apply Volume", command=self.apply_ai_volume, backgroundColor=[0.1, 0.3, 0]) self.max_bounces = cmds.intField(min=1, value=999, step=1) cmds.button(label="Apply Max Bounces", command=self.apply_max_bounces, backgroundColor=[0.2, 0.3, 0]) cmds.setParent("..") def _create_aov_setup_ui(self): cmds.frameLayout(label="AOV Setup", collapsable=True, collapse=False, width=300) layout = cmds.columnLayout(adjustableColumn=True) self.prefix_field = cmds.textField(placeholderText="light_group_name") cmds.button(label="Apply Light Group Name", command=self.apply_aov_group_name, backgroundColor=[0.2, 0.3, 0]) cmds.setParent("..") def _get_selected_arnold_lights(self): selected = cmds.ls(selection=True, long=True) or [] arnold_light_types = [ "aiAreaLight", "aiSkyDomeLight", "aiPhotometricLight", "aiMeshLight", "aiLightPortal", ] lights = [] for obj in selected: 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: lights.append(shape) elif cmds.objectType(obj) in arnold_light_types: lights.append(obj) return lights def _apply_attr(self, attr_name, slider, attr_type="double"): value = cmds.floatSliderGrp(slider, query=True, value=True) lights = self._get_selected_arnold_lights() if not lights: cmds.warning("No Arnold lights selected") return for light in lights: try: if cmds.attributeQuery(attr_name, node=light, exists=True): if attr_type == "double": cmds.setAttr(f"{light}.{attr_name}", value) elif attr_type == "double3" and attr_name == "color": r, g, b = cmds.colorSliderGrp(slider, query=True, rgb=True) cmds.setAttr(f"{light}.{attr_name}", r, g, b, type="double3") print(f"Applied {attr_name} to {light}") except Exception as e: cmds.warning(f"Failed to set {attr_name} on {light}: {e}") cmds.inViewMessage(amg=f"{attr_name.capitalize()} applied to {len(lights)} light(s)", pos="midCenter", fade=True) def apply_color(self, *args): self._apply_attr("color", self.color_rgb, attr_type="double3") def apply_intensity(self, *args): self._apply_attr("intensity", self.intensity) def apply_exposure(self, *args): self._apply_attr("exposure", self.exposure) def apply_ai_transmission(self, *args): self._apply_attr("aiTransmission", self.ai_transmission) def apply_ai_camera(self, *args): self._apply_attr("aiCamera", self.ai_camera) def apply_ai_diffuse(self, *args): self._apply_attr("aiDiffuse", self.ai_diffuse) def apply_ai_specular(self, *args): self._apply_attr("aiSpecular", self.ai_specular) def apply_ai_sss(self, *args): self._apply_attr("aiSss", self.ai_sss) def apply_ai_indirect(self, *args): self._apply_attr("aiIndirect", self.ai_indirect) def apply_ai_volume(self, *args): self._apply_attr("aiVolume", self.ai_volume) def apply_max_bounces(self, *args): value = cmds.intField(self.max_bounces, q=True, v=True) lights = self._get_selected_arnold_lights() 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(f"{light}.aiMaxBounces", value) print(f"Applied Max Bounces to {light}") except Exception as e: cmds.warning(f"Failed to set Max Bounces on {light}: {e}") cmds.inViewMessage(amg=f"Max Bounces applied to {len(lights)} light(s)", pos="midCenter", fade=True) def apply_aov_group_name(self, *args): selection = cmds.ls(sl=True, long=True) if not selection: cmds.confirmDialog(title="Light Group Setup", message="Nothing was selected.", button="Ok", icon="warning") return prefix = cmds.textField(self.prefix_field, q=True, tx=True) failed_lights = [] if not cmds.objExists("defaultArnoldRenderOptions"): cmds.warning("Render Settings not initialised. Initialising...") createOptions() for light in selection: shapes = cmds.listRelatives(light, shapes=True, fullPath=True) or [] for shape in shapes: try: mel.eval(f'setAttr -type "string" {shape}.aiAov "{prefix}"') except RuntimeError: cmds.warning(f"Light not supported for Arnold AOVs: {shape}") failed_lights.append(shape) aov_interface = aovs.AOVInterface() if not cmds.objExists("aiAOV_RGBA"): aov_interface.addAOV("RGBA", aovType="rgba") cmds.setAttr("aiAOV_RGBA.lightGroups", 1) message = "Updated aiAOV_RGBA\n" if failed_lights: message += "\nThese lights could not be setup:\n" for light in failed_lights: message += f"{light}\n" cmds.confirmDialog(title="Confirm", message=message, button="Confirm", icon="information") print("Updated aiAOV_RGBA") # 启动工具 if __name__ == "__main__": ArnoldLightAOVTool() ``` --- ## ✅ 优化说明: - **结构清晰**:使用 `frameLayout` 包裹功能区; - **复用性强**:通过 `_apply_attr` 减少重复代码; - **英文标签**:所有 UI 元素使用英文; - **模块化**:将灯光属性和 AOV 设置分开为两个面板; - **兼容性好**:错误处理完善,提示清晰; - **可扩展性强**:未来添加新属性只需一行代码。 --- ## ✅
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值