/* Program making the Gantt chart from the shceduling data */ /* by K. Tatsumi 2005.4.1 */ // // gcc gant.c -lm -L/usr/X11R6/lib -lX11 -I/usr/X11R6/include // 2005/4/7 K.Tatsumi /* ver.2 再描画を出来るように改変 XW_Graph でglobal 変数として定義してあった gDip, gGc, gWin をローカル変数に修正 XW_RGB, XW_Line.. など多くの関数の修正が必要になった。掃除が必要? ver.3 2005/4/8 K.Tatsumi mode 表示を可能にする。rctngl を三次元配列にして、再描画の計算量を減らした。 2005/4/8 K.Tatsumi ver.4 windows を複数あけられるように修正。XW_graph を掃除して、必要な関数のみ gantt.c に追加。 gantt.h を作成し、prototype宣言追加。 2005/4/9 K.Tatsumi ver.5 リソースが0の仕事が描画されてしまうバグを修正(scd2caht()関数の修正) ver.6 画面の揺らぎを修正。Pixmap を使用して一括して画面の再描画を行う Backgrond が黒になってしまう理由が分からず、大きな白のBOXの描画でごまかし? "q" を押すと修了。 4/10 K.Tatsumi Bug 修正 ・COLOR_MAX, LABEL_MAX のdefine 定義をやめて直接 20 を用いる。 ・show_all: XW_Text部分のモード表示修正 XW_Text( gWin, label[CH_info[i].mode_num-1], ] --> XW_Text( gWin, label[CH_info[i].mode_num], ・gantt.c(旧version の sgannt)の G_rctngl[][][] の初期化し忘れ修正 ver 6.2 2005/4/12 K.Tatsumi 1. 数値表示labelの上20を、無制限になるよう変更 make_label 関数で必要な領域を確保して数字のASCIIコードを設定 2. 構造 G_data を作成し、 x_size, y_size, height, h_graph, mode_fg をまとめて管理 show_all等、表示関数の引き数などが変更になる。 3. 一度は消した COLOR_MAX 復活させ、もし 必要色数がCOLOR_MAXを超えたら全色をランダムに 割り振るよう修正 4. int *** mk_rctngl(int rrs, int r_max, int time); を作成。G_rctngl の領域確保、初期 化を行う */ #include#include #include #include #include #include #include #include #include "config.h" #include "gantt.h" // #include "matrix.h" Display *gDisp; int gScreen; Font gFont; XEvent gEv; // Attributes of GC XSetWindowAttributes gGcAtt; // base GC GC gGc; // Set selected colors to the each activities void setColor(int *color[3], Size *pb_size){ int i, k; int Dcolor[COLOR_MAX][3] = // {{0, 36, 85},{0, 109, 85},{0, 182, 85},{0, 182, 255},// {36,182, 170}, {255,109, 0},{0, 0, 255},{255,36, 0},// {255, 0,85},{128, 0, 128},{128, 255, 0}, {23, 170, 182},// {36,182, 170}, {255,109, 0},{24, 182, 25},{25,255, 182},// {0, 0, 170}, { 0,109, 0},{255, 12, 255},{0, 0, 255}}; for(i=0; i< pb_size->j_num; i++){ for(k=0; k<3; k++){ *(color[k]+i) = Dcolor[i][k]; } } } void setRandomColor(int *color[3], Size *pb_size){ int i, k; srand(time(NULL)); for(i=0; i j_num; i++){ for(k=0; k<3; k++){ *(color[k]+i) = rand()%255; // printf("c%d",j[i].color[k]); } // printf("\n"); } } int measure_Tmax(chartinfo CH_info[], int j_num){ int i, max =0; for(i=0; i r_num; k++){ for(t=0; t t_lngth; t++) { pre_y=0; for(i=1; i<=pb_size->j_num; i++) { r_count=0; if(CH_info[i].st == t && CH_info[i].rr_de[k] != 0){ for(r=pre_y; r r_bound[k]; r++) { if(G_rctngl[k][r][t]==0){ for(rt=t; rt<(CH_info[i].st+CH_info[i].pt); rt++) { G_rctngl[k][r][rt]=CH_info[i].job_num; } r_count++; } if( r_count == CH_info[i].rr_de[k]){ r++; pre_y = r; break; } } if(r_count != CH_info[i].rr_de[k]){ printf("Require resources goes over the bound!"); exit(-1); } } } } } return 0; } // // Select Color // unsigned long XW_RGB( int r, int g, int b ) { Colormap cmap; XColor col; cmap = DefaultColormap( gDisp, 0 ); col.red = 256 * r; col.green = 256 * g; col.blue = 256 * b; XAllocColor( gDisp, cmap, &col ); return col.pixel ; } void XW_SetColor( int r, int g, int b ) { XSetForeground( gDisp, gGc, XW_RGB( r, g, b) ); } // Open window void XW_EndXWindow( Window gWin) { XFreeGC( gDisp, gGc ); XDestroyWindow( gDisp, gWin ); } // Drawing Functions void XW_Cls( Window gWin ) { XClearWindow( gDisp, gWin ); XFlush( gDisp ); } void XW_Text( Window gWin,char *str, int x, int y ) { XDrawString( gDisp, gWin, gGc, x, y, str, strlen(str) ); } void XW_Line( Window gWin, int x1, int y1, int x2, int y2 ) { XSetLineAttributes( gDisp, gGc, 1, LineSolid, CapRound, JoinRound ); XDrawLine( gDisp, gWin, gGc, x1, y1, x2, y2 ); } void XW_BoxFill(Window gWin, int x1, int y1, int x2, int y2 ) { XSetLineAttributes( gDisp, gGc, 1, LineSolid, CapRound, JoinRound ); XFillRectangle( gDisp, gWin, gGc, x1, y1, x2-x1, y2-y1 ); } void Draw_axes(Window gWin, Size *pb_size, G_data *gdata, int k){ int i; XW_SetColor(182, 202, 225); // Set Palebule for(i=1; i y_scale ; i++){ XW_Line( gWin, (ORG), gdata->h_graph-(SCALE)*i-(ORG), // gdata->x_size-1-(SCALE-ORG), gdata->h_graph-(SCALE)*i-(ORG) ); } // the graduation axes for Y-axis for(i=1; i x_scale ; i++){ XW_Line( gWin, (SCALE)*i+(ORG), (SCALE-ORG)+gdata->h_graph - gdata->y_size, (SCALE)*i+(ORG), gdata->h_graph-(ORG) ); // the graduation axes for X-axis } // Drawing axes XW_SetColor( 0, 0, 0 ); // Set Black XW_Line( gWin, ORG, gdata->h_graph-(ORG), gdata->x_size-1, gdata->h_graph-(ORG)); // X-axis XW_Line( gWin, ORG, gdata->h_graph-gdata->y_size, ORG, gdata->h_graph-(ORG)); // Y-axis XW_SetColor( 0, 0, 0 ); // Set Black XW_Line( gWin, (ORG), gdata->h_graph-(SCALE)*(pb_size->r_bound[k])-(ORG),// gdata->x_size-1-(SCALE-ORG), gdata->h_graph-(SCALE)*(pb_size->r_bound[k])-(ORG) ); // Bound of the resource k for(i=4;i x_scale-4; i=i+5){ // the graduation of time XW_Text( gWin, gdata->label[i], ORG+(i+0.5)*(SCALE), gdata->h_graph-(ORG)*0.2); // XW_Text( gWin, label[i], ORG+(0+0.5)*(SCALE), y_size-10 ); XW_Text( gWin, "T", ORG+(pb_size->t_lngth-0.5)*(SCALE), gdata->h_graph-(ORG)*0.2); } for(i=2;i y_scale-2; i=i+3){ // the graduation of resource if(i>9){ XW_Text( gWin, gdata->label[i], (ORG)*0.2, gdata->h_graph-(ORG)-(i+0.5)*(SCALE)); }else{ XW_Text( gWin, gdata->label[i], (ORG)*0.5, gdata->h_graph-(ORG)-(i+0.5)*(SCALE)); } XW_Text( gWin, "R", (ORG)*0.5, ORG+gdata->h_graph-gdata->y_size); } } int gantt( chartinfo *CH_info, int jobs, int rrs, ivector rr_avail, int fg){ int i, r, t, k, r_max=0; int ***G_rctngl; // a unit rectangle in the chart int all_y; int *color[3]; int offset = (SCALE)*5; char string[10]; Size pb_size; G_data gdata; Window gWin; Pixmap gPmap; KeySym key; pb_size.r_bound=(int *)malloc(sizeof(int)*rrs); pb_size.j_num = jobs-2; pb_size.r_num = rrs; for(r_max=0, i=0; i (pb_size.j_num+1)){ gdata.height = all_y*(SCALE); }else{ gdata.height = (pb_size.j_num+1)*(SCALE); } gDisp = XOpenDisplay( NULL ); /* Xサーバに接続する */ gScreen = DefaultScreen( gDisp ); /* スクリーン設定 */ gWin = XCreateSimpleWindow( /* ウィンドウを開く */ gDisp, /* Xサーバ */ RootWindow(gDisp,gScreen), /* 親ウィンドウ */ 0, 0, /* 表示時の左上隅の座標 x, y */ (gdata.x_size)+(offset), gdata.height, /* ウィンドウの幅と高さ */ // gdata.height, wide, /* ウィンドウの幅と高さ */ 1, BlackPixel(gDisp,gScreen),/* ボーダーの幅と色 */ WhitePixel(gDisp,gScreen) /* ウィンドウの背景色 */ ); gPmap = XCreatePixmap(gDisp, gWin, (gdata.x_size)+(offset), gdata.height, DefaultDepth(gDisp, 0)); XSetStandardProperties(gDisp, gWin, "Gantt chart", "CanttChart", None, NULL, 0, NULL); XSelectInput( gDisp, gWin, ExposureMask | KeyPressMask ); XMapWindow( gDisp, gWin ); /* ウィンドウのマッピング */ // XW_initWin(gWin, (gdata.x_size)+(offset), all_y*(SCALE)); gGc = DefaultGC( gDisp, gScreen ); /* グラフィックコンテキストの設定 */ XSetForeground( gDisp, gGc, BlackPixel(gDisp,gScreen) ); /* 描画色設定 */ XSetBackground( gDisp, gGc, WhitePixel(gDisp,gScreen)); if(fg == 0){ // Set colors to each activies at random setRandomColor(color, &pb_size); }else{ if( COLOR_MAX < pb_size.j_num ){ printf("colors are set at random!"); setRandomColor(color, &pb_size); }else{ setColor(color, &pb_size); } } while( 1 ){ XNextEvent( gDisp, &gEv ); switch( gEv.type ){ case Expose: XW_SetColor( 255,255,255 ); // 白色 XW_BoxFill( gPmap, 0, 0, (gdata.x_size)+(offset), gdata.height); // each rectangle initialization gdata.h_graph = 0; for(k=0; k t_lngth; t++){ for(r=0; r r_bound[l]; r++){ i = G_rctngl[l][r][t]; if(i == 0){ }else{ XW_SetColor( *(color[0]+i-1), *(color[1]+i-1),*(color[2]+i-1) ); // XW_BoxFill( gWin, ORG+ t*(SCALE), gdata->h_graph-(r+1)*(SCALE)-(ORG), // (ORG)+ (t+1)*(SCALE), gdata->h_graph-(ORG)-r*(SCALE)); XW_SetColor( 255,255,255 ); // 白色 if(gdata->mode_fg==1){ XW_Text( gWin, gdata->label[CH_info[i].mode_num], ORG+(t+0.4)*(SCALE), gdata->h_graph-(r+0.3)*(SCALE)-(ORG)); }else{ if( i < 10){ XW_Text( gWin, gdata->label[i-1], ORG+(t+0.4)*(SCALE), gdata->h_graph-(r+0.3)*(SCALE)-(ORG)); } else{ XW_Text( gWin, gdata->label[i-1], ORG+(t+0.2)*(SCALE), gdata->h_graph-(r+0.3)*(SCALE)-(ORG)); } } } } } return 0; } int show_description(Window gWin, int *color[3], G_data *gdata, int j_num){ int i; for(i=0; i x_size+ORG, (SCALE)*(i+0.5), // gdata->x_size+ORG+(SCALE), (SCALE)*(i+1.5)); XW_SetColor( 0, 0, 0 ); // Black XW_Text( gWin, "JOB", gdata->x_size+ORG+(SCALE)*1.2, (SCALE)*(i+1.3)); XW_Text( gWin, gdata->label[i], gdata->x_size+ORG+(SCALE)*2.5, (SCALE)*(i+1.3)); } return 0; } int ***mk_rctngl(int rrs, int r_max, int mtime){ int t, r, i; int ***G_rctngl; G_rctngl = (int ***)malloc(rrs*sizeof(int **)); for(t=0; t 0){ for(i=0; i