妈的,这是我这辈子见过的最恶心的代码。

2016-12-01 02:50:10 +08:00
 wdhwg001

最近在修图,听说 Photoshop 可以用 JavaScript 写脚本,于是就去看了看怎么写,觉得自己作为一个前端,总不能看不懂代码吧。

目标是对选中的所有图层和组里的所有图层应用一个动作…需求很简单,也很常见吧。

查了一下代码,对特定的一个图层应用一个动作是这样的:

var doc = app.activeDocument;
doc.activeLayer = doc.artLayers.getByName("背景色");
app.doAction("foo", "foo_folder");

感觉已经没什么好害怕的了。但是发现这样只能选一个图层或者一个组,颇为不方便,要知道 PhotoShop 是可以同时选中多个图层的,而文档里也没有说明这个功能…

于是,在继续找下去的过程中,我看到了这玩意。

function getSelectedLayersIdx() {
  var selectedLayers = new Array;
  var ref = new ActionReference();
  ref.putEnumerated(charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
  var desc = executeActionGet(ref);
  if (desc.hasKey(stringIDToTypeID('targetLayers'))) {
    desc = desc.getList(stringIDToTypeID('targetLayers'));
    var c = desc.count
    var selectedLayers = new Array();
    for (var i = 0; i < c; i++) {
      try {
        activeDocument.backgroundLayer;
        selectedLayers.push(desc.getReference(i).getIndex());
      } catch (e) {
        selectedLayers.push(desc.getReference(i).getIndex() + 1);
      }
    }
  } else {
    var ref = new ActionReference();
    ref.putProperty(charIDToTypeID("Prpr"), charIDToTypeID("ItmI"));
    ref.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
    try {
      activeDocument.backgroundLayer;
      selectedLayers.push(executeActionGet(ref).getInteger(charIDToTypeID("ItmI")) - 1);
    } catch (e) {
      selectedLayers.push(executeActionGet(ref).getInteger(charIDToTypeID("ItmI")));
    }
    var vis = app.activeDocument.activeLayer.visible;
    if (vis == true) app.activeDocument.activeLayer.visible = false;
    var desc9 = new ActionDescriptor();
    var list9 = new ActionList();
    var ref9 = new ActionReference();
    ref9.putEnumerated(charIDToTypeID('Lyr '), charIDToTypeID('Ordn'), charIDToTypeID('Trgt'));
    list9.putReference(ref9);
    desc9.putList(charIDToTypeID('null'), list9);
    executeAction(charIDToTypeID('Shw '), desc9, DialogModes.NO);
    if (app.activeDocument.activeLayer.visible == false) selectedLayers.shift();
    app.activeDocument.activeLayer.visible = vis;
  }
  return selectedLayers;
};

………………

……………

…………

………

……

…那个,我盯着这堆玩意已经看了半个多小时了,有谁能看懂这堆玩意干了啥吗?

13669 次点击
所在节点    程序员
75 条回复
soland
2016-12-01 15:19:14 +08:00
@jason19659 哈哈哈哈
NCE
2016-12-01 15:33:02 +08:00
用到递归了吧?如果有子文件夹之类的,很全面了
wdhwg001
2016-12-01 16:35:52 +08:00
@zongwan 这个文档里不包括对各种 ID 对应了什么的解读,之前也查过了,找到了 StringID 之后可以猜出来一些…

@mazyi 这文档我看过了…

感谢帮助,已经知道这代码基本是做了什么了…它好像是将选中的所有图层进行分组,选择分组里的所有图层,然后撤销分组…大概这样,虽然依旧搞不懂里面一些地方为毛要 try catch …
alqaz
2016-12-01 16:41:35 +08:00
@kaifeii 顺便解决热更问题(O_O)?
innoink
2016-12-01 18:00:40 +08:00
那些史前流传下来不知道改了几遍的 C 代码才叫一个恶心
loveuqian
2016-12-01 18:15:52 +08:00
谁把 oc 那个 if 判断的图贴一下
gouchaoer
2016-12-01 18:19:32 +08:00
缺乏类型的脚本语言就这样咯
holy_sin
2016-12-01 18:45:27 +08:00
最起码还有代码缩进啊
muyege
2016-12-01 19:47:06 +08:00
这辈子还长,别这么诅咒自己
znoodl
2016-12-01 22:02:18 +08:00
见过几百行代码很多 if ,中间是缩进几十行的 tab ,代码像一条龙,那感觉。。。
yangff
2016-12-01 22:17:06 +08:00
嘻嘻,比起 jazz 好多了
zhuangzhuang1988
2016-12-01 22:18:38 +08:00
去 看下 matlab 代码比这些短
看一星期都不一定看得懂
huntzhan
2016-12-02 00:02:23 +08:00
你对恶心一无所知(跑
thedarkside
2016-12-02 09:28:55 +08:00
没有那么难懂吧~
DingSoung
2016-12-02 20:18:38 +08:00
你都用自动生成代码了 那代码还有可读性么

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/324464

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX