From 6f7209aa734c53541cae0f79dcce8f9d57ed70b7 Mon Sep 17 00:00:00 2001
From: dickelbeck <Unknown>
Date: Mon, 6 Aug 2007 20:26:59 +0000
Subject: [PATCH] start of new search stuff, beautification

---
 change_log.txt            |   6 +
 common/base_struct.cpp    |  38 ++-
 include/base_struct.h     | 101 ++++++
 include/pcbstruct.h       |  10 +
 pcbnew/class_board.cpp    |  58 ++++
 pcbnew/class_edge_mod.cpp | 669 ++++++++++++++++++++------------------
 pcbnew/class_edge_mod.h   |  72 ++--
 pcbnew/class_module.cpp   |  76 ++++-
 pcbnew/class_module.h     |  18 +
 pcbnew/class_pad.h        | 139 ++++----
 pcbnew/class_text_mod.cpp |  20 ++
 pcbnew/class_text_mod.h   |  12 +
 pcbnew/locate.cpp         |   7 +-
 13 files changed, 805 insertions(+), 421 deletions(-)

diff --git a/change_log.txt b/change_log.txt
index fe586f6136..0f1cb4f18e 100644
--- a/change_log.txt
+++ b/change_log.txt
@@ -5,6 +5,12 @@ Please add newer entries at the top, list the date and your name with
 email address.
 
 
+2007-Aug-06 UPDATE   Dick Hollenbeck <dick@softplc.com>
+================================================================================
++ pcbnew & common
+    Started sketching out a new search architecture.  To learn more:
+    look for "INSPECTOR" text in base_struct.h. 
+    
 
 2007-Aug-05 UPDATE   Dick Hollenbeck <dick@softplc.com>
 ================================================================================
diff --git a/common/base_struct.cpp b/common/base_struct.cpp
index 53c10e882a..4abb41d002 100644
--- a/common/base_struct.cpp
+++ b/common/base_struct.cpp
@@ -224,10 +224,46 @@ void EDA_BaseStruct::Show( int nestLevel, std::ostream& os )
 std::ostream& EDA_BaseStruct::NestedSpace( int nestLevel, std::ostream& os )
 {
     for( int i=0; i<nestLevel; ++i )
-        os << ' ';      // number of spaces here controls indent per nest level
+        os << "  ";      // number of spaces here controls indent per nest level
     return os;
 }
 
+
+// see base_struct.h
+SEARCH_RESULT EDA_BaseStruct::IterateForward( EDA_BaseStruct* listStart, 
+    INSPECTOR* inspector, void* testData, const KICAD_T scanTypes[] )
+{
+    EDA_BaseStruct* p = listStart;
+    for( ; p; p = p->Pnext )
+    {
+        if( SEARCH_QUIT == p->Traverse( inspector, testData, scanTypes ) )
+            return SEARCH_QUIT;
+    }
+
+    return SEARCH_CONTINUE;
+}
+
+
+// see base_struct.h
+SEARCH_RESULT EDA_BaseStruct::Traverse( INSPECTOR* inspector, void* testData, 
+        const KICAD_T scanTypes[] )
+{
+    KICAD_T     stype;
+    
+    for( const KICAD_T* p = scanTypes;  (stype=*p) != EOT;   ++p )
+    {
+        // If caller wants to inspect my type
+        if( stype == m_StructType )
+        {
+            if( SEARCH_QUIT == inspector->Inspect( this, testData ) )
+                return SEARCH_QUIT;
+
+            break;
+        }
+    }
+
+    return SEARCH_CONTINUE;    
+}
 #endif
 
 
diff --git a/include/base_struct.h b/include/base_struct.h
index 7968152e68..31f8f61305 100644
--- a/include/base_struct.h
+++ b/include/base_struct.h
@@ -13,6 +13,9 @@
 
 /* Id for class identification, at run time */
 enum DrawStructureType {
+
+    EOT = 0,                // search types array terminator (End Of Types)
+    
     TYPE_NOT_INIT = 0,
     TYPEPCB,
 
@@ -70,6 +73,49 @@ enum DrawStructureType {
 };
 
 
+#if defined(DEBUG)      // new searching technique incubator 
+enum SEARCH_RESULT {
+    SEARCH_QUIT,
+    SEARCH_CONTINUE
+};    
+
+typedef DrawStructureType   KICAD_T;    // shorter name
+
+class EDA_BaseStruct;
+
+
+/**
+ * Class INSPECTOR
+ * is an abstract class that is used to inspect and possibly collect the 
+ * (search) results of Iterating over a list or tree of KICAD_T objects.
+ * Extend from this class and implment the Inspect function and provide for
+ * a way for the extension to collect the results of the search/scan data and
+ * provide them to the caller.
+ */
+class INSPECTOR
+{
+public:
+    virtual ~INSPECTOR() {}
+
+    /**
+     * Function Inspect
+     * is the function type that can be passed to the Iterate function,
+     * used primarily for searching, but not exclusively.
+     * @param testData is arbitrary data needed by the inspector to determine
+     *   if the EDA_BaseStruct under test meets its match criteria.
+     * @return SEARCH_RESULT - SEARCH_QUIT if the Iterator is to stop the scan,
+     *   else SCAN_CONTINUE;
+     */ 
+    SEARCH_RESULT virtual Inspect( EDA_BaseStruct* testItem, 
+        void* testData ) = 0;
+    
+    // derived classes add more functions for collecting and subsequent 
+    // retrieval here.
+};
+
+#endif
+
+
 /********************************************************************/
 /* Classes de base: servent a deriver les classes reellement utiles */
 /********************************************************************/
@@ -138,6 +184,7 @@ public:
      * @param os The ostream& to output to.
      */
     virtual void Show( int nestLevel, std::ostream& os );
+
     
     /** 
      * Function NestedSpace
@@ -147,6 +194,60 @@ public:
      * @return std::ostream& - for continuation.
      **/
     static std::ostream& NestedSpace( int nestLevel, std::ostream& os );
+
+    
+    /**
+     * Function IterateForward
+     * walks through the object tree calling the testFunc on each object 
+     * type requested in structTypes.
+     *
+     * @param listStart The first in a list of EDA_BaseStructs to iterate over. 
+     * @param inspector Is an INSPECTOR to call on each object that is of one of 
+     *  the requested itemTypes.
+     * @param testData Is an aid to testFunc, and should be sufficient to 
+     *  allow it to fully determine if an item meets the match criteria, but it
+     *  may also be used to collect output.
+     * @param scanTypes Is a char array of KICAD_T that is EOT 
+     *  terminated, and provides both the order and interest level of of
+     *  the types of objects to be iterated over.
+     * @return SEARCH_RESULT - SEARCH_QUIT if the Iterator is to stop the scan,
+     *   else SCAN_CONTINUE;
+     */
+    static SEARCH_RESULT IterateForward( EDA_BaseStruct* listStart, 
+        INSPECTOR* inspector, void* testData, const KICAD_T scanTypes[] );
+
+    
+    /**
+     * Function Traverse
+     * should be re-implemented for each derrived class in order to handle
+     * all the types given by its member data.  Implementations should call
+     * inspector->Inspect() on types in scanTypes[], and may use IterateForward()
+     * to do so on lists of such data.
+     * @param inspector An INSPECTOR instance to use in the inspection.
+     * @param testData Arbitrary data used by the inspector.
+     * @param scanTypes Which KICAD_T types are of interest and the order 
+     *  is significant too, terminated by EOT.
+     * @return SEARCH_RESULT - SEARCH_QUIT if the Iterator is to stop the scan,
+     *   else SCAN_CONTINUE;
+     */
+    virtual SEARCH_RESULT Traverse( INSPECTOR* inspector, void* testData, 
+        const KICAD_T scanTypes[] );
+
+    
+    /**
+     * Function ListHas
+     * scans the given array and detects if the given type t is present.
+     * @param list An array of KICAD_T, terminated with EOT.
+     * @param t A KICAD_T to check for.
+     * @return bool - true if present, else false.
+     */
+    static bool ListHas( const KICAD_T list[], KICAD_T t )
+    {
+        for( const KICAD_T* p = list;  *p != EOT;  ++p )
+            if( *p == t )
+                return true;
+        return false;
+    }
 #endif
 
 };
