/**************************************************************** Uebungen zur Vorlesung "Graphische Datenverarbeitung" Sommersemester 1996 Programm: planung.c Autor: Xiaowei Xu Programm für Planungssystem. ****************************************************************/ # include # include # include # include # include "Landkarte.h" #define MAX_WIDTH 5069 #define MAX_HIGTH 5069 #define MIN_WIDTH 6 #define MIN_HIGTH 6 #define MAX_INDEX 1000 #define POINT_SIZE 3 #define SEARCH_SIZE 5 #define IN_LINE_LENGTH 100 #define STR_LENGTH 81 #define ABS(a) ((a)<0?-(a):(a)) struct netnode { double x, y; char name [STR_LENGTH]; }; Widget DrawAr; /* Drawing Area */ XtAppContext kontext; /* Applikations-Umgebung */ GC fensterGC, pixmapGC; /* Graphik-Kontext fuer XDrawLine...*/ GC eraseDrawArGC; /* G-Kontext für Abwischen */ GC eraseGraphGC; /* G-Kontext für Abwischen */ Display* display; Pixmap GraphikPixmap = 0; /* Pixmap fuer Graphik */ struct netnode netnodes[MAX_INDEX]; /* Netzknoten */ int index = -1; /* aktuell selektierter Netzknoten */ int maxindex = 0; /* Anzahl von Netzknoten */ int markindex = -1; Widget text_w; /* text Widget fuer Namen von netnode */ char* nname = NULL; static char * fallbackRessourcen [] = { "Planung.geometry: 750x500", "*drawingarea.background: white", "*drawingarea.foreground: black", "*operationsMenue.labelString: Punkte:", "*datei.labelString: Datei", "*datei.mnemonic: D", "*hilfe.labelString: Hilfe", "*hilfe.mnemonic: H", NULL } ; void DrawLandkarte (int n, struct linesegment *segs, double s, Drawable w, GC g) { int i ; for (i=0 ; ievent->xexpose.x, DAinfos->event->xexpose.y, DAinfos->event->xexpose.width, DAinfos->event->xexpose.height, DAinfos->event->xexpose.x, DAinfos->event->xexpose.y); } void update_name ( Widget widget, XtPointer client_data, XtPointer call_data ) { if (index == -1) { printf ("Erst selektieren !\n") ; return ; } if (nname) XtFree (nname) ; nname = XmTextGetString (widget); strncpy (netnodes[index].name, nname, STR_LENGTH - 1); } void get_real_xy (double *x, double *y, double * scale, Widget widget, XmDrawingAreaCallbackStruct* DAinfos) { Dimension w, h; XtVaGetValues (widget, XmNheight, &h, XmNwidth, &w, NULL) ; *scale = (double) ( w < h ) ? h : w; *x = (double) (DAinfos->event->xbutton.x) / *scale ; *y = (double) (DAinfos->event->xbutton.y) / *scale ; } void erase (Widget widget, int x, int y) { DrawKnoten(display, XtWindow(widget), eraseDrawArGC, x, y); DrawKnoten(display, GraphikPixmap, eraseGraphGC, x, y); } void markieren (Widget widget, int x, int y) { String color = "Red"; Colormap cmap = DefaultColormapOfScreen (XtScreen (widget)); XColor col, unused; XAllocNamedColor (display, cmap, color, &col, &unused); XSetForeground (display, fensterGC, col.pixel); XSetForeground (display, pixmapGC, col.pixel); DrawKnoten(display, XtWindow(widget), fensterGC, x, y); DrawKnoten(display, GraphikPixmap, pixmapGC, x, y); XSetForeground (display, fensterGC, 0); XSetForeground (display, pixmapGC, 0); } void demarkieren (Widget widget, int x, int y) { XSetForeground (display, fensterGC, 0); XSetForeground (display, pixmapGC, 0); DrawKnoten(display, XtWindow(widget), fensterGC, x, y); DrawKnoten(display, GraphikPixmap, pixmapGC, x, y); } void plazierenCB (Widget widget, XtPointer clientDaten, XtPointer aufrufDaten) { double scale ; XmDrawingAreaCallbackStruct* DAinfos = (XmDrawingAreaCallbackStruct*) aufrufDaten; if (DAinfos->event->type == ButtonPress && DAinfos->event->xbutton.button == Button1 && maxindex < MAX_INDEX-1) { index = maxindex++ ; get_real_xy (&(netnodes[index].x), &(netnodes[index].y), &scale, widget, DAinfos) ; if (markindex != -1) demarkieren (widget, netnodes[markindex].x *scale, netnodes[markindex].y * scale); markieren (widget, netnodes[index].x *scale, netnodes[index].y * scale); XmTextSetString (text_w, "Name eintragen!"); markindex = index; nname = (char*) NULL ; } } void selektierenCB (Widget widget, XtPointer clientDaten, XtPointer aufrufDaten) { int i ; double x, y, scale ; XmDrawingAreaCallbackStruct* DAinfos = (XmDrawingAreaCallbackStruct*) aufrufDaten; if (DAinfos->event->type == ButtonPress && DAinfos->event->xbutton.button == Button1) { get_real_xy (&x, &y, &scale, widget, DAinfos) ; for (i=0 ; ievent->type == ButtonPress && DAinfos->event->xbutton.button == Button1) { get_real_xy (&x, &y, &scale, widget, DAinfos) ; index = -1 ; for (i=0 ; ievent->type == ButtonRelease && DAinfos->event->xbutton.button == Button1 && index != -1) { get_real_xy (&(netnodes[index].x), &(netnodes[index].y), &scale, widget, DAinfos) ; markieren (widget, netnodes[index].x *scale, netnodes[index].y *scale) ; markindex = index ; XmTextSetString (text_w, netnodes[index].name); } } void LoeschNknoten(int l) { int i; for ( i=l; ievent->type == ButtonPress && DAinfos->event->xbutton.button == Button1) { get_real_xy (&x, &y, &scale, widget, DAinfos) ; for (i=0 ; i MIN_WIDTH ) && ( h > MIN_HIGTH ) ) { XtVaSetValues (DrawAr, XmNx, 0, XmNy, 0, NULL) ; w = (int) w/2; h = (int) h/2; XtVaSetValues (DrawAr, XmNheight, h, XmNwidth, w, NULL) ; initGraphikGC (DrawAr); scale = (double) ( w < h )? w : h ; DrawLandkarte (AnzahlLinien, lines, scale, GraphikPixmap, pixmapGC) ; DrawNetzknoten (scale, GraphikPixmap, pixmapGC) ; if (markindex != -1) markieren (widget, netnodes[markindex].x *scale, netnodes[markindex].y * scale); XClearArea (display, XtWindow (DrawAr), 0, 0, w, h, False) ; } else XtAppWarning (kontext, "lower bound for zoom is reached!"); } void punktOperationenCB ( Widget widget, XtPointer clientDaten, XtPointer aufrufDaten ) { int op_code = (int)clientDaten; XtCallbackRec callbacks[] = { {plazierenCB, (XtPointer) NULL}, {selektierenCB, (XtPointer) NULL}, {verschiebenCB, (XtPointer) NULL}, {loeschenCB, (XtPointer) NULL}, {(XtCallbackProc) NULL, (XtPointer) NULL}, }; switch ( op_code ) { case 1: /* Punkte Plazieren */ XtRemoveCallbacks (DrawAr, XmNinputCallback, callbacks); XtAddCallback (DrawAr, XmNinputCallback, plazierenCB, (XtPointer)NULL); break; case 2: /* Punkte Selektieren */ XtRemoveCallbacks (DrawAr, XmNinputCallback, callbacks); XtAddCallback (DrawAr, XmNinputCallback, selektierenCB, (XtPointer)NULL); break; case 3: /* Punkte Verschieben */ XtRemoveCallbacks (DrawAr, XmNinputCallback, callbacks); XtAddCallback (DrawAr, XmNinputCallback, verschiebenCB, (XtPointer)NULL); break; case 4: /* Punkte Löschen */ XtRemoveCallbacks (DrawAr, XmNinputCallback, callbacks); XtAddCallback (DrawAr, XmNinputCallback, loeschenCB, (XtPointer)NULL); break; default: break; } } void initOperationenMenue ( Widget elternWidget ) { Widget operationenW, obuttonW, operationsMenueW; Arg args[10]; Cardinal n; /* XmPulldownMenu mit Operationen erzeugen */ operationenW = XmCreatePulldownMenu (elternWidget, "operationen", (Arg*)NULL, 0); /* Operation "Plazieren" */ obuttonW = XtCreateManagedWidget ("plazieren", xmPushButtonWidgetClass, operationenW, (Arg*)NULL, 0); XtAddCallback (obuttonW, XmNactivateCallback, punktOperationenCB, (XtPointer)1); /* Operation "Selektieren" */ obuttonW = XtCreateManagedWidget ("selektieren", xmPushButtonWidgetClass, operationenW, (Arg*)NULL, 0); XtAddCallback (obuttonW, XmNactivateCallback, punktOperationenCB, (XtPointer)2); /* Operation "Verschieben" */ obuttonW = XtCreateManagedWidget ("verschieben", xmPushButtonWidgetClass, operationenW, (Arg*)NULL, 0); XtAddCallback (obuttonW, XmNactivateCallback, punktOperationenCB, (XtPointer)3); /* Operation "Löschen" */ obuttonW = XtCreateManagedWidget ("löschen", xmPushButtonWidgetClass, operationenW, (Arg*)NULL, 0); XtAddCallback (obuttonW, XmNactivateCallback, punktOperationenCB, (XtPointer)4); /* XmOperationMenu mit Operationen erzeugen */ n = 0; XtSetArg (args[n], XmNsubMenuId, operationenW); n++; operationsMenueW = XmCreateOptionMenu (elternWidget, "operationsMenue", args, n); XtManageChild (operationsMenueW); } void initZoomButtons ( Widget elternWidget ) { Widget Zoom; Widget ZoomPlus; Widget ZoomMinus; Zoom = XtVaCreateManagedWidget ("Zoom", xmRowColumnWidgetClass, elternWidget, XmNpacking, XmPACK_COLUMN, XmNnumColumns, 3, XmNorientation, XmVERTICAL, NULL); XtVaCreateManagedWidget ("Zoom:", xmLabelGadgetClass, Zoom, NULL); ZoomPlus = XtCreateManagedWidget ("Zoom +",xmPushButtonWidgetClass, Zoom, (Arg*)NULL, 0); ZoomMinus = XtCreateManagedWidget ("Zoom -",xmPushButtonWidgetClass, Zoom, (Arg*)NULL, 0); XtAddCallback (ZoomPlus, XmNactivateCallback, ZoomPlusCB, (XtPointer)NULL); XtAddCallback (ZoomMinus, XmNactivateCallback, ZoomMinusCB, (XtPointer)NULL); } void initTextWidget ( Widget elternWidget ) { Widget knotensname; knotensname = XtVaCreateWidget ("knotensname", xmRowColumnWidgetClass, elternWidget, XmNorientation, XmHORIZONTAL, NULL); XtVaCreateManagedWidget ("Knotensname:", xmLabelGadgetClass, knotensname, NULL); text_w = XtVaCreateManagedWidget ("name", xmTextWidgetClass, knotensname, NULL); XtAddCallback (text_w, XmNvalueChangedCallback, update_name, (XtPointer) NULL); XtManageChild (knotensname); } void initAttributeBoxWidgets (Widget elternWidget) { /* Optionen-Menue fuer die Operationen erzeugen */ initOperationenMenue (elternWidget); XtCreateManagedWidget ("separator", xmSeparatorWidgetClass, elternWidget, (Arg*)NULL, 0); /* Push-Button fuer Zoom erzeugen */ initZoomButtons (elternWidget); XtCreateManagedWidget ("separator", xmSeparatorWidgetClass, elternWidget, (Arg*)NULL, 0); /* Fester fuer die Name eines selektierten Netzknotens erzeugen */ initTextWidget (elternWidget); XtCreateManagedWidget ("separator", xmSeparatorWidgetClass, elternWidget, (Arg*)NULL, 0); } Widget initForm (Widget elternWidget) { Widget formW; Widget dateinameW; Widget attributeBoxW; Widget scrollW; Arg args[10]; Cardinal n; formW = XtCreateManagedWidget ("form", xmFormWidgetClass, elternWidget, (Arg*)NULL, 0); n = 0; XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; attributeBoxW = XtCreateManagedWidget ("attributeBox", xmRowColumnWidgetClass, formW, args, n); initAttributeBoxWidgets (attributeBoxW); n = 0; XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNleftWidget, attributeBoxW); n++; XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNwidth, 500); n++; XtSetArg (args[n], XmNheight, 500); n++; XtSetArg (args[n], XmNscrollingPolicy, XmAUTOMATIC); n++; scrollW = XtCreateManagedWidget ("scrolledGraphik", xmScrolledWindowWidgetClass, formW, args, n); DrawAr = XtVaCreateManagedWidget("drawingarea", xmDrawingAreaWidgetClass, scrollW, XmNwidth, 500, XmNheight, 500, NULL) ; XtAddCallback (DrawAr, XmNexposeCallback, exposeCB, (XtPointer)NULL); XtAddCallback (DrawAr, XmNresizeCallback, resizeCB, (XtPointer)NULL); XtAddCallback (DrawAr, XmNinputCallback, plazierenCB, (XtPointer)NULL); return formW; } void verlassenCB (Widget widget, XtPointer clientDaten, XtPointer aufrufDaten) { /* Programm mit fehlerfreiem Status beenden */ exit (EXIT_SUCCESS); } void initVerlassenButton (Widget elternWidget) { Widget buttonW; /* Menuepunkt 'verlassen' erzeugen */ buttonW = XtCreateManagedWidget ("verlassen", xmPushButtonWidgetClass, elternWidget, (Arg*)NULL, 0); XtAddCallback (buttonW, XmNactivateCallback, verlassenCB, (XtPointer)NULL); } void speichernCB (Widget widget, XtPointer clientDaten, XtPointer aufrufDaten) /* Store the array of netnodes in a file named Netzknoten */ { int i; FILE* outf; outf = fopen("Netzknoten", "w"); if ( outf ) { for ( i=0; i