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
...@@ -177,6 +179,18 @@ public: ...@@ -177,6 +179,18 @@ public:
const wxPoint& offset, const wxPoint& offset,
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,9 +395,11 @@ public: ...@@ -381,9 +395,11 @@ public:
}; };
/* class to handle component boundary box. /**
* This class is similar to wxRect, but some wxRect functions are very curious, * Class EDA_Rect
* so I prefer this suitable class * handles the component boundary box.
* This class is similar to wxRect, but some wxRect functions are very curious,
* so I prefer this suitable class
*/ */
class EDA_Rect class EDA_Rect
{ {
......
...@@ -174,16 +174,17 @@ public: ...@@ -174,16 +174,17 @@ public:
wxPoint m_Curseur; /* Screen cursor coordinate (on grid) in user units. */ wxPoint m_Curseur; /* Screen cursor coordinate (on grid) in user units. */
wxPoint m_MousePosition; /* Mouse cursor coordinate (off grid) in user units. */ wxPoint m_MousePosition; /* Mouse cursor coordinate (off grid) in user units. */
wxPoint m_MousePositionInPixels; /* Mouse cursor coordinate (off grid) in pixels. */ wxPoint m_MousePositionInPixels; /* Mouse cursor coordinate (off grid) in pixels. */
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
* Utile pour recadrer les affichages lors de la wxSize m_SizeVisu; /* taille en pixels de l'ecran (fenetre de visu
* navigation dans la hierarchie */ * Utile pour recadrer les affichages lors de la
bool m_Center; // TRUE: coord algebriques, FALSE: coord >= 0 * navigation dans la hierarchie */
bool m_Center; // TRUE: coord algebriques, FALSE: coord >= 0
bool m_FirstRedraw; bool m_FirstRedraw;
/* Gestion des editions */ /* Gestion des editions */
...@@ -273,9 +274,22 @@ public: ...@@ -273,9 +274,22 @@ public:
void SetFirstGrid( void ); /* ajuste la grille au mini*/ void SetFirstGrid( void ); /* ajuste la grille au mini*/
void SetLastGrid( void ); /* ajuste la grille au max */ void SetLastGrid( void ); /* ajuste la grille au max */
/**
* 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) #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,9 +377,10 @@ public: ...@@ -375,9 +377,10 @@ 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 */
bool DisplayPolarCood; bool DisplayPolarCood;
bool DisplayZones; bool DisplayZones;
......
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,58 +289,75 @@ void BOARD::Show( int nestLevel, std::ostream& os ) ...@@ -289,58 +289,75 @@ 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
EDA_BaseStruct* found;
ModuleOrPad() :
found(0)
{
}
SEARCH_RESULT Inspect( EDA_BaseStruct* testItem, const void* testData )
{ {
const wxPoint* refPos = (const wxPoint*) testData; public:
EDA_BaseStruct* found;
if( testItem->m_StructType == TYPEMODULE ) int layer;
int typeloc;
PadOrModule( int alayer, int atypeloc ) :
found(0),
layer(alayer),
typeloc(atypeloc) {}
SEARCH_RESULT Inspect( EDA_BaseStruct* testItem, const void* testData )
{ {
/* not finished const wxPoint* refPos = (const wxPoint*) testData;
if( testItem->HitTest( &refPos ) )
if( testItem->m_StructType == TYPEMODULE )
{ {
found = testItem; int mlayer = ((MODULE*)testItem)->m_Layer;
return SEARCH_QUIT;
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;
return SEARCH_QUIT;
}
} }
*/ else if( testItem->m_StructType == TYPEPAD )
}
else if( testItem->m_StructType == TYPEPAD )
{
/* not finished
if( testItem->HitTest( &refPos ) )
{ {
found = testItem; if( testItem->HitTest( *refPos ) )
return SEARCH_QUIT; {
found = testItem;
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 ) )
return inspector.found;
// search the current layer first
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 )
if( Pnext) Pnext->Pback = Pback; 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;
while ( Equipot ) Equipot = (EQUIPOT*) pcb->m_Equipots;
{ while( Equipot )
if(Equipot->m_NetCode == netcode ) break; {
Equipot = (EQUIPOT*) Equipot->Pnext; if( Equipot->m_NetCode == netcode )
} break;
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); {
m_NetCode = tmp; sscanf( Line + 2, " %d", &tmp );
m_NetCode = tmp;
ReadDelimitedText(Ltmp, Line + 2, sizeof(Ltmp) );
m_Netname = CONV_FROM_UTF8(Ltmp); ReadDelimitedText( Ltmp, Line + 2, sizeof(Ltmp) );
continue; m_Netname = CONV_FROM_UTF8( Ltmp );
} continue;
}
if( strncmp(Line,"Lw", 2) == 0 ) /* Texte */
{ if( strncmp( Line, "Lw", 2 ) == 0 ) /* Texte */
sscanf(Line+2," %d", &tmp); {
m_ForceWidth = tmp; sscanf( Line + 2, " %d", &tmp );
continue; m_ForceWidth = tmp;
} 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;
p = m_Reference; NestedSpace( nestLevel+1, os ) <<
for( ; p; p = p->Pnext ) "<boundingBox" << m_BoundaryBox.m_Pos << m_BoundaryBox.m_Size << "/>\n";
p->Show( nestLevel+1, os );
p = m_Value; NestedSpace( nestLevel+1, os ) << "<orientation tenths=\"" << m_Orient << "\"/>\n";
for( ; p; p = p->Pnext )
p->Show( nestLevel+1, os ); EDA_BaseStruct* p;
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
......
...@@ -29,11 +29,11 @@ public: ...@@ -29,11 +29,11 @@ public:
char m_Padname[4]; /* nom (numero) de la pastille (assimilable a un long)*/ char m_Padname[4]; /* nom (numero) de la pastille (assimilable a un long)*/
}; };
wxString m_Netname; /* Net Name */ wxString m_Netname; /* Net Name */
int m_Masque_Layer; // (Bit a Bit :1= cuivre, 15= cmp, int m_Masque_Layer; // (Bit a Bit :1= cuivre, 15= cmp,
// 2..14 = interne // 2..14 = interne
// 16 .. 31 = couches non cuivre // 16 .. 31 = couches non cuivre
int m_PadShape; // forme CERCLE, RECT, OVALE, TRAPEZE ou libre int m_PadShape; // forme CERCLE, RECT, OVALE, TRAPEZE ou libre
int m_DrillShape; // forme CERCLE, OVAL int m_DrillShape; // forme CERCLE, OVAL
...@@ -91,7 +91,15 @@ public: ...@@ -91,7 +91,15 @@ 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,11 +461,12 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event ) ...@@ -454,11 +461,12 @@ 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 =
m_Parent, _( "Module Editor" ), new WinEDA_ModuleEditFrame( this,
wxPoint( -1, m_Parent, _( "Module Editor" ),
-1 ), wxPoint( -1,
wxSize( 600, 400 ) ); -1 ),
wxSize( 600, 400 ) );
m_Parent->m_ModuleEditFrame->Show( TRUE ); m_Parent->m_ModuleEditFrame->Show( TRUE );
m_Parent->m_ModuleEditFrame->Zoom_Automatique( TRUE ); m_Parent->m_ModuleEditFrame->Zoom_Automatique( TRUE );
} }
...@@ -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,7 +341,8 @@ void WinEDA_PcbFrame::Show_1_Ratsnest( EDA_BaseStruct* item, wxDC* DC ) ...@@ -341,7 +341,8 @@ void WinEDA_PcbFrame::Show_1_Ratsnest( EDA_BaseStruct* item, wxDC* DC )
{ {
if( item->m_StructType == TYPETEXTEMODULE ) if( item->m_StructType == TYPETEXTEMODULE )
{ {
Module = (MODULE*) item->m_Parent; if( item->m_Parent && (item->m_Parent->m_StructType == TYPEMODULE) )
Module = (MODULE*) item->m_Parent;
} }
else if( item->m_StructType == TYPEMODULE ) else if( item->m_StructType == TYPEMODULE )
......
...@@ -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 return pt_pad;
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;
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.
...@@ -773,13 +717,18 @@ MODULE* Locate_Prefered_Module( BOARD* Pcb, int typeloc ) ...@@ -773,13 +717,18 @@ 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,11 +1104,18 @@ TEXTE_PCB* Locate_Texte_Pcb( EDA_BaseStruct* PtStruct, int LayerSearch, int type ...@@ -1155,11 +1104,18 @@ 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;
}
} }
} }
......
This diff is collapsed.
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
#define U_PCB (PCB_INTERNAL_UNIT / EESCHEMA_INTERNAL_UNIT) #define U_PCB (PCB_INTERNAL_UNIT / EESCHEMA_INTERNAL_UNIT)
/* valeur de flag indicant si le pointeur de reference pour une localisation /* valeur de flag indicant si le pointeur de reference pour une localisation
* est le curseur sur grille ou le curseur a deplacement fin hors grille */ * est le curseur sur grille ou le curseur a deplacement fin hors grille */
#define CURSEUR_ON_GRILLE (0 << 0) #define CURSEUR_ON_GRILLE (0 << 0)
#define CURSEUR_OFF_GRILLE (1 << 0) #define CURSEUR_OFF_GRILLE (1 << 0)
...@@ -57,7 +57,7 @@ ...@@ -57,7 +57,7 @@
eda_global wxArrayString g_LibName_List; // library list to load eda_global wxArrayString g_LibName_List; // library list to load
eda_global wxSize g_GridList[] eda_global wxSize g_GridList[]
#ifdef MAIN #ifdef MAIN
= { = {
wxSize( 1000, 1000 ), wxSize( 500, 500 ), wxSize( 250, 250 ), wxSize( 200, 200 ), wxSize( 1000, 1000 ), wxSize( 500, 500 ), wxSize( 250, 250 ), wxSize( 200, 200 ),
...@@ -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