Hi David and all, On Saturday 30 April 2005 18:01, David Carr wrote: > I posted the header file: http://oscar.dcarr.org/geda/struct.h > I also posted an update version of the code: > http://oscar.dcarr.org/geda/o_net.c > > Pressing shift (and moving the mouse an insy bit - working on that) > will cause the primary net to become horizontal > and the secondary vertical (and vice-versa).
Very nice feature, it speeds up drawing nets a lot. > There are few redraw buglets left but I'll try to nail all of those > before I actually post some patches. I've put your changes into the noweb file, patch attached. regards Werner
Index: gschem/noweb/o_net.nw =================================================================== RCS file: /home/cvspsrv/cvsroot/eda/geda/devel/gschem/noweb/o_net.nw,v retrieving revision 1.17 diff -u -r1.17 o_net.nw --- gschem/noweb/o_net.nw 4 Feb 2005 04:39:30 -0000 1.17 +++ gschem/noweb/o_net.nw 5 May 2005 09:52:14 -0000 @@ -350,8 +350,11 @@ { int size; - w_current->last_x = w_current->start_x = fix_x(w_current, x); - w_current->last_y = w_current->start_y = fix_y(w_current, y); + /* initalize all parameters used when drawing the new net */ + w_current->last_x = w_current->start_x = w_current->second_x = + fix_x(w_current, x); + w_current->last_y = w_current->start_y = w_current->second_y = + fix_y(w_current, y); #if 0 /* not ready for prime time use, this is the snap any point #if 0 */ int distance1; @@ -470,8 +473,11 @@ { int x1, y1; int x2, y2; + int x3, y3; int color; int size; + int primary_zero_length, secondary_zero_length; + /*int temp_x, temp_y;*/ /* OBJECT *o_current;*/ GList *other_objects = NULL; @@ -499,41 +505,57 @@ gdk_gc_set_foreground(w_current->xor_gc, x_get_darkcolor(w_current->select_color) ); - gdk_draw_line(w_current->window, w_current->xor_gc, - w_current->start_x, w_current->start_y, + + /* Erase primary rubber net line */ + gdk_draw_line(w_current->window, w_current->xor_gc, + w_current->start_x, w_current->start_y, w_current->last_x, w_current->last_y); - if (w_current->net_style == THICK ) { + /* Erase secondary rubber net line */ + gdk_draw_line(w_current->window, w_current->xor_gc, + w_current->last_x, w_current->last_y, + w_current->second_x, w_current->second_y); + + if (w_current->net_style == THICK) { gdk_gc_set_line_attributes(w_current->xor_gc, 0, - GDK_LINE_SOLID, - GDK_CAP_NOT_LAST, - GDK_JOIN_MITER); + GDK_LINE_SOLID, + GDK_CAP_NOT_LAST, GDK_JOIN_MITER); gdk_gc_set_line_attributes(w_current->gc, size, - GDK_LINE_SOLID, - GDK_CAP_NOT_LAST, - GDK_JOIN_MITER); + GDK_LINE_SOLID, + GDK_CAP_NOT_LAST, GDK_JOIN_MITER); } - /* don't allow zero length nets */ - /* this ends the net drawing behavior we want this? hack */ - if ( (w_current->start_x == w_current->last_x) && - (w_current->start_y == w_current->last_y) ) { - w_current->start_x = (-1); - w_current->start_y = (-1); - w_current->last_x = (-1); - w_current->last_y = (-1); - w_current->inside_action=0; - i_set_state(w_current, STARTDRAWNET); - o_net_eraserubber(w_current); - return(FALSE); - } -#if 0 /* not ready for prime time use */ + /* See if either of the nets are zero length. We'll only add */ + /* the non-zero ones */ + primary_zero_length = (w_current->start_x == w_current->last_x) && + (w_current->start_y == w_current->last_y); + + secondary_zero_length = (w_current->last_x == w_current->second_x) && + (w_current->last_y == w_current->second_y); + + /* If both nets are zero length... */ + /* this ends the net drawing behavior we want this? hack */ + if ( primary_zero_length && secondary_zero_length ) { + w_current->start_x = (-1); + w_current->start_y = (-1); + w_current->last_x = (-1); + w_current->last_y = (-1); + w_current->second_x = (-1); + w_current->second_y = (-1); + w_current->inside_action = 0; + i_set_state(w_current, STARTDRAWNET); + o_net_eraserubber(w_current); + + return (FALSE); + } +#if 0 /* not ready for prime time use */ /* second attempt at all snapping */ o_current = o_CONN_search_closest_range(w_current, - w_current->page_current->object_head, - w_current->last_x, w_current->last_y, - &temp_x, &temp_y, 200, NULL, NULL); + w_current->page_current-> + object_head, w_current->last_x, + w_current->last_y, &temp_x, + &temp_y, 200, NULL, NULL); if (o_current) { w_current->last_x = temp_x; @@ -544,78 +566,135 @@ } #endif - SCREENtoWORLD(w_current, w_current->start_x, w_current->start_y, &x1, &y1); + + /* Primary net runs from (x1,y1)-(x2,y2) */ + /* Secondary net from (x2,y2)-(x3,y3) */ + SCREENtoWORLD(w_current, w_current->start_x, w_current->start_y, &x1, + &y1); SCREENtoWORLD(w_current, w_current->last_x, w_current->last_y, &x2, &y2); + SCREENtoWORLD(w_current, w_current->second_x, w_current->second_y, &x3, &y3); + + /* Snap points to closest grid location */ x1 = snap_grid(w_current, x1); y1 = snap_grid(w_current, y1); x2 = snap_grid(w_current, x2); y2 = snap_grid(w_current, y2); + x3 = snap_grid(w_current, x3); + y3 = snap_grid(w_current, y3); - w_current->save_x = w_current->last_x; - w_current->save_y = w_current->last_y; - - - w_current->page_current->object_tail = - new_net = o_net_add(w_current, - w_current->page_current->object_tail, - OBJ_NET, - color, - x1, y1, x2, y2); - - /* conn stuff */ - other_objects = s_conn_return_others(other_objects, - w_current->page_current->object_tail); - - if (o_net_add_busrippers(w_current, new_net, other_objects)) { - g_list_free(other_objects); - other_objects = NULL; - other_objects = s_conn_return_others(other_objects, - new_net); - } + w_current->save_x = w_current->second_x; + w_current->save_y = w_current->second_y; + if (!primary_zero_length ) { + /* create primary net */ + w_current->page_current->object_tail = + new_net = o_net_add(w_current, + w_current->page_current->object_tail, + OBJ_NET, color, x1, y1, x2, y2); + + /* conn stuff */ + /* LEAK CHECK 1 */ + other_objects = s_conn_return_others(other_objects, + w_current->page_current-> + object_tail); + + if (o_net_add_busrippers(w_current, new_net, other_objects)) { + g_list_free(other_objects); + other_objects = NULL; + other_objects = s_conn_return_others(other_objects, new_net); + } #if DEBUG - s_conn_print(new_net->conn_list); + s_conn_print(new_net->conn_list); #endif - gdk_gc_set_foreground(w_current->gc, x_get_color(color)); - gdk_draw_line(w_current->window, w_current->gc, - new_net->line->screen_x[0], new_net->line->screen_y[0], - new_net->line->screen_x[1], new_net->line->screen_y[1]); - gdk_draw_line(w_current->backingstore, w_current->gc, - new_net->line->screen_x[0], new_net->line->screen_y[0], - new_net->line->screen_x[1], new_net->line->screen_y[1]); + gdk_gc_set_foreground(w_current->gc, x_get_color(color)); + gdk_draw_line(w_current->window, w_current->gc, + new_net->line->screen_x[0], new_net->line->screen_y[0], + new_net->line->screen_x[1], new_net->line->screen_y[1]); + gdk_draw_line(w_current->backingstore, w_current->gc, + new_net->line->screen_x[0], new_net->line->screen_y[0], + new_net->line->screen_x[1], new_net->line->screen_y[1]); + + if (w_current->net_style == THICK) { + gdk_gc_set_line_attributes(w_current->gc, 0, + GDK_LINE_SOLID, + GDK_CAP_NOT_LAST, GDK_JOIN_MITER); + } - if (w_current->net_style == THICK) { - gdk_gc_set_line_attributes(w_current->gc, 0, - GDK_LINE_SOLID, - GDK_CAP_NOT_LAST, GDK_JOIN_MITER); + o_cue_undraw_list(w_current, other_objects); + o_cue_draw_list(w_current, other_objects); + o_cue_draw_single(w_current, new_net); + + /* you don't want to consolidate nets which are drawn non-ortho */ + if (w_current->net_consolidate == TRUE && !w_current->CONTROLKEY) { + o_net_consolidate_segments(w_current, new_net); + } } + /* If the second net is not zero length, add it as well */ + if (!secondary_zero_length) { + + /* Add secondary net */ + w_current->page_current->object_tail = + new_net = o_net_add(w_current, + w_current->page_current->object_tail, + OBJ_NET, color, x2, y2, x3, y3); + + /* conn stuff */ + /* LEAK CHECK 2 */ + other_objects = s_conn_return_others(other_objects, + w_current->page_current-> + object_tail); + + if (o_net_add_busrippers(w_current, new_net, other_objects)) { + g_list_free(other_objects); + other_objects = NULL; + other_objects = s_conn_return_others(other_objects, new_net); + } +#if DEBUG + s_conn_print(new_net->conn_list); +#endif - o_cue_undraw_list(w_current, other_objects); - o_cue_draw_list(w_current, other_objects); - g_list_free(other_objects); - o_cue_draw_single(w_current, new_net); + gdk_gc_set_foreground(w_current->gc, x_get_color(color)); + gdk_draw_line(w_current->window, w_current->gc, + new_net->line->screen_x[0], new_net->line->screen_y[0], + new_net->line->screen_x[1], new_net->line->screen_y[1]); + gdk_draw_line(w_current->backingstore, w_current->gc, + new_net->line->screen_x[0], new_net->line->screen_y[0], + new_net->line->screen_x[1], new_net->line->screen_y[1]); + + if (w_current->net_style == THICK) { + gdk_gc_set_line_attributes(w_current->gc, 0, + GDK_LINE_SOLID, + GDK_CAP_NOT_LAST, GDK_JOIN_MITER); + } - /* you don't want to consolidate nets which are drawn non-ortho */ - if (w_current->net_consolidate == TRUE && !w_current->CONTROLKEY) { - o_net_consolidate_segments(w_current, new_net); + o_cue_undraw_list(w_current, other_objects); + o_cue_draw_list(w_current, other_objects); + o_cue_draw_single(w_current, new_net); + + /* you don't want to consolidate nets which are drawn non-ortho */ + if (w_current->net_consolidate == TRUE && !w_current->CONTROLKEY) { + o_net_consolidate_segments(w_current, new_net); + } } + + /* LEAK CHECK 3 */ + g_list_free(other_objects); - w_current->page_current->CHANGED=1; + w_current->page_current->CHANGED = 1; w_current->start_x = w_current->save_x; w_current->start_y = w_current->save_y; o_undo_savestate(w_current, UNDO_ALL); -#if 0 /* a false attempt at ending the rubberbanding.. */ - if (conn_count) - { +#if 0 /* a false attempt at ending the rubberbanding.. */ + if (conn_count) { w_current->inside_action = 0; i_set_state(w_current, STARTDRAWNET); o_net_eraserubber(w_current); } #endif - return(TRUE); + return (TRUE); } @@ -633,58 +712,83 @@ { int diff_x, diff_y; int size; + int ortho; if (w_current->inside_action == 0) { o_redraw(w_current, w_current->page_current->object_head); return; } - if (w_current->net_style == THICK ) { + if (w_current->net_style == THICK) { size = SCREENabs(w_current, NET_WIDTH); gdk_gc_set_line_attributes(w_current->xor_gc, size, - GDK_LINE_SOLID, - GDK_CAP_NOT_LAST, - GDK_JOIN_MITER); + GDK_LINE_SOLID, + GDK_CAP_NOT_LAST, GDK_JOIN_MITER); } + gdk_gc_set_foreground(w_current->xor_gc, + x_get_darkcolor(w_current->select_color)); - gdk_gc_set_foreground(w_current->xor_gc, - x_get_darkcolor(w_current->select_color) ); - gdk_draw_line(w_current->window, w_current->xor_gc, - w_current->start_x, w_current->start_y, - w_current->last_x, w_current->last_y); - - /* going into ortho mode (control key not pressed) */ - /* erase non-ortho line */ + /* Orthognal mode enabled when Control Key is NOT pressed */ + ortho = !w_current->CONTROLKEY; - /* going into non-ortho mode (control key pressed) */ - /* erase ortho line */ + /* Erase primary line */ + gdk_draw_line(w_current->window, w_current->xor_gc, + w_current->start_x, w_current->start_y, + w_current->last_x, w_current->last_y); + /* Erase secondary line*/ + if ( w_current->second_x != -1 && w_current->second_y != -1 ) { + gdk_draw_line(w_current->window, w_current->xor_gc, + w_current->last_x, w_current->last_y, + w_current->second_x, w_current->second_y); + } + + /* In orthogonal mode secondary line is the same as the first */ + if (!ortho) + { + w_current->second_x = w_current->last_x; + w_current->second_y = w_current->last_y; + } w_current->last_x = fix_x(w_current, x); w_current->last_y = fix_y(w_current, y); /* If you press the control key then you can draw non-ortho nets */ - if (!w_current->CONTROLKEY) { + if (ortho) { diff_x = abs(w_current->last_x - w_current->start_x); diff_y = abs(w_current->last_y - w_current->start_y); - if (diff_x >= diff_y) { + /* calculate the co-ordinates necessary to draw the lines*/ + /* Pressing the shift key will cause the vertical and horizontal lines to switch places */ + if ( !w_current->SHIFTKEY ) { w_current->last_y = w_current->start_y; + + w_current->second_x = w_current->last_x; + w_current->second_y = mouse_y; } else { w_current->last_x = w_current->start_x; + + w_current->second_x = mouse_x; + w_current->second_y = w_current->last_y; } } gdk_gc_set_foreground(w_current->xor_gc, - x_get_darkcolor(w_current->select_color) ); - gdk_draw_line(w_current->window, w_current->xor_gc, - w_current->start_x, w_current->start_y, + x_get_darkcolor(w_current->select_color)); + + /* draw primary line */ + gdk_draw_line(w_current->window, w_current->xor_gc, + w_current->start_x, w_current->start_y, w_current->last_x, w_current->last_y); - if (w_current->net_style == THICK ) { + /* Draw secondary line */ + gdk_draw_line(w_current->window, w_current->xor_gc, + w_current->last_x, w_current->last_y, + w_current->second_x, w_current->second_y); + + if (w_current->net_style == THICK) { gdk_gc_set_line_attributes(w_current->xor_gc, 0, - GDK_LINE_SOLID, - GDK_CAP_NOT_LAST, - GDK_JOIN_MITER); + GDK_LINE_SOLID, + GDK_CAP_NOT_LAST, GDK_JOIN_MITER); } } @@ -704,27 +808,33 @@ { int size; - if (w_current->net_style == THICK ) { + if (w_current->net_style == THICK) { size = SCREENabs(w_current, NET_WIDTH); if (size < 0) - size=0; + size = 0; gdk_gc_set_line_attributes(w_current->gc, size, - GDK_LINE_SOLID, - GDK_CAP_NOT_LAST, - GDK_JOIN_MITER); + GDK_LINE_SOLID, + GDK_CAP_NOT_LAST, GDK_JOIN_MITER); } gdk_gc_set_foreground(w_current->gc, - x_get_color(w_current->background_color) ); - gdk_draw_line(w_current->window, w_current->gc, w_current->start_x, w_current->start_y, w_current->last_x, w_current->last_y); + x_get_color(w_current->background_color)); - if (w_current->net_style == THICK ) { + /* Erase primary primary rubber net line */ + gdk_draw_line(w_current->window, w_current->gc, w_current->start_x, + w_current->start_y, w_current->last_x, w_current->last_y); + + /* Erase secondary rubber net line */ + gdk_draw_line(w_current->window, w_current->xor_gc, + w_current->last_x, w_current->last_y, + w_current->second_x, w_current->second_y); + + if (w_current->net_style == THICK) { gdk_gc_set_line_attributes(w_current->gc, 0, - GDK_LINE_SOLID, - GDK_CAP_NOT_LAST, - GDK_JOIN_MITER); + GDK_LINE_SOLID, + GDK_CAP_NOT_LAST, GDK_JOIN_MITER); } } Index: libgeda/include/struct.h =================================================================== RCS file: /home/cvspsrv/cvsroot/eda/geda/devel/libgeda/include/struct.h,v retrieving revision 1.73 diff -u -r1.73 struct.h --- libgeda/include/struct.h 19 Feb 2005 23:27:30 -0000 1.73 +++ libgeda/include/struct.h 5 May 2005 09:52:16 -0000 @@ -446,6 +446,8 @@ int save_y; int last_x; int last_y; + int second_x; + int second_y; int loc_x, loc_y; int distance;