diff --git a/include/pcbstruct.h b/include/pcbstruct.h
index 3e70440bfd..140679b088 100644
--- a/include/pcbstruct.h
+++ b/include/pcbstruct.h
@@ -242,6 +242,16 @@ public:
      * @param os The ostream& to output to.
      */
     virtual void Show( int nestLevel, std::ostream& os );
+
+    
+    /**
+     * Function FindModuleOrPad
+     * searches for either a module or a pad, giving precedence to pads.
+     * @param refPos The wxPoint to hit-test.
+     * @return EDA_BaseStruct* - if a direct hit, else NULL.
+     */
+    EDA_BaseStruct* FindModuleOrPad( const wxPoint& refPos );
+    
 #endif
 };
 
diff --git a/pcbnew/class_board.cpp b/pcbnew/class_board.cpp
index 65addd51e9..6b191af4a8 100644
--- a/pcbnew/class_board.cpp
+++ b/pcbnew/class_board.cpp
@@ -286,4 +286,62 @@ void BOARD::Show( int nestLevel, std::ostream& os )
     
     NestedSpace( nestLevel, os ) << "</" << ReturnClassName().mb_str() << ">\n";
 }
+
+
+
+class ModuleOrPad : public INSPECTOR
+{
+public:
+
+    EDA_BaseStruct*     found;
+
+    ModuleOrPad() :
+        found(0)
+    {
+    }
+
+    SEARCH_RESULT Inspect( EDA_BaseStruct* testItem, void* testData )
+    {
+        const wxPoint*  refPos = (const wxPoint*) testData;
+
+        if( testItem->m_StructType == TYPEMODULE )
+        {
+            /* not finished
+            if( testItem->HitTest( &refPos ) )
+            {
+                found = testItem;
+                return SEARCH_QUIT;
+            }
+            */
+        }
+            
+        else if( testItem->m_StructType == TYPEPAD )
+        {
+            /* not finished
+            if( testItem->HitTest( &refPos ) )
+            {
+                found = testItem;
+                return SEARCH_QUIT;
+            }
+            */
+        }
+        
+        return SEARCH_CONTINUE;
+    }
+};
+
+    
+// see pcbstruct.h     
+EDA_BaseStruct* BOARD::FindModuleOrPad( const wxPoint& refPos )
+{
+    ModuleOrPad inspector;
+
+    static const KICAD_T scanTypes[] = { TYPEMODULE, TYPEPAD, EOT };
+    
+    if( SEARCH_QUIT == IterateForward( m_Modules, &inspector, (void*) &refPos, scanTypes ) )
+        return inspector.found;
+
+    return NULL;
+}
+
 #endif
diff --git a/pcbnew/class_edge_mod.cpp b/pcbnew/class_edge_mod.cpp
index 1a697c0014..24488f8315 100644
--- a/pcbnew/class_edge_mod.cpp
+++ b/pcbnew/class_edge_mod.cpp
@@ -1,6 +1,6 @@
-	/****************************************************/
-	/* class_module.cpp : fonctions de la classe MODULE */
-	/****************************************************/
+/****************************************************/
+/* class_module.cpp : fonctions de la classe MODULE */
+/****************************************************/
 
 #include "fctsys.h"
 #include "gr_basic.h"
@@ -22,54 +22,59 @@
 
 #include "protos.h"
 
-#define MAX_WIDTH 10000		// Epaisseur (en 1/10000 ") max raisonnable des traits, textes...
+#define MAX_WIDTH 10000     // Epaisseur (en 1/10000 ") max raisonnable des traits, textes...
 
-	/******************************************/
-	/* class EDGE_MODULE ( contour de module ) */
-	/******************************************/
+/******************************************/
+/* class EDGE_MODULE ( contour de module ) */
+/******************************************/
 
-EDGE_MODULE::EDGE_MODULE(MODULE * parent): EDA_BaseLineStruct( parent, TYPEEDGEMODULE)
+EDGE_MODULE::EDGE_MODULE( MODULE* parent ) : 
+    EDA_BaseLineStruct( parent, TYPEEDGEMODULE )
 {
-	m_Shape = S_SEGMENT;
-	m_Angle = 0;
-	m_Width = 120;
-	m_PolyCount = 0;		// For polygons : number of points (> 2)
-	m_PolyList = NULL;		// For polygons: coord list (1 point = 2 coord)
+    m_Shape     = S_SEGMENT;
+    m_Angle     = 0;
+    m_Width     = 120;
+    m_PolyCount = 0;        // For polygons : number of points (> 2)
+    m_PolyList  = NULL;     // For polygons: coord list (1 point = 2 coord)
 }
 
+
 EDGE_MODULE::~EDGE_MODULE()
 {
-	if ( m_PolyList ) free (m_PolyList);
-	m_PolyList = NULL;
-	m_PolyCount = 0;
+    if( m_PolyList )
+        free( m_PolyList );
+    m_PolyList  = NULL;
+    m_PolyCount = 0;
 }
 
+
 /********************************************/
-void EDGE_MODULE:: Copy(EDGE_MODULE * source)		// copy structure
+void EDGE_MODULE:: Copy( EDGE_MODULE* source )       // copy structure
 /********************************************/
 {
-	if (source == NULL) return;
-
-	m_Start = source->m_Start;
-	m_End = source->m_End;
-	m_Shape = source->m_Shape;
-	m_Start0 = source->m_Start0; // coord relatives a l'ancre du point de depart(Orient 0)
-	m_End0 = source->m_End0;	// coord relatives a l'ancre du point de fin (Orient 0)
-	m_Angle = source->m_Angle;		// pour les arcs de cercle: longueur de l'arc en 0,1 degres
-	m_Layer = source->m_Layer;
-	m_Width = source->m_Width;
-	if ( m_PolyList ) free (m_PolyList);
-	m_PolyCount = 0;
-	m_PolyList = NULL;
-	if ( source->m_PolyCount && source->m_PolyList )
-	{
-	int size;
-		m_PolyCount = source->m_PolyCount;		// For polygons : number of points
-		size = m_PolyCount * 2 * sizeof(int);	// For polygons: 1 point = 2 coord
-		m_PolyList = (int*) MyMalloc( size );
-		memcpy (m_PolyList, source->m_PolyList, size);
-	}
+    if( source == NULL )
+        return;
 
+    m_Start  = source->m_Start;
+    m_End    = source->m_End;
+    m_Shape  = source->m_Shape;
+    m_Start0 = source->m_Start0;    // coord relatives a l'ancre du point de depart(Orient 0)
+    m_End0   = source->m_End0;      // coord relatives a l'ancre du point de fin (Orient 0)
+    m_Angle  = source->m_Angle;     // pour les arcs de cercle: longueur de l'arc en 0,1 degres
+    m_Layer  = source->m_Layer;
+    m_Width  = source->m_Width;
+    if( m_PolyList )
+        free( m_PolyList );
+    m_PolyCount = 0;
+    m_PolyList  = NULL;
+    if( source->m_PolyCount && source->m_PolyList )
+    {
+        int size;
+        m_PolyCount = source->m_PolyCount;      // For polygons : number of points
+        size = m_PolyCount * 2 * sizeof(int);   // For polygons: 1 point = 2 coord
+        m_PolyList = (int*) MyMalloc( size );
+        memcpy( m_PolyList, source->m_PolyList, size );
+    }
 }
 
 
