Skip to main content
fukuoka00000
Participating Frequently
October 10, 2024
Answered

Illustratorスクリプト(.jsx)でルビを作成。文字ツール(TextRange)で部分選択で実行できない。なぜ?

  • October 10, 2024
  • 2 replies
  • 1641 views

タイトル通りですが、Illustratorスクリプト(.jsx)でルビを作成するスクリプトを作成しましたが、テキストプレームを選択してスクリプ実行できますが、文字ツール(TextRange)で部分選択でスクリプト実行がどうしてもできません。選択していないことになってしまします。
文字ツール(TextRange)で部分選択でスクリプト実行できるようにすにはどうすればよいですか?コード教えてください。
現在のPC環境

●mac os Monterey

●Illustrator2023

This topic has been closed for replies.
Correct answer Ten A

アドバイスありがとうございます。

そもそもTextRange選択でルビをつけることは可能でしょうか?
web上でもみかけませんが。。。。


やろうと思えばできます。ただし、難易度は非常に高いです。先にお伝えしたとおり親文字の位置の特定にはフレームからキャラクタまでの相対的な計算が必要になります。これをどのように取得していくのかというと、文字1つづつサイズと送り・変形率等などを総合的に勘案して位置を計算します。行揃えによっても位置は動きます。そういった計算の難易度が高い為スクリプトでやろうという人が見当たらないということです。

2 replies

Ten A
Community Expert
Community Expert
October 10, 2024

textRangeにはジオメトリカルな情報は含まれません。親オブジェクトから辿らないとだめですね。

fukuoka00000
Participating Frequently
October 10, 2024

アドバイスありがとうございます!

テキストだと認識してくれません。むずかしい!

monokano
Community Expert
Community Expert
October 10, 2024

むしろ、あなたが「必要最小限のシンプルなコード」を書いて見せる必要がありますよ。

そうすることで、そのコードのどこに改善点があるのかを第三者がはじめて指摘できます。

fukuoka00000
Participating Frequently
October 10, 2024

すみません、コードを入れるのわすれてました。

↓文字ツール(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;
}

Legend
October 10, 2024

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];