前スレッド(http://www.dtptemple.org/imgbbs/index.php?mode=thread&id=21011&page=1)
スクリプトが完成しました。助言あっての完成です。
ありがとうございます!
ぶちぶちに切れたテキストを全選択してスクリプトを走らせる事で、選択した範囲の高さと幅を計算してテキストフレーム作成し、スタイルを維持したままフレーム内にテキストを流し込む。
app.executeMenuCommand('releaseMask');
app.executeMenuCommand('ungroup');
DOC = activeDocument;
SEL = DOC.selection;
RCT = SEL[0].visibleBounds;
x1 = RCT[0];
y1 = RCT[1];
x2 = RCT[2];
y2 = RCT[3];
for ( N=1 ; N<SEL.length ; N++ ) {
BND = SEL[N].visibleBounds;
if ( BND[0] < x1 ) x1 = BND[0] ;
if ( BND[1] > y1 ) y1 = BND[1] ;
if ( BND[2] > x2 ) x2 = BND[2] ;
if ( BND[3] < y2 ) y2 = BND[3] ;
}
RCT[0] = x1 ;
RCT[1] = y1 ;
RCT[2] = x2 ;
RCT[3] = y2 ;
W = x2 - x1 ;
H = y2 - y1 ;
Xa = RCT[0] ;
//テキストフレームを作成
var rectRef = DOC.pathItems.rectangle(RCT[3], RCT[0], W, H);
var areaTextRef = DOC.textFrames.areaText(rectRef,TextOrientation.HORIZONTAL,undefined,false);
areaTextRef.contents = "";
//テキストを格納
for (var i=0; i < SEL.length; i++){
SEL[i].textRange.move(areaTextRef, ElementPlacement.PLACEATBEGINNING);
SEL[i].remove();
SEL[i] = areaTextRef;
}
doc.selection = sel;
[21027] 柴犬 (2022/12/02 Fri 13:33)
illustrator CC2022にてぶちぶちに切れたテキスト群をまとめてコピーし、新しく作成したテキストフレームに入れ込むスクリプトを開発中なのですがコピーしたもののペーストとするとテキストフレームの外に貼り付けてしまいます。
doc = activeDocument;
sel = doc.selection;
var CoPa = app.copy();
var rectRef = doc.pathItems.rectangle(0, 0, 100, 100);
var areaTextRef = doc.textFrames.areaText(rectRef);
areaTextRef.selected = true;
areaTextRef.contents = app.paste();
app.copy(); を使う場合には app.paste(); としてみたのですが、こうするとテキストフレームの外側に貼り付けてしまいました。
この場合にはpasteとは違う方法があるのでしょうか?
ご教授願います…!
[21011] 柴犬 (2022/11/25 Fri 15:04)
ぶちぶちをコピペでつなげるには未選択状態ではなくテキストのどこか選択されているか挿入点が立っているかの状態でないといけないので、
areaTextRef.selected = true;
ではなく
areaTextRef.textRange.select();
とします。
…でもだめでした orz
あれ……
[21013] (z-) (2022/11/28 Mon 12:32)
> ぶちぶちをコピペでつなげるには未選択状態ではなくテキストのどこか選択されているか挿入点が立っているかの状態でないといけないので、
> areaTextRef.selected = true;
> ではなく
> areaTextRef.textRange.select();
> とします。
>
//検証しやすいように文字をcopyからcutにしました
//テキストフレームを作成してからテキストエリアに変換しました
//ダミーテキスト「hogehoge」加えてます
var CoPa = app.cut(SEL);
var rectRef = doc.pathItems.rectangle(0, 0, 100, 100);
var areaTextRef = doc.textFrames.areaText(rectRef,TextOrientation.HORIZONTAL,undefined,false);
areaTextRef.contents = "hogehoge"
areaTextRef.selected = true;
areaTextRef.textRange.select();
app.paste();
テキストフレームを選択しないと中身が選択出来ないようなので、z-さんのアドバイスにそって「textRange」の一文を加えた上で選択も入れています。これで「paste();」する直前までは中身の文字を選択状態にできているのが確認できましたが…
この状態で「paste();」「app.executeMenuCommand("paste");
」「command+V」と三種試してみましたがフレーム外へペーストしてしまいます。これはもしや根本的にやり方を考え直す必要がある、かも?
[21015] 柴犬 (2022/11/28 Mon 14:18)
添付画像間違えました
現状だと画像の通り文字だけが選択されていて、
フレームが選択されていない?のような妙な感じです。
------追記--------
//areaTextRef.selected = true;
areaTextRef.textRange.select();
※「areaTextRef.selected = true;」は消しています!
(あっても意味のない一文でした……)
[21016] 柴犬 (2022/11/28 Mon 14:29)
現状画像です。もはやスレッドがぶちぶちしていてすみません…!
[21017] 柴犬 (2022/11/28 Mon 14:32)
コピーペーストじゃなくてtextRangeのメソッドのmoveかduplicateを使いましょう
[21018] 教授 (2022/11/28 Mon 16:38)
> コピーペーストじゃなくてtextRangeのメソッドのmoveかduplicateを使いましょう
「textRange」を知ったばかりなので使い方に自信がないのですが、「Illustrator スクリプト作成ガイド」より参照して下記のように記述してみました
var rectRef = doc.pathItems.rectangle(0, 0, 100, 100);
var areaTextRef = DOC.textFrames.areaText(rectRef,TextOrientation.HORIZONTAL,undefined,false);
sel.textRange.move(areaTextRef,ElementPlacement.PLACEATBEGINNING);
テキストがなにもないテキストフレームは作成されましたが、文字の移動が出来ませんでした…。
「textRange.move」や「textRange.duplicate」を使う時には選択したテキストを一度グループ化などが必要でしょうか?
for (var i=0; i < sel.length; i++){
var areaTextRef = doc.textFrames.areaText(rectRef,TextOrientation.HORIZONTAL,undefined,false);
sel.textRange.duplicate(areaTextRef,ElementPlacement.PLACEATBEGINNING);
sel[i].textRange.move(tFrame, ElementPlacement.PLACEATBEGINNING);
sel[i].remove();
sel[i] = tFrame;
}
選択を複数と指定した場合も試してみたのですが同様に変化はなく…
script自体の理解が足りず、訂正箇所が具体的に掴めず申し訳ありません…!
[21019] 柴犬 (2022/11/28 Mon 19:03)
> コピーペーストじゃなくてtextRangeのメソッドのmoveかduplicateを使いましょう
少し方向性を変えてみましたが、こちらだとニュアンスは合っているかと思いますが途切れ途切れのポイントテキストを拾えず…。
var DOC = activeDocument;
var SEL = DOC.selection;
for (var i=0; i < SEL.length; i++){
// if(SEL[i].kind == TextType.POINTTEXT || SEL[i].kind == TextType.PATHTEXT){
var cLayer = SEL[i].layer;
var rect = cLayer.pathItems.rectangle(SEL[i].top, SEL[i].left, SEL[i].width, SEL[i].height);
var tFrame = cLayer.textFrames.areaText(rect);
SEL[i].textRange.move(tFrame, ElementPlacement.PLACEATEND);
SEL[i].remove();
SEL[i] = tFrame;
// }
}
DOC.selection = SEL;
[21020] 柴犬 (2022/11/29 Tue 09:54)
> > コピーペーストじゃなくてtextRangeのメソッドのmoveかduplicateを使いましょう
> var tFrame = cLayer.textFrames.areaText(rect);
> SEL[i].textRange.move(tFrame, ElementPlacement.PLACEATEND);
move先もtextRangeじゃないといけないのでは
[21021] (z-) (2022/11/29 Tue 13:13)
> > > コピーペーストじゃなくてtextRangeのメソッドのmoveかduplicateを使いましょう
>
> > var tFrame = cLayer.textFrames.areaText(rect);
> > SEL[i].textRange.move(tFrame, ElementPlacement.PLACEATEND);
>
> move先もtextRangeじゃないといけないのでは
areaTextをtextRangeとして選択させるには
var tFrame = cLayer.textFrames.areaText(rect);
var tFrameRan = tFrame.textRange
tFrame.contents = "hoge"
SEL[i].textRange.move(tFrame, ElementPlacement.PLACEATEND);
ダミーテキストをテキストエリア内に入れてもtextRangeとして認識してくれない…?どうして…。
[21025] 柴犬 (2022/11/30 Wed 09:33)
var rectRef = DOC.pathItems.rectangle(0, 0, 100, 100);
var areaTextRef = DOC.textFrames.areaText(rectRef,TextOrientation.HORIZONTAL,undefined,false);
//var TextFraRan = areaTextRef.textFrames.textRange;
areaTextRef.contents = "テキストエリア"
SEL.textRange.move(TextFraRan, ElementPlacement.PLACEATBEGINNING);
//DOC.textFrames.textRange.areaText(rectRef,TextOrientation.HORIZONTAL,undefined,false);
作成したパスをテキストエリアに変換する記述内に「textRange」を加えるとエリアテキストに変換出来なくなり、
//var TextFraRan = areaTextRef.textFrames.textRange;
この一行を追加することでcontentsが無効になります
textRangeについて Illustrator Scripting Guide(https://ai-scripting.docsforadobe.dev/jsobjref/TextRange.html
)を参考にしていますが、応用の仕方がわからず手探りで動かしている状態です。
違う。違う。そうじゃない。となる部分も多いかと思いますがもうすこしお知恵を頂けないでしょうか……。
[21026] 柴犬 (2022/11/30 Wed 10:46)
くだらない物に金をかけた者は懺悔を正規の絵馬に書くべき。
[21023] 川崎浩志 (2022/11/29 Tue 17:00)
> くだらない物に金をかけた者は懺悔を正規の絵馬に書くべき。
くだらない感傷ポエムやめてください
気持ち悪いです
[21024] _ (2022/11/29 Tue 18:45)
やはり浅野さんがいなくなって以来、くだらない物に金をかけるとゴミが増えた。そんな状態では仕事どころじゃない。
[20955] 川崎浩志 (2022/11/16 Wed 16:08)
> やはり浅野さんがいなくなって以来、くだらない物に金をかけるとゴミが増えた。そんな状態では仕事どころじゃない。
[21000] い (2022/11/21 Mon 14:01)
2000年代後半、くだらない物を買う人が良ければ工事をほったらかす姿勢だった。やはり傷んだ設備を解体して欲しい。
[20991] 川崎浩志 (2022/11/21 Mon 07:26)
> 2000年代後半、くだらない物を買う人が良ければ工事をほったらかす姿勢だった。やはり傷んだ設備を解体して欲しい。
[20999] い (2022/11/21 Mon 14:01)
2000年代後半に狂った分は傷んだ設備を解体すれば良い。
[20989] 川崎浩志 (2022/11/20 Sun 19:19)
> 2000年代後半に狂った分は傷んだ設備を解体すれば良い。
[20998] か (2022/11/21 Mon 14:00)