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)