2011年10月18日火曜日

【習作】ラジオボタン

ドキュメント全体のテキストフレーム処理をラジオボタンにしてみた。



var d_Obj=app.dialogs.add({name:"テキストフレーム処理"});
var d_Column=d_Obj.dialogColumns.add();
var rbg=d_Column.radiobuttonGroups.add();
rbg.radiobuttonControls.add({staticLabel:"テキストをBlackに"});
rbg.radiobuttonControls.add({staticLabel:"テキストを正体に"});
rbg.radiobuttonControls.add({staticLabel:"フレームをフィット"});
rbg.radiobuttonControls.add({staticLabel:"テキストBlack&正体に"});
rbg.radiobuttonControls.add({staticLabel:"テキストBlack&フレームフィット"});
rbg.radiobuttonControls.add({staticLabel:"テキスト正体&フレームフィット"});
rbg.radiobuttonControls.add({staticLabel:"全て処理",checkState:false});
d_Obj.show();

var inObj = app.activeDocument;
for(var i=0 ; i<inObj.allPageItems.length; i++) {
if(inObj.allPageItems[i].constructor.name =="TextFrame") {
switch(rbg.selectedButton) {
case 0 : inObj.allPageItems[i].parentStory.fillColor="Black"; break ;
case 1 : inObj.allPageItems[i].parentStory.horizontalScale=100;
inObj.allPageItems[i].parentStory.verticalScale=100; break ;
case 2 : inObj.allPageItems[i].fit(FitOptions.FRAME_TO_CONTENT); break ;
case 3 : inObj.allPageItems[i].parentStory.fillColor="Black";
inObj.allPageItems[i].parentStory.horizontalScale=100;
inObj.allPageItems[i].parentStory.verticalScale=100; break ;
case 4 : inObj.allPageItems[i].parentStory.fillColor="Black";
inObj.allPageItems[i].fit(FitOptions.FRAME_TO_CONTENT); break ;
case 5 : inObj.allPageItems[i].parentStory.horizontalScale=100;
inObj.allPageItems[i].parentStory.verticalScale=100;
inObj.allPageItems[i].fit(FitOptions.FRAME_TO_CONTENT); break ;
case 6 : inObj.allPageItems[i].parentStory.fillColor="Black";
inObj.allPageItems[i].parentStory.horizontalScale=100;
inObj.allPageItems[i].parentStory.verticalScale=100;
inObj.allPageItems[i].fit(FitOptions.FRAME_TO_CONTENT); break ;
default : break ;
}
}
}


