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

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;
};

………………

……………

…………

………

……

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

13647 次点击
所在节点    程序员
75 条回复
zwik
2016-12-01 09:28:33 +08:00
上次像写个 ps 的外挂插件,翻了几个文档,完全没有头绪,看来看出都是以 ps 内置扩展文件.8x 的形式出现的插件开发,外挂插件的说明感觉看到关键的地方,然后一下又扯得很宽泛...
最后就写了个简单的 ps js 的脚本 函数的说明能不能详细点,返回值都没有
liuxu
2016-12-01 09:29:25 +08:00
我就看到外部有个 var selectedLayers = new Array();,然后 if 里面又有一个。。
t2doo
2016-12-01 09:30:01 +08:00
这就最恶心啦,年轻人你还 too young ,看哥给你写一段。。。
zwik
2016-12-01 09:30:08 +08:00
r#21 @zwik 网上发帖求助 人家又一个劲地让你去看文档,我勒个去 我能搞掂这个文档,我闲着蛋疼去求助你们
yoke123
2016-12-01 09:43:11 +08:00
这点算什么 too young too simple ( doge 脸)
songz
2016-12-01 09:45:42 +08:00
这属于 extended script,用了 Adobe 分给 ps 的接囗,写法还是通 js 的
itqls
2016-12-01 09:50:28 +08:00
无非是循环找各种图层啥的
xiaolai123
2016-12-01 09:53:08 +08:00
还好吧 我看别人的代码感觉都知道它们在干吗
cnlongxi
2016-12-01 09:53:56 +08:00
@sagaxu 想知道是哪个项目。。
blackboom
2016-12-01 09:54:38 +08:00
@Ouyangan 我懂你,一个函数里 80%的 if else 还巨长
cppgohan
2016-12-01 09:54:48 +08:00
太年轻:)
weberCd
2016-12-01 09:55:03 +08:00
这就恶心了?那你是没看过我的代码
GOOD21
2016-12-01 09:55:47 +08:00
太年轻了 , 来我这看看一个屏幕看不完的 if,else
ihuzhou
2016-12-01 10:00:22 +08:00
真实的故事, rightSomeThing = LeftSomeThing()。。前人挖坑,后人掉坑
wjh3936
2016-12-01 10:04:12 +08:00
@sagaxu 除了 pv 和利润,我的项目跟你一样……
yangxiongguo
2016-12-01 10:04:23 +08:00
ps 不熟看这些代码就是噩梦
Garnett0328
2016-12-01 10:04:33 +08:00
楼主太年轻
jarlyyn
2016-12-01 10:04:50 +08:00
呵呵,有本事看我当年写的代码。



真的看懂的话别忘记告诉我下这些代码是干啥的-_____-
jukka
2016-12-01 10:07:41 +08:00
不算 try exception 圈复杂度才 4 的代码,哪里恶心了。
smallpath
2016-12-01 10:19:52 +08:00
ps 的标准 api 文档都找不到, ame 特么还没文档呢,楼上说操作实现细节的, ps 通篇都是类似浏览器的 dom 操作,要不暴露只能自己再造个 adobe 的 jQuery ,哦对了, Object.prototype.watch 可以截取 get set ,要不要再造个 mvvm ?

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

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

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

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

© 2021 V2EX