← Back to team overview

kicad-developers team mailing list archive

Re: [PATCH] Draw items in block move in pcbnew

 

The attached version of the patch adds a checkbox into the block
operation dialog. The user can choose whether the items in the block
are drawn or not during the operation. That should be more suitable
than a compiled-in constant for users with different preferences.
Outline-only behavior is also changed a little. The outline is resized
to selection contents and the cursor is centered within the resized
selection box.

marco
=== modified file 'include/block_commande.h'
--- include/block_commande.h	2009-11-23 20:18:47 +0000
+++ include/block_commande.h	2010-11-07 18:06:06 +0000
@@ -110,6 +110,15 @@
     {
         return m_ItemsSelection.GetCount();
     }
+
+    /** Function SetLastCursorPosition
+     * sets m_BlockLastCursorPosition
+     * @param aPosition = new position
+     **/
+    void SetLastCursorPosition( wxPoint aPosition )
+    {
+        m_BlockLastCursorPosition = aPosition;
+    }
 };
 
 

=== modified file 'pcbnew/block.cpp'
--- pcbnew/block.cpp	2010-10-25 16:14:36 +0000
+++ pcbnew/block.cpp	2010-11-07 18:49:39 +0000
@@ -18,12 +18,24 @@
 
 #include "protos.h"
 
-
-#define BLOCK_COLOR BROWN
-
-
-static void DrawMovingBlockOutlines( WinEDA_DrawPanel* panel, wxDC* DC,
-                                     bool erase );
+#define BLOCK_OUTLINE_COLOR YELLOW
+
+/** Function drawPickedItems
+ * draws items currently selected in a block
+ * @param aPanel = Current draw panel
+ * @param aDC = Current device context
+ * @param aOffset = Drawing offset
+ **/
+static void drawPickedItems( WinEDA_DrawPanel* aPanel, wxDC* aDC,
+                             wxPoint aOffset );
+/** Function drawMovingBlock
+ * handles drawing of a moving block
+ * @param aPanel = Current draw panel
+ * @param aDC = Current device context
+ * @param aErase = Erase block at current position
+ **/
+static void drawMovingBlock( WinEDA_DrawPanel* aPanel, wxDC* aDC,
+                             bool aErase );
 
 
 static bool Block_Include_Modules     = TRUE;
@@ -33,7 +45,7 @@
 static bool Block_Include_Draw_Items  = TRUE;
 static bool Block_Include_Edges_Items = TRUE;
 static bool Block_Include_PcbTextes   = TRUE;
-
+static bool BlockDrawItems            = TRUE;
 
 /************************************/
 /* class WinEDA_ExecBlockCmdFrame */
@@ -51,6 +63,7 @@
     wxCheckBox*          m_Include_Draw_Items;
     wxCheckBox*          m_Include_Edges_Items;
     wxCheckBox*          m_Include_PcbTextes;
+    wxCheckBox*          m_DrawBlockItems;
 
 public:
 
@@ -150,7 +163,7 @@
     fgSizer1->Add( m_Include_Zones, 0, wxALL, 5 );
 
     m_Include_PcbTextes = new wxCheckBox( this, -1,
-                                          _( "Include Text on Copper Layers" ),
+                                          _( "Include Text Items" ),
                                           wxDefaultPosition,
                                           wxDefaultSize, 0 );
     m_Include_PcbTextes->SetValue( Block_Include_PcbTextes );
@@ -169,6 +182,13 @@
     m_Include_Edges_Items->SetValue( Block_Include_Edges_Items );
     fgSizer1->Add( m_Include_Edges_Items, 0, wxALL, 5 );
 
+    m_DrawBlockItems = new wxCheckBox( this, -1,
+                                       _( "Draw Block Items" ),
+                                       wxDefaultPosition,
+                                       wxDefaultSize, 0 );
+    m_DrawBlockItems->SetValue( BlockDrawItems );
+    fgSizer1->Add( m_DrawBlockItems, 0, wxALL, 5 );
+
     /* Sizer 2 creation */
     wxFlexGridSizer* fgSizer2;
     fgSizer2 = new wxFlexGridSizer( 1, 2, 0, 0 );