@@ -77,333 +82,371 @@ void EDGE_MODULE:: Copy(EDGE_MODULE * source)		// copy structure
 void EDGE_MODULE::UnLink( void )
 /********************************/
 {
-	/* Modification du chainage arriere */
-	if( Pback )
-	{
-		if( Pback->m_StructType != TYPEMODULE)
-		{
-			Pback->Pnext = Pnext;
-		}
+    /* Modification du chainage arriere */
+    if( Pback )
+    {
+        if( Pback->m_StructType != TYPEMODULE )
+        {
+            Pback->Pnext = Pnext;
+        }
+        else /* Le chainage arriere pointe sur la structure "Pere" */
+        {
+            ( (MODULE*) Pback )->m_Drawings = Pnext;
+        }
+    }
 
-		else /* Le chainage arriere pointe sur la structure "Pere" */
-		{
-			((MODULE*) Pback)->m_Drawings = Pnext;
-		}
-	}
+    /* Modification du chainage avant */
+    if( Pnext )
+        Pnext->Pback = Pback;
 
-	/* Modification du chainage avant */
-	if( Pnext) Pnext->Pback = Pback;
-
-	Pnext = Pback = NULL;
+    Pnext = Pback = NULL;
 }
 
 
 /***********************************/
-void EDGE_MODULE::SetDrawCoord(void)
+void EDGE_MODULE::SetDrawCoord( void )
 /***********************************/
 {
-MODULE * Module = (MODULE*) m_Parent;
-	m_Start = m_Start0;
-	m_End = m_End0;
+    MODULE* Module = (MODULE*) m_Parent;
 
-	if ( Module )
-	{
-		RotatePoint( &m_Start.x, &m_Start.y, Module->m_Orient);
-		RotatePoint( &m_End.x, &m_End.y, Module->m_Orient);
-		m_Start.x += Module->m_Pos.x;
-		m_Start.y += Module->m_Pos.y;
-		m_End.x += Module->m_Pos.x;
-		m_End.y += Module->m_Pos.y;
-	}
+    m_Start = m_Start0;
+    m_End   = m_End0;
+
+    if( Module )
+    {
+        RotatePoint( &m_Start.x, &m_Start.y, Module->m_Orient );
+        RotatePoint( &m_End.x, &m_End.y, Module->m_Orient );
+        m_Start.x += Module->m_Pos.x;
+        m_Start.y += Module->m_Pos.y;
+        m_End.x   += Module->m_Pos.x;
+        m_End.y   += Module->m_Pos.y;
+    }
 }
 
 
 /********************************************************************************/
