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