クリエイター手抜きプロジェクト[105]Illustrator 10編 一年分のカレンダーを自動生成する(2)/古籏一浩

投稿:  著者:  読了時間:9分(本文:約4,100文字)


今回も前回と同じカレンダーネタです。今回はIllustrator 10で動作するバージョンです。前回はまるまる一年分でしたが、一年分ではなく単月で生成したい場合には「calYear = 2007;//■生成する西暦年数4桁」より下の行を削除し「calendar(2007,1)」のように指定します。これは2007年1月のカレンダーを生成することになります。あとIllsutrator 10ではユーザー入力ダイアログがサポートされていないので、プログラム中で年数を指定する必要があります。これはcalYear = 2007;の行が該当します。


// Calendar Script for Adobe Illustrator 10
baseX = 10; //■カレンダーの最初の表示位置(X座標)
baseY = 900; //■カレンダーの最初の表示位置(Y座標)
calDX = 30; //■カレンダーの1日あたりの横幅
calDY = 30; //■カレンダーの1日あたりの縦幅
blockX = 250; //■1月あたりの横の差
blockY = 250; //■1月あたりの縦の差
txtColor = new Color();
docObj = activeDocument;
// Calendar Script for Adobe Illustrator CS/CS2
function calendar(theYear__,theMonth__){
var wrtMonth= new Array(0,31,28,31,30,31,30,31,31,30,31,30,31);
var wrtDate = new Array("日","月","火","水","木","金","土");
var wrtColor= new Array([255,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,255]);
var special = new Array(3,21, 9,23, 1,1, 2,11, 4,29, 5,3, 5,4, 5,5, 11,3, 11,23, 12,23);
var specCnt = 15;
var specCol = [255,0,0]; // 休日の文字色
var theDate = new Date(); // 日付オブジェクトを生成
specCnt = 13; // Happy Monday対策
if (theYear__){ // 年月が指定されていた場合は年月を再設定
theDate.setYear(theYear__); // 指定年を設定
theDate.setMonth(theMonth__-1); // 指定月を設定
}
theYear__ = theDate.getFullYear();
theMonth__= theDate.getMonth()+1;
if (((theYear__ % 4 == 0) && (theYear__ % 100 != 0)) || (theYear_ _ % 400 == 0)){
wrtMonth[2] = 29; // 閏年だったら2月を29日にする
}
// 春分/秋分の日を求める(1980-2099まで)
special[1] = Math.floor(20.8431 + 0.242194 * (theYear__ - 1980)- Math.floor((theYear__ - 1980)/4));
special[3] = Math.floor(23.2488 + 0.242194 * (theYear__ - 1980)- Math.floor((theYear__ - 1980)/4));
theDate.setFullYear(theYear__); // 指定年を設定
theDate.setMonth(theMonth__-1); // 指定月を設定
theDate.setDate(1); // 日付を1日にし曜日を次の行で取得
var count = theDate.getDay();
var day = 0; // 曜日カウンタを0にする
var date = 1; // 日付を1日にする
var flag = false; // 休日&日曜日フラグ
var hFlag = false; // 休日フラグ
var xFlag = false; // 成人の日/体育の日
var i,j;
var week = 0; // 2000年からの体育の日と成人の日対策
calX = 0; //■カレンダーを表示する相対座標(X)
calY = 60; //■カレンダーを表示する相対座標(Y)
drawColor([0,0,0]); // 色の初期化
write(theYear__+"年"+theMonth__+"月", 95, 0); // 相対座標(95pt,0pt)に描画
for(i=0;i< 7;i++) write(wrtDate[i], 0+i*calDX, 30); // 曜日書き出し
flag = false; // 休日が日曜日だった場合true
for(i=1;i< =wrtMonth[theMonth__]+count;i++){
hFlag = false; // 休日だったらtrue
if (day >=count){
wrt = ""+date;
for(j=0; j< specCnt; j++){
if ((special[j*2] == theMonth__) && (special[j*2+1] == date)){
drawColor(specCol);
if ((day % 7) == 0) flag = true; // 休日が日曜日だったらtrue
hFlag = true; }
}
date++;
if ((day % 7) == 1) week++; // 月曜日の場合は週の数を増やす
}else{ wrt = " "; }
// 1月と7月と10月の休日処理(Happy Mondayの処理)
xFlag = false;
if ( ((theMonth__ == 1) || (theMonth__ == 10)) && (week== 2) && ((day % 7) == 1)) xFlag = true;
if ( ((theMonth__ == 7) || (theMonth__ == 9)) && (week== 3) && ((day % 7) == 1)) xFlag = true;
if (xFlag){ drawColor(specCol);
}else{
if ((hFlag == false) && flag == false) drawColor(w rtColor[day % 7]);
if (((day % 7) == 1) && flag == true) { drawColor(specCol); flag = false;}
}
drawBox(calX, calY); //■枠を表示する部分。しない場合は行ごと削除
write(wrt, calX, calY);
calX += calDX;
if (day % 7 == 6) { calX = 0; calY += calDY; }
day++; // 1日増やす
}
}
// write textbox
function drawBox(x, y){
var pObj = docObj.pathItems.rectangle(0,0,calDX,calDY);
pObj.translate(baseX + x - 15,baseY-y+calDY-9); //■ここで位置を微調整
pObj.filled = false; // 塗りなし
pObj.stroked = true; // 線あり
pObj.strokeWidth = 0.2; // 線幅0.2ポイント
// pObj.fillColor = setColor(255,255,255); // 反映されないが一応塗りの色を指定(白色)
pObj.strokeColor = setColor(0,0,0); // 線の色を指定(黒色)
}
function write(txt, x,y){
var textObj = docObj.textArtItems.add();
textObj.contents = txt;
textObj.translate(baseX + x, baseY - y);
for (var i=0; i< (textObj.textRange()).characters.length; i++){
(textObj.textRange()).characters[i].fillColor = txtColor;
}
(textObj.textRange()).paragraphs[0].justification = Justification.CENTER;
}
function drawColor(col){
var tmpColor = new RGBColor();
tmpColor.red = col[0];
tmpColor.green = col[1];
tmpColor.blue = col[2];
txtColor.rgb = tmpColor;
}
function setColor(r,g,b){
var tmpColor = new RGBColor();
var aColor = new Color();
tmpColor.red = r;
tmpColor.green = g;
tmpColor.blue = b;
aColor.rgb = tmpColor;
return aColor;
}calYear = 2007; //■生成する西暦年数4桁storeX = baseX;cal = 1;
for (cy=0; cy< 4; cy++){ //■縦に4つ
for (cx=0; cx< 3; cx++){ //■横に3つ
calendar(calYear, cal);
baseX += blockX;
cal++;
}
baseX = storeX;
baseY -= blockY;
}

【古籏一浩】openspc@po.shiojiri.ne.jp
< http://www.openspc2.org/ >
まだまだIllustrator 10は現役みたいで本の図版作成もver 8か10納品。
EPSONのフォトビューアP-5000購入しました。ノートパソコンを持ち歩くより格段に便利です。が、液晶の取り付けが逆なのか、反対側からだときれいに見えるのに、自分の方からはあまりよく見えないという状態に・・・。設計ミス???
最も需要が少ないと思われるけど一応作ってみました。
●AfterEffects 7.0自動化作戦
< http://www.openspc2.org/book/AfterEffects7.0/ >