で、選択アイテムだけを処理するとなると結構ムズイ。
カネムーさんのpageItemsとallPageItemsをパクらせていただきました。
パクっただけで読み解けてません(^^;

var d_Obj=app.dialogs.add({name:"選択テキストフレーム処理"});
var d_Column=d_Obj.dialogColumns.add();
var rbg=d_Column.radiobuttonGroups.add();
rbg.radiobuttonControls.add({staticLabel:"テキストをBlackに"});
rbg.radiobuttonControls.add({staticLabel:"テキストを正体に"});
rbg.radiobuttonControls.add({staticLabel:"フレームをフィット"});
rbg.radiobuttonControls.add({staticLabel:"テキストBlack&正体に"});
rbg.radiobuttonControls.add({staticLabel:"テキストBlack&フレームフィット"});
rbg.radiobuttonControls.add({staticLabel:"テキスト正体&フレームフィット"});
rbg.radiobuttonControls.add({staticLabel:"全て処理",checkState:false});
d_Obj.show();

selObjs=app.activeDocument.selection;
groupLoop=function(objs){
for(var i=0; i<objs.length; i++){
var obj=objs[i].getElements()[0];
if(obj.constructor.name=="Group"){
var groupObjs=obj.pageItems;
arguments.callee(groupObjs);
}else{
if(obj.constructor.name=="TextFrame"){
switch(rbg.selectedButton) {
case 0 : obj.parentStory.fillColor="Black"; break ;
case 1 : obj.parentStory.horizontalScale=100;
obj.parentStory.verticalScale=100; break ;
case 2 : obj.fit(FitOptions.FRAME_TO_CONTENT); break ;
case 3 : obj.parentStory.fillColor="Black";
obj.parentStory.horizontalScale=100;
obj.parentStory.verticalScale=100; break ;
case 4 : obj.parentStory.fillColor="Black";
obj.fit(FitOptions.FRAME_TO_CONTENT); break ;
case 5 : obj.parentStory.horizontalScale=100;
obj.parentStory.verticalScale=100;
obj.fit(FitOptions.FRAME_TO_CONTENT); break ;
case 6 : obj.parentStory.fillColor="Black";
obj.parentStory.horizontalScale=100;
obj.parentStory.verticalScale=100;
obj.fit(FitOptions.FRAME_TO_CONTENT); break ;
default : break ;
}
}
}
}
}

groupLoop(selObjs);

2011年10月10日月曜日

【習作】テキストフレームを内容に合わせる

ドキュメント上の全てのテキストフレームがフィットします。
グループ化されたテキストフレームも含む。
var tfObj=app.activeDocument.textFrames;
for(var i=0; i<tfObj.length; i++){
tfObj[i].fit(FitOptions.FRAME_TO_CONTENT);
}

var grObj = app.activeDocument.allPageItems;
for (var i=0; i<grObj.length;i++){
var grTF = grObj[i].textFrames;
for (var j=0; j<grTF.length; j++){
grTF[j].fit(FitOptions.FRAME_TO_CONTENT);
}
}



複数選択した場合(どんな時に使うのか分かりません)
var selObj = app.activeDocument.selection;
for(var s =0 ; s<selObj.length; s++) {
if(selObj[s].constructor.name =="TextFrame") {
selObj[s].fit(FitOptions.FRAME_TO_CONTENT);
}
}

for (var i=0; i<selObj.length;i++){
var grObj=selObj[i].allPageItems;
for (var g=0; g<grObj.length; g++){
if(grObj[g].constructor.name =="TextFrame") {
grObj[g].fit(FitOptions.FRAME_TO_CONTENT);
}
}
}

太字部分を変えればいろいろできる^^ 例えば、
**Obj[*].parentStory.verticalScale = 100;
**Obj[*].parentStory.horizontalScale = 100;
にすればテキストが正体に戻せる。
**Obj[*].parentStory.fillColor = "Black";
にすればテキストがBlackに。

追記:ラジオボタンなら上記の3つ(合わせ処理で計6つ)選べたら便利^^ と思いチャレンジしたが、やり方が悪いのか知らんが、グループテキストフレームと普通のテキストフレーム処理の2つを処理することができなかった。スクリプトで出来るのだからラジオボタンを使ってもできるはずだと思ってる。

再追記:ひとつにまとめられた!
var selObj = app.activeDocument;
for(var s =0 ; s<selObj.allPageItems.length; s++) {
if(selObj.allPageItems[s].constructor.name =="TextFrame") {
selObj.allPageItems[s].fit(FitOptions.FRAME_TO_CONTENT);
}
}

2011年10月8日土曜日

過去ログ10月分のまとめ

2007年10月分(15投稿)
2008年10月分(14投稿)
2009年10月分(6投稿)
2010年10月分(9投稿)

2010年10月のはてなブックマークよりいくつか

Unicode正規化
Safely Composite「文字の濁点や半濁点などがバラバラになっているのを修正する」

ConvertX
ドラッグ&ドロップでファイルの拡張子を一括変更

画像から使用フォントを検索してくれるWEBサービス「myfonts」

Mac OS X 10.6(Snow Leopard)でIllustrator、InDesignを使う際のHelvetica問題
Mac使ってないから、この問題はすぐ忘れる。

正規表現を使ってテキストをいじる3.0

フォントの文字のGIDやUIDを確認する
winにこのようなツールがないのが残念。ちなみにGIDの説明

単位変換
おっと、こいつで思い出した。下記のwebサービスは便利^^
HTMLタグ文字実体参照(文字参照)変換ツール
文字列を数値文字参照に変換
異体字検索
CMYKをDICに変換

[ppi]ブラウザ印刷とスクリーン解像度の不思議な関係
もう一度、読み直す。

フォントインストーラー SAKURA

Tutorial_ハートのパターンを作る

DTPToolBox

まとめてマスク。

ESTKのデータブラウザでプロパティを探す

イラストレーター、InDesign の使い方 - 入門編ガイド

Everything
驚くほど早くファイル検索してくれる。お勧め^^ 以前にもblogにメモしていた気がするがもう一度。

2011年9月17日土曜日

DTPの勉強会 特別編・第2回

いや~、素ん晴らしいセミナーでした(ひたすら絶賛!

ググって人様のスクリプトをほんのちょこっと弄って参加したアチキには、非常~~に勉強になりました。特に感動したのが「総当たり」。この考え方は初心者にとって非常に勉強になりますですです。

お題のヒント2で「総あたり」の言葉を見ましたけど、(総当たりって何?)状態だったんです。ググって見つかった答え以外にやり方の知らないアチキには目からウロコ。

このやり方というか考え方はあまりwebで見かけることのなかった基本なんですね。検索でヒットするのはどうしても上級者の高度なやり方。順を追って解きほぐすこのやり方は、頭を整理して問題をひとつひとつ解いていく。初心者にとって非常に理解しやすいやり方で頭がスッキリします。

課題4は古旗さんの文章中の価格に消費税を加算する (Adobe InDesign & Illustrator CS3/CS4編)を99%流用して終えましたが、前々日あたりになって「1,000円」が「1,10円」になることに気づく。致命的な欠陥。でもどうにもならない。

セミナーでは古旗さんやり方では価格の前にインライングラフィックがあった場合、消えることを理論的に説明、かつ実演されました。ここのところをもっと詳しく聴きたかった。

というのも古旗さん方式では全差し替えなのでテキストの装飾やインラインは消える可能性がある(というより見事に消えた)とレジュメに書いてありましたが、初心者はどういう記述だからそうなるのか分からんのです。
急ぎ足で終わってしまったことが残念でならない。進め方として質問は最後にまとめてが良かったんじゃないかなぁ~。

とはいえ、足りない部分は写経で追っかけていくか。せうぞーさんの名言
絵描きになるための最初の練習が模写であるように、プログラミングの最初の練習は写経だと思う。コードを眺めてわかったような気になる人はずっと書けないままだ。よい教科書を選んでひたすら打つべし、打つべし!
この意味がやっと分かってきた。打つことによって自分がどこにいて、何をしたいのかが分かってくる。頭の中のモヤモヤが整理されてくる。手本コードを見ないで打つにはそれが必要となってくる。

課題4のレジュメにはカル姫様の書き方の他にNAOIさんのも紹介されてた。他の人の書き方を模写することも大事。その意味でkmutoさんの回答リンクが404 Not Foundなのが残念でならない。一度、blogに上げたものは消さないで欲しいなぁ~

翌日追記;twitterにて連絡いただきました。見事復活しました(バンザ~イ
@zi_chao 自分の課題回答のリンクが壊れていたのは事故です! 課題2の修正も含めて直しておきました。d.kmuto.jp/20110820.html#… #dtpstudySP2


セミナーの休憩時間、macneko_ayuさんに「お~まちさんのObject Model図の読み方教えてよ~」とお願いして家に着いたら早速blogに「オブジェクトモデルビューアってわかんないよね」がupされてました。ありがとね~^^ でもやっぱよく分かんない(^^;A

最後に主催者のあかつきさん、ありがとね~。ホントいい企画でした^^ 講師のたけうちとおるさん、ホント勉強になりました。もっとお話ししたかったんですけど、金欠のため懇親会は遠慮させていただきました<(_ _)> この企画で充実の夏が送れました^^ もっとお題を出して欲しいですw

2011年9月6日火曜日

過去ログ9月分のまとめ

2007年9月分(20投稿)
2008年9月分(8投稿)
2009年9月分(3投稿)
2010年9月分(8投稿)

2010年9月のはてなブックマークよりいくつか

JavaScript初級者から中級者になろう
 チェックしたけどまだ読んでなかったのだ(^^;

背幅換算表
 ページ数と背幅の厚さは、中綴じの時に内側に食い込む数値に近似してる。
関連:私が InDesign CS5 を勧める最大の理由

「仮想ボディの高さ」に直すスクリプト
QuarkXPress→InDesignコンバートは済んでるだろうけど、javascriptの勉強用に。

画像を綺麗に拡大するフリーソフト「SmillaEnlarger」がすごい
 無料ですから^^

ピクセルグリッドちゃん気をつけて
 Illustrator CS5から付いた「ピクセルグリッドに整合」という余計な機能

Mac・PCのトラブルやデータ復旧などのサポートもトクプレ.にお任せ!
 印刷用のトラブルデータの修復がないのが惜しい!

用紙・規格サイズ

標準案内用図記号

Mac OS Xの定期的なメンテナンス方法

続・8Q70%(+スクリーニング)
 文字だけじゃないんだよね。0.1mmの罫線、角度40°、網50%を175線で出力したらどうなるか。デザイナーは特に知って欲しい。

PDFのフォント環境
 エンコーディングが「ビルトイン」になっている場合、文字化け発生比率が高い。ビルトインになる原因が分からない。受け取っていた側だから。

効率化のヒント5
 javascriptでルビ振りが出来るんだから化学式の数字の下付きも出来るよな。

Illustratorのスポイトツールオプションはデフォルトでアピアランスがオフになっている
 忘れそうなので再度、メモ。

2011年8月30日火曜日

見えてきた自分の課題

せめてグループルビだけは自分で何とかなるだろうと、お~まちさんのInDesign Object Model CS-CS5.5を参考にやってみました。


app.findGrepPreferences = NothingEnum.nothing;
app.changeGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = "作成方法";
var inObj = app.activeDocument.findGrep();
for (var i = inObj.length - 1; i > -1; i--) {
try {
inObj[i].rubyFlag = true;
inObj[i].characters[0].rubyFlag = true;
inObj[i].characters[0].rubyType=GROUP_RUBY;
inObj[i].characters[0].rubyString = "さくせいほうほう";
;
} catch(inObj) {}
}
はい、当然のごとく動きません。
rubyType = RubyTypes.GROUP_RUBY;でなければならんみたいです。で、
inObj[i].characters[0].rubyFlag = true;
inObj[i].characters[0].rubyType=RubyTypes.GROUP_RUBY;
inObj[i].characters[0].rubyString = "さくせいほうほう";
だと「作」にグループルビが付いてしまいます。またググる。寺の「ルビについて」に辿り着きました。characters[0]が余計だったんですね。お~まちさん、ありがとうございます。でも、どうしてそうなるのか分かるような分からんような。。。
app.findGrepPreferences = NothingEnum.nothing;
app.changeGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = "作成方法";
var inObj = app.activeDocument.findGrep();
for (var i = inObj.length - 1; i > -1; i--) {
try {
inObj[i].rubyFlag = true;

//↓GROUP_RUBYにしても動く。
inObj[i].rubyType = RubyTypes.groupRuby;
inObj[i].rubyString = "さくせいほうほう";
inObj[i].rubyAlignment = RubyAlignments.rubyFullJustify;

} catch(inObj) {}
}

と、まぁ他人の褌で相撲を取る以前のレベルで課題を終えたのだが、一からやるとなるとひとつの課題さえ終わらなかったことは間違いない。数学に公式、英語に単語、基本文法。これが叩き込まれて「打つべし、打つべし!」の段階に入るのだが、それすら入っていない。Object Model図の読み方、使い方さえ分からないまま。

今まで自分がやっていたことはwebにある人様のスクリプトを眺めていただけ。しかし、それは応用問題の解であって、公式が頭の中に入っていれば、整理でき、どの公式を使っているのか分かる。入っていないと分からない。なにが公式、文法なのかさえ分かっていない、それが今の自分。自分自身の至らなさを知るにいい機会となった。と、同時に先駆者の凄さが改めて分かる。

今回の大きな収穫は公式となるサイトに出会えたことだろう。
さて、頭の中を空にしてもう一度、一からやるか、終わらないだろうけど。。。


2011年8月28日日曜日

お題3に燃料投下されて

8月18日、#dtpstudySP2にNAOIさんが燃料投下
8月20日、続けてkmutoさんが燃料投下

ひと通り課題を終えて安心しきっていたアチキは自分の大きな勘違いに気づく。
お題3って人様の作ったスクリプトを使ってはダメなんだ~。コメント欄を読むと
「ドキュメントの文字すべてを対象にして、指定した文字にルビをつける」というテーマでしょうか? ものすごく難易度が高いっすね! 宿題の想定レベルをはるかに超えてます!
kmutoさんは
「楽しく」の「楽」だけを正規表現で取り出すのはちょっとコツがある。それが後方肯定「(?=STRING)」。これで、文字列としては「楽しく」に一致するけれども「マッチした文字列」として返されるのが「楽」だけ、という挙動を実現できる。
ということは「楽チンな楽曲を選んで楽しく演奏♪」の楽しく部分にだけルビを振るというお題だったのかぁ~~~(絶叫 しかも「ドキュメントの文字すべてを対象にして、指定した文字にルビをつける」というテーマなら、もう無理、無理。古旗サイトや本を参考にしたけど全滅。
実際、選択された文字が特定の文字の場合のみルビを振るを正規表現を使って書き換えてみたけど動作しない。↓
sel = app.activeDocument.selection;
chr = sel[0].characters[0];
if (chr.contents == "楽(?=しく)" )
{
chr.rubyFlag = true;
chr.rubyString = "たの";
}

以下は失敗例のひとつ
var txtObj=app.activeDocument.selection[0];
str = "楽しく";
chr = str.charAt(0);
txtObj.contents = "楽";
txtObj.characters[0].rubyFlag = true;
txtObj.characters[0].rubyString = "たの";
//↑これだとテキストフレーム内の文字が楽(たの)に替わってしまい、他部分が削除されてしまう。裏づけ理論無しに適当に探して弄ったからどうしてそうなるのか分からない。


んで、困っていた。
NAOIさんのコメント欄を見るとカル様のライブラリのアイテムを自動で配置する(InDesign CS3~)が紹介されていた。正規表現を使ってテキストをライブラリアイテムに検索・置換するものだから、応用できそう(^^

ふむ、正規表現を使う場合は

app.findGrepPreferences = NothingEnum.nothing;

と宣言する必要があるようだ。Adobe InDesign CS4 Scripting Guideのp90にも載っている。でもどう書き換えたらいいか分からない。。。orz

そこでapp.findGrepPreferences = NothingEnum.nothing;でググる。

インライングラフィックをファイル名に置き換える

に辿り着く。

こっ、これはカル様の逆パターンなのでは。で、構文が短い^^ これは試す価値はある。
app.findGrepPreferences = NothingEnum.nothing;
app.changeGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = "~a";
var inObj = app.activeDocument.findGrep();
for (var i = inObj.length - 1; i > -1; i--) {
try {
inObj[i].contents = inObj[i].allGraphics[0].itemLink.name;
} catch(inObj) {}
}
赤字部分に検索文字、青字部分をルビ付きに置き換えた。
app.findGrepPreferences = NothingEnum.nothing;
app.changeGrepPreferences = NothingEnum.nothing;
//9/11追記:以下は正規表現が違ってました。
app.findGrepPreferences.findWhat = "楽(=?しく)";

//9/11追記:こちらが正解(^^;
app.findGrepPreferences.findWhat = "楽(?=しく)";
var inObj = app.activeDocument.findGrep();
for (var i = inObj.length - 1; i > -1; i--) {
try {
inObj[i].characters[0].rubyFlag = true;
inObj[i].characters[0].rubyString = "たの"
;
} catch(inObj) {}
}
で動いた。ヾ(〃^∇^)ノわぁい♪

でもどうしてそうなるのか分からない。分からないがこの構文は暗記するに値するものだということは分かる。かなり応用の利きそうな素敵なスクリプトです^^

ps. 余談です。楽(=?しく)をエディタの正規表現で検索すると楽しくにマッチするのはどうしてでしょう? 正規表現を正確に反映してくれるエディタを探してます。

9/11自分で気付く:正規表現が間違っていたから。。。orz 楽(=?しく)は間違い楽(?=しく)が正解。それでもJavaScriptでマッチするのはど~ゆ~理由???

8/31追記:フレーム選択で置換したい時は4行目を
var inObj = app.activeDocument.selection[0].findGrep();
にする。

さらに追記:ドキュメント全体、1つのテキストフレームの処理は上記でOKだが、複数選択された場合は[InDesign][JavaScript]【改変】テキストを正体に戻すを参考に冒頭に以下を加え
var selObj = app.activeDocument.selection;
var textFrameCount = 0 ;
for (s = 0 ; s < selObj.length ; s++) {
if (selObj[s].constructor.name =="TextFrame") {
textFrameCount ++ ;
var inObj = app.activeDocument.findGrep(); を
var inObj = selObj[s].findGrep(); に書き換える。