@@ -212,6 +232,7 @@
     Block_Include_Draw_Items  = m_Include_Draw_Items->GetValue();
     Block_Include_Edges_Items = m_Include_Edges_Items->GetValue();
     Block_Include_PcbTextes   = m_Include_PcbTextes->GetValue();
+    BlockDrawItems            = m_DrawBlockItems->GetValue();
 
     EndModal( 0 );
 }
@@ -328,6 +349,85 @@
 {
     int endcommande = TRUE;
 
+    // If coming here after cancel block, clean up and exit
+    if( GetScreen()->m_BlockLocate.m_State == STATE_NO_BLOCK )
+    {
+        DrawPanel->ManageCurseur = NULL;
+        DrawPanel->ForceCloseManageCurseur = NULL;
+        GetScreen()->m_BlockLocate.m_Flags   = 0;
+        GetScreen()->m_BlockLocate.m_Command = BLOCK_IDLE;
+        GetScreen()->m_BlockLocate.ClearItemsList();
+        DisplayToolMsg( wxEmptyString );
+        return 0;
+    }
+
+    // Show dialog if there are no selected items and
+    // we're not zooming
+    if ( !GetScreen()->m_BlockLocate.GetCount() &&
+         GetScreen()->m_BlockLocate.m_Command != BLOCK_ZOOM )
+    {
+        if( !InstallBlockCmdFrame( this, _( "Block Operation" ) ) )
+        {
+            DrawPanel->ManageCurseur = NULL;
+            DrawPanel->ForceCloseManageCurseur = NULL;
+            GetScreen()->m_BlockLocate.m_Flags   = 0;
+            GetScreen()->m_BlockLocate.m_State   = STATE_NO_BLOCK;
+            GetScreen()->m_BlockLocate.m_Command = BLOCK_IDLE;
+            GetScreen()->m_BlockLocate.ClearItemsList();
+            DisplayToolMsg( wxEmptyString );
+            DrawAndSizingBlockOutlines( DrawPanel, DC, FALSE );
+            return 0;
+        }
+        DrawAndSizingBlockOutlines( DrawPanel, DC, FALSE );
+        Block_SelectItems();
+        // Exit if no items found
+        if( !GetScreen()->m_BlockLocate.GetCount() ) {
+            DrawPanel->ManageCurseur = NULL;
+            DrawPanel->ForceCloseManageCurseur = NULL;
+            GetScreen()->m_BlockLocate.m_Flags   = 0;
+            GetScreen()->m_BlockLocate.m_State   = STATE_NO_BLOCK;
+            GetScreen()->m_BlockLocate.m_Command = BLOCK_IDLE;
+            GetScreen()->m_BlockLocate.ClearItemsList();
+            DisplayToolMsg( wxEmptyString );
+            return 0;
+        }
+        // Move cursor to the center of the smallest rectangle
+        // containing the centers of all selected items.
+        // Also set m_BlockLocate to the size of the rectangle.
+        PICKED_ITEMS_LIST* itemsList = &DrawPanel->GetScreen()->m_BlockLocate.m_ItemsSelection;
+        wxPoint blockCenter;
+        int minX, minY, maxX, maxY;
+        int tempX, tempY;
+        BOARD_ITEM* item = (BOARD_ITEM*) itemsList->GetPickedItem( 0 );
+        minX = item->GetPosition().x;
+        minY = item->GetPosition().y;
+        maxX = minX;
+        maxY = minY;
+        for( unsigned ii = 1; ii < itemsList->GetCount(); ii++ )
+        {
+            item = (BOARD_ITEM*) itemsList->GetPickedItem( ii );
+            tempX = item->GetPosition().x;
+            tempY = item->GetPosition().y;
+            if( tempX > maxX )
+                maxX = tempX;
+            if( tempX < minX )
+                minX = tempX;
+            if( tempY > maxY )
+                maxY = tempY;
+            if( tempY < minY )
+                minY = tempY;
+        }
+        blockCenter.x = ( minX + maxX ) / 2;
+        blockCenter.y = ( minY + maxY ) / 2;
+        DrawPanel->CursorOff( DC );
+        GetScreen()->m_Curseur = blockCenter;
+        GetScreen()->m_BlockLocate.SetLastCursorPosition( blockCenter );
+        GetScreen()->m_BlockLocate.SetOrigin( minX, minY );
+        GetScreen()->m_BlockLocate.SetEnd( maxX, maxY );
+        DrawPanel->MouseToCursorSchema();
+        DrawPanel->CursorOn( DC );
+    }
+
     if( DrawPanel->ManageCurseur )
         switch( GetScreen()->m_BlockLocate.m_Command )
         {
@@ -341,35 +441,25 @@
         case BLOCK_PRESELECT_MOVE:  /* Move with preselection list*/
             GetScreen()->m_BlockLocate.m_State = STATE_BLOCK_MOVE;
             endcommande = FALSE;
-            DrawPanel->ManageCurseur( DrawPanel, DC, FALSE );
-            DrawPanel->ManageCurseur = DrawMovingBlockOutlines;
+            DrawPanel->ManageCurseur = drawMovingBlock;
             DrawPanel->ManageCurseur( DrawPanel, DC, FALSE );
             break;
 
         case BLOCK_DELETE: /* Delete */
-
-            // Turn off the block rectangle now so it is not redisplayed
             DrawPanel->ManageCurseur = NULL;
             GetScreen()->m_BlockLocate.m_State = STATE_BLOCK_STOP;
-            DrawAndSizingBlockOutlines( DrawPanel, DC, FALSE );
             Block_Delete();
             break;
 
         case BLOCK_ROTATE: /* Rotation */
-
-            // Turn off the block rectangle now so it is not redisplayed
             DrawPanel->ManageCurseur = NULL;
             GetScreen()->m_BlockLocate.m_State = STATE_BLOCK_STOP;
-            DrawAndSizingBlockOutlines( DrawPanel, DC, FALSE );
             Block_Rotate();
             break;
 
         case BLOCK_FLIP: /* Flip */
-
-            // Turn off the block rectangle now so it is not redisplayed
             DrawPanel->ManageCurseur = NULL;
             GetScreen()->m_BlockLocate.m_State = STATE_BLOCK_STOP;
-            DrawAndSizingBlockOutlines( DrawPanel, DC, FALSE );
             Block_Flip();
             break;
 
@@ -377,8 +467,6 @@
             GetScreen()->m_BlockLocate.m_State = STATE_BLOCK_STOP;
             if( GetScreen()->m_BlockLocate.GetCount() )
             {
-                DrawAndSizingBlockOutlines( DrawPanel, DC, FALSE );
-
 // TODO (if useful)         Save_Block( );
             }
             break;
@@ -553,49 +641,108 @@
     }
  }
 
