From 6f7209aa734c53541cae0f79dcce8f9d57ed70b7 Mon Sep 17 00:00:00 2001 From: dickelbeck 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 +================================================================================ ++ 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 ================================================================================ 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; iPnext ) + { + 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 ) << "\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 ) << "\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 ) << "\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 */