Skip to main content
fukuoka00000
Participating Frequently
10月 10, 2024 2:14 午前 UTC
解決済み

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

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

●mac os Monterey

●Illustrator2023

このトピックへの返信は締め切られました。
Ten A
Ten A解決!
Community Expert
10月 10, 2024 7:41 午前 UTC

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

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


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

返信数 13

Ten A
Community Expert
Community Expert
10月 10, 2024 2:55 午前 UTC

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

翻訳
fukuoka00000
fukuoka00000作成者
Participating Frequently
10月 10, 2024 3:08 午前 UTC

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

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

翻訳
monokano
Community Expert
Community Expert
10月 10, 2024 2:36 午前 UTC

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

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

翻訳
fukuoka00000
fukuoka00000作成者
Participating Frequently
10月 10, 2024 2:40 午前 UTC

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

↓文字ツール(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
10月 10, 2024 3:26 午前 UTC

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

 

翻訳