-void EDGE_MODULE::Draw(WinEDA_DrawPanel * panel, wxDC * DC,
-						const wxPoint & offset, int draw_mode)
+void EDGE_MODULE::Draw( WinEDA_DrawPanel* panel, wxDC* DC,
+                        const wxPoint& offset, int draw_mode )
 /********************************************************************************/
 
 /* Affichage d'un segment contour de module :
-	Entree : ox, oy = offset de trace
-	draw_mode = mode de trace ( GR_OR, GR_XOR, GR_AND)
-		Les contours sont de differents type:
-		- Segment
-		- Cercles
-		- Arcs
-*/
+ *  Entree : ox, oy = offset de trace
+ *  draw_mode = mode de trace ( GR_OR, GR_XOR, GR_AND)
+ *      Les contours sont de differents type:
+ *      - Segment
+ *      - Cercles
+ *      - Arcs
+ */
 {
-int ux0, uy0, dx, dy,rayon, StAngle, EndAngle;
-int color , type_trace;
-int zoom;
-int typeaff;
-PCB_SCREEN * screen;
-WinEDA_BasePcbFrame * frame;
-MODULE * Module = NULL;
+    int                  ux0, uy0, dx, dy, rayon, StAngle, EndAngle;
+    int                  color, type_trace;
+    int                  zoom;
+    int                  typeaff;
+    PCB_SCREEN*          screen;
+    WinEDA_BasePcbFrame* frame;
+    MODULE*              Module = NULL;
 
-	if ( m_Parent && (m_Parent->m_StructType == TYPEMODULE) )
-		Module = (MODULE*) m_Parent;
+    if( m_Parent && (m_Parent->m_StructType == TYPEMODULE) )
+        Module = (MODULE*) m_Parent;
 
-	color = g_DesignSettings.m_LayerColor[m_Layer];
-	if ( (color & ITEM_NOT_SHOW) != 0 ) return;
+    color = g_DesignSettings.m_LayerColor[m_Layer];
+    if( (color & ITEM_NOT_SHOW) != 0 )
+        return;
 
-	if ( panel ) screen = (PCB_SCREEN *) panel->m_Parent->m_CurrentScreen;
-	else screen = (PCB_SCREEN *) ActiveScreen;
+    if( panel )
+        screen = (PCB_SCREEN*) panel->m_Parent->m_CurrentScreen;
+    else
+        screen = (PCB_SCREEN*) ActiveScreen;
 
-	frame = ( WinEDA_BasePcbFrame * ) panel->m_Parent;
+    frame = (WinEDA_BasePcbFrame*) panel->m_Parent;
 
-	zoom = screen->GetZoom();
+    zoom = screen->GetZoom();
 
-	type_trace = m_Shape;
-	ux0 = m_Start.x - offset.x; uy0 = m_Start.y - offset.y;
-	dx = m_End.x - offset.x ;
-	dy = m_End.y - offset.y ;
+    type_trace = m_Shape;
+    ux0 = m_Start.x - offset.x; uy0 = m_Start.y - offset.y;
+    dx  = m_End.x - offset.x;
+    dy  = m_End.y - offset.y;
 
-	GRSetDrawMode(DC, draw_mode);
-	typeaff = frame->m_DisplayModEdge;
-	if( m_Layer <= CMP_N )
-	{
-		typeaff = frame->m_DisplayPcbTrackFill;
-		if ( ! typeaff ) typeaff = SKETCH;
-	}
-	if( (m_Width /zoom) < L_MIN_DESSIN ) typeaff = FILAIRE;
+    GRSetDrawMode( DC, draw_mode );
+    typeaff = frame->m_DisplayModEdge;
+    if( m_Layer <= CMP_N )
+    {
+        typeaff = frame->m_DisplayPcbTrackFill;
+        if( !typeaff )
+            typeaff = SKETCH;
+    }
+    if( (m_Width / zoom) < L_MIN_DESSIN )
+        typeaff = FILAIRE;
 
-	switch (type_trace )
-	{
-		case S_SEGMENT:
-			if( typeaff == FILAIRE)
-				GRLine(&panel->m_ClipBox, DC,  ux0, uy0, dx, dy, 0, color);
-			else if( typeaff == FILLED)
-				GRLine(&panel->m_ClipBox, DC,  ux0, uy0, dx, dy, m_Width, color) ;
-			else	// SKETCH Mode
-				GRCSegm(&panel->m_ClipBox, DC, ux0, uy0, dx, dy, m_Width, color) ;
-				break ;
+    switch( type_trace )
+    {
+    case S_SEGMENT:
+        if( typeaff == FILAIRE )
+            GRLine( &panel->m_ClipBox, DC, ux0, uy0, dx, dy, 0, color );
+        else if( typeaff == FILLED )
+            GRLine( &panel->m_ClipBox, DC, ux0, uy0, dx, dy, m_Width, color );
+        else
+            // SKETCH Mode
+            GRCSegm( &panel->m_ClipBox, DC, ux0, uy0, dx, dy, m_Width, color );
+        break;
 
-		case S_CIRCLE:
-			rayon = (int)hypot((double)(dx-ux0),(double)(dy-uy0) );
-			if( typeaff == FILAIRE)
-			{
-				GRCircle(&panel->m_ClipBox, DC, ux0, uy0, rayon, color) ;
-			}
-			else
-			{
-				if(typeaff == FILLED )
-				{
-					GRCircle(&panel->m_ClipBox, DC, ux0, uy0, rayon, m_Width, color);
-				}
-				else	// SKETCH Mode
-				{
-					GRCircle(&panel->m_ClipBox, DC, ux0, uy0, rayon + (m_Width/2), color) ;
-					GRCircle(&panel->m_ClipBox, DC, ux0, uy0, rayon - (m_Width/2), color) ;
-				}
-			}
-			break;
+    case S_CIRCLE:
+        rayon = (int) hypot( (double) (dx - ux0), (double) (dy - uy0) );
+        if( typeaff == FILAIRE )
+        {
+            GRCircle( &panel->m_ClipBox, DC, ux0, uy0, rayon, color );
+        }
+        else
+        {
+            if( typeaff == FILLED )
+            {
+                GRCircle( &panel->m_ClipBox, DC, ux0, uy0, rayon, m_Width, color );
+            }
+            else        // SKETCH Mode
+            {
+                GRCircle( &panel->m_ClipBox, DC, ux0, uy0, rayon + (m_Width / 2), color );
+                GRCircle( &panel->m_ClipBox, DC, ux0, uy0, rayon - (m_Width / 2), color );
+            }
+        }
+        break;
 
-		case S_ARC:
-			rayon = (int)hypot((double)(dx-ux0),(double)(dy-uy0) );
-			StAngle = (int)ArcTangente( dy-uy0, dx-ux0 );
-			EndAngle = StAngle + m_Angle;
-			if ( StAngle > EndAngle) EXCHG (StAngle, EndAngle);
-			if( typeaff == FILAIRE)
-			{
-				GRArc(&panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle, rayon, color) ;
-			}
-			else if(typeaff == FILLED )
-				{
-					GRArc(&panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle, rayon,
-								m_Width, color);
-				}
-			else	// SKETCH Mode
-			{
-				GRArc(&panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle,
-						rayon + (m_Width/2), color) ;
-				GRArc(&panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle,
-						rayon - (m_Width/2), color) ;
-			}
-			break;
+    case S_ARC:
+        rayon    = (int) hypot( (double) (dx - ux0), (double) (dy - uy0) );
+        StAngle  = (int) ArcTangente( dy - uy0, dx - ux0 );
+        EndAngle = StAngle + m_Angle;
+        if( StAngle > EndAngle )
+            EXCHG( StAngle, EndAngle );
+        if( typeaff == FILAIRE )
+        {
+            GRArc( &panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle, rayon, color );
+        }
+        else if( typeaff == FILLED )
+        {
+            GRArc( &panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle, rayon,
+                   m_Width, color );
+        }
+        else        // SKETCH Mode
+        {
+            GRArc( &panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle,
+                   rayon + (m_Width / 2), color );
+            GRArc( &panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle,
+                   rayon - (m_Width / 2), color );
+        }
+        break;
 
-		case S_POLYGON:
-		{
-			// We must compute true coordinates from m_PolyList
-			// which are relative to module position, orientation 0
-			int ii, * source, * ptr, * ptr_base;
-			ptr = ptr_base = (int*) MyMalloc( 2 * m_PolyCount * sizeof(int) );
-			source = m_PolyList;
-			for (ii = 0; ii < m_PolyCount; ii++ )
-			{
-				int x, y;
-				x = *source; source++; y = *source; source++;
-				if ( Module )
-				{
-					RotatePoint (&x, &y, Module->m_Orient);
-					x += Module->m_Pos.x;
-					y += Module->m_Pos.y;
-				}
-				x +=  m_Start0.x - offset.x;
-				y +=  m_Start0.y - offset.y;
-				*ptr = x; ptr++; *ptr = y; ptr++;
-			}
-			GRPoly(&panel->m_ClipBox, DC, m_PolyCount, ptr_base,
-				TRUE, m_Width, color, color);
-			free ( ptr_base);
-			break;
-		}
-	}
+    case S_POLYGON:
+    {
+        // We must compute true coordinates from m_PolyList
+        // which are relative to module position, orientation 0
+        int ii, * source, * ptr, * ptr_base;
+        ptr    = ptr_base = (int*) MyMalloc( 2 * m_PolyCount * sizeof(int) );
+        source = m_PolyList;
+        for( ii = 0; ii < m_PolyCount; ii++ )
+        {
+            int x, y;
+            x = *source; source++; y = *source; source++;
+            if( Module )
+            {
+                RotatePoint( &x, &y, Module->m_Orient );
+                x += Module->m_Pos.x;
+                y += Module->m_Pos.y;
+            }
+            x   += m_Start0.x - offset.x;
+            y   += m_Start0.y - offset.y;
+            *ptr = x; ptr++; *ptr = y; ptr++;
+        }
+
+        GRPoly( &panel->m_ClipBox, DC, m_PolyCount, ptr_base,
+                TRUE, m_Width, color, color );
+        free( ptr_base );
+        break;
+    }
+    }
 }
 
 
 /*****************************************/
-int EDGE_MODULE::WriteDescr( FILE * File )
+int EDGE_MODULE::WriteDescr( FILE* File )
 /*****************************************/
+
 /* Write one EDGE_MODULE description
-	File must be opened.
-*/
+ *  File must be opened.
+ */
 {
-int  NbLigne = 0, ii, *ptr;
-	
-	switch(m_Shape )
-	{
-		case S_SEGMENT:
-			fprintf(File,"DS %d %d %d %d %d %d\n",
-						m_Start0.x, m_Start0.y,
-						m_End0.x, m_End0.y,
-						m_Width, m_Layer);
-			NbLigne++;
-			break;
+    int NbLigne = 0, ii, * ptr;
 
-		case S_CIRCLE:
-			fprintf(File,"DC %d %d %d %d %d %d\n",
-						m_Start0.x, m_Start0.y,
-						m_End0.x, m_End0.y,
-						m_Width, m_Layer);
-			NbLigne++;
-			break;
+    switch( m_Shape )
+    {
+    case S_SEGMENT:
+        fprintf( File, "DS %d %d %d %d %d %d\n",
+                 m_Start0.x, m_Start0.y,
+                 m_End0.x, m_End0.y,
+                 m_Width, m_Layer );
+        NbLigne++;
+        break;
 
-		case S_ARC:
-			fprintf(File,"DA %d %d %d %d %d %d %d\n",
-						m_Start0.x, m_Start0.y,
-						m_End0.x, m_End0.y,
-						m_Angle,
-						m_Width, m_Layer);
-			NbLigne++;
-			break;
+    case S_CIRCLE:
+        fprintf( File, "DC %d %d %d %d %d %d\n",
+                 m_Start0.x, m_Start0.y,
+                 m_End0.x, m_End0.y,
+                 m_Width, m_Layer );
+        NbLigne++;
+        break;
 
-		case S_POLYGON:
-			fprintf(File,"DP %d %d %d %d %d %d %d\n",
-						m_Start0.x, m_Start0.y,
-						m_End0.x, m_End0.y,
-						m_PolyCount,
-						m_Width, m_Layer);
-			NbLigne++;
-			for ( ii = 0, ptr = m_PolyList; ii < m_PolyCount; ii++ )
-			{
-			fprintf(File,"Dl %d %d\n",
-						*ptr, *(ptr+1));
-			NbLigne++; ptr += 2;
-			}
-			break;
+    case S_ARC:
+        fprintf( File, "DA %d %d %d %d %d %d %d\n",
+                 m_Start0.x, m_Start0.y,
+                 m_End0.x, m_End0.y,
+                 m_Angle,
+                 m_Width, m_Layer );
+        NbLigne++;
+        break;
 
-		default:
-			DisplayError(NULL, wxT("Type Edge Module inconnu") );
-			break;
-	}
+    case S_POLYGON:
+        fprintf( File, "DP %d %d %d %d %d %d %d\n",
+                 m_Start0.x, m_Start0.y,
+                 m_End0.x, m_End0.y,
+                 m_PolyCount,
+                 m_Width, m_Layer );
+        NbLigne++;
+        for( ii = 0, ptr = m_PolyList; ii < m_PolyCount; ii++ )
+        {
+            fprintf( File, "Dl %d %d\n",
+                    *ptr, *(ptr + 1) );
+            NbLigne++; ptr += 2;
+        }
 
-	return(NbLigne);
+        break;
+
+    default:
+        DisplayError( NULL, wxT( "Type Edge Module inconnu" ) );
+        break;
+    }
+
+    return NbLigne;
 }
 
 
 /****************************************************************/
