/* $Log: boundary.c,v $ * Revision 1.5 1995/03/20 14:53:58 martenl * *** empty log message *** * * Revision 1.4 1995/03/12 14:30:22 martenl * Added new types of boundaries * * Revision 1.3 1995/02/23 09:43:33 martenl * minor typographical changes * */ /* C---------------------------------------------------------------------- C /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ C \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ C---------------------------------------------------------------------- C C +------------------------------------+ . C | | / \ C | Author: | | | C | | |.| C | Marten Levenstam | |.| C | Mekanik/Hydromekanik | |:| __ C | Kungliga Tekniska Hogskolan | ,_|:|_, / ) C | S-100 44 Stockholm | (Oo / _I_ C | SWEDEN | +\ \ || __| C | marten@mech.kth.se | \ \||___| C | | \ /.:.\-\ C | \|/ | |.:. /-----\ C +---------------( )------------------+ |___|::oOo::| C (@ @) / |:<_T_>:| C +------o00------( )------00o---------+ |_____\ ::: / C | o | | | \ \:/ C | | | | | | C | what comes free | \ / | \___ C | comes without a guarantee | / | \_____\ C +------------------------------------+ `-' C +----------------------------------------------------------------+ C | | C | THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS | C | OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE | C | IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A | C | PARTICULAR PURPOSE. | C | | C +----------------------------------------------------------------+ C====================================================================== C 4 6 10 20 30 40 50 60 70 C ]|{ | | | | | | | | | | | | |} C====================================================================== */ #include #include #include "libsx.h" #include "globals.h" #include "geodata.h" #include "post.h" #include "crosshair.h" #include "kraftwerk.h" #include "graph.h" #include "grid.h" void deleteEqData(); int thisBoundary = 0; int x1, y1; int xstart, ystart; int xlast, ylast; int mb = 0; PTS_NODE *p0, *p1, *p2, *mv_pts; GEO_NODE *g; void boundaryMoveMouseDown(Widget w, int button, int xp, int yp, void *data); void boundaryMouseMotion(Widget w, int x, int y, void *data) { crossHair(x, y); if(mb == 1){ SetDrawMode(SANE_XOR); myDrawLine(xstart, ystart, xlast, ylast); myDrawLine(xstart, ystart, x, y); SetDrawMode(GXcopy); } xlast = x; ylast = y; } void boundaryMouseUp(Widget w, int button, int x, int y, void *data) { } int isOnPoint(int *x, int *y) { FOR_ALL_POINTS( p1 ){ if( (*x-p1->x)*(*x-p1->x)+(*y-p1->y)*(*y-p1->y) < CLICK_TOL){ *x = p1->x ; *y = p1->y ; return TRUE; } } return FALSE; } void boundaryMouseDown(Widget w, int button, int x, int y, void *data) { int hh=0, ww=0; int n, nb; float xp, yp; xstart = x; ystart = y; xlast = x; ylast = y; if( mb == 0){ n = 0; x1 = x; y1 = y; mb = 1; myDrawFilledBox(x-2,y-2,4,4); pix2phys(x, y, &xp, &yp); g = new_bnd(); g->type = boundaryType; if(isOnPoint(&x, &y) == FALSE){ pix2phys(x, y, &xp, &yp); p1 = add_pnt(xp, yp); p1->x = x; p1->y = y; } p0 = p1; /* new stuff */ } else{ xstart = x; ystart = y; xlast = x; ylast = y; /* Check to see if we have reach the starting point */ if( (x-x1)*(x-x1) + (y-y1)*(y-y1) < CLICK_TOL) { myDrawLine(xstart, ystart, x1, y1); SetButtonUpCB(drawWindow, NULL); SetButtonDownCB(drawWindow, NULL); SetMouseMotionCB(drawWindow, NULL); deleteCrossHair(); mb = 0; state = HAVE_BOUNDARY; SetButtonDownCB(drawWindow, boundaryMouseDown); SetMouseMotionCB(drawWindow, boundaryMouseMotion); add_seg(p1, p0, g); redisplay(w, hh, ww, data); } /* Nope, just another segment */ else{ myDrawLine(xstart, ystart, x, y); myDrawFilledBox(x-2,y-2,4,4); pix2phys(x, y, &xp, &yp); p2 = p1; if(isOnPoint(&x, &y) == FALSE){ pix2phys(x, y, &xp, &yp); p1 = add_pnt(xp, yp); p1->x = x; p1->y = y; add_seg(p2, p1, g); } else{ /* Ok hit an existing point, stop here should only work for internal bnd*/ p1->x = x; p1->y = y; add_seg(p2, p1, g); mb = 0; SetButtonUpCB(drawWindow, NULL); SetButtonDownCB(drawWindow, NULL); SetMouseMotionCB(drawWindow, NULL); deleteCrossHair(); state = HAVE_BOUNDARY; SetButtonDownCB(drawWindow, boundaryMouseDown); SetMouseMotionCB(drawWindow, boundaryMouseMotion); redisplay(w, hh, ww, data); } } } } /* Things to move a boundary point */ void boundaryMoveMouseMotion(Widget w, int xp, int yp, void *data) { crossHair(xp,yp); } void boundaryMoveDrop(Widget w, int xp, int yp, void *data) { int i1, i2; int n; GEO_NODE *g; BND_NODE *s; crossHair(xp,yp); SetDrawMode(SANE_XOR); /* Now find all segments sharing the point that is moved */ FOR_ALL_BOUNDARIES(g){ FOR_ALL_SEGMENTS(g, s){ if( s->seg->pts1 == mv_pts){ myDrawLine(s->seg->pts2->x, s->seg->pts2->y, xlast, ylast); myDrawLine(s->seg->pts2->x, s->seg->pts2->y, xp, yp); } if( s->seg->pts2 == mv_pts){ myDrawLine(s->seg->pts1->x, s->seg->pts1->y, xlast, ylast); myDrawLine(s->seg->pts1->x, s->seg->pts1->y, xp, yp); } } } SetDrawMode(GXcopy); xlast = xp; ylast = yp; } void boundaryMoveMouseUp(Widget w, int button, int xp, int yp, void *data) { int hh=0, ww=0; int n, nb; float x, y; pix2phys(xp, yp, &x, &y); mv_pts->x = xp; mv_pts->y = yp; mv_pts->physicalX = x; mv_pts->physicalY = y; SetDrawMode(GXcopy); myDrawFilledBox(xp-2,yp-2,4,4); SetMouseMotionCB(drawWindow, NULL); SetButtonDownCB(drawWindow, NULL); SetButtonUpCB(drawWindow, NULL ); deleteCrossHair(); state = HAVE_BOUNDARY; redisplay(w, hh, ww, data); SetButtonDownCB(drawWindow, boundaryMoveMouseDown); SetMouseMotionCB(drawWindow, boundaryMoveMouseMotion); } void boundaryMoveMouseDown(Widget w, int button, int xp, int yp, void *data) { int i, j, xs, ys; int n, nb; PTS_NODE *p; crossHair(xp,yp); FOR_ALL_POINTS(p){ xs = p->x; ys = p->y; if( (xp - xs)*(xp - xs) + (yp - ys)*(yp - ys) < CLICK_TOL){ /* * OK user has hit an existing point */ mv_pts = p; xlast = xs; ylast = ys; SetMouseMotionCB(drawWindow, boundaryMoveDrop); SetButtonDownCB(drawWindow, NULL); SetButtonUpCB(drawWindow, boundaryMoveMouseUp ); break; } } } void plotBoundary() { int i,j; int n, nb; int x1, y1; int x2, y2; float xx1, yy1; float xx2, yy2; float xx[2], yy[2]; GEO_NODE *g; BND_NODE *s; PTS_NODE *p; getDrawBox(); FOR_ALL_BOUNDARIES(g){ FOR_ALL_SEGMENTS(g, s){ xx1 = s->seg->pts1->physicalX; yy1 = s->seg->pts1->physicalY; xx2 = s->seg->pts2->physicalX; yy2 = s->seg->pts2->physicalY; phys2pix(&x1, &y1, xx1, yy1); phys2pix(&x2, &y2, xx2, yy2); s->seg->pts1->x = x1; s->seg->pts1->y = y1; s->seg->pts2->x = x2; s->seg->pts2->y = y2; myDrawLine(x1, y1, x2, y2); } } FOR_ALL_POINTS(p) myDrawFilledBox(p->x-2,p->y-2,4,4); }