Commit 6719900e authored by dickelbeck's avatar dickelbeck

searching and beautification

parent f8f38438
...@@ -5,6 +5,18 @@ Please add newer entries at the top, list the date and your name with ...@@ -5,6 +5,18 @@ Please add newer entries at the top, list the date and your name with
email address. email address.
2007-Aug-07 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================
+ pcbnew & common
* More searching work. Made HitTest() virtual. Factored out a HitTest()
function for both class_module and class_pad from existing code.
* Embellished the Show() function for several of the classes. Could be the
basis of a possible future XML export, but with the native format being
ascii already, this is of questionable value as an export.
* Discovered a long time existing bug in class_module hit-testing.
Still need to understand it. It could just be an improperly formatted module.
2007-Aug-06 UPDATE Dick Hollenbeck <dick@softplc.com> 2007-Aug-06 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================ ================================================================================
+ pcbnew & common + pcbnew & common
......
...@@ -191,6 +191,20 @@ wxString EDA_BaseStruct::ReturnClassName() const ...@@ -191,6 +191,20 @@ wxString EDA_BaseStruct::ReturnClassName() const
#if defined(DEBUG) #if defined(DEBUG)
// A function that should have been in wxWidgets
std::ostream& operator<<( std::ostream& out, wxSize& size )
{
out << " width=\"" << size.GetWidth() << "\" height=\"" << size.GetHeight() << "\"";
return out;
}
// A function that should have been in wxWidgets
std::ostream& operator<<( std::ostream& out, wxPoint& pt )
{
out << " x=\"" << pt.x << "\" y=\"" << pt.y << "\"";
return out;
}
/** /**
* Function Show * Function Show
......
...@@ -8,6 +8,8 @@ ...@@ -8,6 +8,8 @@
#if defined(DEBUG) #if defined(DEBUG)
#include <iostream> // needed for Show() #include <iostream> // needed for Show()
extern std::ostream& operator<<( std::ostream& out, wxSize& size );
extern std::ostream& operator<<( std::ostream& out, wxPoint& pt );
#endif #endif
...@@ -178,6 +180,18 @@ public: ...@@ -178,6 +180,18 @@ public:
int draw_mode, int draw_mode,
int Color = -1 ); int Color = -1 );
/**
* Function HitTest
* tests if the given wxPoint is within the bounds of this object.
* @param refPos A wxPoint to test
* @return bool - true if a hit, else false
*/
virtual bool HitTest( const wxPoint& refPos )
{
return false; // derived classes should override this function
}
#if defined(DEBUG) #if defined(DEBUG)
/** /**
...@@ -330,10 +344,10 @@ public: ...@@ -330,10 +344,10 @@ public:
/** /**
* Function HitTest * Function HitTest
* tests if the given wxPoint is within the bounds of this object. * tests if the given wxPoint is within the bounds of this object.
* @param posref A wxPoint to test * @param ref_pos A wxPoint to test
* @return bool - true if a hit, else false * @return bool - true if a hit, else false
*/ */
bool HitTest( const wxPoint& posref ); bool HitTest( const wxPoint& ref_pos );
int Len_Size( void ); // Return the text lenght in internal units int Len_Size( void ); // Return the text lenght in internal units
}; };
...@@ -381,7 +395,9 @@ public: ...@@ -381,7 +395,9 @@ public:
}; };
/* class to handle component boundary box. /**
* Class EDA_Rect
* handles the component boundary box.
* This class is similar to wxRect, but some wxRect functions are very curious, * This class is similar to wxRect, but some wxRect functions are very curious,
* so I prefer this suitable class * so I prefer this suitable class
*/ */
......
...@@ -177,9 +177,10 @@ public: ...@@ -177,9 +177,10 @@ public:
wxPoint m_O_Curseur; /* Relative Screen cursor coordinate (on grid) in user units. wxPoint m_O_Curseur; /* Relative Screen cursor coordinate (on grid) in user units.
* (coordinates from last reset position)*/ * (coordinates from last reset position)*/
wxPoint m_ScrollbarPos; // Position effective des Curseurs de scroll wxPoint m_ScrollbarPos; // Position effective des Curseurs de scroll
wxSize m_ScrollbarNumber;/* Valeur effective des Nombres de Scrool wxSize m_ScrollbarNumber; /* Valeur effective des Nombres de Scrool
* c.a.d taille en unites de scroll de la surface totale affichable */ * c.a.d taille en unites de scroll de la surface totale affichable */
wxPoint m_StartVisu; // Coord absolues du 1er pixel visualis�a l'ecran (en nombre de pixels) wxPoint m_StartVisu; // Coord absolues du 1er pixel visualis�a l'ecran (en nombre de pixels)
wxSize m_SizeVisu; /* taille en pixels de l'ecran (fenetre de visu wxSize m_SizeVisu; /* taille en pixels de l'ecran (fenetre de visu
* Utile pour recadrer les affichages lors de la * Utile pour recadrer les affichages lors de la
* navigation dans la hierarchie */ * navigation dans la hierarchie */
...@@ -274,8 +275,21 @@ public: ...@@ -274,8 +275,21 @@ public:
void SetLastGrid( void ); /* ajuste la grille au max */ void SetLastGrid( void ); /* ajuste la grille au max */
#if defined (DEBUG) /**
* Function RefPos
* returns the reference position, coming from either the mouse position or the
* the cursor position.
* @param useMouse If true, return mouse posistion, else cursor's.
* @return wxPoint - The reference point, either the mouse position or
* the cursor position.
*/
wxPoint RefPos( bool useMouse )
{
return useMouse ? m_MousePosition : m_Curseur;
}
#if defined (DEBUG)
/** /**
* Function GetClass * Function GetClass
* returns the class name. * returns the class name.
...@@ -285,7 +299,6 @@ public: ...@@ -285,7 +299,6 @@ public:
{ {
return wxT( "BASE_SCREEN" ); return wxT( "BASE_SCREEN" );
} }
#endif #endif
}; };
......
...@@ -66,16 +66,15 @@ ...@@ -66,16 +66,15 @@
#define ECO1_LAYER 0x04000000 #define ECO1_LAYER 0x04000000
#define ECO2_LAYER 0x08000000 #define ECO2_LAYER 0x08000000
#define EDGE_LAYER 0x10000000 #define EDGE_LAYER 0x10000000
#define intS_LAYER 0xE0000000 /* 4 bits MSB = autres flags */ // extra bits 0xE0000000
/* masques generaux : */ /* masques generaux : */
#define ALL_LAYERS 0x1FFFFFFF #define ALL_LAYERS 0x1FFFFFFF
#define ALL_NO_CU_LAYERS 0x1FFF0000 #define ALL_NO_CU_LAYERS 0x1FFF0000
#define ALL_CU_LAYERS 0x0000FFFF #define ALL_CU_LAYERS 0x0000FFFF
#define INTERNAL_LAYERS 0x00007FFE /* Bits layers internes */ #define INTERNAL_LAYERS 0x00007FFE /* Bits layers internes */
#define EXTERNAL_LAYERS 0x00008001 #define EXTERNAL_LAYERS 0x00008001
/* Flags pour les couches cuivres */
#define LAYER_is_PLAN 0x80000000
/* Flags pour les couches cuivres */
/* numero des couches particulieres */ /* numero des couches particulieres */
#define LAYER_CUIVRE_N 0 #define LAYER_CUIVRE_N 0
#define CUIVRE_N 0 #define CUIVRE_N 0
...@@ -96,6 +95,7 @@ ...@@ -96,6 +95,7 @@
#define LAYER_CMP_N 15 #define LAYER_CMP_N 15
#define CMP_N 15 #define CMP_N 15
#define NB_COPPER_LAYERS (CMP_N + 1) #define NB_COPPER_LAYERS (CMP_N + 1)
#define FIRST_NO_COPPER_LAYER 16 #define FIRST_NO_COPPER_LAYER 16
#define ADHESIVE_N_CU 16 #define ADHESIVE_N_CU 16
#define ADHESIVE_N_CMP 17 #define ADHESIVE_N_CMP 17
...@@ -112,6 +112,7 @@ ...@@ -112,6 +112,7 @@
#define EDGE_N 28 #define EDGE_N 28
#define LAST_NO_COPPER_LAYER 28 #define LAST_NO_COPPER_LAYER 28
#define NB_LAYERS (EDGE_N + 1) #define NB_LAYERS (EDGE_N + 1)
#define LAYER_COUNT 32 #define LAYER_COUNT 32
/* Forme des segments (pistes, contours ..) ( parametre .shape ) */ /* Forme des segments (pistes, contours ..) ( parametre .shape ) */
...@@ -257,12 +258,13 @@ public: ...@@ -257,12 +258,13 @@ public:
/** /**
* Function FindModuleOrPad * Function FindPadOrModule
* searches for either a module or a pad, giving precedence to pads. * searches for either a pad or module, giving precedence to pads.
* @param refPos The wxPoint to hit-test. * @param refPos The wxPoint to hit-test.
* @param typeloc
* @return EDA_BaseStruct* - if a direct hit, else NULL. * @return EDA_BaseStruct* - if a direct hit, else NULL.
*/ */
EDA_BaseStruct* FindModuleOrPad( const wxPoint& refPos ); EDA_BaseStruct* FindPadOrModule( const wxPoint& refPos, int layer, int typeloc );
#endif #endif
}; };
...@@ -375,6 +377,7 @@ public: ...@@ -375,6 +377,7 @@ public:
int DisplayModText; int DisplayModText;
bool DisplayPcbTrackFill; /* FALSE = sketch , TRUE = filled */ bool DisplayPcbTrackFill; /* FALSE = sketch , TRUE = filled */
bool DisplayTrackIsol; bool DisplayTrackIsol;
int m_DisplayViaMode; /* 0 do not show via hole, int m_DisplayViaMode; /* 0 do not show via hole,
* 1 show via hole for non default value * 1 show via hole for non default value
* 2 show all via hole */ * 2 show all via hole */
......
MAKEGTK = $(MAKE) -f makefile.gtk MAKEGTK = $(MAKE) -f makefile.gtk
KICAD_SUBDIRS = common 3d-viewer eeschema eeschema/plugins pcbnew cvpcb kicad gerbview KICAD_SUBDIRS = common 3d-viewer pcbnew eeschema eeschema/plugins cvpcb kicad gerbview
KICAD_SUBDIRS_BIN = eeschema eeschema/plugins pcbnew cvpcb kicad gerbview KICAD_SUBDIRS_BIN = eeschema eeschema/plugins pcbnew cvpcb kicad gerbview
KICAD_SUBDIRS_RES = internat modules template library KICAD_SUBDIRS_RES = internat modules template library
KICAD_SUBDIRS_HELP = help KICAD_SUBDIRS_HELP = help
......
...@@ -289,16 +289,20 @@ void BOARD::Show( int nestLevel, std::ostream& os ) ...@@ -289,16 +289,20 @@ void BOARD::Show( int nestLevel, std::ostream& os )
} }
class ModuleOrPad : public INSPECTOR // see pcbstruct.h
EDA_BaseStruct* BOARD::FindPadOrModule( const wxPoint& refPos, int layer, int typeloc )
{ {
public: class PadOrModule : public INSPECTOR
{
public:
EDA_BaseStruct* found; EDA_BaseStruct* found;
int layer;
int typeloc;
ModuleOrPad() : PadOrModule( int alayer, int atypeloc ) :
found(0) found(0),
{ layer(alayer),
} typeloc(atypeloc) {}
SEARCH_RESULT Inspect( EDA_BaseStruct* testItem, const void* testData ) SEARCH_RESULT Inspect( EDA_BaseStruct* testItem, const void* testData )
{ {
...@@ -306,40 +310,53 @@ public: ...@@ -306,40 +310,53 @@ public:
if( testItem->m_StructType == TYPEMODULE ) if( testItem->m_StructType == TYPEMODULE )
{ {
/* not finished int mlayer = ((MODULE*)testItem)->m_Layer;
if( testItem->HitTest( &refPos ) )
if( typeloc & MATCH_LAYER )
{
if( layer != mlayer )
return SEARCH_CONTINUE;
}
if( typeloc & VISIBLE_ONLY )
{
if( !IsModuleLayerVisible(mlayer) )
return SEARCH_CONTINUE;
}
if( testItem->HitTest( *refPos ) )
{ {
found = testItem; found = testItem;
return SEARCH_QUIT; return SEARCH_QUIT;
} }
*/
} }
else if( testItem->m_StructType == TYPEPAD ) else if( testItem->m_StructType == TYPEPAD )
{ {
/* not finished if( testItem->HitTest( *refPos ) )
if( testItem->HitTest( &refPos ) )
{ {
found = testItem; found = testItem;
return SEARCH_QUIT; return SEARCH_QUIT;
} }
*/
} }
else { int debug=1; /* this should not happen, because of scanTypes */ }
return SEARCH_CONTINUE; return SEARCH_CONTINUE;
} }
};
};
// see pcbstruct.h PadOrModule inspector1( layer, MATCH_LAYER );
EDA_BaseStruct* BOARD::FindModuleOrPad( const wxPoint& refPos ) PadOrModule inspector2( layer, VISIBLE_ONLY );
{
ModuleOrPad inspector;
static const KICAD_T scanTypes[] = { TYPEPAD, TYPEMODULE, EOT }; static const KICAD_T scanTypes[] = { TYPEPAD, TYPEMODULE, EOT };
if( SEARCH_QUIT == IterateForward( m_Modules, &inspector, &refPos, scanTypes ) ) // search the current layer first
return inspector.found; if( SEARCH_QUIT == IterateForward( m_Modules, &inspector1, &refPos, scanTypes ) )
return inspector1.found;
// if not found, set layer to don't care and search again
if( SEARCH_QUIT == IterateForward( m_Modules, &inspector2, &refPos, scanTypes ) )
return inspector2.found;
return NULL; return NULL;
} }
......
...@@ -163,7 +163,10 @@ void EDGE_MODULE::Draw( WinEDA_DrawPanel* panel, wxDC* DC, ...@@ -163,7 +163,10 @@ void EDGE_MODULE::Draw( WinEDA_DrawPanel* panel, wxDC* DC,
zoom = screen->GetZoom(); zoom = screen->GetZoom();
type_trace = m_Shape; type_trace = m_Shape;
ux0 = m_Start.x - offset.x; uy0 = m_Start.y - offset.y;
ux0 = m_Start.x - offset.x;
uy0 = m_Start.y - offset.y;
dx = m_End.x - offset.x; dx = m_End.x - offset.x;
dy = m_End.y - offset.y; dy = m_End.y - offset.y;
...@@ -445,8 +448,29 @@ int EDGE_MODULE::ReadDescr( char* Line, FILE* File, ...@@ -445,8 +448,29 @@ int EDGE_MODULE::ReadDescr( char* Line, FILE* File,
*/ */
void EDGE_MODULE::Show( int nestLevel, std::ostream& os ) void EDGE_MODULE::Show( int nestLevel, std::ostream& os )
{ {
const char* cp = "???";
switch( m_Shape )
{
case S_SEGMENT: cp = "line"; break;
case S_RECT: cp = "rect"; break;
case S_ARC: cp = "arc"; break;
case S_CIRCLE: cp = "circle"; break;
case S_ARC_RECT: cp = "arc_rect"; break;
case S_SPOT_OVALE: cp = "spot_oval"; break;
case S_SPOT_CIRCLE: cp = "spot_circle"; break;
case S_SPOT_RECT: cp = "spot_rect"; break;
case S_POLYGON: cp = "polygon"; break;
}
// for now, make it look like XML: // for now, make it look like XML:
NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() << "/>\n"; NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() <<
" type=\"" << cp << "\">\n";
NestedSpace( nestLevel+1, os ) << "<start" << m_Start0 << "/>\n";
NestedSpace( nestLevel+1, os ) << "<end" << m_End0 << "/>\n";
NestedSpace( nestLevel, os ) << "</" << GetClass().Lower().mb_str() << ">\n";
} }
#endif #endif
...@@ -16,7 +16,7 @@ public: ...@@ -16,7 +16,7 @@ public:
int m_Angle; // pour les arcs de cercle: longueur de l'arc en 0,1 degres 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_PolyCount; // For polygons: number of points (> 2)
int* m_PolyList; // For polygons: coord list (1 point = 2 coord) int* m_PolyList; // For polygons: coord list (1 point = 2 coord)
// Coord are relative to Origin, orient 0 // Coord are relative to Origin, orient 0
...@@ -50,7 +50,7 @@ public: ...@@ -50,7 +50,7 @@ public:
*/ */
virtual wxString GetClass() const virtual wxString GetClass() const
{ {
return wxT( "POLYLINE" ); return wxT( "GRAPHIC" );
// return wxT( "EDGE" ); ? // return wxT( "EDGE" ); ?
} }
......
/*****************************************************************/ /*****************************************************************/
/* fonctions membres de la classe EQUIPOT et fonctions associes */ /* fonctions membres de la classe EQUIPOT et fonctions associs */
/*****************************************************************/ /*****************************************************************/
#include "fctsys.h" #include "fctsys.h"
...@@ -17,125 +17,132 @@ ...@@ -17,125 +17,132 @@
#include "protos.h" #include "protos.h"
/*********************************************************/ /*********************************************************/
/* classe EQUIPOT: gestion des listes d'equipotentielles */ /* classe EQUIPOT: gestion des listes d'equipotentielles */
/*********************************************************/ /*********************************************************/
/* Constructeur de la classe EQUIPOT */ /* Constructeur de la classe EQUIPOT */
EQUIPOT::EQUIPOT(EDA_BaseStruct * StructFather): EQUIPOT::EQUIPOT( EDA_BaseStruct* StructFather ) :
EDA_BaseStruct( StructFather, PCB_EQUIPOT_STRUCT_TYPE) EDA_BaseStruct( StructFather, PCB_EQUIPOT_STRUCT_TYPE )
{ {
m_NetCode = 0; m_NetCode = 0;
m_NbNodes = m_NbLink = m_NbNoconn = 0; m_NbNodes = m_NbLink = m_NbNoconn = 0;
m_Masque_Layer = 0; m_Masque_Layer = 0;
m_Masque_Plan = 0; m_Masque_Plan = 0;
m_ForceWidth = 0; m_ForceWidth = 0;
m_PadzoneStart = NULL;// pointeur sur debut de liste pads du net m_PadzoneStart = NULL; // pointeur sur debut de liste pads du net
m_PadzoneEnd = NULL; // pointeur sur fin de liste pads du net m_PadzoneEnd = NULL; // pointeur sur fin de liste pads du net
m_RatsnestStart = NULL; // pointeur sur debut de liste ratsnests du net m_RatsnestStart = NULL; // pointeur sur debut de liste ratsnests du net
m_RatsnestEnd = NULL; // pointeur sur fin de liste ratsnests du net m_RatsnestEnd = NULL; // pointeur sur fin de liste ratsnests du net
} }
/* destructeut */
EQUIPOT::~EQUIPOT(void) /* destructeut */
EQUIPOT::~EQUIPOT( void )
{ {
} }
void EQUIPOT::UnLink( void ) void EQUIPOT::UnLink( void )
{ {
/* Modification du chainage arriere */ /* Modification du chainage arriere */
if( Pback ) if( Pback )
{ {
if( Pback->m_StructType != TYPEPCB) if( Pback->m_StructType != TYPEPCB )
{ {
Pback->Pnext = Pnext; Pback->Pnext = Pnext;
} }
else /* Le chainage arriere pointe sur la structure "Pere" */ else /* Le chainage arriere pointe sur la structure "Pere" */
{ {
((BOARD*)Pback)->m_Equipots = (EQUIPOT*)Pnext; ( (BOARD*) Pback )->m_Equipots = (EQUIPOT*) Pnext;
} }
} }
/* Modification du chainage avant */ /* Modification du chainage avant */
if( Pnext) Pnext->Pback = Pback; if( Pnext )
Pnext->Pback = Pback;
Pnext = Pback = NULL; Pnext = Pback = NULL;
} }
/*************************************************/ /*************************************************/
EQUIPOT * GetEquipot(BOARD * pcb, int netcode) EQUIPOT* GetEquipot( BOARD* pcb, int netcode )
/**************************************************/ /**************************************************/
/* /*
retourne un pointeur sur la structure EQUIPOT de numero netcode * retourne un pointeur sur la structure EQUIPOT de numero netcode
*/ */
{ {
EQUIPOT * Equipot ; EQUIPOT* Equipot;
if( netcode <= 0 ) return NULL; if( netcode <= 0 )
return NULL;
Equipot = (EQUIPOT*)pcb->m_Equipots; Equipot = (EQUIPOT*) pcb->m_Equipots;
while ( Equipot ) while( Equipot )
{ {
if(Equipot->m_NetCode == netcode ) break; if( Equipot->m_NetCode == netcode )
break;
Equipot = (EQUIPOT*) Equipot->Pnext; Equipot = (EQUIPOT*) Equipot->Pnext;
} }
return(Equipot); return Equipot;
} }
/*********************************************************/ /*********************************************************/
int EQUIPOT:: ReadEquipotDescr(FILE * File, int * LineNum) int EQUIPOT:: ReadEquipotDescr( FILE* File, int* LineNum )
/*********************************************************/ /*********************************************************/
/* Routine de lecture de 1 descr Equipotentielle. /* Routine de lecture de 1 descr Equipotentielle.
retourne 0 si OK * retourne 0 si OK
1 si lecture incomplete * 1 si lecture incomplete
*/ */
{ {
char Line[1024], Ltmp[1024]; char Line[1024], Ltmp[1024];
int tmp; int tmp;
while( GetLine(File, Line, LineNum ) ) while( GetLine( File, Line, LineNum ) )
{ {
if( strnicmp(Line,"$End",4) == 0 )return 0; if( strnicmp( Line, "$End", 4 ) == 0 )
return 0;
if( strncmp(Line,"Na", 2) == 0 ) /* Texte */ if( strncmp( Line, "Na", 2 ) == 0 ) /* Texte */
{ {
sscanf(Line+2," %d", &tmp); sscanf( Line + 2, " %d", &tmp );
m_NetCode = tmp; m_NetCode = tmp;
ReadDelimitedText(Ltmp, Line + 2, sizeof(Ltmp) ); ReadDelimitedText( Ltmp, Line + 2, sizeof(Ltmp) );
m_Netname = CONV_FROM_UTF8(Ltmp); m_Netname = CONV_FROM_UTF8( Ltmp );
continue; continue;
} }
if( strncmp(Line,"Lw", 2) == 0 ) /* Texte */ if( strncmp( Line, "Lw", 2 ) == 0 ) /* Texte */
{ {
sscanf(Line+2," %d", &tmp); sscanf( Line + 2, " %d", &tmp );
m_ForceWidth = tmp; m_ForceWidth = tmp;
continue; continue;
} }
} }
return 1; return 1;
} }
/********************************************/ /********************************************/
int EQUIPOT:: WriteEquipotDescr(FILE * File) int EQUIPOT:: WriteEquipotDescr( FILE* File )
/********************************************/ /********************************************/
{ {
if( GetState(DELETED) ) return(0); if( GetState( DELETED ) )
return 0;
fprintf( File,"$EQUIPOT\n");
fprintf( File,"Na %d \"%.16s\"\n", m_NetCode, CONV_TO_UTF8(m_Netname) ); fprintf( File, "$EQUIPOT\n" );
fprintf( File,"St %s\n","~"); fprintf( File, "Na %d \"%.16s\"\n", m_NetCode, CONV_TO_UTF8( m_Netname ) );
if( m_ForceWidth) fprintf( File,"Lw %d\n",m_ForceWidth ); fprintf( File, "St %s\n", "~" );
fprintf( File,"$EndEQUIPOT\n"); if( m_ForceWidth )
return(1); fprintf( File, "Lw %d\n", m_ForceWidth );
fprintf( File, "$EndEQUIPOT\n" );
return 1;
} }
...@@ -1146,6 +1146,29 @@ void MODULE::Display_Infos( WinEDA_BasePcbFrame* frame ) ...@@ -1146,6 +1146,29 @@ void MODULE::Display_Infos( WinEDA_BasePcbFrame* frame )
} }
/**
* Function HitTest
* tests if the given wxPoint is within the bounds of this object.
* @param refPos A wxPoint to test
* @return bool - true if a hit, else false
*/
bool MODULE::HitTest( const wxPoint& refPos )
{
/* Calcul des coord souris dans le repere module */
int spot_cX = refPos.x - m_Pos.x;
int spot_cY = refPos.y - m_Pos.y;
RotatePoint( &spot_cX, &spot_cY, -m_Orient );
/* la souris est-elle dans ce rectangle : */
if( m_BoundaryBox.Inside( spot_cX, spot_cY ) )
return true;
return false;
}
#if defined(DEBUG) #if defined(DEBUG)
/** /**
* Function Show * Function Show
...@@ -1157,29 +1180,29 @@ void MODULE::Display_Infos( WinEDA_BasePcbFrame* frame ) ...@@ -1157,29 +1180,29 @@ void MODULE::Display_Infos( WinEDA_BasePcbFrame* frame )
void MODULE::Show( int nestLevel, std::ostream& os ) void MODULE::Show( int nestLevel, std::ostream& os )
{ {
// for now, make it look like XML, expand on this later. // for now, make it look like XML, expand on this later.
NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() << NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() <<
// " ref=\"" << m_Reference->m_Text.mb_str() << " ref=\"" << m_Reference->m_Text.mb_str() << '"' <<
// "\" value=\"" << m_Value->m_Text.mb_str() << '"' << " value=\"" << m_Value->m_Text.mb_str() << '"' <<
">\n"; ">\n";
EDA_BaseStruct* p; NestedSpace( nestLevel+1, os ) <<
"<boundingBox" << m_BoundaryBox.m_Pos << m_BoundaryBox.m_Size << "/>\n";
p = m_Reference; NestedSpace( nestLevel+1, os ) << "<orientation tenths=\"" << m_Orient << "\"/>\n";
for( ; p; p = p->Pnext )
p->Show( nestLevel+1, os );
p = m_Value; EDA_BaseStruct* p;
for( ; p; p = p->Pnext )
p->Show( nestLevel+1, os );
NestedSpace( nestLevel+1, os ) << "<pads>\n";
p = m_Pads; p = m_Pads;
for( ; p; p = p->Pnext ) for( ; p; p = p->Pnext )
p->Show( nestLevel+1, os ); p->Show( nestLevel+2, os );
NestedSpace( nestLevel+1, os ) << "</pads>\n";
NestedSpace( nestLevel+1, os ) << "<drawings>\n";
p = m_Drawings; p = m_Drawings;
for( ; p; p = p->Pnext ) for( ; p; p = p->Pnext )
p->Show( nestLevel+1, os ); p->Show( nestLevel+2, os );
NestedSpace( nestLevel+1, os ) << "</drawings>\n";
p = m_Son; p = m_Son;
for( ; p; p = p->Pnext ) for( ; p; p = p->Pnext )
...@@ -1207,13 +1230,14 @@ SEARCH_RESULT MODULE::Visit( INSPECTOR* inspector, const void* testData, ...@@ -1207,13 +1230,14 @@ SEARCH_RESULT MODULE::Visit( INSPECTOR* inspector, const void* testData,
} }
else if( stype == TYPETEXTEMODULE ) else if( stype == TYPETEXTEMODULE )
{ {
// iterate over m_Reference if( SEARCH_QUIT == inspector->Inspect( m_Reference, testData ) )
if( SEARCH_QUIT == IterateForward( m_Reference, inspector,
testData, scanTypes ) )
return SEARCH_QUIT; return SEARCH_QUIT;
// iterate over m_Value if( SEARCH_QUIT == inspector->Inspect( m_Value, testData ) )
if( SEARCH_QUIT == IterateForward( m_Value, inspector, return SEARCH_QUIT;
// m_Drawings can hold TYPETEXTMODULE also?
if( SEARCH_QUIT == IterateForward( m_Drawings, inspector,
testData, scanTypes ) ) testData, scanTypes ) )
return SEARCH_QUIT; return SEARCH_QUIT;
} }
......
...@@ -133,6 +133,16 @@ public: ...@@ -133,6 +133,16 @@ public:
/* miscellaneous */ /* miscellaneous */
void Display_Infos( WinEDA_BasePcbFrame* frame ); void Display_Infos( WinEDA_BasePcbFrame* frame );
/**
* Function HitTest
* tests if the given wxPoint is within the bounds of this object.
* @param refPos A wxPoint to test
* @return bool - true if a hit, else false
*/
bool HitTest( const wxPoint& refPos );
#if defined(DEBUG) #if defined(DEBUG)
/** /**
......
...@@ -87,11 +87,16 @@ const wxPoint D_PAD::ReturnShapePos( void ) ...@@ -87,11 +87,16 @@ const wxPoint D_PAD::ReturnShapePos( void )
{ {
if( (m_Offset.x == 0) && (m_Offset.y == 0) ) if( (m_Offset.x == 0) && (m_Offset.y == 0) )
return m_Pos; return m_Pos;
wxPoint shape_pos; wxPoint shape_pos;
int dX, dY; int dX, dY;
dX = m_Offset.x; dY = m_Offset.y; dX = m_Offset.x; dY = m_Offset.y;
RotatePoint( &dX, &dY, m_Orient ); RotatePoint( &dX, &dY, m_Orient );
shape_pos.x = m_Pos.x + dX; shape_pos.y = m_Pos.y + dY;
shape_pos.x = m_Pos.x + dX;
shape_pos.y = m_Pos.y + dY;
return shape_pos; return shape_pos;
} }
...@@ -507,6 +512,7 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int ...@@ -507,6 +512,7 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int
} }
GRSetDrawMode( DC, draw_mode ); GRSetDrawMode( DC, draw_mode );
/* Trace du symbole "No connect" ( / ou \ ou croix en X) si necessaire : */ /* Trace du symbole "No connect" ( / ou \ ou croix en X) si necessaire : */
if( m_Netname.IsEmpty() && DisplayOpt.DisplayPadNoConn ) if( m_Netname.IsEmpty() && DisplayOpt.DisplayPadNoConn )
{ {
...@@ -520,20 +526,26 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int ...@@ -520,20 +526,26 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int
GRLine( &panel->m_ClipBox, DC, cx0 + dx0, cy0 - dx0, GRLine( &panel->m_ClipBox, DC, cx0 + dx0, cy0 - dx0,
cx0 - dx0, cy0 + dx0, 0, nc_color ); cx0 - dx0, cy0 + dx0, 0, nc_color );
} }
/* Trace de la reference */ /* Trace de la reference */
if( !frame->m_DisplayPadNum ) if( !frame->m_DisplayPadNum )
return; return;
dx = min( m_Size.x, m_Size.y ); /* dx = text size */ dx = min( m_Size.x, m_Size.y ); /* dx = text size */
if( (dx / zoom) > 12 ) /* size must be enought to draw 2 chars */ if( (dx / zoom) > 12 ) /* size must be enought to draw 2 chars */
{ {
wxString buffer; wxString buffer;
ReturnStringPadName( buffer ); ReturnStringPadName( buffer );
dy = buffer.Len(); dy = buffer.Len();
/* Draw text with an angle between -90 deg and + 90 deg */ /* Draw text with an angle between -90 deg and + 90 deg */
NORMALIZE_ANGLE_90( angle ); NORMALIZE_ANGLE_90( angle );
if( dy < 2 ) if( dy < 2 )
dy = 2; /* text min size is 2 char */ dy = 2; /* text min size is 2 char */
dx = (dx * 9 ) / (dy * 13 ); /* Text size ajusted to pad size */ dx = (dx * 9 ) / (dy * 13 ); /* Text size ajusted to pad size */
DrawGraphicText( panel, DC, wxPoint( ux0, uy0 ), DrawGraphicText( panel, DC, wxPoint( ux0, uy0 ),
WHITE, buffer, angle, wxSize( dx, dx ), WHITE, buffer, angle, wxSize( dx, dx ),
GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER ); GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER );
...@@ -579,6 +591,7 @@ int D_PAD::ReadDescr( FILE* File, int* LineNum ) ...@@ -579,6 +591,7 @@ int D_PAD::ReadDescr( FILE* File, int* LineNum )
if( *PtLine ) if( *PtLine )
PtLine++; PtLine++;
memset( m_Padname, 0, sizeof(m_Padname) ); memset( m_Padname, 0, sizeof(m_Padname) );
while( (*PtLine != '"') && *PtLine ) while( (*PtLine != '"') && *PtLine )
{ {
...@@ -629,6 +642,7 @@ int D_PAD::ReadDescr( FILE* File, int* LineNum ) ...@@ -629,6 +642,7 @@ int D_PAD::ReadDescr( FILE* File, int* LineNum )
&m_Offset.x, &m_Offset.y, BufCar, &dx, &dy ); &m_Offset.x, &m_Offset.y, BufCar, &dx, &dy );
m_Drill.y = m_Drill.x; m_Drill.y = m_Drill.x;
m_DrillShape = CIRCLE; m_DrillShape = CIRCLE;
if( nn >= 6 ) // Drill shape = OVAL ? if( nn >= 6 ) // Drill shape = OVAL ?
{ {
if( BufCar[0] == 'O' ) if( BufCar[0] == 'O' )
...@@ -944,6 +958,54 @@ void D_PAD::Display_Infos( WinEDA_BasePcbFrame* frame ) ...@@ -944,6 +958,54 @@ void D_PAD::Display_Infos( WinEDA_BasePcbFrame* frame )
Affiche_1_Parametre( frame, pos, _( "Y pos" ), Line, BLUE ); Affiche_1_Parametre( frame, pos, _( "Y pos" ), Line, BLUE );
} }
/**
* Function HitTest
* tests if the given wxPoint is within the bounds of this object.
* @param ref_pos A wxPoint to test
* @return bool - true if a hit, else false
*/
bool D_PAD::HitTest( const wxPoint& ref_pos )
{
int deltaX, deltaY;
int dx, dy;
double dist;
wxPoint shape_pos = ReturnShapePos();
deltaX = ref_pos.x - shape_pos.x;
deltaY = ref_pos.y - shape_pos.y;
/* Test rapide: le point a tester doit etre a l'interieur du cercle exinscrit ... */
if( (abs( deltaX ) > m_Rayon )
|| (abs( deltaY ) > m_Rayon) )
return false;
/* calcul des demi dim dx et dy */
dx = m_Size.x >> 1; // dx also is the radius for rounded pads
dy = m_Size.y >> 1;
/* localisation ? */
switch( m_PadShape & 0x7F )
{
case CIRCLE:
dist = hypot( deltaX, deltaY );
if( (int) ( round( dist ) ) <= dx )
return true;
break;
default:
/* calcul des coord du point test dans le repere du Pad */
RotatePoint( &deltaX, &deltaY, -m_Orient );
if( (abs( deltaX ) <= dx ) && (abs( deltaY ) <= dy) )
return true;
break;
}
return false;
}
#if defined(DEBUG) #if defined(DEBUG)
/** /**
* Function Show * Function Show
......
...@@ -92,6 +92,14 @@ public: ...@@ -92,6 +92,14 @@ public:
// de la forme (pastilles excentrees) // de la forme (pastilles excentrees)
void Display_Infos( WinEDA_BasePcbFrame* frame ); void Display_Infos( WinEDA_BasePcbFrame* frame );
/**
* Function HitTest
* tests if the given wxPoint is within the bounds of this object.
* @param refPos A wxPoint to test
* @return bool - true if a hit, else false
*/
bool HitTest( const wxPoint& refPos );
#if defined(DEBUG) #if defined(DEBUG)
/** /**
* Function GetClass * Function GetClass
......
...@@ -162,11 +162,10 @@ void TEXTE_PCB::Draw( WinEDA_DrawPanel* panel, wxDC* DC, ...@@ -162,11 +162,10 @@ void TEXTE_PCB::Draw( WinEDA_DrawPanel* panel, wxDC* DC,
void TEXTE_PCB::Show( int nestLevel, std::ostream& os ) void TEXTE_PCB::Show( int nestLevel, std::ostream& os )
{ {
// for now, make it look like XML: // for now, make it look like XML:
NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() << ">\n"; NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() <<
" string=\"" << m_Text.mb_str() << "\"/>\n";
NestedSpace( nestLevel+1, os ) << m_Text.mb_str() << '\n'; // NestedSpace( nestLevel, os ) << "</" << GetClass().Lower().mb_str() << ">\n";
NestedSpace( nestLevel, os ) << "</" << GetClass().Lower().mb_str() << ">\n";
} }
#endif #endif
...@@ -305,12 +305,10 @@ int TEXTE_MODULE::GetDrawRotation( void ) ...@@ -305,12 +305,10 @@ int TEXTE_MODULE::GetDrawRotation( void )
*/ */
void TEXTE_MODULE::Show( int nestLevel, std::ostream& os ) void TEXTE_MODULE::Show( int nestLevel, std::ostream& os )
{ {
// for now, make it look like XML, expand on this later. // for now, make it look like XML:
NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() <<
" string=\"" << m_Text.mb_str() << "\"/>\n";
NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() << ">\n"; // NestedSpace( nestLevel, os ) << "</" << GetClass().Lower().mb_str() << ">\n";
NestedSpace( nestLevel+1, os ) << m_Text.mb_str() << '\n';
NestedSpace( nestLevel, os ) << "</" << GetClass().Lower().mb_str() << ">\n";
} }
#endif #endif
...@@ -125,7 +125,14 @@ void WinEDA_PcbFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos ) ...@@ -125,7 +125,14 @@ void WinEDA_PcbFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos )
break; break;
case ID_PCB_SHOW_1_RATSNEST_BUTT: case ID_PCB_SHOW_1_RATSNEST_BUTT:
#if defined(DEBUG)
DrawStruct = m_Pcb->FindPadOrModule(
GetScreen()->RefPos(true),
GetScreen()->m_Active_Layer,
VISIBLE_ONLY );
#else
DrawStruct = PcbGeneralLocateAndDisplay(); DrawStruct = PcbGeneralLocateAndDisplay();
#endif
Show_1_Ratsnest( DrawStruct, DC ); Show_1_Ratsnest( DrawStruct, DC );
break; break;
...@@ -454,7 +461,8 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event ) ...@@ -454,7 +461,8 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event )
case ID_OPEN_MODULE_EDITOR: case ID_OPEN_MODULE_EDITOR:
if( m_Parent->m_ModuleEditFrame == NULL ) if( m_Parent->m_ModuleEditFrame == NULL )
{ {
m_Parent->m_ModuleEditFrame = new WinEDA_ModuleEditFrame( this, m_Parent->m_ModuleEditFrame =
new WinEDA_ModuleEditFrame( this,
m_Parent, _( "Module Editor" ), m_Parent, _( "Module Editor" ),
wxPoint( -1, wxPoint( -1,
-1 ), -1 ),
...@@ -601,8 +609,7 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event ) ...@@ -601,8 +609,7 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event )
case ID_POPUP_END_LINE: case ID_POPUP_END_LINE:
DrawPanel->MouseToCursorSchema(); DrawPanel->MouseToCursorSchema();
// EndSegment(&dc);
// EndSegment(&dc);
break; break;
case ID_POPUP_PCB_EDIT_TRACK: case ID_POPUP_PCB_EDIT_TRACK:
......
...@@ -341,6 +341,7 @@ void WinEDA_PcbFrame::Show_1_Ratsnest( EDA_BaseStruct* item, wxDC* DC ) ...@@ -341,6 +341,7 @@ void WinEDA_PcbFrame::Show_1_Ratsnest( EDA_BaseStruct* item, wxDC* DC )
{ {
if( item->m_StructType == TYPETEXTEMODULE ) if( item->m_StructType == TYPETEXTEMODULE )
{ {
if( item->m_Parent && (item->m_Parent->m_StructType == TYPEMODULE) )
Module = (MODULE*) item->m_Parent; Module = (MODULE*) item->m_Parent;
} }
......
...@@ -32,30 +32,7 @@ EDA_BaseStruct* Locate_MirePcb( EDA_BaseStruct* PtStruct, int LayerSearch, int t ...@@ -32,30 +32,7 @@ EDA_BaseStruct* Locate_MirePcb( EDA_BaseStruct* PtStruct, int LayerSearch, int t
*/ */
wxPoint inline RefPos( int typeloc ) wxPoint inline RefPos( int typeloc )
{ {
if( typeloc & CURSEUR_OFF_GRILLE ) return ActiveScreen->RefPos( (typeloc & CURSEUR_OFF_GRILLE) != 0 );
return ActiveScreen->m_MousePosition;
else
return ActiveScreen->m_Curseur;
}
/**
* Function IsModuleLayerVisible
* expects either of the two layers on which a module can reside, and returns
* whether that layer is visible.
* @param layer One of the two allowed layers for modules: CMP_N or CUIVRE_N
* @return bool - true if the layer is visible, else false.
*/
bool inline IsModuleLayerVisible( int layer )
{
if( layer==CMP_N )
return DisplayOpt.Show_Modules_Cmp;
else if( layer==CUIVRE_N )
return DisplayOpt.Show_Modules_Cu;
else
return true;
} }
...@@ -344,6 +321,7 @@ EDGE_MODULE* Locate_Edge_Module( MODULE* module, int typeloc ) ...@@ -344,6 +321,7 @@ EDGE_MODULE* Locate_Edge_Module( MODULE* module, int typeloc )
{ {
if( PtStruct->m_StructType != TYPEEDGEMODULE ) if( PtStruct->m_StructType != TYPEEDGEMODULE )
continue; continue;
edge_mod = (EDGE_MODULE*) PtStruct; edge_mod = (EDGE_MODULE*) PtStruct;
type_trace = edge_mod->m_Shape; type_trace = edge_mod->m_Shape;
ux0 = edge_mod->m_Start.x; uy0 = edge_mod->m_Start.y; ux0 = edge_mod->m_Start.x; uy0 = edge_mod->m_Start.y;
...@@ -418,6 +396,7 @@ EDA_BaseStruct* Locate_Cotation( BOARD* Pcb, int LayerSearch, int typeloc ) ...@@ -418,6 +396,7 @@ EDA_BaseStruct* Locate_Cotation( BOARD* Pcb, int LayerSearch, int typeloc )
{ {
if( PtStruct->m_StructType != TYPECOTATION ) if( PtStruct->m_StructType != TYPECOTATION )
continue; continue;
Cotation = (COTATION*) PtStruct; Cotation = (COTATION*) PtStruct;
if( (Cotation->m_Layer != LayerSearch) && (LayerSearch != -1) ) if( (Cotation->m_Layer != LayerSearch) && (LayerSearch != -1) )
continue; continue;
...@@ -426,7 +405,10 @@ EDA_BaseStruct* Locate_Cotation( BOARD* Pcb, int LayerSearch, int typeloc ) ...@@ -426,7 +405,10 @@ EDA_BaseStruct* Locate_Cotation( BOARD* Pcb, int LayerSearch, int typeloc )
pt_txt = Cotation->m_Text; pt_txt = Cotation->m_Text;
if( pt_txt ) if( pt_txt )
{ {
if( pt_txt->HitTest( ref_pos ) ) // because HitTest() is present in both base classes of TEXTE_PCB
// use a dis-ambiguating cast to tell compiler which HitTest()
// to call.
if( static_cast<EDA_TextStruct*>(pt_txt)->HitTest( ref_pos ) )
return PtStruct; return PtStruct;
} }
...@@ -666,52 +648,23 @@ D_PAD* Locate_Pads( MODULE* module, int masque_layer, int typeloc ) ...@@ -666,52 +648,23 @@ D_PAD* Locate_Pads( MODULE* module, int masque_layer, int typeloc )
D_PAD* Locate_Pads( MODULE* module, const wxPoint& ref_pos, int masque_layer ) D_PAD* Locate_Pads( MODULE* module, const wxPoint& ref_pos, int masque_layer )
{ {
D_PAD* pt_pad; D_PAD* pt_pad = module->m_Pads;
int deltaX, deltaY;
wxPoint shape_pos;
double dist;
pt_pad = module->m_Pads;
for( ; pt_pad != NULL; pt_pad = (D_PAD*) pt_pad->Pnext ) for( ; pt_pad != NULL; pt_pad = (D_PAD*) pt_pad->Pnext )
{ {
shape_pos = pt_pad->ReturnShapePos(); /*
wxPoint shape_pos = ReturnShapePos();
why the global ux0?
ux0 = shape_pos.x; ux0 = shape_pos.x;
uy0 = shape_pos.y; /* pos x,y du centre du pad */ uy0 = shape_pos.y; // pos x,y du centre du pad
*/
deltaX = ref_pos.x - ux0;
deltaY = ref_pos.y - uy0;
/* Test rapide: le point a tester doit etre a l'interieur du cercle
* exinscrit ... */
if( (abs( deltaX ) > pt_pad->m_Rayon )
|| (abs( deltaY ) > pt_pad->m_Rayon) )
continue;
/* ... et sur la bonne couche */ /* ... et sur la bonne couche */
if( (pt_pad->m_Masque_Layer & masque_layer) == 0 ) if( (pt_pad->m_Masque_Layer & masque_layer) == 0 )
continue; continue;
/* calcul des demi dim dx et dy */ if( pt_pad->HitTest( ref_pos ) )
dx = pt_pad->m_Size.x >> 1; // dx also is the radius for rounded pads
dy = pt_pad->m_Size.y >> 1;
/* localisation ? */
switch( pt_pad->m_PadShape & 0x7F )
{
case CIRCLE:
dist = hypot( deltaX, deltaY );
if( (int) ( round( dist ) ) <= dx )
return pt_pad; return pt_pad;
break;
default:
/* calcul des coord du point test dans le repere du Pad */
RotatePoint( &deltaX, &deltaY, -pt_pad->m_Orient );
if( (abs( deltaX ) <= dx ) && (abs( deltaY ) <= dy) )
return pt_pad;
break;
}
} }
return NULL; return NULL;
...@@ -743,17 +696,8 @@ MODULE* Locate_Prefered_Module( BOARD* Pcb, int typeloc ) ...@@ -743,17 +696,8 @@ MODULE* Locate_Prefered_Module( BOARD* Pcb, int typeloc )
pt_module = Pcb->m_Modules; pt_module = Pcb->m_Modules;
for( ; pt_module; pt_module = (MODULE*) pt_module->Pnext ) for( ; pt_module; pt_module = (MODULE*) pt_module->Pnext )
{ {
/* calcul des dimensions du cadre :*/ // is the ref point within the module's bounds?
lx = pt_module->m_BoundaryBox.GetWidth(); if( !pt_module->HitTest( ref_pos ) )
ly = pt_module->m_BoundaryBox.GetHeight();
/* Calcul des coord souris dans le repere module */
spot_cX = ref_pos.x - pt_module->m_Pos.x;
spot_cY = ref_pos.y - pt_module->m_Pos.y;
RotatePoint( &spot_cX, &spot_cY, -pt_module->m_Orient );
/* la souris est-elle dans ce rectangle : */
if( !pt_module->m_BoundaryBox.Inside( spot_cX, spot_cY ) )
continue; continue;
// if caller wants to ignore locked modules, and this one is locked, skip it. // if caller wants to ignore locked modules, and this one is locked, skip it.
...@@ -774,12 +718,17 @@ MODULE* Locate_Prefered_Module( BOARD* Pcb, int typeloc ) ...@@ -774,12 +718,17 @@ MODULE* Locate_Prefered_Module( BOARD* Pcb, int typeloc )
else if( layer==ADHESIVE_N_CMP || layer==SILKSCREEN_N_CMP ) else if( layer==ADHESIVE_N_CMP || layer==SILKSCREEN_N_CMP )
layer = CMP_N; layer = CMP_N;
/* calcul des dimensions du cadre :*/
lx = pt_module->m_BoundaryBox.GetWidth();
ly = pt_module->m_BoundaryBox.GetHeight();
if( ( (PCB_SCREEN*) ActiveScreen )->m_Active_Layer == layer ) if( ( (PCB_SCREEN*) ActiveScreen )->m_Active_Layer == layer )
{ {
if( min( lx, ly ) <= min_dim ) if( min( lx, ly ) <= min_dim )
{ {
/* meilleure empreinte localisee sur couche active */ /* meilleure empreinte localisee sur couche active */
module = pt_module; min_dim = min( lx, ly ); module = pt_module;
min_dim = min( lx, ly );
} }
} }
else if( !(typeloc & MATCH_LAYER) else if( !(typeloc & MATCH_LAYER)
...@@ -1155,13 +1104,20 @@ TEXTE_PCB* Locate_Texte_Pcb( EDA_BaseStruct* PtStruct, int LayerSearch, int type ...@@ -1155,13 +1104,20 @@ TEXTE_PCB* Locate_Texte_Pcb( EDA_BaseStruct* PtStruct, int LayerSearch, int type
{ {
if( PtStruct->m_StructType != TYPETEXTE ) if( PtStruct->m_StructType != TYPETEXTE )
continue; continue;
TEXTE_PCB* pt_txt_pcb = (TEXTE_PCB*) PtStruct; TEXTE_PCB* pt_txt_pcb = (TEXTE_PCB*) PtStruct;
if( pt_txt_pcb->HitTest( ref ) )
{
if( pt_txt_pcb->m_Layer == LayerSearch ) if( pt_txt_pcb->m_Layer == LayerSearch )
{
// because HitTest() is present in both base classes of TEXTE_PCB
// use a dis-ambiguating cast to tell compiler which HitTest()
// to call.
if( static_cast<EDA_TextStruct*>(pt_txt_pcb)->HitTest( ref ) )
{
return pt_txt_pcb; return pt_txt_pcb;
} }
} }
}
return NULL; return NULL;
} }
......
This diff is collapsed.
...@@ -71,7 +71,7 @@ eda_global wxSize g_GridList[] ...@@ -71,7 +71,7 @@ eda_global wxSize g_GridList[]
; ;
#define UNDELETE_STACK_SIZE 10 #define UNDELETE_STACK_SIZE 10
eda_global EDA_BaseStruct* g_UnDeleteStack[UNDELETE_STACK_SIZE]; //Liste des elements supprimes eda_global EDA_BaseStruct* g_UnDeleteStack[UNDELETE_STACK_SIZE]; // Liste des elements supprimes
eda_global int g_UnDeleteStackPtr; eda_global int g_UnDeleteStackPtr;
eda_global bool g_ShowGrid eda_global bool g_ShowGrid
...@@ -146,6 +146,26 @@ eda_global bool g_ShowIsolDuringCreateTrack; /* .State controle l'affichage ...@@ -146,6 +146,26 @@ eda_global bool g_ShowIsolDuringCreateTrack; /* .State controle l'affichage
eda_global DISPLAY_OPTIONS DisplayOpt; eda_global DISPLAY_OPTIONS DisplayOpt;
/**
* Function IsModuleLayerVisible
* expects either of the two layers on which a module can reside, and returns
* whether that layer is visible.
* @param layer One of the two allowed layers for modules: CMP_N or CUIVRE_N
* @return bool - true if the layer is visible, else false.
*/
bool inline IsModuleLayerVisible( int layer )
{
if( layer==CMP_N )
return DisplayOpt.Show_Modules_Cmp;
else if( layer==CUIVRE_N )
return DisplayOpt.Show_Modules_Cu;
else
return true;
}
eda_global bool Track_45_Only; /* Flag pour limiter l'inclinaison eda_global bool Track_45_Only; /* Flag pour limiter l'inclinaison
* pistes a 45 degres seulement */ * pistes a 45 degres seulement */
eda_global bool Segments_45_Only;/* Flag pour limiter l'inclinaison eda_global bool Segments_45_Only;/* Flag pour limiter l'inclinaison
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment