Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
K
kicad-source-mirror
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
Elphel
kicad-source-mirror
Commits
7d8f2fcf
Commit
7d8f2fcf
authored
Aug 03, 2007
by
dickelbeck
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
beautified
parent
2ba87b4a
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
1093 additions
and
960 deletions
+1093
-960
hotkeys.cpp
pcbnew/hotkeys.cpp
+259
-233
locate.cpp
pcbnew/locate.cpp
+834
-727
No files found.
pcbnew/hotkeys.cpp
View file @
7d8f2fcf
/***************/
/***************/
/* hotkeys.cpp */
/* hotkeys.cpp */
/***************/
/***************/
#include "fctsys.h"
#include "fctsys.h"
...
@@ -17,61 +17,66 @@
...
@@ -17,61 +17,66 @@
/* variables externes */
/* variables externes */
/***********************************************************/
/***********************************************************/
void
WinEDA_PcbFrame
::
OnHotKey
(
wxDC
*
DC
,
int
hotkey
,
void
WinEDA_PcbFrame
::
OnHotKey
(
wxDC
*
DC
,
int
hotkey
,
EDA_BaseStruct
*
DrawStruct
)
EDA_BaseStruct
*
DrawStruct
)
/***********************************************************/
/***********************************************************/
/* Gestion des commandes rapides (Raccourcis claviers) concernant l'element
/* Gestion des commandes rapides (Raccourcis claviers) concernant l'element
sous le courseur souris
*
sous le courseur souris
Les majuscules/minuscules sont indifferenciees
*
Les majuscules/minuscules sont indifferenciees
touche DELETE: Effacement (Module ou piste selon commande en cours)
*
touche DELETE: Effacement (Module ou piste selon commande en cours)
touche V: Place via en cours de trace de piste
*
touche V: Place via en cours de trace de piste
touche R: Rotation module
*
touche R: Rotation module
touche S: Change couche module (Composant <-> Cuivre)
*
touche S: Change couche module (Composant <-> Cuivre)
touche M: Start Move module
*
touche M: Start Move module
touche G: Start Drag module
*
touche G: Start Drag module
*/
*/
{
{
bool
PopupOn
=
GetScreen
()
->
m_CurrentItem
&&
bool
PopupOn
=
GetScreen
()
->
m_CurrentItem
GetScreen
()
->
m_CurrentItem
->
m_Flags
;
&&
GetScreen
()
->
m_CurrentItem
->
m_Flags
;
bool
ItemFree
=
(
GetScreen
()
->
m_CurrentItem
==
0
)
||
bool
ItemFree
=
(
GetScreen
()
->
m_CurrentItem
==
0
)
(
GetScreen
()
->
m_CurrentItem
->
m_Flags
==
0
);
||
(
GetScreen
()
->
m_CurrentItem
->
m_Flags
==
0
);
if
(
hotkey
==
0
)
return
;
if
(
hotkey
==
0
)
return
;
// code Ctrl A = 1, Ctr B = 2 ..., remapped, (more easy to understand in switch)
// code Ctrl A = 1, Ctr B = 2 ..., remapped, (more easy to understand in switch)
if
(
hotkey
&
GR_KB_CTRL
)
hotkey
+=
'A'
-
1
;
if
(
hotkey
&
GR_KB_CTRL
)
hotkey
+=
'A'
-
1
;
MODULE
*
module
=
NULL
;
MODULE
*
module
=
NULL
;
if
(
hotkey
<=
0xFF
)
hotkey
=
toupper
(
hotkey
);
if
(
hotkey
<=
0xFF
)
switch
(
hotkey
)
hotkey
=
toupper
(
hotkey
);
switch
(
hotkey
)
{
{
case
WXK_DELETE
:
case
WXK_DELETE
:
case
WXK_NUMPAD_DELETE
:
case
WXK_NUMPAD_DELETE
:
OnHotkeyDeleteItem
(
DC
,
DrawStruct
);
OnHotkeyDeleteItem
(
DC
,
DrawStruct
);
break
;
break
;
case
WXK_BACK
:
case
WXK_BACK
:
if
(
m_ID_current_state
==
ID_TRACK_BUTT
&&
if
(
m_ID_current_state
==
ID_TRACK_BUTT
&&
GetScreen
()
->
m_Active_Layer
<=
CMP_N
)
GetScreen
()
->
m_Active_Layer
<=
CMP_N
)
{
{
bool
ItemFree
=
(
GetScreen
()
->
m_CurrentItem
==
NULL
)
||
bool
ItemFree
=
(
GetScreen
()
->
m_CurrentItem
==
NULL
)
(
GetScreen
()
->
m_CurrentItem
->
m_Flags
==
0
);
||
(
GetScreen
()
->
m_CurrentItem
->
m_Flags
==
0
);
if
(
ItemFree
)
if
(
ItemFree
)
{
{
//no track is currently being edited - select a segment and remove it.
//no track is currently being edited - select a segment and remove it.
DrawStruct
=
PcbGeneralLocateAndDisplay
();
DrawStruct
=
PcbGeneralLocateAndDisplay
();
//don't let backspace delete modules!!
//don't let backspace delete modules!!
if
(
DrawStruct
&&
(
DrawStruct
->
m_StructType
==
TYPETRACK
if
(
DrawStruct
&&
(
DrawStruct
->
m_StructType
==
TYPETRACK
||
DrawStruct
->
m_StructType
==
TYPEVIA
)
)
||
DrawStruct
->
m_StructType
==
TYPEVIA
)
)
Delete_Segment
(
DC
,
(
TRACK
*
)
DrawStruct
);
Delete_Segment
(
DC
,
(
TRACK
*
)
DrawStruct
);
GetScreen
()
->
SetModify
();
GetScreen
()
->
SetModify
();
}
}
else
if
(
GetScreen
()
->
m_CurrentItem
->
m_StructType
==
TYPETRACK
)
else
if
(
GetScreen
()
->
m_CurrentItem
->
m_StructType
==
TYPETRACK
)
{
{
//then an element is being edited - remove the last segment.
//then an element is being edited - remove the last segment.
GetScreen
()
->
m_CurrentItem
=
GetScreen
()
->
m_CurrentItem
=
Delete_Segment
(
DC
,
(
TRACK
*
)
GetScreen
()
->
m_CurrentItem
);
Delete_Segment
(
DC
,
(
TRACK
*
)
GetScreen
()
->
m_CurrentItem
);
GetScreen
()
->
SetModify
();
GetScreen
()
->
SetModify
();
}
}
}
}
...
@@ -79,23 +84,23 @@ sous le courseur souris
...
@@ -79,23 +84,23 @@ sous le courseur souris
case
WXK_END
:
case
WXK_END
:
DrawPanel
->
MouseToCursorSchema
();
DrawPanel
->
MouseToCursorSchema
();
End_Route
(
(
TRACK
*
)
(
GetScreen
()
->
m_CurrentItem
),
DC
);
End_Route
(
(
TRACK
*
)
(
GetScreen
()
->
m_CurrentItem
),
DC
);
break
;
break
;
case
'F'
+
GR_KB_CTRL
:
case
'F'
+
GR_KB_CTRL
:
{
{
wxCommandEvent
evt
;
wxCommandEvent
evt
;
evt
.
SetId
(
ID_FIND_ITEMS
);
evt
.
SetId
(
ID_FIND_ITEMS
);
Process_Special_Functions
(
evt
);
Process_Special_Functions
(
evt
);
}
}
break
;
break
;
case
(
int
(
'O'
)
+
GR_KB_CTRL
)
:
case
'O'
+
GR_KB_CTRL
:
{
{
//try not to duplicate save, load code etc.
//try not to duplicate save, load code etc.
wxCommandEvent
evt
;
wxCommandEvent
evt
;
evt
.
SetId
(
ID_LOAD_FILE
);
evt
.
SetId
(
ID_LOAD_FILE
);
Files_io
(
evt
);
Files_io
(
evt
);
}
}
break
;
break
;
...
@@ -103,118 +108,131 @@ sous le courseur souris
...
@@ -103,118 +108,131 @@ sous le courseur souris
{
{
//try not to duplicate save, load code etc.
//try not to duplicate save, load code etc.
wxCommandEvent
evt
;
wxCommandEvent
evt
;
evt
.
SetId
(
ID_SAVE_BOARD
);
evt
.
SetId
(
ID_SAVE_BOARD
);
Files_io
(
evt
);
Files_io
(
evt
);
}
}
break
;
break
;
case
'V'
:
// Switch to alternate layer and Place a via if a track is in progress
case
'V'
:
// Switch to alternate layer and Place a via if a track is in progress
if
(
m_ID_current_state
!=
ID_TRACK_BUTT
)
return
;
if
(
m_ID_current_state
!=
ID_TRACK_BUTT
)
if
(
ItemFree
)
return
;
if
(
ItemFree
)
{
{
Other_Layer_Route
(
NULL
,
DC
);
Other_Layer_Route
(
NULL
,
DC
);
break
;
break
;
}
}
if
(
GetScreen
()
->
m_CurrentItem
->
m_StructType
!=
TYPETRACK
)
if
(
GetScreen
()
->
m_CurrentItem
->
m_StructType
!=
TYPETRACK
)
return
;
return
;
if
(
(
GetScreen
()
->
m_CurrentItem
->
m_Flags
&
IS_NEW
)
==
0
)
if
(
(
GetScreen
()
->
m_CurrentItem
->
m_Flags
&
IS_NEW
)
==
0
)
return
;
return
;
Other_Layer_Route
(
(
TRACK
*
)
GetScreen
()
->
m_CurrentItem
,
DC
);
Other_Layer_Route
(
(
TRACK
*
)
GetScreen
()
->
m_CurrentItem
,
DC
);
if
(
DisplayOpt
.
ContrastModeDisplay
)
if
(
DisplayOpt
.
ContrastModeDisplay
)
GetScreen
()
->
SetRefreshReq
();
GetScreen
()
->
SetRefreshReq
();
break
;
break
;
// Footprint edition:
// Footprint edition:
case
'L'
:
// toggle module "MODULE_is_LOCKED" status:
case
'L'
:
// toggle module "MODULE_is_LOCKED" status:
// get any module, locked or not locked and toggle its locked status
// get any module, locked or not locked and toggle its locked status
if
(
ItemFree
)
if
(
ItemFree
)
module
=
Locate_Prefered_Module
(
m_Pcb
,
CURSEUR_OFF_GRILLE
|
VISIBLE_ONLY
);
module
=
Locate_Prefered_Module
(
m_Pcb
,
CURSEUR_OFF_GRILLE
|
VISIBLE_ONLY
);
else
if
(
GetScreen
()
->
m_CurrentItem
->
m_StructType
==
TYPEMODULE
)
else
if
(
GetScreen
()
->
m_CurrentItem
->
m_StructType
==
TYPEMODULE
)
module
=
(
MODULE
*
)
GetScreen
()
->
m_CurrentItem
;
module
=
(
MODULE
*
)
GetScreen
()
->
m_CurrentItem
;
if
(
module
)
if
(
module
)
{
{
GetScreen
()
->
m_CurrentItem
=
module
;
GetScreen
()
->
m_CurrentItem
=
module
;
module
->
SetLocked
(
!
module
->
IsLocked
()
);
module
->
SetLocked
(
!
module
->
IsLocked
()
);
module
->
Display_Infos
(
this
);
module
->
Display_Infos
(
this
);
}
}
break
;
break
;
case
'G'
:
// Start move (and drag) module
case
'G'
:
// Start move (and drag) module
case
'M'
:
// Start move module
case
'M'
:
// Start move module
if
(
PopupOn
)
break
;
if
(
PopupOn
)
break
;
case
'R'
:
// Rotation
case
'R'
:
// Rotation
case
'S'
:
// move to other side
case
'S'
:
// move to other side
if
(
ItemFree
)
if
(
ItemFree
)
{
{
module
=
Locate_Prefered_Module
(
m_Pcb
,
module
=
Locate_Prefered_Module
(
m_Pcb
,
CURSEUR_OFF_GRILLE
|
IGNORE_LOCKED
|
VISIBLE_ONLY
CURSEUR_OFF_GRILLE
|
IGNORE_LOCKED
|
VISIBLE_ONLY
#if defined
(USE_MATCH_LAYER)
#if defined
(USE_MATCH_LAYER)
|
MATCH_LAYER
|
MATCH_LAYER
#endif
#endif
);
);
if
(
module
==
NULL
)
// no footprint found
if
(
module
==
NULL
)
// no footprint found
{
{
module
=
Locate_Prefered_Module
(
m_Pcb
,
CURSEUR_OFF_GRILLE
);
module
=
Locate_Prefered_Module
(
m_Pcb
,
CURSEUR_OFF_GRILLE
);
if
(
module
)
// a footprint is found, but locked or on an other layer
if
(
module
)
// a footprint is found, but locked or on an other layer
{
{
if
(
module
->
IsLocked
()
)
DisplayInfo
(
this
,
_
(
"Footprint found, but locked"
)
);
if
(
module
->
IsLocked
()
)
DisplayInfo
(
this
,
_
(
"Footprint found, but locked"
)
);
module
=
NULL
;
module
=
NULL
;
}
}
}
}
}
}
else
if
(
GetScreen
()
->
m_CurrentItem
->
m_StructType
==
TYPEMODULE
)
else
if
(
GetScreen
()
->
m_CurrentItem
->
m_StructType
==
TYPEMODULE
)
{
{
module
=
(
MODULE
*
)
GetScreen
()
->
m_CurrentItem
;
module
=
(
MODULE
*
)
GetScreen
()
->
m_CurrentItem
;
// @todo: might need to add a layer check in if() below
// @todo: might need to add a layer check in if() below
if
(
(
GetScreen
()
->
m_CurrentItem
->
m_Flags
==
0
)
&&
if
(
(
GetScreen
()
->
m_CurrentItem
->
m_Flags
==
0
)
module
->
IsLocked
()
)
&&
module
->
IsLocked
()
)
module
=
NULL
;
// do not move, rotate ... it.
module
=
NULL
;
// do not move, rotate ... it.
}
}
if
(
module
==
NULL
)
break
;
if
(
module
==
NULL
)
break
;
GetScreen
()
->
m_CurrentItem
=
module
;
GetScreen
()
->
m_CurrentItem
=
module
;
switch
(
hotkey
)
switch
(
hotkey
)
{
{
case
'R'
:
// Rotation
case
'R'
:
// Rotation
Rotate_Module
(
DC
,
module
,
900
,
TRUE
);
Rotate_Module
(
DC
,
module
,
900
,
TRUE
);
break
;
break
;
case
'S'
:
// move to other side
case
'S'
:
// move to other side
Change_Side_Module
(
module
,
DC
);
Change_Side_Module
(
module
,
DC
);
break
;
break
;
case
'G'
:
// Start move (and drag) module
case
'G'
:
// Start move (and drag) module
g_Drag_Pistes_On
=
TRUE
;
g_Drag_Pistes_On
=
TRUE
;
// fall through
// fall through
case
'M'
:
// Start move module
case
'M'
:
// Start move module
StartMove_Module
(
module
,
DC
);
StartMove_Module
(
module
,
DC
);
break
;
break
;
}
}
module
->
Display_Infos
(
this
);
module
->
Display_Infos
(
this
);
break
;
break
;
}
}
}
}
/***********************************************************/
/***********************************************************/
void
WinEDA_ModuleEditFrame
::
OnHotKey
(
wxDC
*
DC
,
int
hotkey
,
void
WinEDA_ModuleEditFrame
::
OnHotKey
(
wxDC
*
DC
,
int
hotkey
,
EDA_BaseStruct
*
DrawStruct
)
EDA_BaseStruct
*
DrawStruct
)
/***********************************************************/
/***********************************************************/
/* Gestion des commandes rapides (Raccourcis claviers) concernant l'element
/* Gestion des commandes rapides (Raccourcis claviers) concernant l'element
sous le courseur souris
*
sous le courseur souris
Les majuscules/minuscules sont indifferenciees
*
Les majuscules/minuscules sont indifferenciees
*/
*/
{
{
bool
PopupOn
=
GetScreen
()
->
m_CurrentItem
&&
bool
PopupOn
=
GetScreen
()
->
m_CurrentItem
GetScreen
()
->
m_CurrentItem
->
m_Flags
;
&&
GetScreen
()
->
m_CurrentItem
->
m_Flags
;
if
(
hotkey
==
0
)
return
;
if
(
hotkey
==
0
)
return
;
switch
(
hotkey
)
switch
(
hotkey
)
{
{
case
WXK_DELETE
:
case
WXK_DELETE
:
case
WXK_NUMPAD_DELETE
:
case
WXK_NUMPAD_DELETE
:
if
(
PopupOn
)
break
;
if
(
PopupOn
)
break
;
break
;
break
;
case
'r'
:
// Rotation
case
'r'
:
// Rotation
...
@@ -235,53 +253,61 @@ bool PopupOn = GetScreen()->m_CurrentItem &&
...
@@ -235,53 +253,61 @@ bool PopupOn = GetScreen()->m_CurrentItem &&
case
'm'
:
case
'm'
:
case
'M'
:
// Start move drawlibpart
case
'M'
:
// Start move drawlibpart
if
(
PopupOn
)
break
;
if
(
PopupOn
)
break
;
break
;
break
;
}
}
}
}
/******************************************************************************/
/******************************************************************************/
bool
WinEDA_PcbFrame
::
OnHotkeyDeleteItem
(
wxDC
*
DC
,
EDA_BaseStruct
*
DrawStruct
)
bool
WinEDA_PcbFrame
::
OnHotkeyDeleteItem
(
wxDC
*
DC
,
EDA_BaseStruct
*
DrawStruct
)
/******************************************************************************/
/******************************************************************************/
/* Efface l'item pointe par la souris, en reponse a la touche "Del"
/* Efface l'item pointe par la souris, en reponse a la touche "Del"
Effet dependant de l'outil selectionne:
*
Effet dependant de l'outil selectionne:
Outil trace de pistes
*
Outil trace de pistes
Efface le segment en cours ou la piste si pas d'element
*
Efface le segment en cours ou la piste si pas d'element
Outil module:
*
Outil module:
Efface le module.
*
Efface le module.
*/
*/
{
{
bool
ItemFree
=
(
GetScreen
()
->
m_CurrentItem
==
NULL
)
||
bool
ItemFree
=
(
GetScreen
()
->
m_CurrentItem
==
NULL
)
(
GetScreen
()
->
m_CurrentItem
->
m_Flags
==
0
);
||
(
GetScreen
()
->
m_CurrentItem
->
m_Flags
==
0
);
switch
(
m_ID_current_state
)
switch
(
m_ID_current_state
)
{
{
case
ID_TRACK_BUTT
:
case
ID_TRACK_BUTT
:
if
(
GetScreen
()
->
m_Active_Layer
>
CMP_N
)
return
FALSE
;
if
(
GetScreen
()
->
m_Active_Layer
>
CMP_N
)
if
(
ItemFree
)
return
FALSE
;
if
(
ItemFree
)
{
{
DrawStruct
=
PcbGeneralLocateAndDisplay
();
DrawStruct
=
PcbGeneralLocateAndDisplay
();
if
(
DrawStruct
&&
DrawStruct
->
m_StructType
!=
TYPETRACK
)
return
FALSE
;
if
(
DrawStruct
&&
DrawStruct
->
m_StructType
!=
TYPETRACK
)
Delete_Track
(
DC
,
(
TRACK
*
)
DrawStruct
);
return
FALSE
;
Delete_Track
(
DC
,
(
TRACK
*
)
DrawStruct
);
}
}
else
if
(
GetScreen
()
->
m_CurrentItem
->
m_StructType
==
TYPETRACK
)
else
if
(
GetScreen
()
->
m_CurrentItem
->
m_StructType
==
TYPETRACK
)
{
{
GetScreen
()
->
m_CurrentItem
=
GetScreen
()
->
m_CurrentItem
=
Delete_Segment
(
DC
,
(
TRACK
*
)
GetScreen
()
->
m_CurrentItem
);
Delete_Segment
(
DC
,
(
TRACK
*
)
GetScreen
()
->
m_CurrentItem
);
GetScreen
()
->
SetModify
();
GetScreen
()
->
SetModify
();
return
TRUE
;
return
TRUE
;
}
}
break
;
break
;
case
ID_COMPONENT_BUTT
:
case
ID_COMPONENT_BUTT
:
if
(
ItemFree
)
if
(
ItemFree
)
{
{
MODULE
*
module
=
Locate_Prefered_Module
(
m_Pcb
,
CURSEUR_ON_GRILLE
);
MODULE
*
module
=
Locate_Prefered_Module
(
m_Pcb
,
CURSEUR_ON_GRILLE
);
if
(
module
==
NULL
)
return
FALSE
;
if
(
module
==
NULL
)
if
(
!
IsOK
(
this
,
_
(
"Delete module?"
))
)
return
FALSE
;
return
FALSE
;
RemoveStruct
(
module
,
DC
);
if
(
!
IsOK
(
this
,
_
(
"Delete module?"
)
)
)
return
FALSE
;
RemoveStruct
(
module
,
DC
);
}
}
else
return
FALSE
;
else
return
FALSE
;
break
;
break
;
default
:
default
:
...
...
pcbnew/locate.cpp
View file @
7d8f2fcf
/*****************************/
/*****************************/
/* Localisation des elements */
/* Localisation des elements */
/*****************************/
/*****************************/
#include "fctsys.h"
#include "fctsys.h"
#include "gr_basic.h"
#include "gr_basic.h"
...
@@ -14,17 +14,18 @@
...
@@ -14,17 +14,18 @@
/* variables locales */
/* variables locales */
int
ux0
,
uy0
,
dx
,
dy
,
spot_cX
,
spot_cY
;
/* Variables utilisees pour
int
ux0
,
uy0
,
dx
,
dy
,
spot_cX
,
spot_cY
;
/* Variables utilisees pour
la localisation des segments */
*
la localisation des segments */
/* fonctions locales */
/* fonctions locales */
EDA_BaseStruct
*
Locate_MirePcb
(
EDA_BaseStruct
*
PtStruct
,
int
LayerSearch
,
int
typeloc
);
EDA_BaseStruct
*
Locate_MirePcb
(
EDA_BaseStruct
*
PtStruct
,
int
LayerSearch
,
int
typeloc
);
/**/
/**/
/* Macro de calcul de la coord de pointage selon le curseur
/* Macro de calcul de la coord de pointage selon le curseur
(ON/OFF grille) choisi
*
(ON/OFF grille) choisi
*/
*/
#define SET_REF_POS(
ref_pos) if(typeloc == CURSEUR_ON_GRILLE
) \
#define SET_REF_POS(
ref_pos ) if( typeloc == CURSEUR_ON_GRILLE
) \
{ ref_pos = ActiveScreen->m_Curseur;
} \
{ ref_pos = ActiveScreen->m_Curseur;
} \
else { ref_pos = ActiveScreen->m_MousePosition; }
else { ref_pos = ActiveScreen->m_MousePosition; }
...
@@ -35,8 +36,7 @@ EDA_BaseStruct * Locate_MirePcb( EDA_BaseStruct * PtStruct, int LayerSearch, int
...
@@ -35,8 +36,7 @@ EDA_BaseStruct * Locate_MirePcb( EDA_BaseStruct * PtStruct, int LayerSearch, int
* @param layer One of the two allowed layers for modules: CMP_N or CUIVRE_N
* @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.
* @return bool - true if the layer is visible, else false.
*/
*/
bool
inline
IsModuleLayerVisible
(
int
layer
)
bool
inline
IsModuleLayerVisible
(
int
layer
)
{
{
if
(
layer
==
CMP_N
)
if
(
layer
==
CMP_N
)
return
DisplayOpt
.
Show_Modules_Cmp
;
return
DisplayOpt
.
Show_Modules_Cmp
;
...
@@ -49,124 +49,133 @@ bool inline IsModuleLayerVisible( int layer )
...
@@ -49,124 +49,133 @@ bool inline IsModuleLayerVisible( int layer )
/*************************************************************/
/*************************************************************/
MODULE
*
ReturnModule
(
BOARD
*
pcb
,
const
wxString
&
reference
)
MODULE
*
ReturnModule
(
BOARD
*
pcb
,
const
wxString
&
reference
)
/*************************************************************/
/*************************************************************/
/*
/*
Recherche d'un module par sa reference
*
Recherche d'un module par sa reference
Retourne:
*
Retourne:
un pointeur sur le module
*
un pointeur sur le module
Null si pas localis
*
Null si pas localis
*/
*/
{
{
MODULE
*
Module
=
pcb
->
m_Modules
;
MODULE
*
Module
=
pcb
->
m_Modules
;
for
(
;
Module
!=
NULL
;
Module
=
(
MODULE
*
)
Module
->
Pnext
)
for
(
;
Module
!=
NULL
;
Module
=
(
MODULE
*
)
Module
->
Pnext
)
{
{
if
(
reference
.
CmpNoCase
(
Module
->
m_Reference
->
m_Text
)
==
0
)
if
(
reference
.
CmpNoCase
(
Module
->
m_Reference
->
m_Text
)
==
0
)
return
Module
;
return
Module
;
}
}
return
NULL
;
return
NULL
;
}
}
/********************************************************/
/********************************************************/
D_PAD
*
ReturnPad
(
MODULE
*
module
,
const
wxString
&
name
)
D_PAD
*
ReturnPad
(
MODULE
*
module
,
const
wxString
&
name
)
/********************************************************/
/********************************************************/
/* Recherche d'un pad par son nom, pour le module Module
/* Recherche d'un pad par son nom, pour le module Module
*/
*/
{
{
D_PAD
*
pt_pad
;
D_PAD
*
pt_pad
;
wxString
buf
;
wxString
buf
;
if
(
module
==
NULL
)
return
NULL
;
if
(
module
==
NULL
)
return
NULL
;
pt_pad
=
module
->
m_Pads
;
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
)
{
{
pt_pad
->
ReturnStringPadName
(
buf
);
pt_pad
->
ReturnStringPadName
(
buf
);
if
(
buf
.
CmpNoCase
(
name
)
==
0
)
if
(
buf
.
CmpNoCase
(
name
)
==
0
)
return
pt_pad
;
return
pt_pad
;
}
}
return
(
NULL
);
}
return
NULL
;
}
/*******************************************************************************/
/*******************************************************************************/
EDA_BaseStruct
*
WinEDA_BasePcbFrame
::
Locate
(
int
typeloc
,
int
LayerSearch
)
EDA_BaseStruct
*
WinEDA_BasePcbFrame
::
Locate
(
int
typeloc
,
int
LayerSearch
)
/*******************************************************************************/
/*******************************************************************************/
/* General locate function
/* General locate function
Display infos relatives to the item found
*
Display infos relatives to the item found
return a pointer to this item ( or NULL )
*
return a pointer to this item ( or NULL )
*/
*/
{
{
TEXTE_PCB
*
pt_texte_pcb
;
TEXTE_PCB
*
pt_texte_pcb
;
TRACK
*
Track
,
*
TrackLocate
;
TRACK
*
Track
,
*
TrackLocate
;
DRAWSEGMENT
*
DrawSegm
;
DRAWSEGMENT
*
DrawSegm
;
MODULE
*
module
;
MODULE
*
module
;
D_PAD
*
pt_pad
;
D_PAD
*
pt_pad
;
int
masque_layer
;
int
masque_layer
;
EDA_BaseStruct
*
item
;
EDA_BaseStruct
*
item
;
pt_texte_pcb
=
Locate_Texte_Pcb
(
m_Pcb
->
m_Drawings
,
LayerSearch
,
typeloc
);
pt_texte_pcb
=
Locate_Texte_Pcb
(
m_Pcb
->
m_Drawings
,
LayerSearch
,
typeloc
);
if
(
pt_texte_pcb
)
// a PCB text is found
if
(
pt_texte_pcb
)
// a PCB text is found
{
{
Affiche_Infos_PCB_Texte
(
this
,
pt_texte_pcb
);
Affiche_Infos_PCB_Texte
(
this
,
pt_texte_pcb
);
return
pt_texte_pcb
;
return
pt_texte_pcb
;
}
}
DrawSegm
=
Locate_Segment_Pcb
(
m_Pcb
,
LayerSearch
,
typeloc
);
DrawSegm
=
Locate_Segment_Pcb
(
m_Pcb
,
LayerSearch
,
typeloc
);
if
(
DrawSegm
!=
NULL
)
if
(
DrawSegm
!=
NULL
)
{
{
Affiche_Infos_DrawSegment
(
this
,
DrawSegm
);
Affiche_Infos_DrawSegment
(
this
,
DrawSegm
);
return
DrawSegm
;
return
DrawSegm
;
}
}
item
=
Locate_Cotation
(
m_Pcb
,
LayerSearch
,
typeloc
);
item
=
Locate_Cotation
(
m_Pcb
,
LayerSearch
,
typeloc
);
if
(
item
!=
NULL
)
if
(
item
!=
NULL
)
return
item
;
return
item
;
item
=
Locate_MirePcb
(
m_Pcb
->
m_Drawings
,
LayerSearch
,
typeloc
);
item
=
Locate_MirePcb
(
m_Pcb
->
m_Drawings
,
LayerSearch
,
typeloc
);
if
(
item
!=
NULL
)
if
(
item
!=
NULL
)
return
item
;
return
item
;
/* Search for tracks and vias, with via priority */
/* Search for tracks and vias, with via priority */
if
(
LayerSearch
==
-
1
)
masque_layer
=
ALL_LAYERS
;
if
(
LayerSearch
==
-
1
)
else
masque_layer
=
g_TabOneLayerMask
[
LayerSearch
];
masque_layer
=
ALL_LAYERS
;
else
masque_layer
=
g_TabOneLayerMask
[
LayerSearch
];
Track
=
Locate_Pistes
(
m_Pcb
->
m_Track
,
masque_layer
,
typeloc
);
Track
=
Locate_Pistes
(
m_Pcb
->
m_Track
,
masque_layer
,
typeloc
);
if
(
Track
!=
NULL
)
if
(
Track
!=
NULL
)
{
{
TrackLocate
=
Track
;
/* a track or a via is found*/
TrackLocate
=
Track
;
/* a track or a via is found*/
/* Search for a via */
/* Search for a via */
while
(
(
TrackLocate
=
Locate_Pistes
(
TrackLocate
,
while
(
(
TrackLocate
=
Locate_Pistes
(
TrackLocate
,
masque_layer
,
typeloc
)
)
!=
NULL
)
masque_layer
,
typeloc
)
)
!=
NULL
)
{
{
Track
=
TrackLocate
;
Track
=
TrackLocate
;
if
(
TrackLocate
->
m_StructType
==
TYPEVIA
)
break
;
if
(
TrackLocate
->
m_StructType
==
TYPEVIA
)
break
;
TrackLocate
=
(
TRACK
*
)
TrackLocate
->
Pnext
;
TrackLocate
=
(
TRACK
*
)
TrackLocate
->
Pnext
;
}
}
Affiche_Infos_Piste
(
this
,
Track
)
;
Affiche_Infos_Piste
(
this
,
Track
);
return
Track
;
return
Track
;
}
}
/* Search for Pads */
/* Search for Pads */
if
(
(
pt_pad
=
Locate_Any_Pad
(
m_Pcb
,
typeloc
)
)
!=
NULL
)
if
(
(
pt_pad
=
Locate_Any_Pad
(
m_Pcb
,
typeloc
)
)
!=
NULL
)
{
{
pt_pad
->
Display_Infos
(
this
);
return
pt_pad
;
pt_pad
->
Display_Infos
(
this
);
return
pt_pad
;
}
}
/* Search for a footprint text */
/* Search for a footprint text */
// First search: locate texts for footprints on copper or component layer
// First search: locate texts for footprints on copper or component layer
// Priority to the active layer (component or copper.
// Priority to the active layer (component or copper.
// this is useful for small smd components when 2 texts overlap but are not on the same layer
// this is useful for small smd components when 2 texts overlap but are not on the same layer
if
(
LayerSearch
==
LAYER_CUIVRE_N
||
LayerSearch
==
CMP_N
)
if
(
LayerSearch
==
LAYER_CUIVRE_N
||
LayerSearch
==
CMP_N
)
{
{
for
(
module
=
m_Pcb
->
m_Modules
;
module
!=
NULL
;
module
=
(
MODULE
*
)
module
->
Pnext
)
for
(
module
=
m_Pcb
->
m_Modules
;
module
!=
NULL
;
module
=
(
MODULE
*
)
module
->
Pnext
)
{
{
TEXTE_MODULE
*
pt_texte
;
TEXTE_MODULE
*
pt_texte
;
if
(
module
->
m_Layer
!=
LayerSearch
)
if
(
module
->
m_Layer
!=
LayerSearch
)
continue
;
continue
;
...
@@ -174,7 +183,7 @@ EDA_BaseStruct * item;
...
@@ -174,7 +183,7 @@ EDA_BaseStruct * item;
pt_texte
=
LocateTexteModule
(
m_Pcb
,
&
module
,
typeloc
|
VISIBLE_ONLY
);
pt_texte
=
LocateTexteModule
(
m_Pcb
,
&
module
,
typeloc
|
VISIBLE_ONLY
);
if
(
pt_texte
!=
NULL
)
if
(
pt_texte
!=
NULL
)
{
{
Affiche_Infos_E_Texte
(
this
,
module
,
pt_texte
);
Affiche_Infos_E_Texte
(
this
,
module
,
pt_texte
);
return
pt_texte
;
return
pt_texte
;
}
}
}
}
...
@@ -183,11 +192,11 @@ EDA_BaseStruct * item;
...
@@ -183,11 +192,11 @@ EDA_BaseStruct * item;
// Now Search footprint texts on all layers
// Now Search footprint texts on all layers
module
=
NULL
;
module
=
NULL
;
{
{
TEXTE_MODULE
*
pt_texte
;
TEXTE_MODULE
*
pt_texte
;
pt_texte
=
LocateTexteModule
(
m_Pcb
,
&
module
,
typeloc
|
VISIBLE_ONLY
);
pt_texte
=
LocateTexteModule
(
m_Pcb
,
&
module
,
typeloc
|
VISIBLE_ONLY
);
if
(
pt_texte
!=
NULL
)
if
(
pt_texte
!=
NULL
)
{
{
Affiche_Infos_E_Texte
(
this
,
module
,
pt_texte
);
Affiche_Infos_E_Texte
(
this
,
module
,
pt_texte
);
return
pt_texte
;
return
pt_texte
;
}
}
}
}
...
@@ -196,15 +205,15 @@ EDA_BaseStruct * item;
...
@@ -196,15 +205,15 @@ EDA_BaseStruct * item;
module
=
Locate_Prefered_Module
(
m_Pcb
,
typeloc
|
VISIBLE_ONLY
);
module
=
Locate_Prefered_Module
(
m_Pcb
,
typeloc
|
VISIBLE_ONLY
);
if
(
module
!=
NULL
)
if
(
module
!=
NULL
)
{
{
module
->
Display_Infos
(
this
);
module
->
Display_Infos
(
this
);
return
module
;
return
module
;
}
}
/* Search for zones */
/* Search for zones */
if
(
(
TrackLocate
=
Locate_Zone
((
TRACK
*
)
m_Pcb
->
m_Zone
,
if
(
(
TrackLocate
=
Locate_Zone
(
(
TRACK
*
)
m_Pcb
->
m_Zone
,
GetScreen
()
->
m_Active_Layer
,
typeloc
)
)
!=
NULL
)
GetScreen
()
->
m_Active_Layer
,
typeloc
)
)
!=
NULL
)
{
{
Affiche_Infos_Piste
(
this
,
TrackLocate
);
Affiche_Infos_Piste
(
this
,
TrackLocate
);
return
TrackLocate
;
return
TrackLocate
;
}
}
...
@@ -214,54 +223,60 @@ EDA_BaseStruct * item;
...
@@ -214,54 +223,60 @@ EDA_BaseStruct * item;
/*******************************************************************/
/*******************************************************************/
TRACK
*
Locate_Via
(
BOARD
*
Pcb
,
const
wxPoint
&
pos
,
int
layer
)
TRACK
*
Locate_Via
(
BOARD
*
Pcb
,
const
wxPoint
&
pos
,
int
layer
)
/*******************************************************************/
/*******************************************************************/
/* Localise une via au point pX,pY
/* Localise une via au point pX,pY
Si layer < 0 la via sera localisee quelle que soit la couche
*
Si layer < 0 la via sera localisee quelle que soit la couche
Si layer = 0 .. 15 la via sera localisee selon son type:
*
Si layer = 0 .. 15 la via sera localisee selon son type:
- traversante : toutes couches
*
- traversante : toutes couches
- aveugle = entre couches utiles
*
- aveugle = entre couches utiles
- borgnes idem
*
- borgnes idem
Entree : coord du point de reference, couche
*
Entree : coord du point de reference, couche
Sortie: NULL si pas de via
*
Sortie: NULL si pas de via
(TRACK*) adresse de la via
*
(TRACK*) adresse de la via
*/
*/
{
{
TRACK
*
Track
;
TRACK
*
Track
;
for
(
Track
=
Pcb
->
m_Track
;
Track
!=
NULL
;
Track
=
Track
->
Next
()
)
for
(
Track
=
Pcb
->
m_Track
;
Track
!=
NULL
;
Track
=
Track
->
Next
()
)
{
{
if
(
Track
->
m_StructType
!=
TYPEVIA
)
continue
;
if
(
Track
->
m_StructType
!=
TYPEVIA
)
if
(
Track
->
m_Start
!=
pos
)
continue
;
continue
;
if
(
Track
->
GetState
(
BUSY
|
DELETED
)
)
continue
;
if
(
Track
->
m_Start
!=
pos
)
if
(
layer
<
0
)
return
(
Track
);
continue
;
if
(
((
SEGVIA
*
)
Track
)
->
IsViaOnLayer
(
layer
)
)
if
(
Track
->
GetState
(
BUSY
|
DELETED
)
)
return
(
Track
);
continue
;
if
(
layer
<
0
)
return
Track
;
if
(
(
(
SEGVIA
*
)
Track
)
->
IsViaOnLayer
(
layer
)
)
return
Track
;
}
}
return
(
NULL
);
return
NULL
;
}
}
/********************************************************************/
/********************************************************************/
D_PAD
*
Locate_Pad_Connecte
(
BOARD
*
Pcb
,
TRACK
*
ptr_piste
,
int
extr
)
D_PAD
*
Locate_Pad_Connecte
(
BOARD
*
Pcb
,
TRACK
*
ptr_piste
,
int
extr
)
/********************************************************************/
/********************************************************************/
/* localisation de la pastille connectee au point de piste a tester
/* localisation de la pastille connectee au point de piste a tester
entree : ptr_piste: pointeur sur le segment de piste
*
entree : ptr_piste: pointeur sur le segment de piste
extr = flag = START -> debut du segment a tester
*
extr = flag = START -> debut du segment a tester
= END -> fin du segment a tester
*
= END -> fin du segment a tester
retourne:
*
retourne:
un pointeur sur la description de la pastille si localisation
*
un pointeur sur la description de la pastille si localisation
pointeur NULL si pastille non trouvee
*
pointeur NULL si pastille non trouvee
*/
*/
{
{
D_PAD
*
ptr_pad
=
NULL
;
D_PAD
*
ptr_pad
=
NULL
;
int
masque_layer
;
int
masque_layer
;
MODULE
*
module
;
MODULE
*
module
;
wxPoint
ref_pos
;
wxPoint
ref_pos
;
masque_layer
=
g_TabOneLayerMask
[
ptr_piste
->
m_Layer
];
masque_layer
=
g_TabOneLayerMask
[
ptr_piste
->
m_Layer
];
if
(
extr
==
START
)
if
(
extr
==
START
)
{
{
ref_pos
=
ptr_piste
->
m_Start
;
ref_pos
=
ptr_piste
->
m_Start
;
}
}
...
@@ -270,78 +285,85 @@ wxPoint ref_pos;
...
@@ -270,78 +285,85 @@ wxPoint ref_pos;
ref_pos
=
ptr_piste
->
m_End
;
ref_pos
=
ptr_piste
->
m_End
;
}
}
module
=
Pcb
->
m_Modules
;
module
=
Pcb
->
m_Modules
;
for
(
;
module
!=
NULL
;
module
=
(
MODULE
*
)
module
->
Pnext
)
for
(
;
module
!=
NULL
;
module
=
(
MODULE
*
)
module
->
Pnext
)
{
{
ptr_pad
=
Locate_Pads
(
module
,
ref_pos
,
masque_layer
)
;
ptr_pad
=
Locate_Pads
(
module
,
ref_pos
,
masque_layer
);
if
(
ptr_pad
!=
NULL
)
break
;
if
(
ptr_pad
!=
NULL
)
break
;
}
}
return
(
ptr_pad
);
}
return
ptr_pad
;
}
/****************************************************************/
/****************************************************************/
EDGE_MODULE
*
Locate_Edge_Module
(
MODULE
*
module
,
int
typeloc
)
EDGE_MODULE
*
Locate_Edge_Module
(
MODULE
*
module
,
int
typeloc
)
/****************************************************************/
/****************************************************************/
/* Localisation de segments de contour du type edge MODULE
/* Localisation de segments de contour du type edge MODULE
Les contours sont de differents type:
*
Les contours sont de differents type:
simple : succession de droites
*
simple : succession de droites
Arcs de cercles : on a alors debut arc, fin arc , centre
*
Arcs de cercles : on a alors debut arc, fin arc , centre
si debut arc = fin arc : cercle complet
*
si debut arc = fin arc : cercle complet
*
Retourne:
*
Retourne:
Pointeur sur le segment localise
*
Pointeur sur le segment localise
NULL si rien trouve
*
NULL si rien trouve
*/
*/
{
{
EDGE_MODULE
*
edge_mod
;
EDGE_MODULE
*
edge_mod
;
EDA_BaseStruct
*
PtStruct
;
EDA_BaseStruct
*
PtStruct
;
int
uxf
,
uyf
,
type_trace
;
int
uxf
,
uyf
,
type_trace
;
int
rayon
,
dist
;
int
rayon
,
dist
;
wxPoint
ref_pos
;
/* coord du point de localisation */
wxPoint
ref_pos
;
/* coord du point de localisation */
int
StAngle
,
EndAngle
,
MouseAngle
;
/* pour localisation d'arcs,
int
StAngle
,
EndAngle
,
MouseAngle
;
/* pour localisation d'arcs,
angle du point de debut, de fin et du point
* angle du point de debut, de fin et du point
de reference */
* de reference */
if
(
!
module
)
return
NULL
;
if
(
!
module
)
return
NULL
;
SET_REF_POS
(
ref_pos
);
SET_REF_POS
(
ref_pos
);
PtStruct
=
module
->
m_Drawings
;
PtStruct
=
module
->
m_Drawings
;
for
(
;
PtStruct
!=
NULL
;
PtStruct
=
PtStruct
->
Pnext
)
for
(
;
PtStruct
!=
NULL
;
PtStruct
=
PtStruct
->
Pnext
)
{
{
if
(
PtStruct
->
m_StructType
!=
TYPEEDGEMODULE
)
continue
;
if
(
PtStruct
->
m_StructType
!=
TYPEEDGEMODULE
)
edge_mod
=
(
EDGE_MODULE
*
)
PtStruct
;
continue
;
type_trace
=
edge_mod
->
m_Shape
;
edge_mod
=
(
EDGE_MODULE
*
)
PtStruct
;
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
;
uxf
=
edge_mod
->
m_End
.
x
;
uyf
=
edge_mod
->
m_End
.
y
;
uxf
=
edge_mod
->
m_End
.
x
;
uyf
=
edge_mod
->
m_End
.
y
;
switch
(
type_trace
)
switch
(
type_trace
)
{
{
case
S_SEGMENT
:
case
S_SEGMENT
:
/* recalcul des coordonnees avec ux0,uy0 = origine des coord. */
/* recalcul des coordonnees avec ux0,uy0 = origine des coord. */
spot_cX
=
ref_pos
.
x
-
ux0
;
spot_cY
=
ref_pos
.
y
-
uy0
;
spot_cX
=
ref_pos
.
x
-
ux0
;
spot_cY
=
ref_pos
.
y
-
uy0
;
dx
=
uxf
-
ux0
;
dy
=
uyf
-
uy0
;
dx
=
uxf
-
ux0
;
dy
=
uyf
-
uy0
;
/* detection : */
/* detection : */
if
(
distance
(
edge_mod
->
m_Width
/
2
)
)
return
(
edge_mod
)
;
if
(
distance
(
edge_mod
->
m_Width
/
2
)
)
return
edge_mod
;
break
;
break
;
case
S_CIRCLE
:
case
S_CIRCLE
:
rayon
=
(
int
)
hypot
((
double
)(
uxf
-
ux0
),(
double
)(
uyf
-
uy0
)
);
rayon
=
(
int
)
hypot
(
(
double
)
(
uxf
-
ux0
),
(
double
)
(
uyf
-
uy0
)
);
dist
=
(
int
)
hypot
((
double
)(
ref_pos
.
x
-
ux0
),(
double
)
(
ref_pos
.
y
-
uy0
)
);
dist
=
(
int
)
hypot
(
(
double
)
(
ref_pos
.
x
-
ux0
),
(
double
)
(
ref_pos
.
y
-
uy0
)
);
if
(
abs
(
rayon
-
dist
)
<=
edge_mod
->
m_Width
)
return
(
edge_mod
);
if
(
abs
(
rayon
-
dist
)
<=
edge_mod
->
m_Width
)
return
edge_mod
;
break
;
break
;
case
S_ARC
:
case
S_ARC
:
rayon
=
(
int
)
hypot
((
double
)(
uxf
-
ux0
),(
double
)(
uyf
-
uy0
)
);
rayon
=
(
int
)
hypot
(
(
double
)
(
uxf
-
ux0
),
(
double
)
(
uyf
-
uy0
)
);
dist
=
(
int
)
hypot
((
double
)(
ref_pos
.
x
-
ux0
),(
double
)
(
ref_pos
.
y
-
uy0
)
);
dist
=
(
int
)
hypot
(
(
double
)
(
ref_pos
.
x
-
ux0
),
(
double
)
(
ref_pos
.
y
-
uy0
)
);
if
(
abs
(
rayon
-
dist
)
>
edge_mod
->
m_Width
)
break
;
if
(
abs
(
rayon
-
dist
)
>
edge_mod
->
m_Width
)
break
;
/* pour un arc, controle complementaire */
/* pour un arc, controle complementaire */
MouseAngle
=
(
int
)
ArcTangente
(
ref_pos
.
y
-
uy0
,
ref_pos
.
x
-
ux0
);
MouseAngle
=
(
int
)
ArcTangente
(
ref_pos
.
y
-
uy0
,
ref_pos
.
x
-
ux0
);
StAngle
=
(
int
)
ArcTangente
(
uyf
-
uy0
,
uxf
-
ux0
);
StAngle
=
(
int
)
ArcTangente
(
uyf
-
uy0
,
uxf
-
ux0
);
EndAngle
=
StAngle
+
edge_mod
->
m_Angle
;
EndAngle
=
StAngle
+
edge_mod
->
m_Angle
;
if
(
EndAngle
>
3600
)
if
(
EndAngle
>
3600
)
...
@@ -350,35 +372,38 @@ int StAngle, EndAngle, MouseAngle; /* pour localisation d'arcs,
...
@@ -350,35 +372,38 @@ int StAngle, EndAngle, MouseAngle; /* pour localisation d'arcs,
}
}
if
(
(
MouseAngle
>=
StAngle
)
&&
(
MouseAngle
<=
EndAngle
)
)
if
(
(
MouseAngle
>=
StAngle
)
&&
(
MouseAngle
<=
EndAngle
)
)
return
(
edge_mod
)
;
return
edge_mod
;
break
;
break
;
}
}
}
}
return
(
NULL
)
;
return
NULL
;
}
}
/*************************************************************************/
/*************************************************************************/
EDA_BaseStruct
*
Locate_Cotation
(
BOARD
*
Pcb
,
int
LayerSearch
,
int
typeloc
)
EDA_BaseStruct
*
Locate_Cotation
(
BOARD
*
Pcb
,
int
LayerSearch
,
int
typeloc
)
/*************************************************************************/
/*************************************************************************/
/* Serach for a cotation item , on LayerSearch,
/* Serach for a cotation item , on LayerSearch,
(if LayerSearch == -1 , no yaere restriction )
*
(if LayerSearch == -1 , no yaere restriction )
return a pointer to the located item, or NULL
*
return a pointer to the located item, or NULL
*/
*/
{
{
EDA_BaseStruct
*
PtStruct
;
EDA_BaseStruct
*
PtStruct
;
COTATION
*
Cotation
;
COTATION
*
Cotation
;
TEXTE_PCB
*
pt_txt
;
TEXTE_PCB
*
pt_txt
;
wxPoint
ref_pos
;
wxPoint
ref_pos
;
int
ux0
,
uy0
;
int
ux0
,
uy0
;
SET_REF_POS
(
ref_pos
);
SET_REF_POS
(
ref_pos
);
PtStruct
=
Pcb
->
m_Drawings
;
PtStruct
=
Pcb
->
m_Drawings
;
for
(
;
PtStruct
!=
NULL
;
PtStruct
=
PtStruct
->
Pnext
)
for
(
;
PtStruct
!=
NULL
;
PtStruct
=
PtStruct
->
Pnext
)
{
{
if
(
PtStruct
->
m_StructType
!=
TYPECOTATION
)
continue
;
if
(
PtStruct
->
m_StructType
!=
TYPECOTATION
)
continue
;
Cotation
=
(
COTATION
*
)
PtStruct
;
Cotation
=
(
COTATION
*
)
PtStruct
;
if
(
(
Cotation
->
m_Layer
!=
LayerSearch
)
&&
(
LayerSearch
!=
-
1
)
)
if
(
(
Cotation
->
m_Layer
!=
LayerSearch
)
&&
(
LayerSearch
!=
-
1
)
)
continue
;
continue
;
...
@@ -387,116 +412,128 @@ int ux0, uy0;
...
@@ -387,116 +412,128 @@ int ux0, uy0;
pt_txt
=
Cotation
->
m_Text
;
pt_txt
=
Cotation
->
m_Text
;
if
(
pt_txt
)
if
(
pt_txt
)
{
{
if
(
pt_txt
->
Locate
(
ref_pos
)
)
return
(
PtStruct
);
if
(
pt_txt
->
Locate
(
ref_pos
)
)
return
PtStruct
;
}
}
/* Localisation des SEGMENTS ?) */
/* Localisation des SEGMENTS ?) */
ux0
=
Cotation
->
Barre_ox
;
uy0
=
Cotation
->
Barre_oy
;
ux0
=
Cotation
->
Barre_ox
;
uy0
=
Cotation
->
Barre_oy
;
/* recalcul des coordonnees avec ux0, uy0 = origine des coordonnees */
/* recalcul des coordonnees avec ux0, uy0 = origine des coordonnees */
dx
=
Cotation
->
Barre_fx
-
ux0
;
dy
=
Cotation
->
Barre_fy
-
uy0
;
dx
=
Cotation
->
Barre_fx
-
ux0
;
dy
=
Cotation
->
Barre_fy
-
uy0
;
spot_cX
=
ref_pos
.
x
-
ux0
;
spot_cY
=
ref_pos
.
y
-
uy0
;
spot_cX
=
ref_pos
.
x
-
ux0
;
spot_cY
=
ref_pos
.
y
-
uy0
;
/* detection : */
/* detection : */
if
(
distance
(
Cotation
->
m_Width
/
2
))
return
(
PtStruct
);
if
(
distance
(
Cotation
->
m_Width
/
2
)
)
return
PtStruct
;
ux0
=
Cotation
->
TraitG_ox
;
uy0
=
Cotation
->
TraitG_oy
;
ux0
=
Cotation
->
TraitG_ox
;
uy0
=
Cotation
->
TraitG_oy
;
/* recalcul des coordonnees avec ux0, uy0 = origine des coordonnees */
/* recalcul des coordonnees avec ux0, uy0 = origine des coordonnees */
dx
=
Cotation
->
TraitG_fx
-
ux0
;
dy
=
Cotation
->
TraitG_fy
-
uy0
;
dx
=
Cotation
->
TraitG_fx
-
ux0
;
dy
=
Cotation
->
TraitG_fy
-
uy0
;
spot_cX
=
ref_pos
.
x
-
ux0
;
spot_cY
=
ref_pos
.
y
-
uy0
;
spot_cX
=
ref_pos
.
x
-
ux0
;
spot_cY
=
ref_pos
.
y
-
uy0
;
/* detection : */
/* detection : */
if
(
distance
(
Cotation
->
m_Width
/
2
))
return
(
PtStruct
);
if
(
distance
(
Cotation
->
m_Width
/
2
)
)
return
PtStruct
;
ux0
=
Cotation
->
TraitD_ox
;
uy0
=
Cotation
->
TraitD_oy
;
ux0
=
Cotation
->
TraitD_ox
;
uy0
=
Cotation
->
TraitD_oy
;
/* recalcul des coordonnees avec ux0, uy0 = origine des coordonnees */
/* recalcul des coordonnees avec ux0, uy0 = origine des coordonnees */
dx
=
Cotation
->
TraitD_fx
-
ux0
;
dy
=
Cotation
->
TraitD_fy
-
uy0
;
dx
=
Cotation
->
TraitD_fx
-
ux0
;
dy
=
Cotation
->
TraitD_fy
-
uy0
;
spot_cX
=
ref_pos
.
x
-
ux0
;
spot_cY
=
ref_pos
.
y
-
uy0
;
spot_cX
=
ref_pos
.
x
-
ux0
;
spot_cY
=
ref_pos
.
y
-
uy0
;
/* detection : */
/* detection : */
if
(
distance
(
Cotation
->
m_Width
/
2
))
return
(
PtStruct
);
if
(
distance
(
Cotation
->
m_Width
/
2
)
)
return
PtStruct
;
ux0
=
Cotation
->
FlecheD1_ox
;
uy0
=
Cotation
->
FlecheD1_oy
;
ux0
=
Cotation
->
FlecheD1_ox
;
uy0
=
Cotation
->
FlecheD1_oy
;
/* recalcul des coordonnees avec ux0, uy0 = origine des coordonnees */
/* recalcul des coordonnees avec ux0, uy0 = origine des coordonnees */
dx
=
Cotation
->
FlecheD1_fx
-
ux0
;
dy
=
Cotation
->
FlecheD1_fy
-
uy0
;
dx
=
Cotation
->
FlecheD1_fx
-
ux0
;
dy
=
Cotation
->
FlecheD1_fy
-
uy0
;
spot_cX
=
ref_pos
.
x
-
ux0
;
spot_cY
=
ref_pos
.
y
-
uy0
;
spot_cX
=
ref_pos
.
x
-
ux0
;
spot_cY
=
ref_pos
.
y
-
uy0
;
/* detection : */
/* detection : */
if
(
distance
(
Cotation
->
m_Width
/
2
))
return
(
PtStruct
);
if
(
distance
(
Cotation
->
m_Width
/
2
)
)
return
PtStruct
;
ux0
=
Cotation
->
FlecheD2_ox
;
uy0
=
Cotation
->
FlecheD2_oy
;
ux0
=
Cotation
->
FlecheD2_ox
;
uy0
=
Cotation
->
FlecheD2_oy
;
/* recalcul des coordonnees avec ux0, uy0 = origine des coordonnees */
/* recalcul des coordonnees avec ux0, uy0 = origine des coordonnees */
dx
=
Cotation
->
FlecheD2_fx
-
ux0
;
dy
=
Cotation
->
FlecheD2_fy
-
uy0
;
dx
=
Cotation
->
FlecheD2_fx
-
ux0
;
dy
=
Cotation
->
FlecheD2_fy
-
uy0
;
spot_cX
=
ref_pos
.
x
-
ux0
;
spot_cY
=
ref_pos
.
y
-
uy0
;
spot_cX
=
ref_pos
.
x
-
ux0
;
spot_cY
=
ref_pos
.
y
-
uy0
;
/* detection : */
/* detection : */
if
(
distance
(
Cotation
->
m_Width
/
2
))
return
(
PtStruct
);
if
(
distance
(
Cotation
->
m_Width
/
2
)
)
return
PtStruct
;
ux0
=
Cotation
->
FlecheG1_ox
;
uy0
=
Cotation
->
FlecheG1_oy
;
ux0
=
Cotation
->
FlecheG1_ox
;
uy0
=
Cotation
->
FlecheG1_oy
;
/* recalcul des coordonnees avec ux0, uy0 = origine des coordonnees */
/* recalcul des coordonnees avec ux0, uy0 = origine des coordonnees */
dx
=
Cotation
->
FlecheG1_fx
-
ux0
;
dy
=
Cotation
->
FlecheG1_fy
-
uy0
;
dx
=
Cotation
->
FlecheG1_fx
-
ux0
;
dy
=
Cotation
->
FlecheG1_fy
-
uy0
;
spot_cX
=
ref_pos
.
x
-
ux0
;
spot_cY
=
ref_pos
.
y
-
uy0
;
spot_cX
=
ref_pos
.
x
-
ux0
;
spot_cY
=
ref_pos
.
y
-
uy0
;
/* detection : */
/* detection : */
if
(
distance
(
Cotation
->
m_Width
/
2
))
return
(
PtStruct
);
if
(
distance
(
Cotation
->
m_Width
/
2
)
)
return
PtStruct
;
ux0
=
Cotation
->
FlecheG2_ox
;
uy0
=
Cotation
->
FlecheG2_oy
;
ux0
=
Cotation
->
FlecheG2_ox
;
uy0
=
Cotation
->
FlecheG2_oy
;
/* recalcul des coordonnees avec ux0, uy0 = origine des coordonnees */
/* recalcul des coordonnees avec ux0, uy0 = origine des coordonnees */
dx
=
Cotation
->
FlecheG2_fx
-
ux0
;
dy
=
Cotation
->
FlecheG2_fy
-
uy0
;
dx
=
Cotation
->
FlecheG2_fx
-
ux0
;
dy
=
Cotation
->
FlecheG2_fy
-
uy0
;
spot_cX
=
ref_pos
.
x
-
ux0
;
spot_cY
=
ref_pos
.
y
-
uy0
;
spot_cX
=
ref_pos
.
x
-
ux0
;
spot_cY
=
ref_pos
.
y
-
uy0
;
/* detection : */
/* detection : */
if
(
distance
(
Cotation
->
m_Width
/
2
))
return
(
PtStruct
);
if
(
distance
(
Cotation
->
m_Width
/
2
)
)
return
PtStruct
;
}
}
return
(
NULL
)
;
return
NULL
;
}
}
/*************************************************************************/
/*************************************************************************/
DRAWSEGMENT
*
Locate_Segment_Pcb
(
BOARD
*
Pcb
,
int
LayerSearch
,
int
typeloc
)
DRAWSEGMENT
*
Locate_Segment_Pcb
(
BOARD
*
Pcb
,
int
LayerSearch
,
int
typeloc
)
/*************************************************************************/
/*************************************************************************/
/* Localisation de segments de contour du type drawing
/* Localisation de segments de contour du type drawing
Retourne:
*
Retourne:
Pointeur sur DEBUT du segment localise
*
Pointeur sur DEBUT du segment localise
NULL si rien trouve
*
NULL si rien trouve
Le segment sur la couche active est dtect en priorite
*
Le segment sur la couche active est dtect en priorite
*/
*/
{
{
EDA_BaseStruct
*
PtStruct
;
EDA_BaseStruct
*
PtStruct
;
DRAWSEGMENT
*
pts
,
*
locate_segm
=
NULL
;
DRAWSEGMENT
*
pts
,
*
locate_segm
=
NULL
;
wxPoint
ref_pos
;
wxPoint
ref_pos
;
PCB_SCREEN
*
screen
=
(
PCB_SCREEN
*
)
ActiveScreen
;
PCB_SCREEN
*
screen
=
(
PCB_SCREEN
*
)
ActiveScreen
;
SET_REF_POS
(
ref_pos
);
SET_REF_POS
(
ref_pos
);
PtStruct
=
Pcb
->
m_Drawings
;
PtStruct
=
Pcb
->
m_Drawings
;
for
(
;
PtStruct
!=
NULL
;
PtStruct
=
PtStruct
->
Pnext
)
for
(
;
PtStruct
!=
NULL
;
PtStruct
=
PtStruct
->
Pnext
)
{
{
if
(
PtStruct
->
m_StructType
!=
TYPEDRAWSEGMENT
)
continue
;
if
(
PtStruct
->
m_StructType
!=
TYPEDRAWSEGMENT
)
pts
=
(
DRAWSEGMENT
*
)
PtStruct
;
continue
;
if
(
(
pts
->
m_Layer
!=
LayerSearch
)
&&
(
LayerSearch
!=
-
1
)
)
pts
=
(
DRAWSEGMENT
*
)
PtStruct
;
if
(
(
pts
->
m_Layer
!=
LayerSearch
)
&&
(
LayerSearch
!=
-
1
)
)
continue
;
continue
;
ux0
=
pts
->
m_Start
.
x
;
uy0
=
pts
->
m_Start
.
y
;
ux0
=
pts
->
m_Start
.
x
;
uy0
=
pts
->
m_Start
.
y
;
/* recalcul des coordonnees avec ux0, uy0 = origine des coordonnees */
/* recalcul des coordonnees avec ux0, uy0 = origine des coordonnees */
dx
=
pts
->
m_End
.
x
-
ux0
;
dy
=
pts
->
m_End
.
y
-
uy0
;
dx
=
pts
->
m_End
.
x
-
ux0
;
dy
=
pts
->
m_End
.
y
-
uy0
;
spot_cX
=
ref_pos
.
x
-
ux0
;
spot_cY
=
ref_pos
.
y
-
uy0
;
spot_cX
=
ref_pos
.
x
-
ux0
;
spot_cY
=
ref_pos
.
y
-
uy0
;
/* detection : */
/* detection : */
if
(
(
pts
->
m_Shape
==
S_CIRCLE
)
||
(
pts
->
m_Shape
==
S_ARC
)
)
if
(
(
pts
->
m_Shape
==
S_CIRCLE
)
||
(
pts
->
m_Shape
==
S_ARC
)
)
{
{
int
rayon
,
dist
,
StAngle
,
EndAngle
,
MouseAngle
;
int
rayon
,
dist
,
StAngle
,
EndAngle
,
MouseAngle
;
rayon
=
(
int
)
hypot
(
(
double
)(
dx
),(
double
)
(
dy
)
);
rayon
=
(
int
)
hypot
(
(
double
)
(
dx
),
(
double
)
(
dy
)
);
dist
=
(
int
)
hypot
((
double
)(
spot_cX
),(
double
)
(
spot_cY
)
);
dist
=
(
int
)
hypot
(
(
double
)
(
spot_cX
),
(
double
)
(
spot_cY
)
);
if
(
abs
(
rayon
-
dist
)
<=
(
pts
->
m_Width
/
2
)
)
if
(
abs
(
rayon
-
dist
)
<=
(
pts
->
m_Width
/
2
)
)
{
{
if
(
pts
->
m_Shape
==
S_CIRCLE
)
if
(
pts
->
m_Shape
==
S_CIRCLE
)
{
{
if
(
pts
->
m_Layer
==
screen
->
m_Active_Layer
)
if
(
pts
->
m_Layer
==
screen
->
m_Active_Layer
)
return
(
pts
)
;
return
pts
;
else
if
(
!
locate_segm
)
locate_segm
=
pts
;
else
if
(
!
locate_segm
)
locate_segm
=
pts
;
}
}
/* pour un arc, controle complementaire */
/* pour un arc, controle complementaire */
MouseAngle
=
(
int
)
ArcTangente
(
spot_cY
,
spot_cX
);
MouseAngle
=
(
int
)
ArcTangente
(
spot_cY
,
spot_cX
);
StAngle
=
(
int
)
ArcTangente
(
dy
,
dx
);
StAngle
=
(
int
)
ArcTangente
(
dy
,
dx
);
EndAngle
=
StAngle
+
pts
->
m_Angle
;
EndAngle
=
StAngle
+
pts
->
m_Angle
;
if
(
EndAngle
>
3600
)
if
(
EndAngle
>
3600
)
...
@@ -505,74 +542,79 @@ PCB_SCREEN *screen = (PCB_SCREEN *)ActiveScreen;
...
@@ -505,74 +542,79 @@ PCB_SCREEN *screen = (PCB_SCREEN *)ActiveScreen;
}
}
if
(
(
MouseAngle
>=
StAngle
)
&&
(
MouseAngle
<=
EndAngle
)
)
if
(
(
MouseAngle
>=
StAngle
)
&&
(
MouseAngle
<=
EndAngle
)
)
{
{
if
(
pts
->
m_Layer
==
screen
->
m_Active_Layer
)
if
(
pts
->
m_Layer
==
screen
->
m_Active_Layer
)
return
(
pts
)
;
return
pts
;
else
if
(
!
locate_segm
)
locate_segm
=
pts
;
else
if
(
!
locate_segm
)
locate_segm
=
pts
;
}
}
}
}
}
}
else
else
{
{
if
(
distance
(
pts
->
m_Width
/
2
)
)
if
(
distance
(
pts
->
m_Width
/
2
)
)
{
{
if
(
pts
->
m_Layer
==
screen
->
m_Active_Layer
)
if
(
pts
->
m_Layer
==
screen
->
m_Active_Layer
)
return
(
pts
)
;
return
pts
;
else
if
(
!
locate_segm
)
locate_segm
=
pts
;
else
if
(
!
locate_segm
)
locate_segm
=
pts
;
}
}
}
}
}
}
return
(
locate_segm
)
;
return
locate_segm
;
}
}
/*************************************************/
/*************************************************/
/* D_PAD * Locate_Any_Pad(int typeloc, bool OnlyCurrentLayer) */
/* D_PAD * Locate_Any_Pad(int typeloc, bool OnlyCurrentLayer) */
/* D_PAD* Locate_Any_Pad(int ref_pos, bool OnlyCurrentLayer) */
/* D_PAD* Locate_Any_Pad(int ref_pos, bool OnlyCurrentLayer) */
/*************************************************/
/*************************************************/
/*
/*
localisation de la pastille pointee par la coordonnee ref_pos.x,,ref_pos.y, ou
*
localisation de la pastille pointee par la coordonnee ref_pos.x,,ref_pos.y, ou
par la souris, recherche faite sur toutes les empreintes.
*
par la souris, recherche faite sur toutes les empreintes.
entree :
*
entree :
- coord souris
* - coord souris
ou ref_pos
*
ou ref_pos
retourne:
*
retourne:
pointeur sur la description de la pastille si localisation
*
pointeur sur la description de la pastille si localisation
pointeur NULL si pastille non trouvee
*
pointeur NULL si pastille non trouvee
num_empr = numero d'empreinte du pad
*
num_empr = numero d'empreinte du pad
*
la priorit est donne a la couche active
*
la priorit est donne a la couche active
*/
*/
D_PAD
*
Locate_Any_Pad
(
BOARD
*
Pcb
,
int
typeloc
,
bool
OnlyCurrentLayer
)
D_PAD
*
Locate_Any_Pad
(
BOARD
*
Pcb
,
int
typeloc
,
bool
OnlyCurrentLayer
)
{
{
wxPoint
ref_pos
;
wxPoint
ref_pos
;
SET_REF_POS
(
ref_pos
);
SET_REF_POS
(
ref_pos
);
return
(
Locate_Any_Pad
(
Pcb
,
ref_pos
,
OnlyCurrentLayer
))
;
return
Locate_Any_Pad
(
Pcb
,
ref_pos
,
OnlyCurrentLayer
)
;
}
}
D_PAD
*
Locate_Any_Pad
(
BOARD
*
Pcb
,
const
wxPoint
&
ref_pos
,
bool
OnlyCurrentLayer
)
D_PAD
*
Locate_Any_Pad
(
BOARD
*
Pcb
,
const
wxPoint
&
ref_pos
,
bool
OnlyCurrentLayer
)
{
{
D_PAD
*
pt_pad
;
D_PAD
*
pt_pad
;
MODULE
*
module
;
MODULE
*
module
;
int
layer_mask
=
g_TabOneLayerMask
[
((
PCB_SCREEN
*
)
ActiveScreen
)
->
m_Active_Layer
];
int
layer_mask
=
g_TabOneLayerMask
[
(
(
PCB_SCREEN
*
)
ActiveScreen
)
->
m_Active_Layer
];
module
=
Pcb
->
m_Modules
;
module
=
Pcb
->
m_Modules
;
for
(
;
module
!=
NULL
;
module
=
(
MODULE
*
)
module
->
Pnext
)
for
(
;
module
!=
NULL
;
module
=
(
MODULE
*
)
module
->
Pnext
)
{
{
/* First: Search a pad on the active layer: */
/* First: Search a pad on the active layer: */
if
(
(
pt_pad
=
Locate_Pads
(
module
,
ref_pos
,
layer_mask
)
)
!=
NULL
)
if
(
(
pt_pad
=
Locate_Pads
(
module
,
ref_pos
,
layer_mask
)
)
!=
NULL
)
return
(
pt_pad
)
;
return
pt_pad
;
/* If not found, search on other layers: */
/* If not found, search on other layers: */
if
(
!
OnlyCurrentLayer
)
if
(
!
OnlyCurrentLayer
)
{
{
if
(
(
pt_pad
=
Locate_Pads
(
module
,
ref_pos
,
ALL_LAYERS
)
)
!=
NULL
)
if
(
(
pt_pad
=
Locate_Pads
(
module
,
ref_pos
,
ALL_LAYERS
)
)
!=
NULL
)
return
(
pt_pad
)
;
return
pt_pad
;
}
}
}
}
return
(
NULL
)
;
return
NULL
;
}
}
...
@@ -582,33 +624,33 @@ int layer_mask = g_TabOneLayerMask[ ((PCB_SCREEN*)ActiveScreen)->m_Active_Layer]
...
@@ -582,33 +624,33 @@ int layer_mask = g_TabOneLayerMask[ ((PCB_SCREEN*)ActiveScreen)->m_Active_Layer]
/******************************************************************************/
/******************************************************************************/
/* localisation de la pastille pointee par la coordonnee ref_pos.x,,ref_pos.y, ou
/* localisation de la pastille pointee par la coordonnee ref_pos.x,,ref_pos.y, ou
par la souris, concernant l'empreinte en cours.
*
par la souris, concernant l'empreinte en cours.
entree :
*
entree :
- parametres generaux de l'empreinte mise a jour par caract()
*
- parametres generaux de l'empreinte mise a jour par caract()
- masque_layer = couche(s) (bit_masque)sur laquelle doit etre la pastille
*
- masque_layer = couche(s) (bit_masque)sur laquelle doit etre la pastille
retourne:
*
retourne:
un pointeur sur la description de la pastille si localisation
*
un pointeur sur la description de la pastille si localisation
pointeur NULL si pastille non trouvee
*
pointeur NULL si pastille non trouvee
*/
*/
D_PAD
*
Locate_Pads
(
MODULE
*
module
,
int
masque_layer
,
int
typeloc
)
D_PAD
*
Locate_Pads
(
MODULE
*
module
,
int
masque_layer
,
int
typeloc
)
{
{
wxPoint
ref_pos
;
wxPoint
ref_pos
;
SET_REF_POS
(
ref_pos
);
SET_REF_POS
(
ref_pos
);
return
(
Locate_Pads
(
module
,
ref_pos
,
masque_layer
)
);
return
Locate_Pads
(
module
,
ref_pos
,
masque_layer
);
}
}
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
;
int
deltaX
,
deltaY
;
int
deltaX
,
deltaY
;
wxPoint
shape_pos
;
wxPoint
shape_pos
;
double
dist
;
double
dist
;
pt_pad
=
module
->
m_Pads
;
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
();
shape_pos
=
pt_pad
->
ReturnShapePos
();
ux0
=
shape_pos
.
x
;
uy0
=
shape_pos
.
y
;
/* pos x,y du centre du pad */
ux0
=
shape_pos
.
x
;
uy0
=
shape_pos
.
y
;
/* pos x,y du centre du pad */
...
@@ -616,47 +658,51 @@ double dist;
...
@@ -616,47 +658,51 @@ double dist;
deltaX
=
ref_pos
.
x
-
ux0
;
deltaY
=
ref_pos
.
y
-
uy0
;
deltaX
=
ref_pos
.
x
-
ux0
;
deltaY
=
ref_pos
.
y
-
uy0
;
/* Test rapide: le point a tester doit etre a l'interieur du cercle
/* Test rapide: le point a tester doit etre a l'interieur du cercle
exinscrit ... */
*
exinscrit ... */
if
(
(
abs
(
deltaX
)
>
pt_pad
->
m_Rayon
)
||
if
(
(
abs
(
deltaX
)
>
pt_pad
->
m_Rayon
)
(
abs
(
deltaY
)
>
pt_pad
->
m_Rayon
)
)
||
(
abs
(
deltaY
)
>
pt_pad
->
m_Rayon
)
)
continue
;
continue
;
/* ... et sur la bonne couche */
/* ... et sur la bonne couche */
if
(
(
pt_pad
->
m_Masque_Layer
&
masque_layer
)
==
0
)
continue
;
if
(
(
pt_pad
->
m_Masque_Layer
&
masque_layer
)
==
0
)
continue
;
/* calcul des demi dim dx et dy */
/* calcul des demi dim dx et dy */
dx
=
pt_pad
->
m_Size
.
x
>>
1
;
// dx also is the radius for rounded pads
dx
=
pt_pad
->
m_Size
.
x
>>
1
;
// dx also is the radius for rounded pads
dy
=
pt_pad
->
m_Size
.
y
>>
1
;
dy
=
pt_pad
->
m_Size
.
y
>>
1
;
/* localisation ? */
/* localisation ? */
switch
(
pt_pad
->
m_PadShape
&
0x7F
)
switch
(
pt_pad
->
m_PadShape
&
0x7F
)
{
{
case
CIRCLE
:
case
CIRCLE
:
dist
=
hypot
(
deltaX
,
deltaY
);
dist
=
hypot
(
deltaX
,
deltaY
);
if
(
(
int
)(
round
(
dist
))
<=
dx
)
return
(
pt_pad
)
;
if
(
(
int
)
(
round
(
dist
)
)
<=
dx
)
return
pt_pad
;
break
;
break
;
default
:
default
:
/* calcul des coord du point test dans le repere du Pad */
/* calcul des coord du point test dans le repere du Pad */
RotatePoint
(
&
deltaX
,
&
deltaY
,
-
pt_pad
->
m_Orient
);
RotatePoint
(
&
deltaX
,
&
deltaY
,
-
pt_pad
->
m_Orient
);
if
(
(
abs
(
deltaX
)
<=
dx
)
&&
(
abs
(
deltaY
)
<=
dy
)
)
if
(
(
abs
(
deltaX
)
<=
dx
)
&&
(
abs
(
deltaY
)
<=
dy
)
)
return
(
pt_pad
)
;
return
pt_pad
;
break
;
break
;
}
}
}
}
return
(
NULL
);
return
NULL
;
}
}
/********************************************************/
/********************************************************/
MODULE
*
Locate_Prefered_Module
(
BOARD
*
Pcb
,
int
typeloc
)
MODULE
*
Locate_Prefered_Module
(
BOARD
*
Pcb
,
int
typeloc
)
/********************************************************/
/********************************************************/
/*
/*
localisation d'une empreinte par son rectangle d'encadrement
*
localisation d'une empreinte par son rectangle d'encadrement
Si plusieurs empreintes sont possibles, la priorite est:
*
Si plusieurs empreintes sont possibles, la priorite est:
- sur la couche active
*
- sur la couche active
- la plus petite
*
- la plus petite
*/
*/
{
{
MODULE
*
pt_module
;
MODULE
*
pt_module
;
int
lx
,
ly
;
/* dimensions du rectangle d'encadrement du module */
int
lx
,
ly
;
/* dimensions du rectangle d'encadrement du module */
...
@@ -667,7 +713,7 @@ MODULE * Locate_Prefered_Module(BOARD * Pcb, int typeloc)
...
@@ -667,7 +713,7 @@ MODULE * Locate_Prefered_Module(BOARD * Pcb, int typeloc)
int
layer
;
/* pour calcul de couches prioritaires */
int
layer
;
/* pour calcul de couches prioritaires */
wxPoint
ref_pos
;
/* coord du point de reference pour la localisation */
wxPoint
ref_pos
;
/* coord du point de reference pour la localisation */
SET_REF_POS
(
ref_pos
);
SET_REF_POS
(
ref_pos
);
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
)
{
{
...
@@ -678,10 +724,10 @@ MODULE * Locate_Prefered_Module(BOARD * Pcb, int typeloc)
...
@@ -678,10 +724,10 @@ MODULE * Locate_Prefered_Module(BOARD * Pcb, int typeloc)
/* Calcul des coord souris dans le repere module */
/* Calcul des coord souris dans le repere module */
spot_cX
=
ref_pos
.
x
-
pt_module
->
m_Pos
.
x
;
spot_cX
=
ref_pos
.
x
-
pt_module
->
m_Pos
.
x
;
spot_cY
=
ref_pos
.
y
-
pt_module
->
m_Pos
.
y
;
spot_cY
=
ref_pos
.
y
-
pt_module
->
m_Pos
.
y
;
RotatePoint
(
&
spot_cX
,
&
spot_cY
,
-
pt_module
->
m_Orient
);
RotatePoint
(
&
spot_cX
,
&
spot_cY
,
-
pt_module
->
m_Orient
);
/* la souris est-elle dans ce rectangle : */
/* la souris est-elle dans ce rectangle : */
if
(
!
pt_module
->
m_BoundaryBox
.
Inside
(
spot_cX
,
spot_cY
)
)
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.
...
@@ -691,9 +737,9 @@ MODULE * Locate_Prefered_Module(BOARD * Pcb, int typeloc)
...
@@ -691,9 +737,9 @@ MODULE * Locate_Prefered_Module(BOARD * Pcb, int typeloc)
/* Localisation: test des dimensions minimales, choix du meilleur candidat */
/* Localisation: test des dimensions minimales, choix du meilleur candidat */
/* calcul de priorite: la priorite est donnee a la couche
/* calcul de priorite: la priorite est donnee a la couche
d'appartenance du module et a la couche cuivre si le module
*
d'appartenance du module et a la couche cuivre si le module
est sur couche serigr,adhesive cuivre, a la couche cmp si le module
*
est sur couche serigr,adhesive cuivre, a la couche cmp si le module
est sur couche serigr,adhesive composant */
*
est sur couche serigr,adhesive composant */
layer
=
pt_module
->
m_Layer
;
layer
=
pt_module
->
m_Layer
;
if
(
layer
==
ADHESIVE_N_CU
||
layer
==
SILKSCREEN_N_CU
)
if
(
layer
==
ADHESIVE_N_CU
||
layer
==
SILKSCREEN_N_CU
)
...
@@ -702,23 +748,22 @@ MODULE * Locate_Prefered_Module(BOARD * Pcb, int typeloc)
...
@@ -702,23 +748,22 @@ 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
;
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
)
&&
(
!
(
typeloc
&
VISIBLE_ONLY
)
||
IsModuleLayerVisible
(
layer
)
)
)
&&
(
!
(
typeloc
&
VISIBLE_ONLY
)
||
IsModuleLayerVisible
(
layer
)
)
)
{
{
if
(
min
(
lx
,
ly
)
<=
alt_min_dim
)
if
(
min
(
lx
,
ly
)
<=
alt_min_dim
)
{
{
/* meilleure empreinte localisee sur autres couches */
/* meilleure empreinte localisee sur autres couches */
Altmodule
=
pt_module
;
Altmodule
=
pt_module
;
alt_min_dim
=
min
(
lx
,
ly
);
alt_min_dim
=
min
(
lx
,
ly
);
}
}
}
}
}
}
...
@@ -738,34 +783,35 @@ MODULE * Locate_Prefered_Module(BOARD * Pcb, int typeloc)
...
@@ -738,34 +783,35 @@ MODULE * Locate_Prefered_Module(BOARD * Pcb, int typeloc)
/*****************************************************************************/
/*****************************************************************************/
TEXTE_MODULE
*
LocateTexteModule
(
BOARD
*
Pcb
,
MODULE
**
PtModule
,
int
typeloc
)
TEXTE_MODULE
*
LocateTexteModule
(
BOARD
*
Pcb
,
MODULE
**
PtModule
,
int
typeloc
)
/*****************************************************************************/
/*****************************************************************************/
/* localisation du texte pointe par la souris (texte sur empreinte)
si * PtModule == NULL; recherche sur tous les modules
sinon sur le module pointe par module
retourne
/* localisation du texte pointe par la souris (texte sur empreinte)
- pointeur sur le texte localise ( ou NULL )
*
- si Ptmodule != NULL: pointeur sur module module ( non modifie sinon )
* si * PtModule == NULL; recherche sur tous les modules
* sinon sur le module pointe par module
if typeloc bas the flag VISIBLE_ONLY set, only footprints which are "visible" are considered
*
*/
* retourne
* - pointeur sur le texte localise ( ou NULL )
* - si Ptmodule != NULL: pointeur sur module module ( non modifie sinon )
*
* if typeloc bas the flag VISIBLE_ONLY set, only footprints which are "visible" are considered
*/
{
{
EDA_BaseStruct
*
PtStruct
;
EDA_BaseStruct
*
PtStruct
;
TEXTE_MODULE
*
pt_txt_mod
;
TEXTE_MODULE
*
pt_txt_mod
;
MODULE
*
module
;
MODULE
*
module
;
wxPoint
ref_pos
;
wxPoint
ref_pos
;
SET_REF_POS
(
ref_pos
);
SET_REF_POS
(
ref_pos
);
module
=
*
PtModule
;
module
=
*
PtModule
;
if
(
module
==
NULL
)
if
(
module
==
NULL
)
{
{
module
=
Pcb
->
m_Modules
;
module
=
Pcb
->
m_Modules
;
}
}
for
(
;
module
!=
NULL
;
module
=
(
MODULE
*
)
module
->
Pnext
)
for
(
;
module
!=
NULL
;
module
=
(
MODULE
*
)
module
->
Pnext
)
{
{
int
layer
=
module
->
m_Layer
;
int
layer
=
module
->
m_Layer
;
if
(
layer
==
ADHESIVE_N_CU
||
layer
==
SILKSCREEN_N_CU
)
if
(
layer
==
ADHESIVE_N_CU
||
layer
==
SILKSCREEN_N_CU
)
...
@@ -781,146 +827,177 @@ wxPoint ref_pos;
...
@@ -781,146 +827,177 @@ wxPoint ref_pos;
if
(
typeloc
&
MATCH_LAYER
)
if
(
typeloc
&
MATCH_LAYER
)
{
{
if
(
(
(
PCB_SCREEN
*
)
ActiveScreen
)
->
m_Active_Layer
!=
layer
)
if
(
(
(
PCB_SCREEN
*
)
ActiveScreen
)
->
m_Active_Layer
!=
layer
)
continue
;
continue
;
}
}
pt_txt_mod
=
module
->
m_Reference
;
pt_txt_mod
=
module
->
m_Reference
;
/* la souris est-elle dans le rectangle autour du texte*/
/* la souris est-elle dans le rectangle autour du texte*/
if
(
pt_txt_mod
->
Locate
(
ref_pos
)
)
if
(
pt_txt_mod
->
Locate
(
ref_pos
)
)
{
{
if
(
PtModule
)
*
PtModule
=
module
;
if
(
PtModule
)
return
(
pt_txt_mod
);
*
PtModule
=
module
;
return
pt_txt_mod
;
}
}
pt_txt_mod
=
module
->
m_Value
;
pt_txt_mod
=
module
->
m_Value
;
/* la souris est-elle dans le rectangle autour du texte*/
/* la souris est-elle dans le rectangle autour du texte*/
if
(
pt_txt_mod
->
Locate
(
ref_pos
)
)
if
(
pt_txt_mod
->
Locate
(
ref_pos
)
)
{
{
if
(
PtModule
)
*
PtModule
=
module
;
if
(
PtModule
)
return
(
pt_txt_mod
);
*
PtModule
=
module
;
return
pt_txt_mod
;
}
}
PtStruct
=
module
->
m_Drawings
;
PtStruct
=
module
->
m_Drawings
;
for
(
;
PtStruct
!=
NULL
;
PtStruct
=
PtStruct
->
Pnext
)
for
(
;
PtStruct
!=
NULL
;
PtStruct
=
PtStruct
->
Pnext
)
{
{
if
(
PtStruct
->
m_StructType
!=
TYPETEXTEMODULE
)
continue
;
if
(
PtStruct
->
m_StructType
!=
TYPETEXTEMODULE
)
continue
;
pt_txt_mod
=
(
TEXTE_MODULE
*
)
PtStruct
;
pt_txt_mod
=
(
TEXTE_MODULE
*
)
PtStruct
;
/* la souris est-elle dans le rectangle autour du texte*/
/* la souris est-elle dans le rectangle autour du texte*/
if
(
pt_txt_mod
->
Locate
(
ref_pos
)
)
if
(
pt_txt_mod
->
Locate
(
ref_pos
)
)
{
{
if
(
PtModule
)
*
PtModule
=
module
;
if
(
PtModule
)
return
(
pt_txt_mod
);
*
PtModule
=
module
;
return
pt_txt_mod
;
}
}
}
}
if
(
*
PtModule
!=
NULL
)
break
;
/* Recherche limitee a 1 seul module */
if
(
*
PtModule
!=
NULL
)
break
;
/* Recherche limitee a 1 seul module */
}
}
return
(
NULL
)
;
return
NULL
;
}
}
/**************************************************************/
/**************************************************************/
TRACK
*
Locate_Piste_Connectee
(
TRACK
*
PtRefSegm
,
TRACK
*
pt_base
,
TRACK
*
Locate_Piste_Connectee
(
TRACK
*
PtRefSegm
,
TRACK
*
pt_base
,
TRACK
*
pt_lim
,
int
extr
)
TRACK
*
pt_lim
,
int
extr
)
/**************************************************************/
/**************************************************************/
/* recherche le segment connecte au segment pointe par
/* recherche le segment connecte au segment pointe par
PtRefSegm:
*
PtRefSegm:
si int extr = START, le point de debut du segment est utilise
*
si int extr = START, le point de debut du segment est utilise
si int extr = END, le point de fin du segment est utilise
*
si int extr = END, le point de fin du segment est utilise
La recherche ne se fait que sur les EXTREMITES des segments
*
La recherche ne se fait que sur les EXTREMITES des segments
*
La recherche se fait de l'adresse :
*
La recherche se fait de l'adresse :
pt_base a pt_lim (borne finale comprise)
*
pt_base a pt_lim (borne finale comprise)
si pt_lim = NULL, la recherche se fait jusqu'a la fin de la liste
*
si pt_lim = NULL, la recherche se fait jusqu'a la fin de la liste
Afin d'accelerer la recherche, une 1ere passe est faite, avec une recherche
*
Afin d'accelerer la recherche, une 1ere passe est faite, avec une recherche
realisee sur un ensemble de +/- 100 points autour du point courant.
*
realisee sur un ensemble de +/- 100 points autour du point courant.
Si echec: recherche generale
*
Si echec: recherche generale
*/
*/
{
{
TRACK
*
PtSegmB
,
*
PtSegmN
;
TRACK
*
PtSegmB
,
*
PtSegmN
;
int
Reflayer
;
int
Reflayer
;
wxPoint
pos_ref
;
wxPoint
pos_ref
;
int
ii
;
int
ii
;
if
(
extr
==
START
)
pos_ref
=
PtRefSegm
->
m_Start
;
if
(
extr
==
START
)
else
pos_ref
=
PtRefSegm
->
m_End
;
pos_ref
=
PtRefSegm
->
m_Start
;
else
pos_ref
=
PtRefSegm
->
m_End
;
Reflayer
=
PtRefSegm
->
ReturnMaskLayer
();
Reflayer
=
PtRefSegm
->
ReturnMaskLayer
();
/* 1ere passe */
/* 1ere passe */
PtSegmB
=
PtSegmN
=
PtRefSegm
;
PtSegmB
=
PtSegmN
=
PtRefSegm
;
for
(
ii
=
0
;
ii
<
50
;
ii
++
)
for
(
ii
=
0
;
ii
<
50
;
ii
++
)
{
{
if
(
(
PtSegmN
==
NULL
)
&&
(
PtSegmB
==
NULL
)
)
break
;
if
(
(
PtSegmN
==
NULL
)
&&
(
PtSegmB
==
NULL
)
)
break
;
if
(
PtSegmN
)
if
(
PtSegmN
)
{
{
if
(
PtSegmN
->
GetState
(
BUSY
|
DELETED
)
)
goto
suite
;
if
(
PtSegmN
->
GetState
(
BUSY
|
DELETED
)
)
if
(
PtSegmN
==
PtRefSegm
)
goto
suite
;
goto
suite
;
if
(
PtSegmN
==
PtRefSegm
)
goto
suite
;
if
(
pos_ref
==
PtSegmN
->
m_Start
)
if
(
pos_ref
==
PtSegmN
->
m_Start
)
{
/* Test des couches */
{
/* Test des couches */
if
(
Reflayer
&
PtSegmN
->
ReturnMaskLayer
()
)
return
(
PtSegmN
);
if
(
Reflayer
&
PtSegmN
->
ReturnMaskLayer
()
)
return
PtSegmN
;
}
}
if
(
pos_ref
==
PtSegmN
->
m_End
)
if
(
pos_ref
==
PtSegmN
->
m_End
)
{
/* Test des couches */
{
/* Test des couches */
if
(
Reflayer
&
PtSegmN
->
ReturnMaskLayer
()
)
return
(
PtSegmN
);
if
(
Reflayer
&
PtSegmN
->
ReturnMaskLayer
()
)
return
PtSegmN
;
}
}
suite
:
suite
:
if
(
PtSegmN
==
pt_lim
)
PtSegmN
=
NULL
;
if
(
PtSegmN
==
pt_lim
)
else
PtSegmN
=
(
TRACK
*
)
PtSegmN
->
Pnext
;
PtSegmN
=
NULL
;
else
PtSegmN
=
(
TRACK
*
)
PtSegmN
->
Pnext
;
}
}
if
(
PtSegmB
)
if
(
PtSegmB
)
{
{
if
(
PtSegmB
->
GetState
(
BUSY
|
DELETED
)
)
goto
suite1
;
if
(
PtSegmB
->
GetState
(
BUSY
|
DELETED
)
)
if
(
PtSegmB
==
PtRefSegm
)
goto
suite1
;
goto
suite1
;
if
(
PtSegmB
==
PtRefSegm
)
goto
suite1
;
if
(
pos_ref
==
PtSegmB
->
m_Start
)
if
(
pos_ref
==
PtSegmB
->
m_Start
)
{
/* Test des couches */
{
/* Test des couches */
if
(
Reflayer
&
PtSegmB
->
ReturnMaskLayer
()
)
return
(
PtSegmB
);
if
(
Reflayer
&
PtSegmB
->
ReturnMaskLayer
()
)
return
PtSegmB
;
}
}
if
(
pos_ref
==
PtSegmB
->
m_End
)
if
(
pos_ref
==
PtSegmB
->
m_End
)
{
/* Test des couches */
{
/* Test des couches */
if
(
Reflayer
&
PtSegmB
->
ReturnMaskLayer
()
)
return
(
PtSegmB
);
if
(
Reflayer
&
PtSegmB
->
ReturnMaskLayer
()
)
}
return
PtSegmB
;
suite1
:
}
if
(
PtSegmB
==
pt_base
)
PtSegmB
=
NULL
;
suite1
:
else
if
(
PtSegmB
->
m_StructType
!=
TYPEPCB
)
PtSegmB
=
(
TRACK
*
)
PtSegmB
->
Pback
;
if
(
PtSegmB
==
pt_base
)
else
PtSegmB
=
NULL
;
PtSegmB
=
NULL
;
else
if
(
PtSegmB
->
m_StructType
!=
TYPEPCB
)
PtSegmB
=
(
TRACK
*
)
PtSegmB
->
Pback
;
else
PtSegmB
=
NULL
;
}
}
}
}
/* Recherche generale */
/* Recherche generale */
for
(
PtSegmN
=
pt_base
;
PtSegmN
!=
NULL
;
PtSegmN
=
(
TRACK
*
)
PtSegmN
->
Pnext
)
for
(
PtSegmN
=
pt_base
;
PtSegmN
!=
NULL
;
PtSegmN
=
(
TRACK
*
)
PtSegmN
->
Pnext
)
{
{
if
(
PtSegmN
->
GetState
(
DELETED
|
BUSY
)
)
if
(
PtSegmN
->
GetState
(
DELETED
|
BUSY
)
)
{
{
if
(
PtSegmN
==
pt_lim
)
break
;
if
(
PtSegmN
==
pt_lim
)
break
;
continue
;
continue
;
}
}
if
(
PtSegmN
==
PtRefSegm
)
if
(
PtSegmN
==
PtRefSegm
)
{
{
if
(
PtSegmN
==
pt_lim
)
break
;
if
(
PtSegmN
==
pt_lim
)
break
;
continue
;
continue
;
}
}
if
(
pos_ref
==
PtSegmN
->
m_Start
)
if
(
pos_ref
==
PtSegmN
->
m_Start
)
{
/* Test des couches */
{
/* Test des couches */
if
(
Reflayer
&
PtSegmN
->
ReturnMaskLayer
()
)
return
(
PtSegmN
);
if
(
Reflayer
&
PtSegmN
->
ReturnMaskLayer
()
)
return
PtSegmN
;
}
}
if
(
pos_ref
==
PtSegmN
->
m_End
)
if
(
pos_ref
==
PtSegmN
->
m_End
)
{
/* Test des couches */
{
/* Test des couches */
if
(
Reflayer
&
PtSegmN
->
ReturnMaskLayer
()
)
return
(
PtSegmN
);
if
(
Reflayer
&
PtSegmN
->
ReturnMaskLayer
()
)
return
PtSegmN
;
}
}
if
(
PtSegmN
==
pt_lim
)
break
;
if
(
PtSegmN
==
pt_lim
)
break
;
}
}
return
(
NULL
);
return
NULL
;
}
}
/****************************************************************************/
/****************************************************************************/
/* TRACK *Locate_Pistes(TRACK * start_adresse, int MasqueLayer,int typeloc) */
/* TRACK *Locate_Pistes(TRACK * start_adresse, int MasqueLayer,int typeloc) */
/* TRACK *Locate_Pistes(TRACK * start_adresse, int ref_pos.x, int ref_pos.y,*/
/* TRACK *Locate_Pistes(TRACK * start_adresse, int ref_pos.x, int ref_pos.y,*/
...
@@ -928,408 +1005,438 @@ int ii;
...
@@ -928,408 +1005,438 @@ int ii;
/****************************************************************************/
/****************************************************************************/
/*
/*
1 - routine de localisation du segment de piste pointe par la souris.
*
1 - routine de localisation du segment de piste pointe par la souris.
2 - routine de localisation du segment de piste pointe par le point
*
2 - routine de localisation du segment de piste pointe par le point
ref_pos.x , ref_pos.y.r
*
ref_pos.x , ref_pos.y.r
*
La recherche commence a l'adresse start_adresse
*
La recherche commence a l'adresse start_adresse
*/
*/
TRACK
*
Locate_Pistes
(
TRACK
*
start_adresse
,
int
MasqueLayer
,
int
typeloc
)
TRACK
*
Locate_Pistes
(
TRACK
*
start_adresse
,
int
MasqueLayer
,
int
typeloc
)
{
{
wxPoint
ref_pos
;
wxPoint
ref_pos
;
SET_REF_POS
(
ref_pos
);
SET_REF_POS
(
ref_pos
);
return
(
Locate_Pistes
(
start_adresse
,
ref_pos
,
MasqueLayer
)
);
return
Locate_Pistes
(
start_adresse
,
ref_pos
,
MasqueLayer
);
}
}
TRACK
*
Locate_Pistes
(
TRACK
*
start_adresse
,
const
wxPoint
&
ref_pos
,
int
MasqueLayer
)
TRACK
*
Locate_Pistes
(
TRACK
*
start_adresse
,
const
wxPoint
&
ref_pos
,
int
MasqueLayer
)
{
{
TRACK
*
Track
;
/* pointeur sur les pistes */
TRACK
*
Track
;
/* pointeur sur les pistes */
int
l_piste
;
/* demi-largeur de la piste */
int
l_piste
;
/* demi-largeur de la piste */
for
(
Track
=
start_adresse
;
Track
!=
NULL
;
Track
=
(
TRACK
*
)
Track
->
Pnext
)
for
(
Track
=
start_adresse
;
Track
!=
NULL
;
Track
=
(
TRACK
*
)
Track
->
Pnext
)
{
{
if
(
Track
->
GetState
(
BUSY
|
DELETED
)
)
continue
;
if
(
Track
->
GetState
(
BUSY
|
DELETED
)
)
if
(
(
g_DesignSettings
.
m_LayerColor
[
Track
->
m_Layer
]
&
ITEM_NOT_SHOW
)
)
continue
;
if
(
(
g_DesignSettings
.
m_LayerColor
[
Track
->
m_Layer
]
&
ITEM_NOT_SHOW
)
)
continue
;
continue
;
/* calcul des coordonnees du segment teste */
/* calcul des coordonnees du segment teste */
l_piste
=
Track
->
m_Width
>>
1
;
/* l_piste = demi largeur piste */
l_piste
=
Track
->
m_Width
>>
1
;
/* l_piste = demi largeur piste */
ux0
=
Track
->
m_Start
.
x
;
uy0
=
Track
->
m_Start
.
y
;
/* coord de depart */
ux0
=
Track
->
m_Start
.
x
;
uy0
=
Track
->
m_Start
.
y
;
/* coord de depart */
dx
=
Track
->
m_End
.
x
;
dy
=
Track
->
m_End
.
y
;
/* coord d'arrivee */
dx
=
Track
->
m_End
.
x
;
dy
=
Track
->
m_End
.
y
;
/* coord d'arrivee */
/* recalcul des coordonnees avec ux0, uy0 = origine des coordonnees */
/* recalcul des coordonnees avec ux0, uy0 = origine des coordonnees */
dx
-=
ux0
;
dy
-=
uy0
;
dx
-=
ux0
;
dy
-=
uy0
;
spot_cX
=
ref_pos
.
x
-
ux0
;
spot_cY
=
ref_pos
.
y
-
uy0
;
spot_cX
=
ref_pos
.
x
-
ux0
;
spot_cY
=
ref_pos
.
y
-
uy0
;
if
(
Track
->
m_StructType
==
TYPEVIA
)
/* VIA rencontree */
if
(
Track
->
m_StructType
==
TYPEVIA
)
/* VIA rencontree */
{
{
if
((
abs
(
spot_cX
)
<=
l_piste
)
&&
(
abs
(
spot_cY
)
<=
l_piste
)
)
if
(
(
abs
(
spot_cX
)
<=
l_piste
)
&&
(
abs
(
spot_cY
)
<=
l_piste
)
)
{
{
return
(
Track
)
;
return
Track
;
}
}
continue
;
continue
;
}
}
if
(
MasqueLayer
!=
-
1
)
if
(
MasqueLayer
!=
-
1
)
if
(
(
g_TabOneLayerMask
[
Track
->
m_Layer
]
&
MasqueLayer
)
==
0
)
if
(
(
g_TabOneLayerMask
[
Track
->
m_Layer
]
&
MasqueLayer
)
==
0
)
continue
;
/* Segments sur couches differentes */
continue
;
/* Segments sur couches differentes */
if
(
distance
(
l_piste
)
)
return
(
Track
)
;
if
(
distance
(
l_piste
)
)
return
Track
;
}
}
return
(
NULL
)
;
return
NULL
;
}
}
/****************************************************************/
/* TRACK * Locate_Zone(TRACK * start_adresse, int layer, */
/* int typeloc) */
/* TRACK * Locate_Zone(TRACK * start_adresse, */
/* const wxPoint & ref_pos, */
/* int layer) */
/****************************************************************/
/*
/****************************************************************/
1 - routine de localisation du segment de zone pointe par la souris.
/* TRACK * Locate_Zone(TRACK * start_adresse, int layer, */
2 - routine de localisation du segment de zone pointe par le point
/* int typeloc) */
ref_pos.x , ref_pos.y.r
/* TRACK * Locate_Zone(TRACK * start_adresse, */
/* const wxPoint & ref_pos, */
Si layer == -1 , le tst de la couche n'est pas fait
/* int layer) */
/****************************************************************/
La recherche commence a l'adresse start_adresse
/*
*/
* 1 - routine de localisation du segment de zone pointe par la souris.
* 2 - routine de localisation du segment de zone pointe par le point
* ref_pos.x , ref_pos.y.r
*
* Si layer == -1 , le tst de la couche n'est pas fait
*
* La recherche commence a l'adresse start_adresse
*/
TRACK
*
Locate_Zone
(
TRACK
*
start_adresse
,
int
layer
,
int
typeloc
)
TRACK
*
Locate_Zone
(
TRACK
*
start_adresse
,
int
layer
,
int
typeloc
)
{
{
wxPoint
ref_pos
;
wxPoint
ref_pos
;
SET_REF_POS
(
ref_pos
);
SET_REF_POS
(
ref_pos
);
return
(
Locate_Zone
(
start_adresse
,
ref_pos
,
layer
)
);
return
Locate_Zone
(
start_adresse
,
ref_pos
,
layer
);
}
}
TRACK
*
Locate_Zone
(
TRACK
*
start_adresse
,
const
wxPoint
&
ref_pos
,
int
layer
)
TRACK
*
Locate_Zone
(
TRACK
*
start_adresse
,
const
wxPoint
&
ref_pos
,
int
layer
)
{
{
TRACK
*
Zone
;
/* pointeur sur les pistes */
TRACK
*
Zone
;
/* pointeur sur les pistes */
int
l_segm
;
/* demi-largeur de la piste */
int
l_segm
;
/* demi-largeur de la piste */
for
(
Zone
=
start_adresse
;
Zone
!=
NULL
;
Zone
=
(
TRACK
*
)
Zone
->
Pnext
)
for
(
Zone
=
start_adresse
;
Zone
!=
NULL
;
Zone
=
(
TRACK
*
)
Zone
->
Pnext
)
{
{
/* calcul des coordonnees du segment teste */
/* calcul des coordonnees du segment teste */
l_segm
=
Zone
->
m_Width
>>
1
;
/* l_piste = demi largeur piste */
l_segm
=
Zone
->
m_Width
>>
1
;
/* l_piste = demi largeur piste */
ux0
=
Zone
->
m_Start
.
x
;
uy0
=
Zone
->
m_Start
.
y
;
/* coord de depart */
ux0
=
Zone
->
m_Start
.
x
;
uy0
=
Zone
->
m_Start
.
y
;
/* coord de depart */
dx
=
Zone
->
m_End
.
x
;
dy
=
Zone
->
m_End
.
y
;
/* coord d'arrivee */
dx
=
Zone
->
m_End
.
x
;
dy
=
Zone
->
m_End
.
y
;
/* coord d'arrivee */
/* recalcul des coordonnees avec ux0, uy0 = origine des coordonnees */
/* recalcul des coordonnees avec ux0, uy0 = origine des coordonnees */
dx
-=
ux0
;
dy
-=
uy0
;
dx
-=
ux0
;
dy
-=
uy0
;
spot_cX
=
ref_pos
.
x
-
ux0
;
spot_cY
=
ref_pos
.
y
-
uy0
;
spot_cX
=
ref_pos
.
x
-
ux0
;
spot_cY
=
ref_pos
.
y
-
uy0
;
if
((
layer
!=
-
1
)
&&
(
Zone
->
m_Layer
!=
layer
))
continue
;
if
(
(
layer
!=
-
1
)
&&
(
Zone
->
m_Layer
!=
layer
)
)
if
(
distance
(
l_segm
)
)
return
(
Zone
)
;
continue
;
if
(
distance
(
l_segm
)
)
return
Zone
;
}
}
return
(
NULL
)
;
}
return
NULL
;
}
/************************************************************************************/
/************************************************************************************/
TEXTE_PCB
*
Locate_Texte_Pcb
(
EDA_BaseStruct
*
PtStruct
,
int
LayerSearch
,
int
typeloc
)
TEXTE_PCB
*
Locate_Texte_Pcb
(
EDA_BaseStruct
*
PtStruct
,
int
LayerSearch
,
int
typeloc
)
/************************************************************************************/
/************************************************************************************/
/* localisation des inscriptions sur le Pcb:
/* localisation des inscriptions sur le Pcb:
entree : EDA_BaseStruct pointeur sur le debut de la zone de recherche
*
entree : EDA_BaseStruct pointeur sur le debut de la zone de recherche
retour : pointeur sur la description du texte localise
*
retour : pointeur sur la description du texte localise
*/
*/
{
{
wxPoint
ref
;
wxPoint
ref
;
SET_REF_POS
(
ref
);
SET_REF_POS
(
ref
);
for
(
;
PtStruct
!=
NULL
;
PtStruct
=
PtStruct
->
Pnext
)
for
(
;
PtStruct
!=
NULL
;
PtStruct
=
PtStruct
->
Pnext
)
{
{
if
(
PtStruct
->
m_StructType
!=
TYPETEXTE
)
continue
;
if
(
PtStruct
->
m_StructType
!=
TYPETEXTE
)
TEXTE_PCB
*
pt_txt_pcb
=
(
TEXTE_PCB
*
)
PtStruct
;
continue
;
if
(
pt_txt_pcb
->
Locate
(
ref
)
)
TEXTE_PCB
*
pt_txt_pcb
=
(
TEXTE_PCB
*
)
PtStruct
;
if
(
pt_txt_pcb
->
Locate
(
ref
)
)
{
{
if
(
pt_txt_pcb
->
m_Layer
==
LayerSearch
)
if
(
pt_txt_pcb
->
m_Layer
==
LayerSearch
)
return
pt_txt_pcb
;
return
pt_txt_pcb
;
}
}
}
}
return
(
NULL
)
;
}
return
NULL
;
}
/*****************************/
/*****************************/
int
distance
(
int
seuil
)
int
distance
(
int
seuil
)
/*****************************/
/*****************************/
/*
/*
Calcul de la distance du curseur souris a un segment de droite :
*
Calcul de la distance du curseur souris a un segment de droite :
( piste, edge, contour module ..
*
( piste, edge, contour module ..
retourne:
*
retourne:
0 si distance > seuil
*
0 si distance > seuil
1 si distance <= seuil
*
1 si distance <= seuil
Variables utilisees ( doivent etre initialisees avant appel , et
*
Variables utilisees ( doivent etre initialisees avant appel , et
sont ramenees au repere centre sur l'origine du segment)
*
sont ramenees au repere centre sur l'origine du segment)
dx, dy = coord de l'extremite segment.
*
dx, dy = coord de l'extremite segment.
spot_cX,spot_cY = coord du curseur souris
*
spot_cX,spot_cY = coord du curseur souris
la recherche se fait selon 4 cas:
*
la recherche se fait selon 4 cas:
segment horizontal
*
segment horizontal
segment vertical
*
segment vertical
segment 45
*
segment 45
segment quelconque
*
segment quelconque
*/
*/
{
{
int
cXrot
,
cYrot
,
/* coord du point (souris) dans le repere tourne */
int
cXrot
,
cYrot
,
/* coord du point (souris) dans le repere tourne */
segX
,
segY
;
/* coord extremite segment tj >= 0 */
segX
,
segY
;
/* coord extremite segment tj >= 0 */
int
pointX
,
pointY
;
/* coord point a tester dans repere modifie dans lequel
int
pointX
,
pointY
;
/* coord point a tester dans repere modifie dans lequel
segX et segY sont >=0 */
*
segX et segY sont >=0 */
segX
=
dx
;
segY
=
dy
;
pointX
=
spot_cX
;
pointY
=
spot_cY
;
segX
=
dx
;
segY
=
dy
;
pointX
=
spot_cX
;
pointY
=
spot_cY
;
/*Recalcul coord pour que le segment soit dans 1er quadrant (coord >= 0)*/
/*Recalcul coord pour que le segment soit dans 1er quadrant (coord >= 0)*/
if
(
segX
<
0
)
/* mise en >0 par symetrie par rapport a l'axe Y */
if
(
segX
<
0
)
/* mise en >0 par symetrie par rapport a l'axe Y */
{
{
segX
=
-
segX
;
pointX
=
-
pointX
;
segX
=
-
segX
;
pointX
=
-
pointX
;
}
}
if
(
segY
<
0
)
/* mise en > 0 par symetrie par rapport a l'axe X */
if
(
segY
<
0
)
/* mise en > 0 par symetrie par rapport a l'axe X */
{
{
segY
=
-
segY
;
pointY
=
-
pointY
;
segY
=
-
segY
;
pointY
=
-
pointY
;
}
}
if
(
segY
==
0
)
/* piste Horizontale */
if
(
segY
==
0
)
/* piste Horizontale */
{
{
if
(
abs
(
pointY
)
<=
seuil
)
if
(
abs
(
pointY
)
<=
seuil
)
{
{
if
((
pointX
>=
0
)
&&
(
pointX
<=
segX
)
)
return
(
1
);
if
(
(
pointX
>=
0
)
&&
(
pointX
<=
segX
)
)
return
1
;
/* Etude des extremites : cercle de rayon seuil */
/* Etude des extremites : cercle de rayon seuil */
if
(
(
pointX
<
0
)
&&
(
pointX
>=
-
seuil
)
)
if
(
(
pointX
<
0
)
&&
(
pointX
>=
-
seuil
)
)
{
{
if
(
(
(
pointX
*
pointX
)
+
(
pointY
*
pointY
))
<=
(
seuil
*
seuil
)
)
if
(
(
(
pointX
*
pointX
)
+
(
pointY
*
pointY
)
)
<=
(
seuil
*
seuil
)
)
return
(
1
)
;
return
1
;
}
}
if
(
(
pointX
>
segX
)
&&
(
pointX
<=
(
segX
+
seuil
)
)
)
if
(
(
pointX
>
segX
)
&&
(
pointX
<=
(
segX
+
seuil
)
)
)
{
{
if
(
(((
pointX
-
segX
)
*
(
pointX
-
segX
))
+
(
pointY
*
pointY
))
<=
(
seuil
*
seuil
)
)
if
(
(
(
(
pointX
-
segX
)
*
(
pointX
-
segX
)
)
+
(
pointY
*
pointY
)
)
<=
return
(
1
);
(
seuil
*
seuil
)
)
return
1
;
}
}
}
}
}
}
else
if
(
segX
==
0
)
/* piste verticale */
else
if
(
segX
==
0
)
/* piste verticale */
{
{
if
(
abs
(
pointX
)
<=
seuil
)
if
(
abs
(
pointX
)
<=
seuil
)
{
{
if
((
pointY
>=
0
)
&&
(
pointY
<=
segY
)
)
return
(
1
);
if
(
(
pointY
>=
0
)
&&
(
pointY
<=
segY
)
)
return
1
;
if
(
(
pointY
<
0
)
&&
(
pointY
>=
-
seuil
)
)
if
(
(
pointY
<
0
)
&&
(
pointY
>=
-
seuil
)
)
{
{
if
(
(
(
pointY
*
pointY
)
+
(
pointX
*
pointX
))
<=
(
seuil
*
seuil
)
)
if
(
(
(
pointY
*
pointY
)
+
(
pointX
*
pointX
)
)
<=
(
seuil
*
seuil
)
)
return
(
1
)
;
return
1
;
}
}
if
(
(
pointY
>
segY
)
&&
(
pointY
<=
(
segY
+
seuil
)
)
)
if
(
(
pointY
>
segY
)
&&
(
pointY
<=
(
segY
+
seuil
)
)
)
{
{
if
(
(
((
pointY
-
segY
)
*
(
pointY
-
segY
))
+
(
pointX
*
pointX
))
<=
(
seuil
*
seuil
)
)
if
(
(
(
(
pointY
-
segY
)
*
(
pointY
-
segY
)
)
+
(
pointX
*
pointX
)
)
<=
return
(
1
);
(
seuil
*
seuil
)
)
return
1
;
}
}
}
}
}
}
else
if
(
segX
==
segY
)
/* piste a 45 degre */
else
if
(
segX
==
segY
)
/* piste a 45 degre */
{
{
/* on fait tourner les axes de 45 degre. la souris a alors les
/* on fait tourner les axes de 45 degre. la souris a alors les
coord : x1 = x*cos45 + y*sin45
*
coord : x1 = x*cos45 + y*sin45
y1 = y*cos45 - x*sin45
*
y1 = y*cos45 - x*sin45
et le segment de piste est alors horizontal.
*
et le segment de piste est alors horizontal.
recalcul des coord de la souris ( sin45 = cos45 = .707 = 7/10
*
recalcul des coord de la souris ( sin45 = cos45 = .707 = 7/10
remarque : sin ou cos45 = .707, et lors du recalcul des coord
*
remarque : sin ou cos45 = .707, et lors du recalcul des coord
dx45 et dy45, lec coeff .707 est neglige, dx et dy sont en fait .707 fois
*
dx45 et dy45, lec coeff .707 est neglige, dx et dy sont en fait .707 fois
trop grands. (c.a.d trop petits)
*
trop grands. (c.a.d trop petits)
spot_cX,Y doit etre * par .707 * .707 = 0.5 */
*
spot_cX,Y doit etre * par .707 * .707 = 0.5 */
cXrot
=
(
pointX
+
pointY
)
>>
1
;
cXrot
=
(
pointX
+
pointY
)
>>
1
;
cYrot
=
(
pointY
-
pointX
)
>>
1
;
cYrot
=
(
pointY
-
pointX
)
>>
1
;
/* recalcul des coord de l'extremite du segment , qui sera vertical
/* recalcul des coord de l'extremite du segment , qui sera vertical
suite a l'orientation des axes sur l'ecran : dx45 = pointX (ou pointY)
*
suite a l'orientation des axes sur l'ecran : dx45 = pointX (ou pointY)
et est en fait 1,414 plus grand , et dy45 = 0 */
*
et est en fait 1,414 plus grand , et dy45 = 0 */
// seuil doit etre * .707 pour tenir compte du coeff de reduction sur dx,dy
// seuil doit etre * .707 pour tenir compte du coeff de reduction sur dx,dy
seuil
*=
7
;
seuil
/=
10
;
seuil
*=
7
;
seuil
/=
10
;
if
(
abs
(
cYrot
)
<=
seuil
)
/* ok sur axe vertical) */
if
(
abs
(
cYrot
)
<=
seuil
)
/* ok sur axe vertical) */
{
{
if
((
cXrot
>=
0
)
&&
(
cXrot
<=
segX
)
)
return
(
1
)
;
if
(
(
cXrot
>=
0
)
&&
(
cXrot
<=
segX
)
)
return
1
;
/* Etude des extremites : cercle de rayon seuil */
/* Etude des extremites : cercle de rayon seuil */
if
(
(
cXrot
<
0
)
&&
(
cXrot
>=
-
seuil
)
)
if
(
(
cXrot
<
0
)
&&
(
cXrot
>=
-
seuil
)
)
{
{
if
(
(
(
cXrot
*
cXrot
)
+
(
cYrot
*
cYrot
))
<=
(
seuil
*
seuil
)
)
if
(
(
(
cXrot
*
cXrot
)
+
(
cYrot
*
cYrot
)
)
<=
(
seuil
*
seuil
)
)
return
(
1
)
;
return
1
;
}
}
if
(
(
cXrot
>
segX
)
&&
(
cXrot
<=
(
segX
+
seuil
)
)
)
if
(
(
cXrot
>
segX
)
&&
(
cXrot
<=
(
segX
+
seuil
)
)
)
{
{
if
(
(
((
cXrot
-
segX
)
*
(
cXrot
-
segX
))
+
(
cYrot
*
cYrot
))
<=
(
seuil
*
seuil
)
)
if
(
(
(
(
cXrot
-
segX
)
*
(
cXrot
-
segX
)
)
+
(
cYrot
*
cYrot
)
)
<=
(
seuil
*
seuil
)
)
return
(
1
)
;
return
1
;
}
}
}
}
}
}
else
/* orientation quelconque */
else
/* orientation quelconque */
{
{
/* On fait un changement d'axe (rotation) de facon a ce que le segment
/* On fait un changement d'axe (rotation) de facon a ce que le segment
de piste soit horizontal dans le nouveau repere */
*
de piste soit horizontal dans le nouveau repere */
int
angle
;
int
angle
;
angle
=
(
int
)
(
atan2
((
float
)
segY
,
(
float
)
segX
)
*
1800
/
M_PI
)
;
angle
=
(
int
)
(
atan2
(
(
float
)
segY
,
(
float
)
segX
)
*
1800
/
M_PI
)
;
cXrot
=
pointX
;
cYrot
=
pointY
;
cXrot
=
pointX
;
cYrot
=
pointY
;
RotatePoint
(
&
cXrot
,
&
cYrot
,
angle
);
/* Rotation du point a tester */
RotatePoint
(
&
cXrot
,
&
cYrot
,
angle
);
/* Rotation du point a tester */
RotatePoint
(
&
segX
,
&
segY
,
angle
)
;
/* Rotation du segment */
RotatePoint
(
&
segX
,
&
segY
,
angle
);
/* Rotation du segment */
/*la piste est Horizontale , par suite des modifs de coordonnes
/*la piste est Horizontale , par suite des modifs de coordonnes
et d'axe, donc segX = longueur du segment */
*
et d'axe, donc segX = longueur du segment */
if
(
abs
(
cYrot
)
<=
seuil
)
/* ok sur axe vertical) */
if
(
abs
(
cYrot
)
<=
seuil
)
/* ok sur axe vertical) */
{
{
if
((
cXrot
>=
0
)
&&
(
cXrot
<=
segX
)
)
return
(
1
)
;
if
(
(
cXrot
>=
0
)
&&
(
cXrot
<=
segX
)
)
return
1
;
/* Etude des extremites : cercle de rayon seuil */
/* Etude des extremites : cercle de rayon seuil */
if
(
(
cXrot
<
0
)
&&
(
cXrot
>=
-
seuil
)
)
if
(
(
cXrot
<
0
)
&&
(
cXrot
>=
-
seuil
)
)
{
{
if
(
(
(
cXrot
*
cXrot
)
+
(
cYrot
*
cYrot
))
<=
(
seuil
*
seuil
)
)
if
(
(
(
cXrot
*
cXrot
)
+
(
cYrot
*
cYrot
)
)
<=
(
seuil
*
seuil
)
)
return
(
1
)
;
return
1
;
}
}
if
(
(
cXrot
>
segX
)
&&
(
cXrot
<=
(
segX
+
seuil
)
)
)
if
(
(
cXrot
>
segX
)
&&
(
cXrot
<=
(
segX
+
seuil
)
)
)
{
{
if
(
(
((
cXrot
-
segX
)
*
(
cXrot
-
segX
))
+
(
cYrot
*
cYrot
))
<=
(
seuil
*
seuil
)
)
if
(
(
(
(
cXrot
-
segX
)
*
(
cXrot
-
segX
)
)
+
(
cYrot
*
cYrot
)
)
<=
(
seuil
*
seuil
)
)
return
(
1
)
;
return
1
;
}
}
}
}
}
}
return
(
0
)
;
return
0
;
}
}
/*******************************************************************************/
/*******************************************************************************/
D_PAD
*
Fast_Locate_Pad_Connecte
(
BOARD
*
Pcb
,
const
wxPoint
&
ref_pos
,
int
masque_layer
)
D_PAD
*
Fast_Locate_Pad_Connecte
(
BOARD
*
Pcb
,
const
wxPoint
&
ref_pos
,
int
masque_layer
)
/*******************************************************************************/
/*******************************************************************************/
/* Routine cherchant le pad de centre px,py,
/* Routine cherchant le pad de centre px,py,
sur la couche indiquee par masque_layer (bit a bit)
*
sur la couche indiquee par masque_layer (bit a bit)
( extremite de piste )
*
( extremite de piste )
La liste des pads doit deja exister.
*
La liste des pads doit deja exister.
*
retourne :
*
retourne :
NULL si pas de pad localise.
*
NULL si pas de pad localise.
pointeur sur la structure descr_pad correspondante si pad trouve
*
pointeur sur la structure descr_pad correspondante si pad trouve
(bonne position ET bonne couche).
*
(bonne position ET bonne couche).
*/
*/
{
{
D_PAD
*
pad
;
D_PAD
*
pad
;
LISTE_PAD
*
ptr_pad
,
*
lim
;
LISTE_PAD
*
ptr_pad
,
*
lim
;
lim
=
(
LISTE_PAD
*
)
Pcb
->
m_Pads
+
Pcb
->
m_NbPads
;
lim
=
(
LISTE_PAD
*
)
Pcb
->
m_Pads
+
Pcb
->
m_NbPads
;
for
(
ptr_pad
=
(
LISTE_PAD
*
)
Pcb
->
m_Pads
;
ptr_pad
<
lim
;
ptr_pad
++
)
for
(
ptr_pad
=
(
LISTE_PAD
*
)
Pcb
->
m_Pads
;
ptr_pad
<
lim
;
ptr_pad
++
)
{
{
pad
=
*
ptr_pad
;
pad
=
*
ptr_pad
;
if
(
pad
->
m_Pos
!=
ref_pos
)
continue
;
if
(
pad
->
m_Pos
!=
ref_pos
)
continue
;
/* Pad peut-etre trouve ici : il doit etre sur la bonne couche */
/* Pad peut-etre trouve ici : il doit etre sur la bonne couche */
if
(
pad
->
m_Masque_Layer
&
masque_layer
)
return
(
pad
)
;
if
(
pad
->
m_Masque_Layer
&
masque_layer
)
return
pad
;
}
}
return
(
NULL
);
return
NULL
;
}
}
/***********************************************************************************/
/***********************************************************************************/
TRACK
*
Fast_Locate_Piste
(
TRACK
*
start_adr
,
TRACK
*
end_adr
,
TRACK
*
Fast_Locate_Piste
(
TRACK
*
start_adr
,
TRACK
*
end_adr
,
const
wxPoint
&
ref_pos
,
int
MaskLayer
)
const
wxPoint
&
ref_pos
,
int
MaskLayer
)
/***********************************************************************************/
/***********************************************************************************/
/* Localiste le segment dont une extremite coincide avec le point x,y
/* Localiste le segment dont une extremite coincide avec le point x,y
sur les couches donnees par masklayer
*
sur les couches donnees par masklayer
la recherche se fait de l'adresse start_adr a end_adr
*
la recherche se fait de l'adresse start_adr a end_adr
si end_adr = NULL, recherche jusqu'a la fin de la liste
*
si end_adr = NULL, recherche jusqu'a la fin de la liste
Les segments de piste marques avec le flag DELETED ne sont pas
*
Les segments de piste marques avec le flag DELETED ne sont pas
pris en compte
*
pris en compte
*/
*/
{
{
TRACK
*
PtSegm
;
TRACK
*
PtSegm
;
if
(
start_adr
==
NULL
)
return
(
NULL
);
if
(
start_adr
==
NULL
)
for
(
PtSegm
=
start_adr
;
PtSegm
!=
NULL
;
PtSegm
=
(
TRACK
*
)
PtSegm
->
Pnext
)
return
NULL
;
for
(
PtSegm
=
start_adr
;
PtSegm
!=
NULL
;
PtSegm
=
(
TRACK
*
)
PtSegm
->
Pnext
)
{
{
if
(
PtSegm
->
GetState
(
DELETED
|
BUSY
)
==
0
)
if
(
PtSegm
->
GetState
(
DELETED
|
BUSY
)
==
0
)
{
{
if
(
ref_pos
==
PtSegm
->
m_Start
)
if
(
ref_pos
==
PtSegm
->
m_Start
)
{
/* Test des couches */
{
/* Test des couches */
if
(
MaskLayer
&
PtSegm
->
ReturnMaskLayer
()
)
return
(
PtSegm
);
if
(
MaskLayer
&
PtSegm
->
ReturnMaskLayer
()
)
return
PtSegm
;
}
}
if
(
ref_pos
==
PtSegm
->
m_End
)
if
(
ref_pos
==
PtSegm
->
m_End
)
{
/* Test des couches */
{
/* Test des couches */
if
(
MaskLayer
&
PtSegm
->
ReturnMaskLayer
()
)
return
(
PtSegm
);
if
(
MaskLayer
&
PtSegm
->
ReturnMaskLayer
()
)
return
PtSegm
;
}
}
}
}
if
(
PtSegm
==
end_adr
)
break
;
if
(
PtSegm
==
end_adr
)
break
;
}
}
return
(
NULL
);
return
NULL
;
}
}
/*******************************************************************/
/*******************************************************************/
TRACK
*
Fast_Locate_Via
(
TRACK
*
start_adr
,
TRACK
*
end_adr
,
TRACK
*
Fast_Locate_Via
(
TRACK
*
start_adr
,
TRACK
*
end_adr
,
const
wxPoint
&
pos
,
int
MaskLayer
)
const
wxPoint
&
pos
,
int
MaskLayer
)
/*******************************************************************/
/*******************************************************************/
/* Localise la via de centre le point x,y , sur les couches donnees
/* Localise la via de centre le point x,y , sur les couches donnees
par masklayer
*
par masklayer
la recherche se fait de l'adresse start_adr a end_adr.
*
la recherche se fait de l'adresse start_adr a end_adr.
si end_adr = NULL, recherche jusqu'a la fin de la liste
*
si end_adr = NULL, recherche jusqu'a la fin de la liste
les vias dont le parametre State a le bit DELETED ou BUSY = 1 sont ignorees
*
les vias dont le parametre State a le bit DELETED ou BUSY = 1 sont ignorees
*/
*/
{
{
TRACK
*
PtSegm
;
TRACK
*
PtSegm
;
for
(
PtSegm
=
start_adr
;
PtSegm
!=
NULL
;
PtSegm
=
(
TRACK
*
)
PtSegm
->
Pnext
)
for
(
PtSegm
=
start_adr
;
PtSegm
!=
NULL
;
PtSegm
=
(
TRACK
*
)
PtSegm
->
Pnext
)
{
{
if
(
PtSegm
->
m_StructType
==
TYPEVIA
)
if
(
PtSegm
->
m_StructType
==
TYPEVIA
)
{
{
if
(
pos
==
PtSegm
->
m_Start
)
if
(
pos
==
PtSegm
->
m_Start
)
{
{
if
(
PtSegm
->
GetState
(
BUSY
|
DELETED
)
==
0
)
if
(
PtSegm
->
GetState
(
BUSY
|
DELETED
)
==
0
)
{
/* Test des couches */
{
/* Test des couches */
if
(
MaskLayer
&
PtSegm
->
ReturnMaskLayer
()
)
return
(
PtSegm
);
if
(
MaskLayer
&
PtSegm
->
ReturnMaskLayer
()
)
return
PtSegm
;
}
}
}
}
}
}
if
(
PtSegm
==
end_adr
)
break
;
if
(
PtSegm
==
end_adr
)
break
;
}
}
return
(
NULL
);
return
NULL
;
}
}
/***********************************************************************/
/***********************************************************************/
EDA_BaseStruct
*
Locate_MirePcb
(
EDA_BaseStruct
*
PtStruct
,
int
LayerSearch
,
EDA_BaseStruct
*
Locate_MirePcb
(
EDA_BaseStruct
*
PtStruct
,
int
LayerSearch
,
int
typeloc
)
int
typeloc
)
/***********************************************************************/
/***********************************************************************/
/* Serach for a photo target
/* Serach for a photo target
*/
*/
{
{
wxPoint
ref_pos
;
/* coord du point de localisation */
wxPoint
ref_pos
;
/* coord du point de localisation */
int
dX
,
dY
,
rayon
;
int
dX
,
dY
,
rayon
;
if
(
PtStruct
==
NULL
)
return
(
NULL
);
if
(
PtStruct
==
NULL
)
return
NULL
;
SET_REF_POS
(
ref_pos
);
SET_REF_POS
(
ref_pos
);
for
(
;
PtStruct
!=
NULL
;
PtStruct
=
PtStruct
->
Pnext
)
for
(
;
PtStruct
!=
NULL
;
PtStruct
=
PtStruct
->
Pnext
)
{
{
MIREPCB
*
item
;
MIREPCB
*
item
;
if
(
PtStruct
->
m_StructType
!=
TYPEMIRE
)
continue
;
if
(
PtStruct
->
m_StructType
!=
TYPEMIRE
)
continue
;
item
=
(
MIREPCB
*
)
PtStruct
;
item
=
(
MIREPCB
*
)
PtStruct
;
if
(
LayerSearch
!=
-
1
&&
item
->
m_Layer
!=
LayerSearch
)
continue
;
if
(
LayerSearch
!=
-
1
&&
item
->
m_Layer
!=
LayerSearch
)
continue
;
dX
=
ref_pos
.
x
-
item
->
m_Pos
.
x
;
dX
=
ref_pos
.
x
-
item
->
m_Pos
.
x
;
dY
=
ref_pos
.
y
-
item
->
m_Pos
.
y
;
dY
=
ref_pos
.
y
-
item
->
m_Pos
.
y
;
rayon
=
item
->
m_Size
/
2
;
rayon
=
item
->
m_Size
/
2
;
if
(
(
abs
(
dX
)
<=
rayon
)
&&
(
abs
(
dY
)
<=
rayon
)
)
if
(
(
abs
(
dX
)
<=
rayon
)
&&
(
abs
(
dY
)
<=
rayon
)
)
break
;
/* Mire Localisee */
break
;
/* Mire Localisee */
}
}
return
(
PtStruct
);
}
return
PtStruct
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment