Photoshopでレイヤー名を置換するJSX


仕事なり趣味なりでPhotoshopをいじることはあるんですが、時々したくなるのがレイヤー名の置換。標準の機能でそれくらいできればいいのに…と思いますが、無いようですし、拡張機能を使えば自作できるので作りました。

本当は所謂テキストエディタみたいなウィンドウの出し方がわかればよかったんですが、JavaScriptのpromptで入力させてごまかしてます。

JSXファイルの配置場所は、Windows7でCS5(64bit)の標準だと

C:\Program Files\Adobe\Adobe Photoshop CS5 (64 Bit)\Presets\Scripts

ですかね。

コードはこちら。

Win7+CS5,CS6での動作は一応確認しましたが、誤動作による責任は負えませんので試してからお使いください。

使い方は、Photoshopで何かしらPSDファイルを開いている時に、スクリプト→このJSXで実行して、

  1. 検索文字列を入力→Enter
  2. 置換する文字を入力→Enter

で置換されます。

ウィンドウの出し方がわかったらアップデートしたいです。

追記@2012/07/20

ウィンドウの出し方がわかったのでアップデートしました。Gistの元データを書き換えるとこちらのも変わるんですね…。

追記@2016/03/31

不具合修正とアップデートを行いました。

2次元Vectorの初期値設定


1次元Vectorの書き方は覚えたけど、2次元Vectorに初期値を入れたい時ってどうするんだろ?って思ったのでメモ。

以下のようにすればできる。

var vec2:Vector.<Vector.<int>> = new <Vector.<int>>[new <int>[0, 1, 1], new <int>[1, 0, 0]];

少し見やすくすると、

var vec2:Vector.<Vector.<int>> = new <Vector.<int>>[
    new <int>[0, 1, 1],
    new <int>[1, 0, 0]
];

こう。

CS5からの書き方で、CS4以前では違う書き方をすることになります。

全部にnew <int>を書く、というのと、最初のnew <Vector.<int>>がハマりどころでした。考えて見れば、確かにそうですねという所。流石に3次元Vectorまではやりたくない感じがしますね。

参考:FN0902001 – Vectorクラス – Flash : テクニカルノート

AS3のTimerのズレ


AS3でタイマーを使ったとき、処理が重いとズレる場合がある、というのは時々言われているみたいです。しかし、全然重くない処理でももともとズレるようになっているようです。

回数をTimerで設定することができるんですが、これが回数が増えると、大きくズレる。

今までずっと、

var timer1:Timer = new Timer(1000, 1);

var timer2:Timer = new Timer(50, 20);

は同じ時間にTIMER_COMPLETEを吐くとばかり思っていたんですが、
実はやってみると、0.5秒くらいtimer2の方が遅い。1秒で0.5秒ずれる、っていうのは相当な誤差です。誤差と言える範囲ではないです。

タイマーをフレーム間隔に近づけると、誤差は少なくなっていく気がしますが、絶対そう!というわけでもないみたいです。あと、回数を増やせば増やすほどずれる、というわけでもない。

0.05秒というのが、30fpsで1フレームあたりの秒数(≒0.033)にちょうど合いにくいのかもしれません。時間ごとに処理したい場合は、Timerを使うよりも、ENTER_FRAMEでgetTimerした方がよいのかもしれません。

Timerのズレ実験 – wonderfl build flash online

ライブラリの選択中のアイテムをフレームに配分するJSFL


Flashで数字入りの画像をタイムラインに並べたい時に、一気に並べられたら便利だなーと思って作ってみた。

正確にはどっかにあるかなーと思って探してみたら、Kayacのブログが出てきたけれど、ファイルをDLできなかったので作ってみたという感じです。

/**
 * 選択中のアイテムをフレームに分配
 */
var _doc = fl.getDocumentDOM();
var _timeline = _doc.getTimeline();
var _lib = _doc.library;

function main(){
     fl.outputPanel.clear();

     var selectedItems = _lib.getSelectedItems();
     var numItem = selectedItems.length;

     if(numItem == 0){
          fl.trace('何も選択されていません');
     }
     else{
          _timeline.convertToKeyframes(0, numItem);
          fl.trace(numItem);
          for(var i = 0; i < numItem; i++){
               var item = selectedItems[i];
               var name = item.name;
               name.match(/[0-9]+/g);
               var num = parseInt(RegExp.lastMatch);
               if(selectedItems.length == 10 && num == 0){
                    num = 10;
               }
               setNumFrame(item, num);
          }
          fl.trace("処理が完了しました");
     }
}

/**
 * 指定したフレームに配置
 */
function setNumFrame(item, frame){
     _timeline.currentFrame = frame - 1;
     _doc.addItem({x:0, y:0},item);
     _doc.selectNone();
     _doc.selectAll();
     var elem = _doc.selection[0];
     var mat = elem.matrix;
     mat.tx = 0;
     mat.ty = 0;
     elem.matrix = mat;
}

main();

使い方

  1. 空のムービークリップを作成、編集モードに入る
  2. ライブラリのアイテムを選択(ライブラリアイテムは数値があるものとする)
  3. コマンドを実行

数値がフレーム番号になります。中を見れば分かるかと思いますが、0~9の時のみ、0番は10フレーム目に置きます(数値を画像にしたとき用)。数字のないものはうまく配置できません。

上をコピペすれば動くと思いますが一応ファイル

使用の際はバックアップなど行ったほうが良いかと思います。あんまり多いとフリーズするかもしれません。50程度は問題なく動きました。(WinXP+CS5で確認)

参考

TitaniumMobile勉強中


最近はFlashもやってはいるんですが、スマートフォンアプリの方に興味が移りつつあります。もちろん、Flashでも作れるんですが、Flashだったらまあ何とか今までの知識を使えるだろうということで、そうではない方法を試しています。今のところやってるのは、JavaとTitaniumMobileです。

JavaはAndroidの方だけなんですが、TitaniumMobileではiOSでもAndroidでも両方書き出せます。また、開発言語がJavaScriptなので、Web系プログラマには取っ付きやすい感じになってると思います。

ただ、このTitaniumMobile、結構癖があるみたいで、同じソースでAndroidアプリもiPhoneアプリもどっちもさくさく作れるぜーとは行かない様子。

というわけで、まだ完成したアプリなど1つもないのですが、詰まった(ている)ところを少しばかりまとめてみる。

試したのはTitaniumMobile1.6.2+TitaniumStudio(Preview)です。

続きを読む TitaniumMobile勉強中