-int EDGE_MODULE::ReadDescr(char * Line, FILE * File,
-		int * LineNum)
+int EDGE_MODULE::ReadDescr( char* Line, FILE* File,
+                            int* LineNum )
 /***************************************************************/
+
 /* Read a description line like:
-DS 2600 0 2600 -600 120 21
-this description line is in Line
-EDGE_MODULE type can be:
-	- Circle,
-	- Segment (line)
-	- Arc
-	- Polygon
-	
-*/
+ *  DS 2600 0 2600 -600 120 21
+ *  this description line is in Line
+ *  EDGE_MODULE type can be:
+ *  - Circle,
+ *  - Segment (line)
+ *  - Arc
+ *  - Polygon
+ * 
+ */
 {
-int ii, *ptr;
-int error = 0;
-char Buf[1024];
-	
-	
-	switch ( Line[1] )
-	{
-		case 'S':
-			m_Shape = S_SEGMENT;
-			break;
-		case 'C':
-			m_Shape = S_CIRCLE;
-			break;
-		case 'A':
-			m_Shape = S_ARC;
-			break;
-		case 'P':
-			m_Shape = S_POLYGON;
-			break;
-		default:
-			wxString msg;
-			msg.Printf( wxT("Unknown EDGE_MODULE type <%s>") , Line);
-			DisplayError(NULL, msg);
-			error = 1;
-			break;
-	}
+    int  ii, * ptr;
+    int  error = 0;
+    char Buf[1024];
 
-	switch ( m_Shape )
-	{
-		case  S_ARC:
-			sscanf(Line+3,"%d %d %d %d %d %d %d",
-				&m_Start0.x, &m_Start0.y,
-				&m_End0.x, &m_End0.y,
-				&m_Angle, &m_Width, &m_Layer);
-			break;
 
-		case S_SEGMENT:
-		case S_CIRCLE:
-			sscanf(Line+3,"%d %d %d %d %d %d",
-				&m_Start0.x, &m_Start0.y,
-				&m_End0.x, &m_End0.y,
-				&m_Width, &m_Layer);
-			break;
+    switch( Line[1] )
+    {
+    case 'S':
+        m_Shape = S_SEGMENT;
+        break;
 
-		case S_POLYGON:
-			sscanf(Line+3,"%d %d %d %d %d %d %d",
-				&m_Start0.x, &m_Start0.y,
-				&m_End0.x, &m_End0.y,
-				&m_PolyCount, &m_Width, &m_Layer);
-			(*LineNum)++;
-			m_PolyList = (int*) MyZMalloc( 2 * m_PolyCount * sizeof(int) );
-			for ( ii = 0, ptr = m_PolyList; ii < m_PolyCount; ii++ )
-			{
-				if( GetLine(File, Buf, LineNum , sizeof(Buf) -1) != NULL )
-				{
-					if( strncmp(Buf, "Dl", 2) != 0 ) { error = 1; break;}
-					sscanf(Buf+3,"%d %d\n", ptr, ptr+1);
-					(*LineNum)++; ptr += 2;
-				}
-				else {
-					error = 1; break;
-				}
-			}
-			break;
+    case 'C':
+        m_Shape = S_CIRCLE;
+        break;
 
-		default:
-			sscanf(Line+3,"%d %d %d %d %d %d",
-				&m_Start0.x, &m_Start0.y,
-				&m_End0.x, &m_End0.y,
-				&m_Width, &m_Layer);
-			break;
-	}
+    case 'A':
+        m_Shape = S_ARC;
+        break;
 
-	// Controle d'epaisseur raisonnable:
-	if( m_Width <= 1 ) m_Width = 1;
-	if( m_Width > MAX_WIDTH ) m_Width = MAX_WIDTH;
-		
-	return error;
+    case 'P':
+        m_Shape = S_POLYGON;
+        break;
 
+    default:
+        wxString msg;
+        msg.Printf( wxT( "Unknown EDGE_MODULE type <%s>" ), Line );
+        DisplayError( NULL, msg );
+        error = 1;
+        break;
+    }
+
+    switch( m_Shape )
+    {
+    case  S_ARC:
+        sscanf( Line + 3, "%d %d %d %d %d %d %d",
+                &m_Start0.x, &m_Start0.y,
+                &m_End0.x, &m_End0.y,
+                &m_Angle, &m_Width, &m_Layer );
+        break;
+
+    case S_SEGMENT:
+    case S_CIRCLE:
+        sscanf( Line + 3, "%d %d %d %d %d %d",
+                &m_Start0.x, &m_Start0.y,
+                &m_End0.x, &m_End0.y,
+                &m_Width, &m_Layer );
+        break;
+
+    case S_POLYGON:
+        sscanf( Line + 3, "%d %d %d %d %d %d %d",
+                &m_Start0.x, &m_Start0.y,
+                &m_End0.x, &m_End0.y,
+                &m_PolyCount, &m_Width, &m_Layer );
+        (*LineNum)++;
+        m_PolyList = (int*) MyZMalloc( 2 * m_PolyCount * sizeof(int) );
+        for( ii = 0, ptr = m_PolyList; ii < m_PolyCount; ii++ )
+        {
+            if( GetLine( File, Buf, LineNum, sizeof(Buf) - 1 ) != NULL )
+            {
+                if( strncmp( Buf, "Dl", 2 ) != 0 )
+                {
+                    error = 1; break;
+                }
+                sscanf( Buf + 3, "%d %d\n", ptr, ptr + 1 );
+                (*LineNum)++; ptr += 2;
+            }
+            else
+            {
+                error = 1; break;
+            }
+        }
+
+        break;
+
+    default:
+        sscanf( Line + 3, "%d %d %d %d %d %d",
+                &m_Start0.x, &m_Start0.y,
+                &m_End0.x, &m_End0.y,
+                &m_Width, &m_Layer );
+        break;
+    }
+
+    // Controle d'epaisseur raisonnable:
+    if( m_Width <= 1 )
+        m_Width = 1;
+    if( m_Width > MAX_WIDTH )
+        m_Width = MAX_WIDTH;
+
+    return error;
 }
 
