はいはいどもども。続いてないけど続き。
前回はスクリプトで処理するってどういうこと、
プロパティ探せ、オーケー流星号、
という内容でした。
部品だけ並べたてたかんじ。これだけではまだ敷居が高いと思わせてしまうでしょう。
今回は実際に白紙状態から組み立ててってみます。
実用的なヤツがいいよなあ。
でも長らく実務から離れてるんだよな。
んでは、
空の図形を削除するスクリプト
を作ってみるとします。一見かんたんっぽいし。
まずは脳内または紙面または画面上に、フローチャートを作成してみましょう。(実際あまりやったことありませんが…)
プログラマー的な書式がベストでしょうけど(ぐぐりましょう)、自分がわかれば(数日後の自分がわかれば)どんな書き方でもいいでしょう。
ここで、いま思い付く限りの可能性を書き出して対処していきます。
ウチはまるっきりの初心者ではないのでここでほぼばっちりめに書けてしまいますが、それだとちょっとあれなので、わざと過去の経験を生かし、見落としまみれの穴だらけにしてあります。
せめてもうちょっとまじめに書きましょうか。
あと、フリーフォントは字間がイラッとする事が多いので気をつけましょう(使わせてもらっといてなんなんですけど…)
これを眺めた時点で、処理の流れが間違ってないか確認。
これだとうまく動かない要素が思い付く場合もありますが、実際にスクリプトを動かしてみてから吠え面かくのもアリでしょう。
ではこれを設計図として、実際にスクリプトを書いてみましょう。
※今回は不完全なソースコードがとっちらかるので、いつものkamisetoさんの置き場は使いません。
さて。いいのかこれで。ほんとにいいのか。
まず処理対象はドキュメント内すべてのページアイテムにしました(つもり)。
allPageItemsは前回まで扱ってきたコレクションオブジェクトと違い、ほぼ純粋に配列です。ただし読み取り専用です。ここから直接足したり引いたり書き換えたりはできません。これをループ処理。
allPageItemsのi番目の塗りカラー(fillColor)と線カラー(strokeColor)それぞれのnameプロパティを参照しています。
fillColorとsrtokeColorはどちらもSwatchクラスです。まーそのスウォッチ。これの名前が[なし]に一致しているかを見ているわけです。
注意点は、ベーシックなスウォッチ以外ではこの方法は万能ではないこと。ベーシックな物でも黒、白などはカラー値だけが一致していてスウォッチが適用されていない場合があるわけで。。
そんなこんなーで、塗り線とも[なし]なら、ブリッと削除。allPageItemsは読み取り専用ですが、要素のPageItemオブジェクトは削除とかできます。するとallPageItemsのlengthは1つ減ります。そして次のオブジェクトを、と順々処理。全部やったら挨拶して終了。
という内容ですが。
まあ、ザルですw 穴だらけ。
とりゃえず一番の問題点は、えー、前々回の図を参照。
ループ中、i = 0 のとき、アカレンジャーを削除すると残った人たちが一歩ずつ前に詰めます。
でも変数iはそんな事情なんか知りません。教えてないので。無邪気なままです。ループは淡々と繰り返され、今度は i = 1 で処理されます。
すると、アカの次にいたアオがスルーされてキレンジャーが次回の処理対象になってしまう。あらあら大変。
解決法はいくつか。
・allPageItemsをいちいち取得し直しているので、前もって代入しておいた配列変数をループ処理する
・allPageItemsを逆順(昇順 -> 降順)で処理する
・オブジェクトを削除した直後に変数iを -1 しておく
・すぐ削除せず、「あとで消す」と記憶だけしておいて、チェックのループが終わったら最後にまとめて削除する
4通りとも書いてみせるのもかさばるし紛らわしいので。1つめ+4つめの案だけ採用して書き直してみましょう。
※諸事情でそうなりましたが、実際のところ1つめ or 4つめ、どちらかだけの実装で直りますこれ。
しつこいけどフローチャートから直しておきますね。
がんばってかきました。
これをもとにスクリプトを書き直します。最後の挨拶は完全にネタなので気軽に消しました。
今度はどーでしょう。
「最後にまとめて削除する」と書きましたが、結局はまたループで、1個ずつ削除するわけですが…
削除を実行している行は、
hoge = kesuAry.shift( );
hoge.remove( );
を1行で済ませたもの、と考えてください。
これで「塗りも線も[なし]のオブジェクト」は残らず削除される事でしょう。
どうじゃ、ずんとましになったじゃろう。
これ、非表示レイヤーの中身も関係なく削除されるんですよー。すごいでしょー。
でも、レイヤーやオブジェクトそのものにロックがかかっていると削除できません。内包しているグループも同様です。
要件のアラ探しは尽きないんですが、望まぬ処理をしてくれようとしてエラーで止まるヤツは、自分使い用であれば無視してもいいかと思います。
もっとも、処理途中で止まるやつは取り消しも大変で厄介なこともあるんですが。。
さておき、ここでまた問題ですね、はい。
・非表示オブジェクトは許してあげたい(とした場合)
・ロックがかかってたら解除してから削除しないといけない
・でもレイヤーのロックは一時的に解除しても最後には元通りにしてあげたい(とした場合)
……とかですね。あのー今回はやりませんけども。特にロックはものすごくめんどくさい事になるのでやりません。今回は。
とりあえずこのへんで終わりにしたいんですけど、
気付かないフリをして進めた様々な問題を、脳内で思い付く限り晒して締めます。
・塗り&線カラーがあっても不透明度が0%だった場合は?
・回り込みオブジェクトだった場合は?
・テキストフレームだった場合は?
・画像が配置されたグラフィックフレームだった場合は?
・マスターページアイテムだったら?
・見えないボタンだったら?
・インラインオブジェクトは消せなくない?
……ぐらいですね。まだまだ出そうですけど。
以上、おそまつさまでした。
ちゃんとした人にはソースコード配置のため今回から使い出したGitHubが全然使いこなせてないのがマルバレでほんとお恥ずかしい限りですけども。
ちょっとこっち方面を覚えていかなければいけなくなってきているのでがんばります。
でーすー。
今回も素晴らしい内容をありがとうございます。
このように系統立てての解説は、JavaScriptの考え方を理解する上でとても勉強になります。慢性五月病の私にもちょっぴり道が開けました。
サンプルソースを試しに実行したのですが、「for文の閉じ括弧が無い」と怒られます。
「これはz-さんのトラップなのかー」と驚愕しましたが、しかるべき箇所に括弧を追加すると問題なく動作しました。僭越ながら一応、報告です。
これからも、「一生勉強、一生青春」(相田みつを)ですね。おおっ、まるで大人の締めだ。
>「for文の閉じ括弧が無い」
ぎゃーごめんなさい直しました。。
なんというか、わからない人のわからなさも多様なようで、
これは自分もなのですがわりと義務教育で習った事すらおぼつかないもので、
となると全員を救うような物ってちょっと無理なので、
最近の一連のやつは過去の自分に教えるつもりで書きました。
周波数の近い人しか救えないとは思うのですが、多少なりともタシになれば^