親の親フレームの選び方

[9256]親の親フレームの選び方 投稿者:az 投稿日:2017/06/03 11:21:02
CC2015です。
配置ピクトを右に2.5mm移動させたいのですが
インラインになってるものが混じっていてエラーが出ます。
親のテキストフレームを動かすにはどう指示すればいいのでしょうか。
現状はこれです。よろしくお願いします。

var my_doc = app.activeDocument;
var my_image = my_doc.allGraphics;

for (var i = (my_image.length - 1); i >= 0; i--) {
var tmp_name = my_image[i].itemLink.name;
if (tmp_name.match( /^pict.+.eps/)) {
try{
my_image[i].parent.move("by",[2.5,0]);
}
catch(e) {
}
}
}
[9257]Re: 親の親フレームの選び方 投稿者:uske_S 投稿日:2017/06/03 13:46:11
azさん、こんにちは。
ひとつ確認させてください。
インラインのオブジェクトの場合は、オブジェクトそれ自体ではなく、
配置されている親のテキストフレームを移動する、
ということなのですね?
また、移動させるオブジェクトは「pict」で始まる、拡張子「.eps
であることが条件ということですね?

var my_doc = app.activeDocument;
var my_image = my_doc.allGraphics;
for (var i=0; i<my_image.length; i++){
var tmp_name = my_image[i].itemLink.name;
if (/^pict.+\.eps$/.test(tmp_name)){
if (my_image[i].parent.parent.constructor.name !== "Character"){
my_image[i].parent.move("by",[2.5,0]);
}
else {
my_image[i].parent.parent.parentTextFrames[0].move("by",[2.5,0]);
}
}
}

こんな感じになりました。
単純にtmp_nameが正規表現とマッチするかだけの比較であればtestメソッドで十分と思います。
正規表現も、拡張子だけを特定するのであれば「\.eps$」として、
「.」をエスケープする
「$」をつけて文末を指定する
まで絞り込んだほうがより安全だと思います。
正規表現「^pict.+.eps」だと、例えば「pict_beeps.psd」とか、
間にepsという文字列さえれば構わないので全然違うものもヒットします。

で、本題の親のテキストフレームですが、これは力業?です。
アンカーとして挿入されているgraphicオブジェクトのparent(Rectangle)の
parentがCharacterオブジェクトになるので、
さらにそこからparentTextFrames[0]として親のテキストフレームを特定します。
なんかもっとうまい方法があると思うのですが、ぱっと思いついた方法がこれでした(^^;
parentTextFramesプロパティ自体はCS5からの実装ですので、
過去のバージョンへの対応は別の方法が必要になります。
(parentを辿ってconstructor.name === "TextFrame"を探す?)

今回はある程度状況が限定できたのでtry・catch構文は見送りましたが、
もしエラーで止まるようならば書き加えるなりしていただければと思います。
[9258]Re: 親の親フレームの選び方 投稿者:az 投稿日:2017/06/03 21:52:32
uske_Sさん、希望通りに動きました! ありがとうございます。
正規表現も勉強になりました。

一つお聞きしたいことがあります。
"ピクト"とカタカナから始まるリンクファイルもあるのですが
うまいことヒットしません。日本語ファイル名はダメなのでしょうか。
[9259]Re: 親の親フレームの選び方 投稿者:uske_S 投稿日:2017/06/06 12:36:24
azさん、こんにちは。
日本語ファイル名がだめ、ということはありませんが、
ファイルシステムの都合で、濁点・半濁点は何かと面倒になります。
参考:
http://tama-san.com/combining_character_sequence/

今回のケースでは、仮に下記のようにすればどうでしょうか。
var my_doc = app.activeDocument;
var my_image = my_doc.allGraphics;
for (var i=0; i<my_image.length; i++){
var tmp_name = decodeURI(my_image[i].itemLink.name);
if (/^(pict|ピクト).+\.eps$/.test(tmp_name)){
if (my_image[i].parent.parent.constructor.name !== "Character"){
my_image[i].parent.move("by",[2.5,0]);
}
else {
my_image[i].parent.parent.parentTextFrames[0].move("by",[2.5,0]);
}
}
}

変更点は
var tmp_name = decodeURI(my_image[i].itemLink.name);
if (/^(pict|ピクト).+\.eps$/.test(tmp_name)){
の部分です。
decodeURIメソッドを使って取得した文字列をデコードします。
こうすれば「ピクト」で始まるファイルもヒットすると思います。
[9260]Re: 親の親フレームの選び方 投稿者:az 投稿日:2017/06/09 20:46:30
uske_Sさん、遅くなってすみません。ばっちり動きました。
解説とてもありがたいです。感謝します。
この記事の書き込み元へのリンク (コメントや質問などはこちらへどうぞ)