+
+#if defined(DEBUG)
+/**
+ * Function Show
+ * is used to output the object tree, currently for debugging only.
+ * @param nestLevel An aid to prettier tree indenting, and is the level 
+ *          of nesting of this object within the overall tree.
+ * @param os The ostream& to output to.
+ */
+void EDGE_MODULE::Show( int nestLevel, std::ostream& os )
+{
+    // for now, make it look like XML:
+    NestedSpace( nestLevel, os ) << '<' << ReturnClassName().mb_str() << "/>\n";
+}
+
+#endif
diff --git a/pcbnew/class_edge_mod.h b/pcbnew/class_edge_mod.h
index 95cb867054..29588760d4 100644
--- a/pcbnew/class_edge_mod.h
+++ b/pcbnew/class_edge_mod.h
@@ -1,43 +1,55 @@
-	/**************************************************************/
-	/* class_edge_module.h : description des contours d'un module */
-	/**************************************************************/
+/**************************************************************/
+/* class_edge_module.h : description des contours d'un module */
+/**************************************************************/
 
 class Pcb3D_GLCanvas;
 
 
 /* description des contours (empreintes ) et TYPES des CONTOURS : */
 
-class EDGE_MODULE: public EDA_BaseLineStruct
-	{
-	public:
-	int m_Shape ;			// voir "enum Track_Shapes" 
-	wxPoint m_Start0;		// coord relatives a l'ancre du point de depart(Orient 0)
-	wxPoint m_End0;			// coord relatives a l'ancre du point de fin (Orient 0)
-	int m_Angle;			// pour les arcs de cercle: longueur de l'arc en 0,1 degres
-	int m_PolyCount;		// For polygons : number of points (> 2)
-	int * m_PolyList;		// For polygons: coord list (1 point = 2 coord)
-							// Coord are relative to Origine, orient 0
+class EDGE_MODULE : public EDA_BaseLineStruct
+{
+public:
+    int     m_Shape;        // voir "enum Track_Shapes"
+    wxPoint m_Start0;       // coord relatives a l'ancre du point de depart(Orient 0)
+    wxPoint m_End0;         // coord relatives a l'ancre du point de fin (Orient 0)
+    
+    int     m_Angle;        // pour les arcs de cercle: longueur de l'arc en 0,1 degres
+    
+    int     m_PolyCount;    // For polygons : number of points (> 2)
+    int*    m_PolyList;     // For polygons: coord list (1 point = 2 coord)
+                            // Coord are relative to Origin, orient 0
 
-	public:
-	EDGE_MODULE(MODULE * parent );
-	EDGE_MODULE(EDGE_MODULE * edge );
-	~EDGE_MODULE();
+public:
+    EDGE_MODULE( MODULE* parent );
+    EDGE_MODULE( EDGE_MODULE* edge );
+    ~EDGE_MODULE();
 
-	/* supprime du chainage la structure Struct */
-	void UnLink( void );
+    /* supprime du chainage la structure Struct */
+    void    UnLink( void );
 
-    void Copy(EDGE_MODULE * source);		// copy structure
+    void    Copy( EDGE_MODULE* source );    // copy structure
 
-	/* Readind and writing data on files */
-	int WriteDescr( FILE * File );
-	int ReadDescr( char * Line, FILE * File, int * LineNum = NULL);
+    /* Reading and writing data on files */
+    int     WriteDescr( FILE* File );
+    int     ReadDescr( char* Line, FILE* File, int* LineNum = NULL );
 
-	// Mise a jour des coordon�es pour l'affichage
-	void SetDrawCoord(void);
+    // Mise a jour des coordon�s pour l'affichage
+    void    SetDrawCoord( void );
 
-	/* drawing functions */
-	void Draw(WinEDA_DrawPanel * panel, wxDC * DC, const wxPoint & offset,
-							int draw_mode);
-	void Draw3D(Pcb3D_GLCanvas * glcanvas);
+    /* drawing functions */
+    void    Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset,
+                  int draw_mode );
+    void    Draw3D( Pcb3D_GLCanvas* glcanvas );
+    
+#if defined(DEBUG)
+    /**
+     * Function Show
+     * is used to output the object tree, currently for debugging only.
+     * @param nestLevel An aid to prettier tree indenting, and is the level 
+     *          of nesting of this object within the overall tree.
+     * @param os The ostream& to output to.
+     */
+    virtual void Show( int nestLevel, std::ostream& os );
+#endif
 };
-
diff --git a/pcbnew/class_module.cpp b/pcbnew/class_module.cpp
index 07c3bee493..abd8bbf2ed 100644
--- a/pcbnew/class_module.cpp
+++ b/pcbnew/class_module.cpp
@@ -208,7 +208,9 @@ void MODULE::Copy( MODULE* Module )
 
     /* Copy des elements complementaires Drawings 3D */
     m_3D_Drawings->Copy( Module->m_3D_Drawings );
+    
     Struct3D_Master* Struct3D, * NewStruct3D, * CurrStruct3D;
+    
     Struct3D     = (Struct3D_Master*) Module->m_3D_Drawings->Pnext;
     CurrStruct3D = m_3D_Drawings;
     for( ; Struct3D != NULL; Struct3D = (Struct3D_Master*) Struct3D->Pnext )
@@ -370,6 +372,7 @@ int MODULE::WriteDescr( FILE* File )
         StringStat[0] = 'F';
     else
         StringStat[0] = '~';
+    
     if( m_ModuleStatus & MODULE_is_PLACED )
         StringStat[1] = 'P';
     else
@@ -649,9 +652,9 @@ int MODULE::ReadDescr( FILE* File, int* LineNum )
                 Read_3D_Descr( File, LineNum );
         }
 
-
         if( strlen( Line ) < 4 )
             continue;
+
         PtLine = Line + 3;
 
         /* Pointe 1er code utile de la ligne */
@@ -811,13 +814,16 @@ void MODULE::SetPosition( const wxPoint& newpos )
     int deltaY = newpos.y - m_Pos.y;
 
     /* deplacement de l'ancre */
-    m_Pos.x += deltaX; m_Pos.y += deltaY;
+    m_Pos.x += deltaX; 
+    m_Pos.y += deltaY;
 
     /* deplacement de la reference */
-    m_Reference->m_Pos.x += deltaX; m_Reference->m_Pos.y += deltaY;
+    m_Reference->m_Pos.x += deltaX; 
+    m_Reference->m_Pos.y += deltaY;
 
     /* deplacement de la Valeur */
-    m_Value->m_Pos.x += deltaX; m_Value->m_Pos.y += deltaY;
+    m_Value->m_Pos.x += deltaX; 
+    m_Value->m_Pos.y += deltaY;
 
     /* deplacement des pastilles */
     D_PAD*          pad = m_Pads;
@@ -1153,22 +1159,70 @@ void MODULE::Show( int nestLevel, std::ostream& os )
     // for now, make it look like XML, expand on this later.
     
     NestedSpace( nestLevel, os ) << '<' << ReturnClassName().mb_str() <<
-        " ref=\""      <<  m_Reference->m_Text.mb_str() << 
+//        " ref=\""     <<  m_Reference->m_Text.mb_str() << 
+//        "\" value=\"" <<  m_Value->m_Text.mb_str() << '"' << 
+        ">\n";
 
-        "\" value=\"" <<  m_Value->m_Text.mb_str() << 
-        "\">\n";
+    EDA_BaseStruct* p;
+        
+    p = m_Reference;
+    for( ; p; p = p->Pnext )
+        p->Show( nestLevel+1, os );
 
-    EDA_BaseStruct* p = m_Drawings;
+    p = m_Value;
     for( ; p; p = p->Pnext )
         p->Show( nestLevel+1, os );
     
-    EDA_BaseStruct* kid = m_Son;
-    for( ; kid;  kid = kid->Pnext )
+    p = m_Drawings;
+    for( ; p; p = p->Pnext )
+        p->Show( nestLevel+1, os );
+
+    p = m_Son;
+    for( ; p;  p = p->Pnext )
     {
-        kid->Show( nestLevel+1, os );
+        p->Show( nestLevel+1, os );
     }
     
     NestedSpace( nestLevel, os ) << "</" << ReturnClassName().mb_str() << ">\n";
 }
 
+
+// see class_module.h     
+SEARCH_RESULT MODULE::Traverse( INSPECTOR* inspector, void* testData, 
+    const KICAD_T scanTypes[] )
+{
+    KICAD_T     stype;
+    
+    for( const KICAD_T* p = scanTypes;  (stype=*p) != EOT;   ++p )
+    {
+        // If caller wants to inspect my type
+        if( stype == m_StructType )
+        {
+            if( SEARCH_QUIT == inspector->Inspect( this, testData ) )
+                return SEARCH_QUIT;
+        }
+        else if( stype == TYPEEDGEMODULE )
+        {
+            // iterate over m_Drawings
+            if( SEARCH_QUIT == IterateForward( m_Drawings, inspector, 
+                                    testData, scanTypes ) )
+                return SEARCH_QUIT;
+        }
+        else if( stype == TYPETEXTEMODULE )
+        {
+            // iterate over m_Reference
+            if( SEARCH_QUIT == IterateForward( m_Reference, inspector, 
+                                    testData, scanTypes ) )
+                return SEARCH_QUIT;
+                
+            // iterate over m_Value
+            if( SEARCH_QUIT == IterateForward( m_Value, inspector, 
+                                    testData, scanTypes ) )
+                return SEARCH_QUIT;
+        }
+    }
+
+    return SEARCH_CONTINUE;    
+}
+
 #endif
diff --git a/pcbnew/class_module.h b/pcbnew/class_module.h
index 9c002c77a9..23341f35a8 100644
--- a/pcbnew/class_module.h
+++ b/pcbnew/class_module.h
@@ -142,6 +142,24 @@ public:
      * @param os The ostream& to output to.
      */
     virtual void Show( int nestLevel, std::ostream& os );
+
+    
+    /**
+     * Function Traverse
+     * should be re-implemented for each derrived class in order to handle
+     * all the types given by its member data.  Implementations should call
+     * inspector->Inspect() on types in scanTypes[], and may use IterateForward()
+     * to do so on lists of such data.
+     * @param inspector An INSPECTOR instance to use in the inspection.
+     * @param testData Arbitrary data used by the inspector.
+     * @param scanTypes Which KICAD_T types are of interest and the order 
+     *  is significant too, terminated by EOT.
+     * @return SEARCH_RESULT - SEARCH_QUIT if the Iterator is to stop the scan,
+     *   else SCAN_CONTINUE;
+     */
+    virtual SEARCH_RESULT Traverse( INSPECTOR* inspector, void* testData, 
+        const KICAD_T scanTypes[] );
+    
 #endif
     
 };
diff --git a/pcbnew/class_pad.h b/pcbnew/class_pad.h
index aca764c83c..48b9f410dc 100644
--- a/pcbnew/class_pad.h
+++ b/pcbnew/class_pad.h
@@ -1,85 +1,96 @@
-	/**********************************/
-	/* class_pad.h : Pads description */
-	/**********************************/
+/**********************************/
+/* class_pad.h : Pads description */
+/**********************************/
 
 class Pcb3D_GLCanvas;
 
 /* forme des pastilles : (parametre .forme) */
-#define CIRCLE 1
-#define RECT   2
-#define OVALE  3
-#define TRAPEZE 4		// trapeze: traversante ou surfacique
-#define SPECIAL_PAD 5	// description libre
+#define CIRCLE      1
+#define RECT        2
+#define OVALE       3
+#define TRAPEZE     4       // trapeze: traversante ou surfacique
+#define SPECIAL_PAD 5       // description libre
 
 /* Attributs des PADS */
-#define STANDARD	0	// pad classique
-#define SMD	   1		// surfacique, generation d'un masque d'empatement
-#define CONN   2		// surfacique, peut etre dore
-#define P_HOLE 3		// trou simple, utile sur pad stack
-#define MECA   4		// PAD "mecanique" (fixation, zone cuivre...)
-#define PAD_STACK 0x80	// bit 7 de .attrib  (flag)
+#define STANDARD    0       // pad classique
+#define SMD         1       // surfacique, generation d'un masque d'empatement
+#define CONN        2       // surfacique, peut etre dore
+#define P_HOLE      3       // trou simple, utile sur pad stack
+#define MECA        4       // PAD "mecanique" (fixation, zone cuivre...)
+#define PAD_STACK   0x80    // bit 7 de .attrib  (flag)
 
 /* Definition type Structure d'un pad */
