这段代码用于Photoshop脚本,目的是切换智能对象中的特定图层可见性。代码逻辑基本正确,但存在一些可以改进的地方: 1. 当前代码在每次找到智能对象后都会尝试打开并编辑内容,即使目标图层不在当前智能对象中,建议优化为先检查再打开 2. 代码没有处理多个同名图层的情况 3. 缺少对activeDocument的非空检查 以下是优化后的版本: ```javascript var LayerKind = { ARTOBJECT: 12 }; function toggleSmartObjectLayer() { var targetLayerName = prompt("请输入目标图层名称:"); if (!targetLayerName) { alert("未输入有效的图层名称!"); return; } // 检查是否有打开的文档 if (app.documents.length === 0) { alert("请先打开一个文档!"); return; } var doc = app.activeDocument; var found = false; for (var i = 0; i < doc.layers.length; i++) { var smartObj = doc.layers[i]; if (smartObj.kind === LayerKind.ARTOBJECT && containsTargetLayer(smartObj, targetLayerName)) { try { smartObj.editContents(); var contents = app.activeDocument; var targetLayer = contents.layers.getByName(targetLayerName); targetLayer.visible = true; hideOtherLayers(contents, targetLayer); contents.close(SaveOptions.SAVECHANGES); found = true; } catch (error) { handleEditError(smartObj, error); } } } if (!found) { alert("未找到包含目标图层的智能对象!"); } } // 辅助函数:检查智能对象是否包含目标图层 function containsTargetLayer(smartObj, targetName) { try { var contents = smartObj.layerSets[0].layers; for (var i = 0; i < contents.length; i++) { if (contents[i].name === targetName) return true; } return false; } catch (e) { return false; } } // 辅助函数:隐藏其他图层 function hideOtherLayers(doc, targetLayer) { doc.layers.forEach(function(layer) { layer.visible = (layer === targetLayer); }); } // 错误处理函数 function handleEditError(smartObj, error) { if (error.message.includes("editContents")) { alert("在智能对象 " + smartObj.name + " 中无法编辑内容,请检查软件版本或对象状态。"); } else { alert("在智能对象 " + smartObj.name + " 中编辑内容时出现未知错误:" + error.message); } } ``` 额外需要注意的逻辑点: - 在处理多个智能对象时,考虑使用更高效的方式查找目标图层 - 对用户输入的图层名称进行合法性验证 - 考虑添加撤销功能,以便用户可以在操作后恢复原状 [2025-02-27 17:48:28 | AI写代码神器 | 650点数解答]