• ベストアンサー

イラストレーターのマクロとか(2)

以前に質問させて頂いた者です。 非常に的を得た回答を頂き、悩んでいた仕事がようやく進行できる兆しになったのですが どうやら私がしようとしてた組み立て方が間違ってたらしく 以前こちらで教えてもらった手法を利用して なんとかあと一歩の所まで来たのですが プログラミング言語が理解できず、 悩んでいます。 できれば、追記式を教えてもらえれば 半年悩んだこの仕事ともオサラバできるのですが どなたかご指導頂けないでしょうか。 -----以前の質問----- イラストレーター上で、絵画したオブジェクトを 任意のピッチで増分移動させたい。 例: ●-●--●---● ●(絵画オブジェクト) - 移動ピッチ 横一列にある規定のピッチにのっとり 指定回数分ピッチを増分して絵画する方法。 回答: 質問ページの要領を超えたので記載不可。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2103896 結果、良好で私の仕事もこれで終わったと思ってましたが 実は、とんでもない修正があり上記のプログラムでは 絵画できない事が発覚しました。 (なんとか利用してやってみようと試みましたが私の頭ではとてもできなかった) 今回の質問: ●-●-●-●-● -●-●-●-●- ●-●-●-●-● ・・・・↓・・・・・永遠と続く 上記のように、綺麗に整列してない形状です。 しかも、横方向及び下方向のピッチは増分の対象となります。 また、増分する数値は下記の約束があります。 横方向: 左右に移動するピッチは変動(増分)しないが 一段下に下がる毎に、左右のピッチが少し増えていく。 下方向: 固定の増分ピッチで増えていく あと、入れ子状態で絵画しているので それぞれの描写開始地点も指定しなければなりません。 こんな特異な質問にご回答くださる方がいらっしゃればお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • grazie
  • ベストアンサー率56% (200/355)
回答No.4

var objs = documents[0].selection; var obj=objs[0]; obj.name="original"; var mm=2.8346456;//Illustratorの内部計算はポイントで行われる。mmに変換するための数値 var increase_x=1*mm;//ヨコ方向に増分する距離 var increase_y=-1*mm;//タテ方向に増分する距離 var increase_x_1 = 0.1*mm;//一段下がると増分する距離 var increase_y_1 = -0.1*mm;//一段下がると増分する距離 var yoko_num=25;//コピーする数 var tate_num=25; var dx1 = 0;//先頭位置 var dy1 = 0; var temp=0; for(var i=0; i<=tate_num; i++){ /*******最初の図形を一段下にコピー********/ if (i!=0)//はじめは無視 { obj=documents[0].pathItems["original"]; dx=0; dy=(increase_y*i)+(increase_y_1*i); obj.duplicate(); obj.translate(dx,dy,undefined,undefined,undefined,undefined); obj.name=0; dx1 = temp+temp1/2;//先頭の移動距離 dy1 = 0; obj.translate(dx1,dy1,undefined,undefined,undefined,undefined); temp=dx1; } /********横方向にコピー********/ for(var j=1; j<=yoko_num; j++) { dx =increase_x; dy =0; obj.duplicate(); obj.translate(dx,dy,undefined,undefined,undefined,undefined); obj.name=j; } dx=0;//移動距離初期化 dy=0; var temp1=increase_x;//一段上の増分値を一時的に記憶 increase_x=increase_x+increase_x_1;//一段下がると増分する increase_y=increase_y+increase_y_1;//一段下がると増分する } /*以下は無くてもよい*/ activeDocument.selection=null;//選択解除 /* 一応、直してみました。 変数名も変更しました。 正直言って、直接会って"打ち合わせ"しないとよくわからないかも...。 ご自分で書ければ一番早いわけですけどね...。 スクリプトの勉強に関してPC歴は関係ありません。 興味があればいいだけです。 Illustratorのスクリプトの場合、結果をすぐ目で見られるのが楽しいところです。 勉強しやすいと思います。仕事の役にも立つし...。 Adobeが出してるpdfを見ながら勉強しましょう。 たぶん、インストールCDに入ってます。 それか、Adobeの本家サイトでDLできるはずです。 AIJavaScriptReference.pdf IllustratorGettingStarted.pdf IllustratorScriptingGuide.pdf */

参考URL:
http://www.openspc2.org/book/IllustratorCS/
irukacyan
質問者

お礼

なんとかできました! ありがとうございます。 これで仕事が先に進みそうです。 本当に有難うございました。

その他の回答 (4)

  • proust
  • ベストアンサー率57% (62/108)
回答No.5

スクリプトの書き方ですが #1の方が以前の質問に回答されていた通り、イラレ付属のCD-ROMの 中に解説PDFファイルがありますのでそれをご覧ください。 イラレの場合色んな言語で書くことができ、#1の方はJavaScript (ECMAScript)で書かれています。これはFlashのActionScriptと ほぼ同じようなものですので、ご経験があるならば最もなじみやすい と思います。 尚、私がやっているのはPostScriptといい、DTP用途に開発された言語 です、潜在力は高いのですが、もともとはDTPアプリが自動で 出力するような用途が想定されているため、学びやすくはないです。

参考URL:
http://www.cs.indiana.edu/docproject/programming/postscript/postscript.html
irukacyan
質問者

お礼

CD見ましたけど英語でした;; でも勉強してみせます。 ありがとうございました。

  • grazie
  • ベストアンサー率56% (200/355)
回答No.3

duplicate関数の中身を消してみてください。 obj.duplicate();

irukacyan
質問者

お礼

消したら(2つありました)動きました。 数値はまだデフォルトの数値できっちりやりたい事に対してできるのか検証していませんが 見た目の雰囲気からすると ループの回数と移動数値を入れれば 目的の事ができそうな予感です。 ありがとうございました。 イラストレーターで組める このような命令(スプリクト?)を覚えたいのですが PC暦3年ごときの一般素人では勉強できるでしょうか? 検索でイラストレーター スプリクトで調べてみましたが 検索結果の言葉だけでどのサイトを見ればいいのか チンプンカンプンな状態なのですが 何か良い書籍やHP紹介があれば是非教えてください。 ちなみに 中途半端な理解力ではありますが エクセルのVBAと、FLASHのスプリクトは見よう見真似で なんとかゲームくらいは作れるスキルがあります。 (シューティングなんかは無理ですが、フラグをたてた謎解きゲーム程度です) 何から何まで面倒かけて申し訳ないですが お時間ありましたらご紹介くださいませ。

irukacyan
質問者

補足

うううう・・・・ 非常に申し上げにくい内容なのですが、怒らないで聞いてください。 私の書き方が非常に悪かったので申し訳ないのですが スプリクト実行したら惜しい所まできているのですが 思った内容の結果ではありませんでした。 頂いたスプリクトの数値をいじって何とか物にならないか 試しましたがコピーとかしている命令の所が どうしても意味が分からないので、これ以上の処理ができませんでした。 私のやりたい事を 活字だけではどうしても難があるのですが、絵に描いても説明できなくて・・・・ 今回頂いたスプリクトで Y軸の下へ向かうオブジェクトもある規定の数値分 ピッチプラスしたいのです。 また、下段へ移動する配置場所は 上段で用意されたオブジェクトの調度間にはまる位置関係が必要なのです。 ↓開始位置 ●_●_●_●_●_● (例:左右のピッチが2mmとして) ↑↓ (上下関係も規定の2mm+規定数のピッチ) _.●_.●_.●_.●_.●_ (二行目は2mm+規定数のピッチ) ※ 開始位置からスタートしているのは最初の横一列だけで その後で出来てくるオブジェクトは上段の間を狙うかのように配置されなくてはならない ●_●_●_●_● _●_●_●_●_ (こういう感じです) ですが、下段の方が上段より、左右のピッチが大きくなっているので 実際は調度間に入れるというのは不可能な話なのですが 実は、ピッチのプラスされていく数値は非常に細かい数値であり 数学的にはおかしな話ですが、見た目そうなってればいいです。 言い返せば、 ●_●_●_●_● _●_●_●_●_ で、1セット つぎに ●._●._●._●._● _.●_.●_.●_.●_と言うのを継ぎ足すイメージでもいいかもしれません。 私の予想できる範囲で恐らく台形のような仕上がりになると思います。 あまりにもややこしいので、これ以上の質問も申し訳なく できましたら、現状のスープリクトに Y軸をピッチプラスできる状態の物を頂ければ後は試行錯誤してみたいと思います。 上記、勝手ばかり申し訳ございませんが もう少しお付き合い願えないでしょうか。 宜しくお願いします。

  • proust
  • ベストアンサー率57% (62/108)
回答No.2

%!PS-Adobe-1.0 EPSF-1.0 %%BoundingBox:0 0 841 595 /mm { 2.83464567 mul } def /r 0.5 mm def % 円の半径 /xpitch 1 mm def % X方向のピッチ /xdelta .2 mm def % 1行ふえるごとのX方向の増分 /ypitch 1 mm neg def % Y方向のピッチ (neg: マイナス) /ydelta .2 mm neg def % 1行ふえるごとのY方向の増分 /x0 1 mm def % X位置の初期値 /y0 200 mm def % Y位置の初期値 /XCOUNT 10 def % X方向の繰り返し回数 /YCOUNT 10 def % Y方向の繰り返し回数 0 0 0 1 setcmykcolor % CMYK色指定 /y y0 def % ycurを1..YCOUNTの間1づつ増やして 1 1 YCOUNT {/ycur exch def % 奇数行のとき左端から開始、さもなくばピッチ÷2だけずらして開始★ % ycur 2 mod 1 eq { x0 } { x0 xpitch 2 div add } ifelse /x exch def ycur 2 mod 1 eq { x0 } { x0 x0 2 div add } ifelse /x exch def % xcurを1..XCOUNTの間1づつ増やして 1 1 XCOUNT {/xcur exch def x y r 0 360 arc closepath fill % X方向移動 /x x xpitch add def } for % Xピッチ増分 /xpitch xpitch xdelta add def % Y方向移動 /y y ypitch add def % Yピッチ増分 /ypitch ypitch ydelta add def } for showpage すでに回答が出ているので蛇足かもしれませんが、PostScript版も出してみました。 入れ子状態の描画の部分がどう考えるかによるのだと思いますが、 あんまりきれいにならなかったです。

irukacyan
質問者

お礼

ありがとうございます。 こんなにも色んな回答を頂き、非常に嬉しいです。 一見ではとても理解できる頭の持ち主では無いので 自宅に帰ってからじっくり検討したいと思います。 闇の中で光を見つけた気持ちです。 ありがとうございました。

  • grazie
  • ベストアンサー率56% (200/355)
回答No.1

var objs = documents[0].selection; var obj=objs[0]; obj.name="original"; var mm=2.8346456;//Illustratorの内部計算はポイントで行われる。mmに変換するための数値 var increase_x_dval=1*mm;//ヨコ方向に増分する距離 var increase_y_dval=-1*mm;//タテ方向に増分する距離 var increase_val = 0.1*mm;//一段下がると増分する距離 var yoko_num=20;//コピーする数 var tate_num=20; var x_dval1 = 1*mm;//先頭の移動距離 var y_dval1 = 0*mm; var flag=-1; for(var i=0; i<=tate_num; i++){ /*******最初の図形を一段下にコピー********/ if (i!=0) { obj=documents[0].pathItems["original"]; x_dval=0; y_dval=increase_y_dval*i; obj.duplicate(obj.parent,ElementPlacement.PLACEATEND); obj.translate(x_dval,y_dval,undefined,undefined,undefined,undefined); obj.name=0; } /********先頭位置移動********/ if(flag==1)obj.translate(x_dval1,y_dval1,undefined,undefined,undefined,undefined); flag=-flag;//一段ごとにフラグを反転 /********横方向にコピー********/ for(var j=1; j<=yoko_num; j++) { x_dval =increase_x_dval; y_dval =0; obj.duplicate(obj.parent,ElementPlacement.PLACEATEND); obj.translate(x_dval,y_dval,undefined,undefined,undefined,undefined); obj.name=j; } x_dval=0*mm;//移動距離初期化 y_dval=0*mm; increase_x_dval=increase_x_dval+increase_val;//一段下がると増分する } /*以下は無くてもよい*/ activeDocument.selection=null;//選択解除 obj=documents[0].pathItems["original"]; obj.move(obj.parent,ElementPlacement.PLACEATBEGINNING); /* 非常に煩雑になってしまって、自分でもよくわからなくなってしまいました...。 でもなんとなく動くので試用してみてください。 */

irukacyan
質問者

お礼

うわぁ!!! ご回答有難うございます。 きっと、こんな都合の良い質問には誰も応えてくれないと半ば諦めてましたので、すごくうれしいです。 「自分で調べれ」とか 「貴方のやりたい事は知識レベルで無理です」とかで あちこちの掲示板で叩かれたので この嬉しさはたまらないものがあります。 出先でこのページを確認しましたので 自宅に帰ってからじっくりスプリクト解析してみます。 (偉そうですね^^;。じっくり見て操作してみます) 本当にありがとうございました。 念のため、結果を報告したいと思いますので しばらくはこのページ閉めないでいますね。 ありがとうございました。

irukacyan
質問者

補足

出先のイラストレーターで試してみました。 動作方法: 新規ファイルで、1ミリの円形を書き それを選択した状態でお教えくださった 命令をテキストで作成されたJS保存の物を実行。 結果、 このようなメッセージが現れました。 ElementPlacement is undefined Line:41 -> obj.duplicate(obj.parent,ElementPlacement.PLAC・・・・・ここから先が何故か表示されない 何かやり方間違っているでしょうか? 重ね重ねすみません、宜しくお願いします。

関連するQ&A