如何使用CEP/ExtendScript/JavaScript折叠Photoshop图层文件夹?
Photoshop 扩展折叠图层组实现方案
官方DOM没有直接暴露图层组折叠状态的操作接口,查公开DOM文档或者面板相关API都找不到对应入口,所有可用实现都要走底层动作指令调用,核心是修改图层组的layerSectionExpanded属性,以下是两种主流扩展框架可直接运行的实现:
CEP 扩展实现(兼容 CS6 至所有最新版 PS)
CEP 框架通过 Action Manager 发送指令操作,代码如下:
// 折叠单个指定图层组 function collapseLayerGroup(layerGroup) { if (layerGroup?.typename !== "LayerSet") return; const desc = new ActionDescriptor(); const ref = new ActionReference(); ref.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt")); desc.putReference(charIDToTypeID("null"), ref); const groupDesc = new ActionDescriptor(); // 传入false为折叠,改为true就是展开状态 groupDesc.putBoolean(stringIDToTypeID("layerSectionExpanded"), false); desc.putObject(charIDToTypeID("T "), charIDToTypeID("Lyr "), groupDesc); layerGroup.selected = true; executeAction(charIDToTypeID("setd"), desc, DialogModes.NO); } // 递归折叠文档内所有图层组(包含多层嵌套组) function collapseAllGroups(parent = app.activeDocument) { for (const group of parent.layerSets) { collapseLayerGroup(group); collapseAllGroups(group); } }
- 如果不想操作时改变当前选中的图层,可以在执行前先缓存当前选中的图层对象,操作完成后再恢复选中状态即可。
- 不要用模拟点击图层面板折叠箭头的方案,不同PS版本的面板UI结构差异极大,基本没有跨版本兼容性。
UXP 扩展实现(PS 2021+ 官方推荐新扩展框架)
UXP 用 batchPlay 接口实现,不需要选中图层就能直接操作,执行效率更高:
const ps = require("photoshop"); // 折叠单个指定ID的图层组 async function collapseLayerGroupUXP(layerId) { await ps.action.batchPlay([{ _obj: "set", _target: [{ _ref: "layer", _id: layerId }], to: { _obj: "layer", // 传入false为折叠,改为true就是展开状态 layerSectionExpanded: false }, _options: { dialogOptions: "dontDisplay" } }], {}); }
批量操作时先遍历文档图层树拿到所有图层组的ID,逐个调用即可,嵌套组不需要父组处于展开状态也能正常生效。
注意:如果当前文档处于文字编辑、自由变换等模态编辑状态,调用动作指令会抛出错误,正式使用时外层包一层try-catch做兜底即可。
内容的提问来源于stack exchange,提问作者Fitspade
相关产品推荐
相关产品推荐