-
-/* Traces the outline of the block structures during move.
- */
-static void DrawMovingBlockOutlines( WinEDA_DrawPanel* panel, wxDC* DC,
-                                     bool erase )
-{
-    int          Color;
-    BASE_SCREEN* screen = panel->GetScreen();
-
-    Color = YELLOW;
-
-    if( erase )
-    {
-        screen->m_BlockLocate.Draw( panel, DC, wxPoint( 0, 0 ), g_XorMode,
-                                    Color );
+static void drawPickedItems( WinEDA_DrawPanel* aPanel, wxDC* aDC,
+                             wxPoint aOffset )
+{
+    PICKED_ITEMS_LIST* itemsList = &aPanel->GetScreen()->m_BlockLocate.m_ItemsSelection;
+    WinEDA_BasePcbFrame* frame = (WinEDA_BasePcbFrame*) aPanel->GetParent();
+    g_Offset_Module = -aOffset;
+    for( unsigned ii = 0; ii < itemsList->GetCount(); ii++ )
+    {
+        BOARD_ITEM* item = (BOARD_ITEM*) itemsList->GetPickedItem( ii );
+        switch( item->Type() )
+        {
+        case TYPE_MODULE:
+        {
+            MODULE* module = (MODULE*) item;
+            frame->GetBoard()->m_Status_Pcb &= ~RATSNEST_ITEM_LOCAL_OK;
+            DrawModuleOutlines( aPanel, aDC, module );
+            break;
+        }
+        case TYPE_DRAWSEGMENT:
+        {
+            DRAWSEGMENT* segment = (DRAWSEGMENT*) item;
+            segment->Draw( aPanel, aDC, GR_XOR, aOffset );
+            break;
+        }
+        case TYPE_TEXTE:
+        {
+            TEXTE_PCB* text = (TEXTE_PCB*) item;
+            text->Draw( aPanel, aDC, GR_XOR, aOffset );
+            break;
+        }
+        case TYPE_TRACK:
+        case TYPE_VIA:
+        {
+            TRACK* track = (TRACK*) item;
+            track->Draw( aPanel, aDC, GR_XOR, aOffset );
+            break;
+        }
+        case TYPE_MIRE:
+        {
+            MIREPCB* mire = (MIREPCB*) item;
+            mire->Draw( aPanel, aDC, GR_XOR, aOffset );
+            break;
+        }
+        case TYPE_DIMENSION:
+        {
+            DIMENSION* dimension = (DIMENSION*) item;
+            dimension->Draw( aPanel, aDC, GR_XOR, aOffset );
+            break;
+        }
+        case TYPE_ZONE_CONTAINER:
+        {
+            ZONE_CONTAINER* zoneContainer = (ZONE_CONTAINER*) item;
+            zoneContainer->Draw( aPanel, aDC, GR_XOR, aOffset );
+            zoneContainer->DrawFilledArea( aPanel, aDC, GR_XOR, aOffset );
+            break;
+        }
+        // Currently markers are not affected by block commands
+        case TYPE_MARKER_PCB:
+        {
+            MARKER_PCB* pcbMarker = (MARKER_PCB*) item;
+            pcbMarker->Draw( aPanel, aDC, GR_XOR, aOffset );
+            break;
+        }
+        }
+    }
+    g_Offset_Module = wxPoint( 0, 0 );
+}
+
+static void drawMovingBlock( WinEDA_DrawPanel* aPanel, wxDC* aDC,
+                             bool aErase )
+{
+    BASE_SCREEN* screen = aPanel->GetScreen();
+
+    if( aErase )
+    {
         if( screen->m_BlockLocate.m_MoveVector.x
             || screen->m_BlockLocate.m_MoveVector.y )
         {
-            screen->m_BlockLocate.Draw( panel,
-                                        DC,
-                                        screen->m_BlockLocate.m_MoveVector,
-                                        g_XorMode,
-                                        Color );
+            if( !BlockDrawItems )
+                screen->m_BlockLocate.Draw( aPanel, aDC, screen->m_BlockLocate.m_MoveVector,
+                                            GR_XOR, BLOCK_OUTLINE_COLOR );
+            else
+                drawPickedItems( aPanel, aDC, screen->m_BlockLocate.m_MoveVector );
         }
     }
 
     if( screen->m_BlockLocate.m_State != STATE_BLOCK_STOP )
     {
         screen->m_BlockLocate.m_MoveVector.x = screen->m_Curseur.x -
-                                               screen->m_BlockLocate.GetRight();
+                                               screen->m_BlockLocate.m_BlockLastCursorPosition.x;
         screen->m_BlockLocate.m_MoveVector.y = screen->m_Curseur.y -
-                                               screen->m_BlockLocate.GetBottom();
+                                               screen->m_BlockLocate.m_BlockLastCursorPosition.y;
     }
 
-    screen->m_BlockLocate.Draw( panel, DC, wxPoint( 0, 0 ), g_XorMode, Color );
     if( screen->m_BlockLocate.m_MoveVector.x
         || screen->m_BlockLocate.m_MoveVector.y )
     {
-        screen->m_BlockLocate.Draw( panel,
-                                    DC,
-                                    screen->m_BlockLocate.m_MoveVector,
-                                    g_XorMode,
-                                    Color );
+            if( !BlockDrawItems )
+                screen->m_BlockLocate.Draw( aPanel, aDC, screen->m_BlockLocate.m_MoveVector,
+                                            GR_XOR, BLOCK_OUTLINE_COLOR );
+            else
+                drawPickedItems( aPanel, aDC, screen->m_BlockLocate.m_MoveVector );
     }
 }
 
@@ -605,13 +752,6 @@
  */
 void WinEDA_PcbFrame::Block_Delete()
 {
-    if( !InstallBlockCmdFrame( this, _( "Delete Block" ) ) )
-        return;
-
-    Block_SelectItems();
-    if( GetScreen()->m_BlockLocate.GetCount() == 0 )
-        return;
-
     OnModify();
     SetCurItem( NULL );
 
@@ -681,13 +821,6 @@
     wxPoint centre;         // rotation cent-re for the rotation transform
     int rotAngle = 900;     // rotation angle in 0.1 deg.
 
-    if( !InstallBlockCmdFrame( this, _( "Rotate Block" ) ) )
-        return;
-
-    Block_SelectItems();
-    if( GetScreen()->m_BlockLocate.GetCount() == 0 )
-        return;
-
     oldpos = GetScreen()->m_Curseur;
     centre = GetScreen()->m_BlockLocate.Centre();
 
@@ -753,13 +886,6 @@
     wxPoint memo;
     wxPoint center; /* Position of the axis for inversion of all elements */
 
-    if( !InstallBlockCmdFrame( this, _( "Flip Block" ) ) )
-        return;
-
-    Block_SelectItems();
-    if( GetScreen()->m_BlockLocate.GetCount() == 0 )
-        return;
-
     OnModify();
 
     PICKED_ITEMS_LIST* itemsList = &GetScreen()->m_BlockLocate.m_ItemsSelection;
@@ -823,13 +949,6 @@
  */
 void WinEDA_PcbFrame::Block_Move()
 {
-    if( !InstallBlockCmdFrame( this, _( "Move Block" ) ) )
-        return;
-
-    Block_SelectItems();
-    if( GetScreen()->m_BlockLocate.GetCount() == 0 )
-        return;
-
     OnModify();
 
     wxPoint MoveVector = GetScreen()->m_BlockLocate.m_MoveVector;
@@ -893,13 +1012,6 @@
 {
     wxPoint MoveVector = GetScreen()->m_BlockLocate.m_MoveVector;
 
-    if( !InstallBlockCmdFrame( this, _( "Copy Block" ) ) )
-        return;
-
-    Block_SelectItems();
-    if( GetScreen()->m_BlockLocate.GetCount() == 0 )
-        return;
-
     OnModify();
 
     PICKED_ITEMS_LIST* itemsList = &GetScreen()->m_BlockLocate.m_ItemsSelection;

=== modified file 'pcbnew/class_dimension.cpp'
--- pcbnew/class_dimension.cpp	2010-05-02 19:35:46 +0000
+++ pcbnew/class_dimension.cpp	2010-11-07 18:06:06 +0000
@@ -532,8 +532,8 @@
 {
     int ox, oy, typeaff, width, gcolor;
 
-    ox = offset.x;
-    oy = offset.y;
+    ox = -offset.x;
+    oy = -offset.y;
 
     m_Text->Draw( panel, DC, mode_color, offset );
 

=== modified file 'pcbnew/class_drawsegment.cpp'
--- pcbnew/class_drawsegment.cpp	2010-10-25 07:43:50 +0000
+++ pcbnew/class_drawsegment.cpp	2010-11-07 18:06:06 +0000
@@ -229,7 +229,7 @@
 
 
 void DRAWSEGMENT::Draw( WinEDA_DrawPanel* panel, wxDC* DC,
-                        int draw_mode, const wxPoint& notUsed )
+                        int draw_mode, const wxPoint& aOffset )
 {
     int ux0, uy0, dx, dy;
     int l_piste;
@@ -246,12 +246,12 @@
     l_piste = m_Width >> 1;  /* half trace width */
 
     // Line start point or Circle and Arc center
-    ux0 = m_Start.x;
-    uy0 = m_Start.y;
+    ux0 = m_Start.x + aOffset.x;
+    uy0 = m_Start.y + aOffset.y;
 
     // Line end point or circle and arc start point
-    dx = m_End.x;
-    dy = m_End.y;
+    dx = m_End.x + aOffset.x;
+    dy = m_End.y + aOffset.y;
 
     mode = DisplayOpt.DisplayDrawItems;
     if( m_Flags & FORCE_SKETCH )

=== modified file 'pcbnew/class_drawsegment.h'
--- pcbnew/class_drawsegment.h	2010-10-25 07:43:50 +0000
+++ pcbnew/class_drawsegment.h	2010-11-07 18:06:06 +0000
@@ -65,7 +65,7 @@
 
 
     void         Draw( WinEDA_DrawPanel* panel, wxDC* DC,
-                       int aDrawMode, const wxPoint& offset = ZeroOffset );
+                       int aDrawMode, const wxPoint& aOffset = ZeroOffset );
 
     /**
      * Function DisplayInfo

=== modified file 'pcbnew/class_track.cpp'
--- pcbnew/class_track.cpp	2010-10-16 14:51:22 +0000
+++ pcbnew/class_track.cpp	2010-11-07 18:06:06 +0000
@@ -554,7 +554,8 @@
 
 
 /*********************************************************************/
-void TRACK::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int draw_mode, const wxPoint& notUsed )
+void TRACK::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int draw_mode,
+                  const wxPoint& aOffset )
 /*********************************************************************/
 {
     int l_piste;
@@ -610,7 +611,8 @@
         if( panel->GetScreen()->Scale( l_piste ) < L_MIN_DESSIN )
 #endif
         {
-            GRCircle( &panel->m_ClipBox, DC, m_Start.x, m_Start.y, rayon, color );
+            GRCircle( &panel->m_ClipBox, DC, m_Start.x + aOffset.x,
+                      m_Start.y + aOffset.y, rayon, color );
         }
         else
         {
@@ -621,16 +623,20 @@
             if( panel->GetScreen()->Scale( l_piste ) <= 1 ) /* Sketch mode if l_piste/zoom <= 1 */
 #endif
             {
-                GRCircle( &panel->m_ClipBox, DC, m_Start.x, m_Start.y, rayon, color );
+                GRCircle( &panel->m_ClipBox, DC, m_Start.x + aOffset.x,
+                          m_Start.y + aOffset.y, rayon, color );
             }
             else if( ( !DisplayOpt.DisplayPcbTrackFill) || GetState( FORCE_SKETCH ) )
             {
-                GRCircle( &panel->m_ClipBox, DC, m_Start.x, m_Start.y, rayon - l_piste, color );
-                GRCircle( &panel->m_ClipBox, DC, m_Start.x, m_Start.y, rayon + l_piste, color );
+                GRCircle( &panel->m_ClipBox, DC, m_Start.x + aOffset.x,
+                          m_Start.y + aOffset.y, rayon - l_piste, color );
+                GRCircle( &panel->m_ClipBox, DC, m_Start.x + aOffset.x,
+                          m_Start.y + aOffset.y, rayon + l_piste, color );
             }
             else
             {
-                GRCircle( &panel->m_ClipBox, DC, m_Start.x, m_Start.y, rayon,
+                GRCircle( &panel->m_ClipBox, DC, m_Start.x + aOffset.x,
+                          m_Start.y + aOffset.y, rayon,
                           m_Width, color );
             }
         }
@@ -643,20 +649,23 @@
     if( panel->GetScreen()->Scale( l_piste ) < L_MIN_DESSIN )
 #endif
     {
-        GRLine( &panel->m_ClipBox, DC, m_Start.x, m_Start.y,
-                m_End.x, m_End.y, 0, color );
+        GRLine( &panel->m_ClipBox, DC, m_Start.x + aOffset.x,
+                m_Start.y + aOffset.y,
+                m_End.x + aOffset.x, m_End.y + aOffset.y, 0, color );
         return;
     }
 
     if( !DisplayOpt.DisplayPcbTrackFill || GetState( FORCE_SKETCH ) )
     {
-        GRCSegm( &panel->m_ClipBox, DC, m_Start.x, m_Start.y,
-                 m_End.x, m_End.y, m_Width, color );
+        GRCSegm( &panel->m_ClipBox, DC, m_Start.x + aOffset.x,
+                 m_Start.y + aOffset.y,
+                 m_End.x + aOffset.x, m_End.y + aOffset.y, m_Width, color );
     }
     else
     {
-        GRFillCSegm( &panel->m_ClipBox, DC, m_Start.x, m_Start.y,
-                     m_End.x, m_End.y, m_Width, color );
+        GRFillCSegm( &panel->m_ClipBox, DC, m_Start.x + aOffset.x,
+                     m_Start.y + aOffset.y,
+                     m_End.x + aOffset.x, m_End.y + aOffset.y, m_Width, color );
     }
 
     if( panel->GetScreen()->m_IsPrinting )
@@ -665,8 +674,9 @@
     // Show clearance for tracks, not for zone segments
     if( ShowClearance( this ) )
     {
-        GRCSegm( &panel->m_ClipBox, DC, m_Start.x, m_Start.y,
-                 m_End.x, m_End.y,
+        GRCSegm( &panel->m_ClipBox, DC, m_Start.x + aOffset.x,
+                 m_Start.y + aOffset.y,
+                 m_End.x + aOffset.x, m_End.y + aOffset.y,
                  m_Width + (GetClearance() * 2), color );
     }
 
@@ -683,10 +693,12 @@
         return;
 
     #define THRESHOLD 10
-    if( (m_End.x - m_Start.x) != 0 &&  (m_End.y - m_Start.y) != 0 )
+    if( (m_End.x - m_Start.x) != 0
+        &&  (m_End.y - m_Start.y) != 0 )
         return;
 
-    int len = ABS( (m_End.x - m_Start.x) + (m_End.y - m_Start.y) );
+    int len = ABS( (m_End.x - m_Start.x)
+                   + (m_End.y - m_Start.y) );
 
     if( len < THRESHOLD * m_Width )
         return;
@@ -738,7 +750,8 @@
 
 
 /*******************************************************************************************/
-void SEGVIA::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int draw_mode, const wxPoint& notUsed )
+void SEGVIA::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int draw_mode,
+                   const wxPoint& aOffset )
 /*******************************************************************************************/
 {
     int color;
@@ -811,14 +824,17 @@
     }
 
     if( fillvia )
-        GRFilledCircle( &panel->m_ClipBox, DC, m_Start.x, m_Start.y, rayon, 0, color, color );
+        GRFilledCircle( &panel->m_ClipBox, DC, m_Start.x + aOffset.x,
+                        m_Start.y + aOffset.y, rayon, 0, color, color );
 
     else
     {
-        GRCircle( &panel->m_ClipBox, DC, m_Start.x, m_Start.y, rayon, color );
+        GRCircle( &panel->m_ClipBox, DC, m_Start.x + aOffset.x,
+                  m_Start.y + aOffset.y, rayon, color );
         if ( fast_draw )
             return;
-        GRCircle( &panel->m_ClipBox, DC, m_Start.x, m_Start.y,
+        GRCircle( &panel->m_ClipBox, DC, m_Start.x + aOffset.x,
+                  m_Start.y + aOffset.y,
                   inner_rayon, color );
     }
 
@@ -850,8 +866,8 @@
 #else
                 if( screen->Scale( drill_rayon ) > 1 )     /* draw hole if its size is enought */
 #endif
-                    GRFilledCircle( &panel->m_ClipBox, DC, m_Start.x,
-                                    m_Start.y, drill_rayon, 0, color, color );
+                    GRFilledCircle( &panel->m_ClipBox, DC, m_Start.x + aOffset.x,
+                                    m_Start.y + aOffset.y, drill_rayon, 0, color, color );
 
                 if( screen->m_IsPrinting )
                     GRForceBlackPen( blackpenstate );
@@ -859,14 +875,16 @@
             else
             {
                 if( drill_rayon < inner_rayon )         // We can show the via hole
-                    GRCircle( &panel->m_ClipBox, DC, m_Start.x, m_Start.y,
+                    GRCircle( &panel->m_ClipBox, DC, m_Start.x + aOffset.x,
+                              m_Start.y + aOffset.y,
                               drill_rayon, color );
             }
         }
     }
 
     if( DisplayOpt.ShowTrackClearanceMode == SHOW_CLEARANCE_ALWAYS )
-        GRCircle( &panel->m_ClipBox, DC, m_Start.x, m_Start.y,
+        GRCircle( &panel->m_ClipBox, DC, m_Start.x + aOffset.x,
+                  m_Start.y + aOffset.y,
                   rayon + GetClearance(), color );
 
     // for Micro Vias, draw a partial cross :
@@ -888,16 +906,24 @@
         }
 
         /* lines | or \ */
-        GRLine( &panel->m_ClipBox, DC, m_Start.x - ax, m_Start.y - ay,
-                m_Start.x - bx, m_Start.y - by, 0, color );
-        GRLine( &panel->m_ClipBox, DC, m_Start.x + bx, m_Start.y + by,
-                m_Start.x + ax, m_Start.y + ay, 0, color );
+        GRLine( &panel->m_ClipBox, DC, m_Start.x + aOffset.x - ax,
+                m_Start.y + aOffset.y - ay,
+                m_Start.x + aOffset.x - bx,
+                m_Start.y + aOffset.y - by, 0, color );
+        GRLine( &panel->m_ClipBox, DC, m_Start.x + aOffset.x + bx,
+                m_Start.y + aOffset.y + by,
+                m_Start.x + aOffset.x + ax,
+                m_Start.y + aOffset.y + ay, 0, color );
 
         /* lines - or / */
-        GRLine( &panel->m_ClipBox, DC, m_Start.x + ay, m_Start.y - ax,
-                m_Start.x + by, m_Start.y - bx, 0, color );
-        GRLine( &panel->m_ClipBox, DC, m_Start.x - by, m_Start.y + bx,
-                m_Start.x - ay, m_Start.y + ax, 0, color );
+        GRLine( &panel->m_ClipBox, DC, m_Start.x + aOffset.x + ay,
+                m_Start.y + aOffset.y - ax,
+                m_Start.x + aOffset.x + by,
+                m_Start.y + aOffset.y - bx, 0, color );
+        GRLine( &panel->m_ClipBox, DC, m_Start.x + aOffset.x - by,
+                m_Start.y + aOffset.y + bx,
+                m_Start.x + aOffset.x - ay,
+                m_Start.y + aOffset.y + ax, 0, color );
     }
 
     // for Buried Vias, draw a partial line :
@@ -913,15 +939,19 @@
         /* lines for the top layer */
         RotatePoint( &ax, &ay, layer_top * 3600 / brd->GetCopperLayerCount( ) );
         RotatePoint( &bx, &by, layer_top * 3600 / brd->GetCopperLayerCount( ) );
-        GRLine( &panel->m_ClipBox, DC, m_Start.x - ax, m_Start.y - ay,
-                m_Start.x - bx, m_Start.y - by, 0, color );
+        GRLine( &panel->m_ClipBox, DC, m_Start.x + aOffset.x - ax,
+                m_Start.y + aOffset.y - ay,
+                m_Start.x + aOffset.x - bx,
+                m_Start.y + aOffset.y - by, 0, color );
 
         /* lines for the bottom layer */
         ax = 0; ay = rayon; bx = 0; by = drill_rayon;
         RotatePoint( &ax, &ay, layer_bottom * 3600 / brd->GetCopperLayerCount( ) );
         RotatePoint( &bx, &by, layer_bottom * 3600 / brd->GetCopperLayerCount( ) );
-        GRLine( &panel->m_ClipBox, DC, m_Start.x - ax, m_Start.y - ay,
-                m_Start.x - bx, m_Start.y - by, 0, color );
+        GRLine( &panel->m_ClipBox, DC, m_Start.x + aOffset.x - ax,
+                m_Start.y + aOffset.y - ay,
+                m_Start.x + aOffset.x - bx,
+                m_Start.y + aOffset.y - by, 0, color );
     }
 
     // Display the short netname:

=== modified file 'pcbnew/class_track.h'
--- pcbnew/class_track.h	2010-04-08 11:33:43 +0000
+++ pcbnew/class_track.h	2010-11-07 18:06:07 +0000
@@ -144,7 +144,7 @@
 
 
     /* Display on screen: */
-    void    Draw( WinEDA_DrawPanel* panel, wxDC* DC, int aDrawMode, const wxPoint& offset = ZeroOffset );
+    void    Draw( WinEDA_DrawPanel* panel, wxDC* DC, int aDrawMode, const wxPoint& aOffset = ZeroOffset );
 
     /* divers */
     int Shape() const { return m_Shape & 0xFF; }
@@ -341,7 +341,7 @@
     }
 
 
-    void    Draw( WinEDA_DrawPanel* panel, wxDC* DC, int aDrawMode, const wxPoint& offset = ZeroOffset );
+    void    Draw( WinEDA_DrawPanel* panel, wxDC* DC, int aDrawMode, const wxPoint& aOffset = ZeroOffset );
 
 
     /**


Follow ups

References