-class D_PAD: public EDA_BaseStruct
+class D_PAD : public EDA_BaseStruct
 {
 public:
-	union	 {
-	unsigned long m_NumPadName;
-	char m_Padname[4] ;			/* nom (numero) de la pastille (assimilable a un long)*/
-	};
-	wxString m_Netname;			/* Net Name */
-	int m_Masque_Layer;			// (Bit a Bit :1= cuivre, 15= cmp,
-								// 2..14 = interne
-								// 16 .. 31 = couches non cuivre
-	int m_PadShape;				// forme CERCLE, RECT, OVALE, TRAPEZE ou libre
-	int m_DrillShape;			// forme CERCLE, OVAL
-	wxPoint m_Pos;				// Position de reference du pad
-	wxSize m_Drill;				// Drill diam (drill shape = CIRCLE) or drill size(shape = OVAL)
-								// for drill shape = CIRCLE, drill diam = m_Drill.x
-	wxSize m_Offset;			// Offset de la forme (pastilles excentrees)
-	wxSize m_Size;				// Dimensions X et Y ( si orient 0 x = axe X
-								// y = axe Y
-	wxSize m_DeltaSize;			// delta sur formes rectangle -> trapezes
-	wxPoint m_Pos0;				// Coord relatives a l'ancre du pad en orientation 0
-	int m_Rayon;				// rayon du cercle exinscrit du pad
-	int m_Attribut;				// NORMAL, SMD, CONN, Bit 7 = STACK
-	int m_Orient ;				// en 1/10 degres
+    union
+    {
+        unsigned long m_NumPadName;
+        char          m_Padname[4]; /* nom (numero) de la pastille (assimilable a un long)*/
+    };
+    
+    wxString m_Netname;         /* Net Name */
+    
+    int      m_Masque_Layer;    // (Bit a Bit :1= cuivre, 15= cmp,
+                                // 2..14 = interne
+                                // 16 .. 31 = couches non cuivre
+                                
+    int      m_PadShape;            // forme CERCLE, RECT, OVALE, TRAPEZE ou libre
+    int      m_DrillShape;          // forme CERCLE, OVAL
+    
+    wxPoint  m_Pos;                 // Position de reference du pad
+    
+    wxSize   m_Drill;               // Drill diam (drill shape = CIRCLE) or drill size(shape = OVAL)
+                                    // for drill shape = CIRCLE, drill diam = m_Drill.x
+                                    
+    wxSize   m_Offset;              // Offset de la forme (pastilles excentrees)
+    wxSize   m_Size;                // Dimensions X et Y ( si orient 0 x = axe X
+                                    // y = axe Y
+                                    
+    wxSize   m_DeltaSize;           // delta sur formes rectangle -> trapezes
+    
+    wxPoint  m_Pos0;                // Coord relatives a l'ancre du pad en orientation 0
+    
+    int      m_Rayon;               // rayon du cercle exinscrit du pad
+    int      m_Attribut;            // NORMAL, SMD, CONN, Bit 7 = STACK
+    int      m_Orient;              // en 1/10 degres
 
-	int m_NetCode;				/* Numero de net pour comparaisons rapides */
-	int m_logical_connexion;		// variable utilisee lors du calcul du chevelu:
-   								// contient de numero de block pour une connexion type ratsnet
-	int m_physical_connexion;		// variable utilisee lors du calcul de la connexit�:
-   								// contient de numero de block pour une connexion type piste
+    int      m_NetCode;             /* Numero de net pour comparaisons rapides */
+    int      m_logical_connexion;   // variable utilisee lors du calcul du chevelu:
+                                    // contient de numero de block pour une connexion type ratsnet
+                                    
+    int      m_physical_connexion;  // variable utilisee lors du calcul de la connexit�
+                                    // contient de numero de block pour une connexion type piste
 
 public:
-	D_PAD(MODULE * parent);
-	D_PAD(D_PAD * pad);
-	~D_PAD(void);
+    D_PAD( MODULE* parent );
+    D_PAD( D_PAD* pad );
+    ~D_PAD( void );
 
-	void Copy(D_PAD * source);
-	D_PAD * Next(void)
-		{ return (D_PAD *) Pnext; }
+    void            Copy( D_PAD* source );
 
-	/* supprime du chainage la structure Struct */
-	void UnLink( void );
+    D_PAD*          Next( void ) { return (D_PAD*) Pnext; }
 
-	/* Readind and writing data on files */
-	int ReadDescr( FILE * File, int * LineNum = NULL);
-	int WriteDescr( FILE * File );
+    /* supprime du chainage la structure Struct */
+    void            UnLink( void );
 
-	/* drawing functions */
-	void Draw(WinEDA_DrawPanel * panel, wxDC * DC, const wxPoint & offset, int draw_mode);
-	void Draw3D(Pcb3D_GLCanvas * glcanvas);
+    /* Readind and writing data on files */
+    int             ReadDescr( FILE* File, int* LineNum = NULL );
+    int             WriteDescr( FILE* File );
 
-	// autres
-	void SetPadName(const wxString & name);	// Change pade name
-	wxString ReturnStringPadName(void);		// Return pad name as string in a wxString
-	void ReturnStringPadName(wxString & text);	// Return pad name as string in a buffer
-	void ComputeRayon(void);			// met a jour m_Rayon, rayon du cercle exinscrit
-	const wxPoint ReturnShapePos(void);	// retourne la position
-								// de la forme (pastilles excentrees)
-	void Display_Infos(WinEDA_BasePcbFrame * frame);
+    /* drawing functions */
+    void            Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int draw_mode );
+    void            Draw3D( Pcb3D_GLCanvas* glcanvas );
+
+    // autres
+    void            SetPadName( const wxString& name );     // Change pade name
+    wxString        ReturnStringPadName( void );            // Return pad name as string in a wxString
+    void            ReturnStringPadName( wxString& text );  // Return pad name as string in a buffer
+    void            ComputeRayon( void );                   // met a jour m_Rayon, rayon du cercle exinscrit
+    const wxPoint   ReturnShapePos( void );                 // retourne la position
+
+    // de la forme (pastilles excentrees)
+    void            Display_Infos( WinEDA_BasePcbFrame* frame );
 };
 
 typedef class D_PAD * LISTE_PAD;
-
diff --git a/pcbnew/class_text_mod.cpp b/pcbnew/class_text_mod.cpp
index 742575d670..712a7a6718 100644
--- a/pcbnew/class_text_mod.cpp
+++ b/pcbnew/class_text_mod.cpp
@@ -294,3 +294,23 @@ int TEXTE_MODULE::GetDrawRotation( void )
 
     return rotation;
 }
+
+#if defined(DEBUG)
+/**
+ * Function Show
+ * is used to output the object tree, currently for debugging only.
+ * @param nestLevel An aid to prettier tree indenting, and is the level 
+ *          of nesting of this object within the overall tree.
+ * @param os The ostream& to output to.
+ */
+void TEXTE_MODULE::Show( int nestLevel, std::ostream& os )
+{
+    // for now, make it look like XML, expand on this later.
+    
+    NestedSpace( nestLevel, os ) << '<' << ReturnClassName().mb_str() << ">\n";
+
+    NestedSpace( nestLevel+1, os ) << m_Text.mb_str() << '\n';
+    
+    NestedSpace( nestLevel, os ) << "</" << ReturnClassName().mb_str() << ">\n";
+}
+#endif
diff --git a/pcbnew/class_text_mod.h b/pcbnew/class_text_mod.h
index 7e250a66b5..91a3dafc15 100644
--- a/pcbnew/class_text_mod.h
+++ b/pcbnew/class_text_mod.h
@@ -58,4 +58,16 @@ public:
      * @return bool - true if a hit, else false
      */
     bool    HitTest( const wxPoint& posref );
+
+    
+#if defined(DEBUG)
+    /**
+     * Function Show
+     * is used to output the object tree, currently for debugging only.
+     * @param nestLevel An aid to prettier tree indenting, and is the level 
+     *          of nesting of this object within the overall tree.
+     * @param os The ostream& to output to.
+     */
+    virtual void Show( int nestLevel, std::ostream& os );
+#endif
 };
diff --git a/pcbnew/locate.cpp b/pcbnew/locate.cpp
index 00ec15c631..3ab3b94d14 100644
--- a/pcbnew/locate.cpp
+++ b/pcbnew/locate.cpp
@@ -935,6 +935,7 @@ TRACK* Locate_Piste_Connectee( TRACK* PtRefSegm, TRACK* pt_base,
     {
         if( (PtSegmN == NULL) && (PtSegmB == NULL) )
             break;
+
         if( PtSegmN )
         {
             if( PtSegmN->GetState( BUSY | DELETED ) )
@@ -1054,6 +1055,7 @@ TRACK* Locate_Pistes( TRACK* start_adresse, const wxPoint& ref_pos, int MasqueLa
             continue;
         if( (g_DesignSettings.m_LayerColor[Track->m_Layer] & ITEM_NOT_SHOW) )
             continue;
+
         /* calcul des coordonnees du segment teste */
         l_piste = Track->m_Width >> 1;                  /* l_piste = demi largeur piste */
         ux0 = Track->m_Start.x; uy0 = Track->m_Start.y; /* coord de depart */
@@ -1074,7 +1076,8 @@ TRACK* Locate_Pistes( TRACK* start_adresse, const wxPoint& ref_pos, int MasqueLa
 
         if( MasqueLayer != -1 )
             if( (g_TabOneLayerMask[Track->m_Layer] & MasqueLayer) == 0 )
-                continue;/* Segments sur couches differentes */
+                continue;   /* Segments sur couches differentes */
+
         if( distance( l_piste ) )
             return Track;
     }
@@ -1100,7 +1103,6 @@ TRACK* Locate_Pistes( TRACK* start_adresse, const wxPoint& ref_pos, int MasqueLa
  * 
  *  La recherche commence a l'adresse start_adresse
  */
-
 TRACK* Locate_Zone( TRACK* start_adresse, int layer, int typeloc )
 {
     wxPoint ref_pos = RefPos( typeloc );
@@ -1287,6 +1289,7 @@ int distance( int seuil )
 
         angle = (int) ( atan2( (float) segY, (float) segX ) * 1800 / M_PI);
         cXrot = pointX; cYrot = pointY;
+
         RotatePoint( &cXrot, &cYrot, angle );   /* Rotation du point a tester */
         RotatePoint( &segX, &segY, angle );     /* Rotation du segment */