終了

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

New Here ,
Oct 09, 2024 Oct 09, 2024

リンクをクリップボードにコピー

コピー完了

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

●mac os Monterey

●Illustrator2023

キーワード
Mac , スクリプティング , 手順・操作方法 , 文字・フォント , 機能改善リクエスト

表示

304

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines

correct answers 1 件の正解

Community Expert , Oct 10, 2024 Oct 10, 2024

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

投票

翻訳

翻訳
Community Expert ,
Oct 09, 2024 Oct 09, 2024

リンクをクリップボードにコピー

コピー完了

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

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

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
New Here ,
Oct 09, 2024 Oct 09, 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;
}

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Oct 09, 2024 Oct 09, 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];

 

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Oct 09, 2024 Oct 09, 2024

リンクをクリップボードにコピー

コピー完了

sttk3さんからもありましたが、parentStoryというプロパティ名が使用されてますね。これはInDesignでは有効ですがIllustratorにはありません。

出自はChatGTPなどでしょうか?

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
New Here ,
Oct 09, 2024 Oct 09, 2024

リンクをクリップボードにコピー

コピー完了

コメントありがとうございます。
こまかいところはchatGPTに書いてもらってます。
アドバイスのおかげで文字ツール(TextRange)でもルビが付くようになりましたが、
ルビがすべてテキストボックの左上にしかこない状態です。。。。(どこの文字を選択しても)

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Oct 09, 2024 Oct 09, 2024

リンクをクリップボードにコピー

コピー完了

それは親オブジェクトのジオメトリ拾うからです。実際に配置する位置はそこからキャラクタオフセットを拾い上げたうえで各キャラクタのサイズや変形率、スペーシングなどを加味して移動位置を決定して配置します。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Oct 09, 2024 Oct 09, 2024

リンクをクリップボードにコピー

コピー完了

Ten Aさんの補足になるですが、  

 たとえば、変形パネルには選択オブジェクトの座標が出ます。

これは言い換えると「マウスでドラッグ移動できるもの」の座標を示しています。

長方形や直線を、ダイレクト選択ツールで一部のパスだけ選択すると表示が変わります。これはパスのアンカーポイントがそれぞれ座標のプロパティを持っているため、といえます。

 

【参考】直線全体を選択した状態、右上のアンカーポイントだけ選択した状態のXY座標表示の変化

スクリーンショット 2024-10-10 15.17.19.pngスクリーンショット 2024-10-10 15.17.40.png

 

対して、選択した一部の文字(textRange)にはこれがありません。

スクリーンショット 2024-10-10 15.20.31.png

なので、textFrameの座標値から目標の文字までの、その他の文字数を、それぞれの文字サイズぶん足してって計算しないといけない、というわけです。

 

【おまけ】InDesignは情報パネルで選択した文字の座標を拾うことができます。すごい。べんり。

スクリーンショット 2024-10-10 15.09.47.png

 

Illustratorの情報パネルはできません。パネルがアホだからではなく、前述の通り、文字がそもそも座標の情報を持たないためです。

スクリーンショット 2024-10-10 15.07.59.png

 

といった情報をChatGPTのプロンプトに盛り込んでみてはいかがでしょうか。

 

【まとめ】

このように、自前でスクリプトを「書いた」場合と、AIに「書かせた」場合ではアドバイスの方向がだいぶ異なるため、なるべく「ChatGPTに書かせた」ことは最初に教えていただきたいのです。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
New Here ,
Oct 09, 2024 Oct 09, 2024

リンクをクリップボードにコピー

コピー完了

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

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

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Oct 10, 2024 Oct 10, 2024

リンクをクリップボードにコピー

コピー完了

>そもそも

 

そもそも返しであれですが、なにしろルビ機能のないアプリ上のことなので、「ルビをつける」というよりは

「ルビ位置に読みがなの新規テキストオブジェクトを作成する」ということなのです。

 

自分もweb上で公開されているスクリプトをすべて網羅しているわけではないので、「ない」とは言えず「知らない」にとどまりますが、手段の経路としては前回の返信にある通りです。地道に計算していくほかありません。

 

Google検索で一番上に出てきたこちら

https://zenn.dev/inaniwaudon/articles/e7c11633685cf5

はソースコードを公開されているので覗かせてもらいましたが、文字サイズと文字数できっちり計算しているのがわかります。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Oct 10, 2024 Oct 10, 2024

リンクをクリップボードにコピー

コピー完了

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

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
New Here ,
Oct 10, 2024 Oct 10, 2024

リンクをクリップボードにコピー

コピー完了

最新

返信ありがとうございます。

そうですかぁ〜。このスクリプトができたらかなり便利かなと思ったんですが。。。

 

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Oct 09, 2024 Oct 09, 2024

リンクをクリップボードにコピー

コピー完了

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

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
New Here ,
Oct 09, 2024 Oct 09, 2024

リンクをクリップボードにコピー

コピー完了

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

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

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines