[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

gEDA-user: Fwd: PCB and short segments



I did not see a reply to this on geda-dev, so I will try geda-user instead...

----------  Forwarded Message  ----------

When you come off of a package whose pins are not on-grid, there is a small
jog in the trace as you step back on grid.  If you try to move the line
including the small segment, the move does the wrong thing.

See the attached image.  The upper line is three segments where the middle
segment has a small jog.  The middle line shows the rubberbanding during the
move.  The bottom line shows that the intended move did not happen.

The problem is that the two long segments touch without the small segment
 that is between them.  So the search finds two segments attached to the long
 segment on the right, instead of just the one short segment.

The attached diff to MoveObjectAndRubberband() in move.c does not fix the
selection process so the rubberbanding still looks wrong, but when you
release the button the move does the right thing: it moves the long segment
on the right, it moves the endpoint of the short segment and it leaves the
long segment on the left alone.

I do not consider diff.txt a patch as much as a workaround.  The real problem
is in the selection code, but we could not figure out a way to change
CheckLinePointForRubberbandConnection() or LookupRubberbandLines() in a way
that would not break other things.

Even this change to move.c has the side effect that if two segments touch
without sharing an endpoint and without having a small segment between them,
a move will move one segment and leave the other one behind.

Regards,
Daniel

-------------------------------------------------------

Attachment: LinesBugReport.jpg
Description: JPEG image

vien@yankee-linux2:~/CvsLayout> diff -wc pcb-20060422/src/move.c pcb-20060422/src/move.c.change
*** pcb-20060422/src/move.c     2006-06-05 12:14:11.000000000 -0700
--- pcb-20060422/src/move.c.change      2006-06-05 11:32:33.000000000 -0700
***************
*** 781,790 ****
--- 781,829 ----
      {
        /* first clear any marks that we made in the line flags */
        CLEAR_FLAG (RUBBERENDFLAG, ptr->Line);
+
+       LineTypePtr lp = (LineTypePtr)Ptr1;
+
+       switch (Type) {
+       case LINE_TYPE:
+       if ((lp->Point1.X == ptr->Line->Point1.X && lp->Point1.Y == ptr->Line->Point1.Y) ||
+           (lp->Point2.X == ptr->Line->Point1.X && lp->Point2.Y == ptr->Line->Point1.Y)) {
+         AddObjectToMoveUndoList (LINEPOINT_TYPE,
+                              ptr->Layer, ptr->Line, &ptr->Line->Point1, DX,
+                              DY);
+         MoveLinePoint (ptr->Layer, ptr->Line, &ptr->Line->Point1);
+       }
+       if ((lp->Point1.X == ptr->Line->Point2.X && lp->Point1.Y == ptr->Line->Point2.Y) ||
+           (lp->Point2.X == ptr->Line->Point2.X && lp->Point2.Y == ptr->Line->Point2.Y)) {
+         AddObjectToMoveUndoList (LINEPOINT_TYPE,
+                              ptr->Layer, ptr->Line, &ptr->Line->Point2, DX,
+                              DY);
+         MoveLinePoint (ptr->Layer, ptr->Line, &ptr->Line->Point2);
+       }
+       break;
+
+       case LINEPOINT_TYPE:
+       if (lp->Point1.X == ptr->Line->Point1.X && lp->Point1.Y == ptr->Line->Point1.Y) {
+         AddObjectToMoveUndoList (LINEPOINT_TYPE,
+                              ptr->Layer, ptr->Line, &ptr->Line->Point1, DX,
+                              DY);
+         MoveLinePoint (ptr->Layer, ptr->Line, &ptr->Line->Point1);
+       }
+       if (lp->Point1.X == ptr->Line->Point2.X && lp->Point1.Y == ptr->Line->Point2.Y) {
+         AddObjectToMoveUndoList (LINEPOINT_TYPE,
+                              ptr->Layer, ptr->Line, &ptr->Line->Point2, DX,
+                              DY);
+         MoveLinePoint (ptr->Layer, ptr->Line, &ptr->Line->Point2);
+       }
+       break;
+
+       default:
        AddObjectToMoveUndoList (LINEPOINT_TYPE,
                               ptr->Layer, ptr->Line, ptr->MovedPoint, DX,
                               DY);
        MoveLinePoint (ptr->Layer, ptr->Line, ptr->MovedPoint);
+       break;
+       }
        Crosshair.AttachedObject.RubberbandN--;
        ptr++;
      }