Hi all,
I tried to fix a small drawing error (whichend was missing) in
o_pin_end() and stumbled over a failing connection check.
to reproduce the bug:
* draw a net
* draw a pin starting at the middle of the net
--> no connection between the net and the pin.
Guessed bug:
The add_pin_hook can add some objects to the object_tail.
The following connection check fails as it checks a pin attribute, not
the pin itself.
Possible corrections:
* move the add_pin_hook behind the connection checks
or
* save a object pointer to the pin (that's the way I've done it)
In the patch I've outcommented the drawing code too, o_pin_draw() is
used for that part now.
If the patch is ok, I'll clean it up and apply it.
regards
Werner
Index: noweb/o_pin.nw
===================================================================
RCS file: /home/cvspsrv/cvsroot/eda/geda/devel/gschem/noweb/o_pin.nw,v
retrieving revision 1.10
diff -u -r1.10 o_pin.nw
--- noweb/o_pin.nw 25 Feb 2006 15:00:58 -0000 1.10
+++ noweb/o_pin.nw 15 May 2006 19:29:42 -0000
@@ -265,9 +265,9 @@
int x1, y1;
int x2, y2;
int color;
- int size;
+// int size;
GList *other_objects = NULL;
- OBJECT *o_current;
+ OBJECT *o_current, *o_current_pin;
if (w_current->inside_action == 0) {
o_redraw(w_current, w_current->page_current->object_head);
@@ -279,36 +279,36 @@
} else {
color = w_current->override_pin_color;
}
-
- /* removed 3/15 to see if we can get pins to be ortho only */
- /* w_current->last_x = fix_x(w_current, x);
- w_current->last_y = fix_y(w_current, y);*/
-
- size = SCREENabs(w_current, PIN_WIDTH);
- if (w_current->pin_style == THICK ) {
- gdk_gc_set_line_attributes(w_current->xor_gc, size,
- 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_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->pin_style == THICK ) {
- gdk_gc_set_line_attributes(w_current->xor_gc, 0,
- 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);
- }
+//
+// /* removed 3/15 to see if we can get pins to be ortho only */
+// /* w_current->last_x = fix_x(w_current, x);
+// w_current->last_y = fix_y(w_current, y);*/
+//
+// size = SCREENabs(w_current, PIN_WIDTH);
+// if (w_current->pin_style == THICK ) {
+// gdk_gc_set_line_attributes(w_current->xor_gc, size,
+// 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_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->pin_style == THICK ) {
+// gdk_gc_set_line_attributes(w_current->xor_gc, 0,
+// 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);
+// }
/* don't allow zero length pins */
if ( (w_current->start_x == w_current->last_x) &&
@@ -318,19 +318,19 @@
w_current->last_x = (-1);
w_current->last_y = (-1);
return;
- }
-
- gdk_gc_set_foreground(w_current->gc, x_get_color(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);
- gdk_draw_line(w_current->backingstore, w_current->gc, w_current->start_x, w_current->start_y, w_current->last_x, w_current->last_y);
-
- if (w_current->pin_style == THICK ) {
- gdk_gc_set_line_attributes(w_current->gc, 0,
- GDK_LINE_SOLID,
- GDK_CAP_NOT_LAST,
- GDK_JOIN_MITER);
}
+// gdk_gc_set_foreground(w_current->gc, x_get_color(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);
+// gdk_draw_line(w_current->backingstore, w_current->gc, w_current->start_x, w_current->start_y, w_current->last_x, w_current->last_y);
+//
+// if (w_current->pin_style == THICK ) {
+// gdk_gc_set_line_attributes(w_current->gc, 0,
+// GDK_LINE_SOLID,
+// GDK_CAP_NOT_LAST,
+// GDK_JOIN_MITER);
+// }
+
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);
x1 = snap_grid(w_current, x1);
@@ -345,7 +345,9 @@
x1, y1, x2, y2,
PIN_TYPE_NET, 0);
- o_current = w_current->page_current->object_tail;
+
+ o_current = o_current_pin = w_current->page_current->object_tail;
+
if (scm_hook_empty_p(add_pin_hook) == SCM_BOOL_F &&
o_current != NULL) {
scm_run_hook(add_pin_hook,
@@ -353,13 +355,14 @@
SCM_EOL));
}
- other_objects = s_conn_return_others(other_objects,
- w_current->page_current->
- object_tail);
+ other_objects = s_conn_return_others(other_objects, o_current_pin);
+ // w_current->page_current->
+ // object_tail);
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, w_current->page_current->object_tail);
+ o_cue_draw_single(w_current, o_current_pin); //w_current->page_current->object_tail);
+ o_pin_draw(w_current, o_current_pin);
w_current->start_x = (-1);
w_current->start_y = (-1);