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
1dbf5e21
Commit
1dbf5e21
authored
Feb 27, 2008
by
dickelbeck
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
beautify
parent
4b8925dd
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
120 additions
and
108 deletions
+120
-108
controle.cpp
pcbnew/controle.cpp
+20
-20
editrack.cpp
pcbnew/editrack.cpp
+97
-88
protos.h
pcbnew/protos.h
+3
-0
No files found.
pcbnew/controle.cpp
View file @
1dbf5e21
...
@@ -499,25 +499,25 @@ void WinEDA_BasePcbFrame::GeneralControle( wxDC* DC, wxPoint Mouse )
...
@@ -499,25 +499,25 @@ void WinEDA_BasePcbFrame::GeneralControle( wxDC* DC, wxPoint Mouse )
if
(
DrawStruct
&&
DrawStruct
->
m_Flags
)
if
(
DrawStruct
&&
DrawStruct
->
m_Flags
)
keep_on_grid
=
TRUE
;
keep_on_grid
=
TRUE
;
if
(
keep_on_grid
)
{
if
(
keep_on_grid
)
{
wxPoint
on_grid
=
curpos
;
wxPoint
on_grid
=
curpos
;
PutOnGrid
(
&
on_grid
);
PutOnGrid
(
&
on_grid
);
if
(
Magnetize
(
m_Pcb
,
(
WinEDA_PcbFrame
*
)
this
,
m_ID_current_state
,
if
(
Magnetize
(
m_Pcb
,
(
WinEDA_PcbFrame
*
)
this
,
m_ID_current_state
,
GetScreen
()
->
GetGrid
(),
on_grid
,
curpos
)
)
GetScreen
()
->
GetGrid
(),
on_grid
,
curpos
)
)
GetScreen
()
->
m_Curseur
=
curpos
;
GetScreen
()
->
m_Curseur
=
curpos
;
else
{
else
extern
TRACK
*
LocateIntrusion
(
TRACK
*
start
,
int
net
,
int
width
);
{
/*
/*
* If there's an intrusion and DRC is active, we pass the cursor
* If there's an intrusion and DRC is active, we pass the cursor
* "as is", and let ShowNewTrackWhenMovingCursor figure our what to
* "as is", and let ShowNewTrackWhenMovingCursor figure our what to
* do.
* do.
*/
*/
if
(
!
Drc_On
||
!
g_CurrentTrackSegment
||
if
(
!
Drc_On
||
!
g_CurrentTrackSegment
g_CurrentTrackSegment
!=
this
->
GetCurItem
()
||
||
g_CurrentTrackSegment
!=
this
->
GetCurItem
()
!
LocateIntrusion
(
m_Pcb
->
m_Track
,
g_CurrentTrackSegment
->
GetNet
(),
||
!
LocateIntrusion
(
m_Pcb
->
m_Track
,
g_CurrentTrackSegment
->
GetNet
(),
g_CurrentTrackSegment
->
m_Width
)
)
g_CurrentTrackSegment
->
m_Width
)
)
GetScreen
()
->
m_Curseur
=
on_grid
;
GetScreen
()
->
m_Curseur
=
on_grid
;
}
}
}
}
...
...
pcbnew/editrack.cpp
View file @
1dbf5e21
...
@@ -12,6 +12,8 @@
...
@@ -12,6 +12,8 @@
#include "protos.h"
#include "protos.h"
#include "drc_stuff.h"
#include "drc_stuff.h"
#include "trigo.h"
/* Routines Locales */
/* Routines Locales */
...
@@ -281,6 +283,7 @@ int WinEDA_PcbFrame::Add_45_degrees_Segment( wxDC* DC, TRACK* pt_segm )
...
@@ -281,6 +283,7 @@ int WinEDA_PcbFrame::Add_45_degrees_Segment( wxDC* DC, TRACK* pt_segm )
pas_45
=
GetScreen
()
->
GetGrid
().
x
/
2
;
pas_45
=
GetScreen
()
->
GetGrid
().
x
/
2
;
if
(
pas_45
<
pt_segm
->
m_Width
)
if
(
pas_45
<
pt_segm
->
m_Width
)
pas_45
=
GetScreen
()
->
GetGrid
().
x
;
pas_45
=
GetScreen
()
->
GetGrid
().
x
;
while
(
pas_45
<
pt_segm
->
m_Width
)
while
(
pas_45
<
pt_segm
->
m_Width
)
pas_45
*=
2
;
pas_45
*=
2
;
...
@@ -436,6 +439,7 @@ void WinEDA_PcbFrame::End_Route( TRACK* track, wxDC* DC )
...
@@ -436,6 +439,7 @@ void WinEDA_PcbFrame::End_Route( TRACK* track, wxDC* DC )
{
{
adr_buf
=
(
TRACK
*
)
LockPoint
;
adr_buf
=
(
TRACK
*
)
LockPoint
;
g_HightLigth_NetCode
=
adr_buf
->
GetNet
();
g_HightLigth_NetCode
=
adr_buf
->
GetNet
();
/* creation eventuelle d'un point d'accrochage */
/* creation eventuelle d'un point d'accrochage */
LockPoint
=
CreateLockPoint
(
&
g_CurrentTrackSegment
->
m_End
.
x
,
LockPoint
=
CreateLockPoint
(
&
g_CurrentTrackSegment
->
m_End
.
x
,
&
g_CurrentTrackSegment
->
m_End
.
y
,
&
g_CurrentTrackSegment
->
m_End
.
y
,
...
@@ -493,121 +497,126 @@ void WinEDA_PcbFrame::End_Route( TRACK* track, wxDC* DC )
...
@@ -493,121 +497,126 @@ void WinEDA_PcbFrame::End_Route( TRACK* track, wxDC* DC )
SetCurItem
(
NULL
);
SetCurItem
(
NULL
);
}
}
/*
* PushTrack detecs if the mouse is pointing into a conflicting track.
* In this case, it tries to push the new track out of the conflicting track's
* clearance zone. This gives us a cheap mechanism for drawing tracks that
* tightly follow others, independent of grid settings.
*
* KNOWN BUGS:
* - we do the same sort of search and calculation up to three times:
* 1) we search for magnetic hits (in controle.cpp)
* 2) we check if there's a DRC violation in the making (also controle.cpp)
* 3) we try to fix the DRC violation (here)
* - if we have a magnetic hit and a DRC violation at the same time, we choose
* the magnetic hit instead of solving the violation
* - should locate conflicting tracks also when we're crossing over them
* - we obviously shouldn't access functions through "extern" or have #includes
* in the middle of the file
*/
#include "trigo.h"
extern
bool
Project
(
wxPoint
&
res
,
wxPoint
on_grid
,
const
TRACK
*
track
);
TRACK
*
LocateIntrusion
(
TRACK
*
start
,
int
net
,
int
width
)
TRACK
*
LocateIntrusion
(
TRACK
*
start
,
int
net
,
int
width
)
{
{
int
layer
=
((
PCB_SCREEN
*
)
ActiveScreen
)
->
m_Active_Layer
;
int
layer
=
(
(
PCB_SCREEN
*
)
ActiveScreen
)
->
m_Active_Layer
;
int
layer_mask
=
g_TabOneLayerMask
[
layer
];
int
layer_mask
=
g_TabOneLayerMask
[
layer
];
wxPoint
ref
=
ActiveScreen
->
RefPos
(
1
);
wxPoint
ref
=
ActiveScreen
->
RefPos
(
1
);
TRACK
*
track
,
*
found
=
NULL
;
TRACK
*
track
,
*
found
=
NULL
;
for
(
track
=
start
;
track
;
track
=
track
->
Next
())
{
for
(
track
=
start
;
track
;
track
=
track
->
Next
()
)
{
int
dist
;
int
dist
;
wxPoint
pos
,
vec
;
wxPoint
pos
,
vec
;
int64_t
tmp
;
int64_t
tmp
;
/* Locate_Pistes */
/* Locate_Pistes */
if
(
track
->
GetState
(
BUSY
|
DELETED
)
)
if
(
track
->
GetState
(
BUSY
|
DELETED
)
)
continue
;
continue
;
if
(
!
(
g_TabOneLayerMask
[
track
->
GetLayer
()]
&
layer_mask
))
if
(
!
(
g_TabOneLayerMask
[
track
->
GetLayer
()]
&
layer_mask
)
)
continue
;
continue
;
if
(
track
->
GetNet
()
==
net
)
if
(
track
->
GetNet
()
==
net
)
continue
;
continue
;
if
(
track
->
Type
()
==
TYPEVIA
)
if
(
track
->
Type
()
==
TYPEVIA
)
continue
;
continue
;
/* TRACK::HitTest */
/* TRACK::HitTest */
dist
=
width
/
2
+
track
->
m_Width
/
2
+
g_DesignSettings
.
m_TrackClearence
;
dist
=
width
/
2
+
track
->
m_Width
/
2
+
g_DesignSettings
.
m_TrackClearence
;
pos
=
ref
-
track
->
m_Start
;
pos
=
ref
-
track
->
m_Start
;
vec
=
track
->
m_End
-
track
->
m_Start
;
vec
=
track
->
m_End
-
track
->
m_Start
;
if
(
!
DistanceTest
(
dist
,
vec
.
x
,
vec
.
y
,
pos
.
x
,
pos
.
y
))
if
(
!
DistanceTest
(
dist
,
vec
.
x
,
vec
.
y
,
pos
.
x
,
pos
.
y
)
)
continue
;
continue
;
found
=
track
;
found
=
track
;
/* prefer intrusions from the side, not the end */
/* prefer intrusions from the side, not the end */
tmp
=
(
int64_t
)
pos
.
x
*
vec
.
x
+
(
int64_t
)
pos
.
y
*
vec
.
y
;
tmp
=
(
int64_t
)
pos
.
x
*
vec
.
x
+
(
int64_t
)
pos
.
y
*
vec
.
y
;
if
(
tmp
>=
0
&&
tmp
<=
(
int64_t
)
vec
.
x
*
vec
.
x
+
(
int64_t
)
vec
.
y
*
vec
.
y
)
if
(
tmp
>=
0
&&
tmp
<=
(
int64_t
)
vec
.
x
*
vec
.
x
+
(
int64_t
)
vec
.
y
*
vec
.
y
)
break
;
break
;
}
}
return
found
;
return
found
;
}
}
/**
static
void
PushTrack
(
WinEDA_DrawPanel
*
panel
)
* Function PushTrack
* detects if the mouse is pointing into a conflicting track.
* In this case, it tries to push the new track out of the conflicting track's
* clearance zone. This gives us a cheap mechanism for drawing tracks that
* tightly follow others, independent of grid settings.
*
* KNOWN BUGS:
* - we do the same sort of search and calculation up to three times:
* 1) we search for magnetic hits (in controle.cpp)
* 2) we check if there's a DRC violation in the making (also controle.cpp)
* 3) we try to fix the DRC violation (here)
* - if we have a magnetic hit and a DRC violation at the same time, we choose
* the magnetic hit instead of solving the violation
* - should locate conflicting tracks also when we're crossing over them
*/
static
void
PushTrack
(
WinEDA_DrawPanel
*
panel
)
{
{
BOARD
*
pcb
=
((
WinEDA_BasePcbFrame
*
)
(
panel
->
m_Parent
)
)
->
m_Pcb
;
BOARD
*
pcb
=
(
(
WinEDA_BasePcbFrame
*
)
(
panel
->
m_Parent
)
)
->
m_Pcb
;
wxPoint
cursor
=
ActiveScreen
->
m_Curseur
;
wxPoint
cursor
=
ActiveScreen
->
m_Curseur
;
wxPoint
cv
,
vec
,
n
;
wxPoint
cv
,
vec
,
n
;
TRACK
*
track
=
g_CurrentTrackSegment
;
TRACK
*
track
=
g_CurrentTrackSegment
;
TRACK
*
other
;
TRACK
*
other
;
int64_t
det
;
int64_t
det
;
int
dist
;
int
dist
;
double
f
;
double
f
;
other
=
LocateIntrusion
(
pcb
->
m_Track
,
track
->
GetNet
(),
track
->
m_Width
);
other
=
LocateIntrusion
(
pcb
->
m_Track
,
track
->
GetNet
(),
track
->
m_Width
);
/* are we currently pointing into a conflicting trace ? */
/* are we currently pointing into a conflicting trace ? */
if
(
!
other
)
if
(
!
other
)
return
;
return
;
if
(
other
->
GetNet
()
==
track
->
GetNet
())
if
(
other
->
GetNet
()
==
track
->
GetNet
()
)
return
;
return
;
cv
=
cursor
-
other
->
m_Start
;
cv
=
cursor
-
other
->
m_Start
;
vec
=
other
->
m_End
-
other
->
m_Start
;
vec
=
other
->
m_End
-
other
->
m_Start
;
det
=
(
int64_t
)
cv
.
x
*
vec
.
y
-
(
int64_t
)
cv
.
y
*
vec
.
x
;
det
=
(
int64_t
)
cv
.
x
*
vec
.
y
-
(
int64_t
)
cv
.
y
*
vec
.
x
;
/* cursor is right at the center of the old track */
/* cursor is right at the center of the old track */
if
(
!
det
)
if
(
!
det
)
return
;
return
;
dist
=
(
track
->
m_Width
+
1
)
/
2
+
(
other
->
m_Width
+
1
)
/
2
+
dist
=
(
track
->
m_Width
+
1
)
/
2
+
(
other
->
m_Width
+
1
)
/
2
+
g_DesignSettings
.
m_TrackClearence
+
2
;
g_DesignSettings
.
m_TrackClearence
+
2
;
/*
/*
* DRC wants >, so +1.
* DRC wants >, so +1.
* We may have a quantization error of 1/sqrt(2), so +1 again.
* We may have a quantization error of 1/sqrt(2), so +1 again.
*/
*/
/* Vector "n" is perpendicular to "other", pointing towards the cursor. */
/* Vector "n" is perpendicular to "other", pointing towards the cursor. */
if
(
det
>
0
)
{
if
(
det
>
0
)
{
n
.
x
=
vec
.
y
;
n
.
x
=
vec
.
y
;
n
.
y
=
-
vec
.
x
;
n
.
y
=
-
vec
.
x
;
}
}
else
{
else
{
n
.
x
=
-
vec
.
y
;
n
.
x
=
-
vec
.
y
;
n
.
y
=
vec
.
x
;
n
.
y
=
vec
.
x
;
}
}
f
=
dist
/
hypot
(
n
.
x
,
n
.
y
);
f
=
dist
/
hypot
(
n
.
x
,
n
.
y
);
n
.
x
=
(
int
)
round
(
f
*
n
.
x
);
n
.
x
=
(
int
)
round
(
f
*
n
.
x
);
n
.
y
=
(
int
)
round
(
f
*
n
.
y
);
n
.
y
=
(
int
)
round
(
f
*
n
.
y
);
Project
(
track
->
m_End
,
cursor
,
other
);
Project
(
track
->
m_End
,
cursor
,
other
);
track
->
m_End
+=
n
;
track
->
m_End
+=
n
;
}
}
/****************************************************************************/
/****************************************************************************/
void
ShowNewTrackWhenMovingCursor
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
bool
erase
)
void
ShowNewTrackWhenMovingCursor
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
bool
erase
)
/****************************************************************************/
/****************************************************************************/
...
...
pcbnew/protos.h
View file @
1dbf5e21
...
@@ -224,6 +224,8 @@ MODULE* Load_Module_From_Library( WinEDA_DrawFrame* frame, wxDC* DC );
...
@@ -224,6 +224,8 @@ MODULE* Load_Module_From_Library( WinEDA_DrawFrame* frame, wxDC* DC );
/* EDITRACK.C : */
/* EDITRACK.C : */
/****************/
/****************/
TRACK
*
LocateIntrusion
(
TRACK
*
start
,
int
net
,
int
width
);
void
ShowNewTrackWhenMovingCursor
(
WinEDA_DrawPanel
*
panel
,
void
ShowNewTrackWhenMovingCursor
(
WinEDA_DrawPanel
*
panel
,
wxDC
*
DC
,
bool
erase
);
wxDC
*
DC
,
bool
erase
);
...
@@ -385,6 +387,7 @@ TRACK* CreateLockPoint( int* pX, int* pY, TRACK* ptsegm, TRACK* refsegm
...
@@ -385,6 +387,7 @@ TRACK* CreateLockPoint( int* pX, int* pY, TRACK* ptsegm, TRACK* refsegm
/* CONTROLE.CPP */
/* CONTROLE.CPP */
/****************/
/****************/
void
RemoteCommand
(
const
char
*
cmdline
);
void
RemoteCommand
(
const
char
*
cmdline
);
bool
Project
(
wxPoint
&
res
,
wxPoint
on_grid
,
const
TRACK
*
track
);
/***************/
/***************/
...
...
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