リンクをクリップボードにコピー
コピー完了
タイトル通りですが、Illustratorスクリプト(.jsx)でルビを作成するスクリプトを作成しましたが、テキストプレームを選択してスクリプ実行できますが、文字ツール(TextRange)で部分選択でスクリプト実行がどうしてもできません。選択していないことになってしまします。
文字ツール(TextRange)で部分選択でスクリプト実行できるようにすにはどうすればよいですか?コード教えてください。
現在のPC環境
●mac os Monterey
●Illustrator2023
リンクをクリップボードにコピー
コピー完了
むしろ、あなたが「必要最小限のシンプルなコード」を書いて見せる必要がありますよ。
そうすることで、そのコードのどこに改善点があるのかを第三者がはじめて指摘できます。
リンクをクリップボードにコピー
コピー完了
すみません、コードを入れるのわすれてました。
↓文字ツール(TextRange)で部分選択です。
var textFrame = null;
var selectedText = null;
if (selection[0] && selection[0].typename === "TextFrame") {
textFrame = selection[0];
selectedText = textFrame.textRange;
} else if (selection[0] && selection[0].typename === "TextRange") {
selectedText = selection[0];
try {
textFrame = selectedText.parentStory.textFrames[0];
} catch (e) {
alert("選択されたテキストの親テキストフレームが見つかりませんでした。");
return;
}
} else {
alert("選択されたオブジェクトはテキストフレームではありません。");
return;
}
リンクをクリップボードにコピー
コピー完了
1. 中身の文字を選択しているときは、selection自体がTextRangeになります(Arrayではない)。selection[0]を参照せず、直接selectionのtypenameを調べましょう。
// この部分を変更
// } else if (selection[0] && selection[0].typename === "TextRange") {
} else if (selection.typename === "TextRange") {
2. parentStoryというプロパティがありませんでした。かわりにstoryを使いましょう。
// この部分を変更
// textFrame = selectedText.parentStory.textFrames[0];
textFrame = selectedText.story.textFrames[0];
リンクをクリップボードにコピー
コピー完了
sttk3さんからもありましたが、parentStoryというプロパティ名が使用されてますね。これはInDesignでは有効ですがIllustratorにはありません。
出自はChatGTPなどでしょうか?
リンクをクリップボードにコピー
コピー完了
コメントありがとうございます。
こまかいところはchatGPTに書いてもらってます。
アドバイスのおかげで文字ツール(TextRange)でもルビが付くようになりましたが、
ルビがすべてテキストボックの左上にしかこない状態です。。。。(どこの文字を選択しても)
リンクをクリップボードにコピー
コピー完了
リンクをクリップボードにコピー
コピー完了
Ten Aさんの補足になるですが、
たとえば、変形パネルには選択オブジェクトの座標が出ます。
これは言い換えると「マウスでドラッグ移動できるもの」の座標を示しています。
長方形や直線を、ダイレクト選択ツールで一部のパスだけ選択すると表示が変わります。これはパスのアンカーポイントがそれぞれ座標のプロパティを持っているため、といえます。
【参考】直線全体を選択した状態、右上のアンカーポイントだけ選択した状態のXY座標表示の変化
対して、選択した一部の文字(textRange)にはこれがありません。
なので、textFrameの座標値から目標の文字までの、その他の文字数を、それぞれの文字サイズぶん足してって計算しないといけない、というわけです。
【おまけ】InDesignは情報パネルで選択した文字の座標を拾うことができます。すごい。べんり。
Illustratorの情報パネルはできません。パネルがアホだからではなく、前述の通り、文字がそもそも座標の情報を持たないためです。
といった情報をChatGPTのプロンプトに盛り込んでみてはいかがでしょうか。
【まとめ】
このように、自前でスクリプトを「書いた」場合と、AIに「書かせた」場合ではアドバイスの方向がだいぶ異なるため、なるべく「ChatGPTに書かせた」ことは最初に教えていただきたいのです。
リンクをクリップボードにコピー
コピー完了
アドバイスありがとうございます。
そもそもTextRange選択でルビをつけることは可能でしょうか?
web上でもみかけませんが。。。。
リンクをクリップボードにコピー
コピー完了
>そもそも
そもそも返しであれですが、なにしろルビ機能のないアプリ上のことなので、「ルビをつける」というよりは
「ルビ位置に読みがなの新規テキストオブジェクトを作成する」ということなのです。
自分もweb上で公開されているスクリプトをすべて網羅しているわけではないので、「ない」とは言えず「知らない」にとどまりますが、手段の経路としては前回の返信にある通りです。地道に計算していくほかありません。
Google検索で一番上に出てきたこちら
https://zenn.dev/inaniwaudon/articles/e7c11633685cf5
はソースコードを公開されているので覗かせてもらいましたが、文字サイズと文字数できっちり計算しているのがわかります。
リンクをクリップボードにコピー
コピー完了
やろうと思えばできます。ただし、難易度は非常に高いです。先にお伝えしたとおり親文字の位置の特定にはフレームからキャラクタまでの相対的な計算が必要になります。これをどのように取得していくのかというと、文字1つづつサイズと送り・変形率等などを総合的に勘案して位置を計算します。行揃えによっても位置は動きます。そういった計算の難易度が高い為スクリプトでやろうという人が見当たらないということです。
リンクをクリップボードにコピー
コピー完了
返信ありがとうございます。
そうですかぁ〜。このスクリプトができたらかなり便利かなと思ったんですが。。。
リンクをクリップボードにコピー
コピー完了
textRangeにはジオメトリカルな情報は含まれません。親オブジェクトから辿らないとだめですね。
リンクをクリップボードにコピー
コピー完了
アドバイスありがとうございます!
テキストだと認識してくれません。むずかしい!