//----------------------------------------------------------------------------- // Velmi jednoduchy prohlizec souboru typu DXF upraveny pro zobrazeni // zakladnich 2D entit // // Autor: Pavel Tisnovsky // //----------------------------------------------------------------------------- #ifdef __BORLANDC__ #include #endif #include // hlavickovy soubor funkci GLUTu a OpenGL #include #include #include #include #include #define WINDOW_TITLE "simple DXF 2D viewer" // titulek okna #define WINDOW_WIDTH 800 // pocatecni velikost okna #define WINDOW_HEIGHT 600 #define MAX_LINE_LENGTH 1024 #define MAX_TEXT_LENGTH 256 void callback_begin_header(char *input); void callback_end_header(char *input); void callback_begin_blocks(char *input); void callback_end_blocks(char *input); void callback_begin_entities(char *input); void callback_end_entities(char *input); void callback_line_setcolor(char *input); void callback_line_setlayer(char *input); void callback_line_set_x1(char *input); void callback_line_set_y1(char *input); void callback_line_set_x2(char *input); void callback_line_set_y2(char *input); void callback_line_color(char *input); void callback_line_layer(char *input); void callback_line_x1(char *input); void callback_line_y1(char *input); void callback_line_x2(char *input); void callback_line_y2(char *input); void callback_line_store(char *input); void callback_circle_setcolor(char *input); void callback_circle_setlayer(char *input); void callback_circle_set_x(char *input); void callback_circle_set_y(char *input); void callback_circle_set_r(char *input); void callback_circle_color(char *input); void callback_circle_layer(char *input); void callback_circle_x(char *input); void callback_circle_y(char *input); void callback_circle_r(char *input); void callback_circle_store(char *input); void callback_arc_setcolor(char *input); void callback_arc_setlayer(char *input); void callback_arc_set_x(char *input); void callback_arc_set_y(char *input); void callback_arc_set_r(char *input); void callback_arc_set_u1(char *input); void callback_arc_set_u2(char *input); void callback_arc_color(char *input); void callback_arc_layer(char *input); void callback_arc_x(char *input); void callback_arc_y(char *input); void callback_arc_r(char *input); void callback_arc_u1(char *input); void callback_arc_u2(char *input); void callback_arc_store(char *input); void callback_text_setcolor(char *input); void callback_text_setlayer(char *input); void callback_text_set_x(char *input); void callback_text_set_y(char *input); void callback_text_set_text(char *input); void callback_text_color(char *input); void callback_text_layer(char *input); void callback_text_x(char *input); void callback_text_y(char *input); void callback_text_text(char *input); void callback_text_store(char *input); // graficke entity {{{ typedef struct GfxPoint { int color; int layer; double x; double y; double angle; } GfxPoint; typedef struct GfxLine { int color; int layer; double x1; double y1; double x2; double y2; } GfxLine; typedef struct GfxCircle { int color; int layer; double x; double y; double r; } GfxCircle; typedef struct GfxArc { int color; int layer; double x; double y; double r; double u1; double u2; } GfxArc; typedef struct GfxText { int color; int layer; double x; double y; char str[MAX_TEXT_LENGTH]; } GfxText; // }}} // typ grafickych entit {{{ typedef enum Type { T_POINT, T_LINE, T_CIRCLE, T_ARC, T_TEXT } Type; // }}} // linearni seznam s entitami {{{ typedef struct Item { Type type; void *entity; struct Item *next; // vazba v linearnim seznamu } Item; // }}} // stav KA {{{ typedef enum t_dxf_status { Unknown, Delimiter, Section, SecName, Header, Blocks, Entities, Line, LineLayer, LineColor, LineX1, LineY1, LineX2, LineY2, Circle, CircleLayer, CircleColor, CircleX, CircleY, CircleR, ArcEntity, ArcLayer, ArcColor, ArcX, ArcY, ArcR, ArcU1, ArcU2, TextEntity, TextLayer, TextColor, TextX, TextY, TextText, End } t_dxf_status; // }}} // prechod mezi stavy KA {{{ typedef struct t_transition { t_dxf_status status; char *input; t_dxf_status newStatus; void (*fce)(char *input); } t_transition; // }}} // vlastni konfigurace KA {{{ static const t_transition transitions[]={ {Unknown, " 0", Delimiter, NULL}, {Delimiter, "SECTION", Section, NULL}, {Section, " 2", SecName, NULL}, {SecName, "HEADER", Header, callback_begin_header}, {SecName, "BLOCKS", Blocks, callback_begin_blocks}, {SecName, "ENTITIES", Entities, callback_begin_entities}, {Header, " 0", Header, NULL}, {Header, "ENDSEC", Unknown, callback_end_header}, {Blocks, " 0", Blocks, NULL}, {Blocks, "ENDSEC", Unknown, callback_end_blocks}, {Entities, " 0", Entities, NULL}, {Entities, "ENDSEC", Unknown, callback_end_entities}, {Entities, "LINE", Line, NULL}, {Line, " 8", LineLayer, callback_line_layer}, {Line, " 62", LineColor, callback_line_color}, {Line, " 10", LineX1, callback_line_x1}, {Line, " 20", LineY1, callback_line_y1}, {Line, " 11", LineX2, callback_line_x2}, {Line, " 21", LineY2, callback_line_y2}, {Line, " 0", Entities, callback_line_store}, {Entities, "CIRCLE", Circle, NULL}, {Circle, " 8", CircleLayer, callback_circle_layer}, {Circle, " 62", CircleColor, callback_circle_color}, {Circle, " 10", CircleX, callback_circle_x}, {Circle, " 20", CircleY, callback_circle_y}, {Circle, " 40", CircleR, callback_circle_r}, {Circle, " 0", Entities, callback_circle_store}, {Entities, "ARC", ArcEntity, NULL}, {ArcEntity, " 8", ArcLayer, callback_arc_layer}, {ArcEntity, " 62", ArcColor, callback_arc_color}, {ArcEntity, " 10", ArcX, callback_arc_x}, {ArcEntity, " 20", ArcY, callback_arc_y}, {ArcEntity, " 40", ArcR, callback_arc_r}, {ArcEntity, " 50", ArcU1, callback_arc_u1}, {ArcEntity, " 51", ArcU2, callback_arc_u2}, {ArcEntity, " 0", Entities, callback_arc_store}, {Entities, "TEXT", TextEntity, NULL}, {TextEntity, " 8", TextLayer, callback_text_layer}, {TextEntity, " 62", TextColor, callback_text_color}, {TextEntity, " 10", TextX, callback_text_x}, {TextEntity, " 20", TextY, callback_text_y}, {TextEntity, " 1", TextText, callback_text_text}, {TextEntity, " 0", Entities, callback_text_store}, {End, "", End, NULL} // jen ukonceni pro pruchod stavy KA }; // }}} // informace o okne {{{ struct { int width; int height; } window={WINDOW_WIDTH, WINDOW_HEIGHT}; // }}} // informace o mysi {{{ struct { int status; int xtran0, xtran1, xtran2; int ytran0, ytran1, ytran2; int ztran0, ztran1, ztran2; } mouse={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // }}} // globalni promenne {{{ double scale=1.0; double xpos=0.0; double ypos=0.0; int redraw=1; void (*special_callback)(char *input)=NULL; t_dxf_status status=Unknown; // inicializace KA Item *p_first; // ukazatele v linearnim seznamu Item *p_last; GfxLine g_line; // pomocne entity pro postupne naplnovani GfxCircle g_circle; GfxArc g_arc; GfxText g_text; int colorStyle=1; // }}} // initItem() {{{ //----------------------------------------------------------------------------- // Inicializace linearniho seznamu //----------------------------------------------------------------------------- void initItem(void) { p_first=NULL; p_last=NULL; } // }}} // addItem() {{{ //----------------------------------------------------------------------------- // Vlozeni polozky do linearniho seznamu //----------------------------------------------------------------------------- void addItem(Type type, void *entity) { Item *item=(Item*)malloc(sizeof(Item)); item->type=type; item->entity=entity; item->next=NULL; // prvek bude umisten na konci seznamu // seznam je prazdny if (p_first==NULL) { p_first=item; // prvni i posledni prvek p_last=item; // seznamu jsou shodne } // pridani polozky do neprazdneho seznamu else { p_last->next=item; // zretezeni prvku na konec seznamu p_last=item; // aktualizace ukazatele na posledni prvek /* Item *p=p_first; while (p->next !=NULL) p=p->next; p->next=item; */ } } // }}} // callback_begin_header() {{{ void callback_begin_header(char *input) { puts(" begin header"); } // }}} // callback_end_header() {{{ void callback_end_header(char *input) { puts(" end header"); } // }}} // callback_begin_blocks() {{{ void callback_begin_blocks(char *input) { puts(" begin blocks"); } // }}} // callback_end_blocks() {{{ void callback_end_blocks(char *input) { puts(" end blocks"); } // }}} // callback_begin_entities() {{{ void callback_begin_entities(char *input) { puts(" begin entities"); } // }}} // callback_end_entities() {{{ void callback_end_entities(char *input) { puts(" end entities"); } // }}} // callback_line_setcolor() {{{ void callback_line_setcolor(char *input) { g_line.color=atoi(input); special_callback=NULL; status=Line; } // }}} // callback_line_setlayer() {{{ void callback_line_setlayer(char *input) { int i, j; // velmi primitivni vypocet hashe for (i=0, j=0; input[i]; i++) j+=input[i]; g_line.layer=j; special_callback=NULL; status=Line; } // }}} // callback_line_set_x1() {{{ void callback_line_set_x1(char *input) { g_line.x1=atof(input); special_callback=NULL; status=Line; } // }}} // callback_line_set_y1() {{{ void callback_line_set_y1(char *input) { g_line.y1=atof(input); special_callback=NULL; status=Line; } // }}} // callback_line_set_x2() {{{ void callback_line_set_x2(char *input) { g_line.x2=atof(input); special_callback=NULL; status=Line; } // }}} // callback_line_set_y2() {{{ void callback_line_set_y2(char *input) { g_line.y2=atof(input); special_callback=NULL; status=Line; } // }}} // callback_line_color() {{{ void callback_line_color(char *input) { special_callback=callback_line_setcolor; } // }}} // callback_line_layer() {{{ void callback_line_layer(char *input) { special_callback=callback_line_setlayer; } // }}} // callback_line_x1() {{{ void callback_line_x1(char *input) { special_callback=callback_line_set_x1; } // }}} // callback_line_y1() {{{ void callback_line_y1(char *input) { special_callback=callback_line_set_y1; } // }}} // callback_line_x2() {{{ void callback_line_x2(char *input) { special_callback=callback_line_set_x2; } // }}} // callback_line_y2() {{{ void callback_line_y2(char *input) { special_callback=callback_line_set_y2; } // }}} // callback_line_store() {{{ void callback_line_store(char *input) { GfxLine *l=(GfxLine *)malloc(sizeof(GfxLine)); l->x1=g_line.x1; l->y1=g_line.y1; l->x2=g_line.x2; l->y2=g_line.y2; l->color=g_line.color; l->layer=g_line.layer; addItem(T_LINE, l); } // }}} // callback_circle_setcolor() {{{ void callback_circle_setcolor(char *input) { g_circle.color=atoi(input); special_callback=NULL; status=Circle; } // }}} // callback_circle_setlayer() {{{ void callback_circle_setlayer(char *input) { int i, j; // velmi primitivni vypocet hashe for (i=0, j=0; input[i]; i++) j+=input[i]; g_circle.layer=j; special_callback=NULL; status=Circle; } // }}} // callback_circle_set_x() {{{ void callback_circle_set_x(char *input) { g_circle.x=atof(input); special_callback=NULL; status=Circle; } // }}} // callback_circle_set_y() {{{ void callback_circle_set_y(char *input) { g_circle.y=atof(input); special_callback=NULL; status=Circle; } // }}} // callback_circle_set_r() {{{ void callback_circle_set_r(char *input) { g_circle.r=atof(input); special_callback=NULL; status=Circle; } // }}} // callback_circle_color() {{{ void callback_circle_color(char *input) { special_callback=callback_circle_setcolor; } // }}} // callback_circle_layer() {{{ void callback_circle_layer(char *input) { special_callback=callback_circle_setlayer; } // }}} // callback_circle_x() {{{ void callback_circle_x(char *input) { special_callback=callback_circle_set_x; } // }}} // callback_circle_y() {{{ void callback_circle_y(char *input) { special_callback=callback_circle_set_y; } // }}} // callback_circle_r() {{{ void callback_circle_r(char *input) { special_callback=callback_circle_set_r; } // }}} // callback_circle_store() {{{ void callback_circle_store(char *input) { GfxCircle *c=(GfxCircle *)malloc(sizeof(GfxCircle)); c->x=g_circle.x; c->y=g_circle.y; c->r=g_circle.r; c->color=g_circle.color; c->layer=g_circle.layer; addItem(T_CIRCLE, c); } // }}} // callback_arc_setcolor() {{{ void callback_arc_setcolor(char *input) { g_arc.color=atoi(input); special_callback=NULL; status=ArcEntity; } // }}} // callback_arc_setlayer() {{{ void callback_arc_setlayer(char *input) { int i, j; // velmi primitivni vypocet hashe for (i=0, j=0; input[i]; i++) j+=input[i]; g_arc.layer=j; special_callback=NULL; status=ArcEntity; } // }}} // callback_arc_set_x() {{{ void callback_arc_set_x(char *input) { g_arc.x=atof(input); special_callback=NULL; status=ArcEntity; } // }}} // callback_arc_set_y() {{{ void callback_arc_set_y(char *input) { g_arc.y=atof(input); special_callback=NULL; status=ArcEntity; } // }}} // callback_arc_set_r() {{{ void callback_arc_set_r(char *input) { g_arc.r=atof(input); special_callback=NULL; status=ArcEntity; } // }}} // callback_arc_set_u1() {{{ void callback_arc_set_u1(char *input) { g_arc.u1=atof(input); special_callback=NULL; status=ArcEntity; } // }}} // callback_arc_set_u2() {{{ void callback_arc_set_u2(char *input) { g_arc.u2=atof(input); special_callback=NULL; status=ArcEntity; } // }}} // callback_arc_color() {{{ void callback_arc_color(char *input) { special_callback=callback_arc_setcolor; } // }}} // callback_arc_layer() {{{ void callback_arc_layer(char *input) { special_callback=callback_arc_setlayer; } // }}} // callback_arc_x() {{{ void callback_arc_x(char *input) { special_callback=callback_arc_set_x; } // }}} // callback_arc_y() {{{ void callback_arc_y(char *input) { special_callback=callback_arc_set_y; } // }}} // callback_arc_r() {{{ void callback_arc_r(char *input) { special_callback=callback_arc_set_r; } // }}} // callback_arc_u1() {{{ void callback_arc_u1(char *input) { special_callback=callback_arc_set_u1; } // }}} // callback_arc_u2() {{{ void callback_arc_u2(char *input) { special_callback=callback_arc_set_u2; } // }}} // callback_arc_store() {{{ void callback_arc_store(char *input) { GfxArc *c=(GfxArc *)malloc(sizeof(GfxArc)); c->x=g_arc.x; c->y=g_arc.y; c->r=g_arc.r; c->u1=g_arc.u1; c->u2=g_arc.u2; c->color=g_arc.color; c->layer=g_arc.layer; addItem(T_ARC, c); } // }}} // callback_text_setcolor() {{{ void callback_text_setcolor(char *input) { g_text.color=atoi(input); special_callback=NULL; status=TextEntity; } // }}} // callback_text_setlayer() {{{ void callback_text_setlayer(char *input) { int i, j; // velmi primitivni vypocet hashe for (i=0, j=0; input[i]; i++) j+=input[i]; g_text.layer=j; special_callback=NULL; status=TextEntity; } // }}} // callback_text_set_x() {{{ void callback_text_set_x(char *input) { g_text.x=atof(input); special_callback=NULL; status=TextEntity; } // }}} // callback_text_set_y() {{{ void callback_text_set_y(char *input) { g_text.y=atof(input); special_callback=NULL; status=TextEntity; } // }}} // callback_text_set_text() {{{ void callback_text_set_text(char *input) { strncpy(g_text.str, input, MAX_TEXT_LENGTH-1); special_callback=NULL; status=TextEntity; } // }}} // callback_text_color() {{{ void callback_text_color(char *input) { special_callback=callback_text_setcolor; } // }}} // callback_text_layer() {{{ void callback_text_layer(char *input) { special_callback=callback_text_setlayer; } // }}} // callback_text_x() {{{ void callback_text_x(char *input) { special_callback=callback_text_set_x; } // }}} // callback_text_y() {{{ void callback_text_y(char *input) { special_callback=callback_text_set_y; } // }}} // callback_text_text() {{{ void callback_text_text(char *input) { special_callback=callback_text_set_text; } // }}} // callback_text_store() {{{ void callback_text_store(char *input) { GfxText *t=(GfxText *)malloc(sizeof(GfxText)); t->x=g_text.x; t->y=g_text.y; t->color=g_text.color; t->layer=g_text.layer; strcpy(t->str, g_text.str); addItem(T_TEXT, t); } // }}} // doConvert() {{{ // --------------------------------------------------------------------- // Nacteni obsahu souboru DXF a konverze do internich datovych struktur // --------------------------------------------------------------------- int doConvert(char *fileName) { FILE *fin; char line[MAX_LINE_LENGTH]; int lines=0; int t; fin=fopen(fileName, "rt"); // otevreni vstupniho souboru if (!fin) return 0; while (fgets(line, MAX_LINE_LENGTH, fin)) { // projit vsechny radky lines++; line[strlen(line)-1]=0; // oriznout if (special_callback!=NULL) { // specialni callback funkce -> nacteni atributu special_callback(line); } else { // normalni callback funkce -> prechod KA for (t=0; transitions[t].status!=End; t++) { if ((status==transitions[t].status) && (!strcmp(transitions[t].input, line))) { if (transitions[t].fce!=NULL) transitions[t].fce(line); status=transitions[t].newStatus; break; } } } } printf("done %d lines\n", lines); fclose(fin); return 1; } // }}} // setColor() {{{ //----------------------------------------------------------------------------- // nastaveni barvy vykreslovani //----------------------------------------------------------------------------- void setColor(int color) { // velmi zjednodusena paleta static float palette[][3]={ {1.0, 1.0, 1.0}, {0.0, 0.0, 1.0}, {0.0, 1.0, 0.0}, {0.0, 1.0, 1.0}, {1.0, 0.0, 0.0}, {1.0, 0.0, 1.0}, {1.0, 1.0, 0.0}, {0.5, 0.5, 0.5}, }; float r, g, b; r=palette[color & 0x07][0]; g=palette[color & 0x07][1]; b=palette[color & 0x07][2]; glColor3f(r, g, b); } // }}} // drawPoint() {{{ //----------------------------------------------------------------------------- // vykresleni bodu //----------------------------------------------------------------------------- void drawPoint(void *entity) { GfxPoint *p=(GfxPoint*)entity; if (colorStyle) setColor(p->color); else setColor(p->layer); glBegin(GL_POINTS); glVertex2d(p->x, p->y); glEnd(); } // }}} // drawLine() {{{ //----------------------------------------------------------------------------- // vykresleni usecky //----------------------------------------------------------------------------- void drawLine(void *entity) { GfxLine *l=(GfxLine*)entity; if (colorStyle) setColor(l->color); else setColor(l->layer); glBegin(GL_LINES); glVertex2d(l->x1, l->y1); glVertex2d(l->x2, l->y2); glEnd(); } // }}} // drawCircle() {{{ //----------------------------------------------------------------------------- // vykresleni kruznice //----------------------------------------------------------------------------- void drawCircle(void *entity) { #define SEGMENTS 100 int i; GfxCircle *c=(GfxCircle*)entity; if (colorStyle) setColor(c->color); else setColor(c->layer); glBegin(GL_LINE_LOOP); for (i=0; ix+c->r*cos(i*6.28/SEGMENTS), c->y+c->r*sin(i*6.28/SEGMENTS)); glEnd(); } // }}} // drawArc() {{{ //----------------------------------------------------------------------------- // vykresleni oblouku //----------------------------------------------------------------------------- void drawArc(void *entity) { #define SEGMENTS_A 50 #ifndef M_PI #define M_PI 3.1415927 #endif float u; float a, b; GfxArc *arc=(GfxArc*)entity; if (colorStyle) setColor(arc->color); else setColor(arc->layer); if (arc->u1 > arc->u2) { a=(arc->u2)*M_PI/180.0+M_PI; b=(arc->u1)*M_PI/180.0+M_PI; } else { a=(arc->u1)*M_PI/180.0; b=(arc->u2)*M_PI/180.0; } glBegin(GL_LINE_STRIP); for (u=a; u<=b; u+=(b-a)/SEGMENTS_A) { glVertex2d(arc->x+arc->r*cos(u), arc->y+arc->r*sin(u)); } glEnd(); } // }}} // drawText() {{{ //----------------------------------------------------------------------------- // vykresleni textu //----------------------------------------------------------------------------- void drawText(void *entity) { char *c; GfxText *t=(GfxText*)entity; if (colorStyle) setColor(t->color); else setColor(t->layer); glPushMatrix(); glTranslatef(t->x, t->y, 0); glScalef(0.01, 0.01, 0.01); for (c=t->str; *c!=0; c++) { glutStrokeCharacter(GLUT_STROKE_ROMAN, *c); } glPopMatrix(); } // }}} // redrawDrawing() {{{ //----------------------------------------------------------------------------- // Prekresleni vektorove kresby //----------------------------------------------------------------------------- void redrawDrawing(double scale, // meritko obrazce double xpos, // posun obrazce double ypos) { Item *item=p_first; float scale2=mouse.ztran0/100.0+1.0; // zmena meritka zadana mysi // posun a zmena meritka kresby glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(xpos, ypos, 0); // posun zadany klavesnici glTranslatef(mouse.xtran0, -mouse.ytran0, 0); // posun zadany mysi // posunuti pocatku (pro zmenu meritka vuci stredu okna // je nutna mala programova uprava) glTranslatef(window.width/2, window.height/2, 0); glScalef(scale, scale, scale); // zmena meritka zadana klavesnici glScalef(scale2, scale2, scale2); // zmena meritka zadana mysi // glScalef(0.1, 0.1, 0.1); glTranslatef(-window.width/2, -window.height/2, 0); // projit celym seznamem a aplikovat v nem ulozene prikazy while (item!=NULL) { Type type=item->type; switch (type) { case T_POINT: drawPoint(item->entity); break; case T_LINE: drawLine(item->entity); break; case T_CIRCLE: drawCircle(item->entity); break; case T_ARC: drawArc(item->entity); break; case T_TEXT: drawText(item->entity); break; default: break; } item=item->next; } } // }}} // onInit() {{{ //----------------------------------------------------------------------------- // Funkce volana pro inicializaci vykreslovani //----------------------------------------------------------------------------- void onInit(void) { glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // barva pozadi glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // mod ulozeni pixelu glPointSize(1.0f); glLineWidth(1.0f); glEnable(GL_POINT_SMOOTH); //glEnable(GL_LINE_SMOOTH); } // }}} // onResize() {{{ //----------------------------------------------------------------------------- // Nastaveni souradneho systemu v zavislosti na velikosti okna //----------------------------------------------------------------------------- void onResize(int w, int h) // argumenty w a h reprezentuji novou velikost okna { glViewport(0, 0, w, h); // viditelna oblast pres cele okno glMatrixMode(GL_PROJECTION); // zacatek modifikace projekcni matice glLoadIdentity(); // vymazani projekcni matice (=identita) glOrtho(0, w, 0, h, -1, 1); // mapovani abstraktnich souradnic do souradnic okna window.width=w; window.height=h; } // }}} // onDisplay() {{{ //----------------------------------------------------------------------------- // Tato callback funkce je zavolana pri kazdem prekresleni okna //----------------------------------------------------------------------------- void onDisplay(void) { glClear(GL_COLOR_BUFFER_BIT); // vymazani vsech bitovych rovin barvoveho bufferu glDrawBuffer(GL_BACK); // pixmapa se bude kreslit do zadniho barvoveho bufferu redrawDrawing(scale, xpos, ypos); glFlush(); // provedeni a vykresleni vsech zmen glutSwapBuffers(); } // }}} // onKeyboard() {{{ //----------------------------------------------------------------------------- // Tato callback funkce je zavolana pri stlaceni ASCII klavesy //----------------------------------------------------------------------------- #ifdef __BORLANDC__ #pragma option -w-par #endif void onKeyboard(unsigned char key, int x, int y) { key=(key>='A' && key<='Z') ? key-'A'+'a': key; if (key>='0' && key<='9') { glutPostRedisplay(); } // nastaveni barvove palety switch (key) { case 27: // pokud byla stlacena klavesa ESC, konec programu case 'q': exit(0); break; // totez co klavesa ESC case 'l': colorStyle=0; glutPostRedisplay(); break; // barvy podle hashe hladiny case 'c': colorStyle=1; glutPostRedisplay(); break; // barvy podle informaci z DXF default: break; } } #ifdef __BORLANDC__ #pragma option -w+par #endif // }}} // onSpecial() {{{ //----------------------------------------------------------------------------- // Tato callback funkce je zavolana pri stlaceni non-ASCII klavesy //----------------------------------------------------------------------------- #ifdef __BORLANDC__ #pragma option -w-par #endif void onSpecial(int key, int x, int y) { // posun kresby a zmena meritka switch (key) { case GLUT_KEY_LEFT: xpos-=25; redraw=1; glutPostRedisplay(); break; case GLUT_KEY_RIGHT: xpos+=25; redraw=1; glutPostRedisplay(); break; case GLUT_KEY_UP: ypos+=25; redraw=1; glutPostRedisplay(); break; case GLUT_KEY_DOWN: ypos-=25; redraw=1; glutPostRedisplay(); break; case GLUT_KEY_PAGE_UP: scale*=1.1; redraw=1; glutPostRedisplay(); break; case GLUT_KEY_PAGE_DOWN: scale/=1.1; redraw=1; glutPostRedisplay(); break; default: break; } } #ifdef __BORLANDC__ #pragma option -w+par #endif // }}} // onMouse() {{{ //----------------------------------------------------------------------------- // Tato callback funkce je zavolana pri stlaceni ci pusteni tlacitka mysi //----------------------------------------------------------------------------- void onMouse(int button, int state, int x, int y) { switch (button) { case GLUT_LEFT_BUTTON: // posun kresby if (state==GLUT_DOWN) { mouse.status=1; mouse.xtran1=x; mouse.ytran1=y; } else { mouse.status=0; mouse.xtran2=mouse.xtran0; mouse.ytran2=mouse.ytran0; } break; case GLUT_RIGHT_BUTTON: // zmena meritka kresby if (state==GLUT_DOWN) { mouse.status=2; mouse.ztran1=y; } else { mouse.status=0; mouse.ztran2=mouse.ztran0; } break; default: break; } } // }}} // onMouseMotion() {{{ //----------------------------------------------------------------------------- // Tato callback funkce je zavolana pri posunu kurzoru mysi //----------------------------------------------------------------------------- void onMouseMotion(int x, int y) { switch (mouse.status) { case 1: // posun kresby mouse.xtran0=mouse.xtran2+x-mouse.xtran1; mouse.ytran0=mouse.ytran2+y-mouse.ytran1; glutPostRedisplay(); break; case 2: // zmena meritka kresby mouse.ztran0=mouse.ztran2+y-mouse.ztran1; glutPostRedisplay(); break; default: break; } } // }}} // main() {{{ //----------------------------------------------------------------------------- // Hlavni funkce konzolove aplikace //----------------------------------------------------------------------------- int main(int argc, char **argv) { glutInit(&argc, argv); // inicializace knihovny GLUT glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); glutCreateWindow(WINDOW_TITLE); // vytvoreni okna pro kresleni glutReshapeWindow(WINDOW_WIDTH, WINDOW_HEIGHT);// zmena velikosti okna glutPositionWindow(100, 100); // pozice leveho horniho rohu okna glutDisplayFunc(onDisplay); // registrace funkce volane pri prekreslovani okna glutReshapeFunc(onResize); // registrace funkce volane pri zmene velikosti okna glutKeyboardFunc(onKeyboard); // registrace funkce volane pri stlaceni klavesy glutSpecialFunc(onSpecial); // registrace funkce volane pri stlaceni specialni klavesy glutMouseFunc(onMouse); // funkce volana pri stlaceni tlacitka mysi glutMotionFunc(onMouseMotion); // funkce volana pri posunu mysi onInit(); // inicializace vykreslovani if (!doConvert(argv[1])) { // nacteni celeho souboru s kresbou puts("Nacteni souboru selhalo!\nUkonceni prohlizece...\n"); return 0; } glutMainLoop(); // nekonecna smycka, kde se volaji zaregistrovane funkce return 0; // navratova hodnota vracena operacnimu systemu } // }}} //----------------------------------------------------------------------------- // finito //----------------------------------------------------------------------------- // vim: foldmethod=marker