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
2c60c006
Commit
2c60c006
authored
Oct 13, 2008
by
charras
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Some enhancements about code for zones
parent
3de5ffc7
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
67 additions
and
145 deletions
+67
-145
dialog_copper_zones.cpp
pcbnew/dialog_copper_zones.cpp
+24
-0
zones_by_polygon.cpp
pcbnew/zones_by_polygon.cpp
+14
-2
math_for_graphics.cpp
polygon/math_for_graphics.cpp
+2
-105
math_for_graphics.h
polygon/math_for_graphics.h
+0
-4
polygon_test_point_inside.cpp
polygon/polygon_test_point_inside.cpp
+27
-34
No files found.
pcbnew/dialog_copper_zones.cpp
View file @
2c60c006
...
@@ -229,6 +229,7 @@ void dialog_copper_zone::OnInitDialog( wxInitDialogEvent& event )
...
@@ -229,6 +229,7 @@ void dialog_copper_zone::OnInitDialog( wxInitDialogEvent& event )
if
(
ListNetName
[
ii
]
==
equipot
->
m_Netname
)
if
(
ListNetName
[
ii
]
==
equipot
->
m_Netname
)
{
{
m_ListNetNameSelection
->
SetSelection
(
ii
);
m_ListNetNameSelection
->
SetSelection
(
ii
);
m_ListNetNameSelection
->
EnsureVisible
(
ii
);
break
;
break
;
}
}
}
}
...
@@ -388,6 +389,29 @@ void dialog_copper_zone::OnNetSortingOptionSelected( wxCommandEvent& event )
...
@@ -388,6 +389,29 @@ void dialog_copper_zone::OnNetSortingOptionSelected( wxCommandEvent& event )
m_Parent
->
m_Parent
->
m_EDA_Config
->
Write
(
ZONE_NET_SORT_OPTION_KEY
,
(
long
)
m_NetSorting
);
m_Parent
->
m_Parent
->
m_EDA_Config
->
Write
(
ZONE_NET_SORT_OPTION_KEY
,
(
long
)
m_NetSorting
);
m_Parent
->
m_Parent
->
m_EDA_Config
->
Write
(
ZONE_NET_FILTER_STRING_KEY
,
m_NetNameFilter
->
GetValue
()
);
m_Parent
->
m_Parent
->
m_EDA_Config
->
Write
(
ZONE_NET_FILTER_STRING_KEY
,
m_NetNameFilter
->
GetValue
()
);
}
}
// Select and isplay current zone net name in listbox:
int
net_select
=
g_HightLigth_NetCode
;
if
(
m_Zone_Container
)
net_select
=
m_Zone_Container
->
GetNet
();
if
(
net_select
>
0
)
{
EQUIPOT
*
equipot
=
m_Parent
->
m_Pcb
->
FindNet
(
net_select
);
if
(
equipot
)
// Search net in list and select it
{
for
(
unsigned
ii
=
0
;
ii
<
ListNetName
.
GetCount
();
ii
++
)
{
if
(
ListNetName
[
ii
]
==
equipot
->
m_Netname
)
{
m_ListNetNameSelection
->
SetSelection
(
ii
);
m_ListNetNameSelection
->
EnsureVisible
(
ii
);
break
;
}
}
}
}
}
}
...
...
pcbnew/zones_by_polygon.cpp
View file @
2c60c006
...
@@ -508,10 +508,22 @@ int WinEDA_PcbFrame::Begin_Zone( wxDC* DC )
...
@@ -508,10 +508,22 @@ int WinEDA_PcbFrame::Begin_Zone( wxDC* DC )
if
(
s_CurrentZone
==
NULL
)
// A new outline is created
if
(
s_CurrentZone
==
NULL
)
// A new outline is created
{
{
int
diag
;
int
diag
;
DrawPanel
->
m_IgnoreMouseEvents
=
TRUE
;
// Init zone params to reasonnable values
zone
->
SetLayer
(
(
(
PCB_SCREEN
*
)
GetScreen
()
)
->
m_Active_Layer
);
zone
->
SetLayer
(
(
(
PCB_SCREEN
*
)
GetScreen
()
)
->
m_Active_Layer
);
// Prompt user fro exact parameters:
DrawPanel
->
m_IgnoreMouseEvents
=
TRUE
;
if
(
zone
->
IsOnCopperLayer
()
)
if
(
zone
->
IsOnCopperLayer
()
)
{
// Put a zone on a copper layer
{
// Put a zone on a copper layer
if
(
g_HightLigth_NetCode
)
{
g_NetcodeSelection
=
g_HightLigth_NetCode
;
zone
->
SetNet
(
g_NetcodeSelection
);
EQUIPOT
*
net
=
m_Pcb
->
FindNet
(
g_NetcodeSelection
);
if
(
net
)
zone
->
m_Netname
=
net
->
m_Netname
;
}
dialog_copper_zone
*
frame
=
new
dialog_copper_zone
(
this
,
zone
);
dialog_copper_zone
*
frame
=
new
dialog_copper_zone
(
this
,
zone
);
diag
=
frame
->
ShowModal
();
diag
=
frame
->
ShowModal
();
frame
->
Destroy
();
frame
->
Destroy
();
...
...
polygon/math_for_graphics.cpp
View file @
2c60c006
...
@@ -832,111 +832,8 @@ bool TestForIntersectionOfStraightLineSegments( int x1i, int y1i, int x1f, int y
...
@@ -832,111 +832,8 @@ bool TestForIntersectionOfStraightLineSegments( int x1i, int y1i, int x1f, int y
}
}
// quicksort algorithm
/*solves the Quadratic equation = a*x*x + b*x + c
// sorts array numbers[], also moves elements of another array index[]
*/
//
#define Q3WAY
void
quickSort
(
int
numbers
[],
int
index
[],
int
array_size
)
{
#ifdef Q3WAY
q_sort_3way
(
numbers
,
index
,
0
,
array_size
-
1
);
#else
q_sort
(
numbers
,
index
,
0
,
array_size
-
1
);
#endif
}
// standard quicksort
//
void
q_sort
(
int
numbers
[],
int
index
[],
int
left
,
int
right
)
{
int
pivot
,
pivot_index
,
l_hold
,
r_hold
;
l_hold
=
left
;
r_hold
=
right
;
pivot
=
numbers
[
left
];
pivot_index
=
index
[
left
];
while
(
left
<
right
)
{
while
((
numbers
[
right
]
>=
pivot
)
&&
(
left
<
right
))
right
--
;
if
(
left
!=
right
)
{
numbers
[
left
]
=
numbers
[
right
];
index
[
left
]
=
index
[
right
];
left
++
;
}
while
((
numbers
[
left
]
<=
pivot
)
&&
(
left
<
right
))
left
++
;
if
(
left
!=
right
)
{
numbers
[
right
]
=
numbers
[
left
];
index
[
right
]
=
index
[
left
];
right
--
;
}
}
numbers
[
left
]
=
pivot
;
index
[
left
]
=
pivot_index
;
pivot
=
left
;
left
=
l_hold
;
right
=
r_hold
;
if
(
left
<
pivot
)
q_sort
(
numbers
,
index
,
left
,
pivot
-
1
);
if
(
right
>
pivot
)
q_sort
(
numbers
,
index
,
pivot
+
1
,
right
);
}
// 3-way quicksort...useful where there are duplicate values
//
void
q_sort_3way
(
int
a
[],
int
b
[],
int
l
,
int
r
)
{
#define EXCH(i,j) {int temp=a[i]; a[i]=a[j]; a[j]=temp; temp=b[i]; b[i]=b[j]; b[j]=temp;}
int
i
=
l
-
1
;
int
j
=
r
;
int
p
=
l
-
1
;
int
q
=
r
;
int
v
=
a
[
r
];
if
(
r
<=
l
)
return
;
for
(;;)
{
while
(
a
[
++
i
]
<
v
);
while
(
v
<
a
[
--
j
]
)
if
(
j
==
1
)
break
;
if
(
i
>=
j
)
break
;
EXCH
(
i
,
j
);
if
(
a
[
i
]
==
v
)
{
p
++
;
EXCH
(
p
,
i
);
}
if
(
v
==
a
[
j
]
)
{
q
--
;
EXCH
(
j
,
q
);
}
}
EXCH
(
i
,
r
);
j
=
i
-
1
;
i
=
i
+
1
;
for
(
int
k
=
l
;
k
<
p
;
k
++
,
j
--
)
EXCH
(
k
,
j
);
for
(
int
k
=
r
-
1
;
k
>
q
;
k
--
,
i
++
)
EXCH
(
i
,
k
);
q_sort_3way
(
a
,
b
,
l
,
j
);
q_sort_3way
(
a
,
b
,
i
,
r
);
}
// solves quadratic equation
// i.e. ax**2 + bx + c = 0
// returns true if solution exist, with solutions in x1 and x2
// else returns false
//
bool
Quadratic
(
double
a
,
double
b
,
double
c
,
double
*
x1
,
double
*
x2
)
bool
Quadratic
(
double
a
,
double
b
,
double
c
,
double
*
x1
,
double
*
x2
)
{
{
double
root
=
b
*
b
-
4.0
*
a
*
c
;
double
root
=
b
*
b
-
4.0
*
a
*
c
;
...
...
polygon/math_for_graphics.h
View file @
2c60c006
...
@@ -106,7 +106,3 @@ int GetArcIntersections( EllipseKH * el1, EllipseKH * el2,
...
@@ -106,7 +106,3 @@ int GetArcIntersections( EllipseKH * el1, EllipseKH * el2,
double
*
x2
=
NULL
,
double
*
y2
=
NULL
);
double
*
x2
=
NULL
,
double
*
y2
=
NULL
);
CPoint
GetInflectionPoint
(
CPoint
pi
,
CPoint
pf
,
int
mode
);
CPoint
GetInflectionPoint
(
CPoint
pi
,
CPoint
pf
,
int
mode
);
// quicksort (2-way or 3-way)
void
quickSort
(
int
numbers
[],
int
index
[],
int
array_size
);
void
q_sort
(
int
numbers
[],
int
index
[],
int
left
,
int
right
);
void
q_sort_3way
(
int
a
[],
int
b
[],
int
left
,
int
right
);
polygon/polygon_test_point_inside.cpp
View file @
2c60c006
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// Name: polygon_test_point_inside.cpp
// Name: polygon_test_point_inside.cpp
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
...
@@ -20,7 +21,7 @@ using namespace std;
...
@@ -20,7 +21,7 @@ using namespace std;
* the second version is GPL (currently used)
* the second version is GPL (currently used)
* the first version is for explanations and tests (used to test the second version)
* the first version is for explanations and tests (used to test the second version)
* both use the same algorithm.
* both use the same algorithm.
*/
*/
#if 0
#if 0
/* This text and the algorithm come from http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
/* This text and the algorithm come from http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
...
@@ -282,9 +283,6 @@ bool TestPointInsidePolygon( std::vector <CPolyPt> aPolysList,
...
@@ -282,9 +283,6 @@ bool TestPointInsidePolygon( std::vector <CPolyPt> aPolysList,
#else
#else
/* this algo come from freePCB.
*/
bool
TestPointInsidePolygon
(
std
::
vector
<
CPolyPt
>
aPolysList
,
bool
TestPointInsidePolygon
(
std
::
vector
<
CPolyPt
>
aPolysList
,
int
istart
,
int
istart
,
int
iend
,
int
iend
,
...
@@ -294,12 +292,13 @@ bool TestPointInsidePolygon( std::vector <CPolyPt> aPolysList,
...
@@ -294,12 +292,13 @@ bool TestPointInsidePolygon( std::vector <CPolyPt> aPolysList,
/** Function TestPointInsidePolygon
/** Function TestPointInsidePolygon
* test if a point is inside or outside a polygon.
* test if a point is inside or outside a polygon.
* if a point is on a outline segment, it is considered outside the polygon
* if a point is on a outline segment, it is considered outside the polygon
* the polygon must have only lines (not arcs) for outlines.
* Use TestPointInside or TestPointInsideContour for more complex polygons
* @param aPolysList: the list of polygons
* @param aPolysList: the list of polygons
* @param istart: the starting point of a given polygon in m_FilledPolysList.
* @param istart: the starting point of a given polygon in m_FilledPolysList.
* @param iend: the ending point of the polygon in m_FilledPolysList.
* @param iend: the ending point of the polygon in m_FilledPolysList.
* @param refx,refy: the point coordinate to test
* @param refx,refy: the point coordinate to test
* @return true if the point is inside, false for outside
* @return true if the point is inside, false for outside
* this algorithm come from FreePCB.
*/
*/
{
{
#define OUTSIDE_IF_ON_SIDE 0 // = 1 if we consider point on a side outside the polygon
#define OUTSIDE_IF_ON_SIDE 0 // = 1 if we consider point on a side outside the polygon
...
@@ -307,7 +306,7 @@ bool TestPointInsidePolygon( std::vector <CPolyPt> aPolysList,
...
@@ -307,7 +306,7 @@ bool TestPointInsidePolygon( std::vector <CPolyPt> aPolysList,
// get intersection points
// get intersection points
// count intersection points to right of (x,y), if odd (x,y) is inside polyline
// count intersection points to right of (x,y), if odd (x,y) is inside polyline
int
xx
,
yy
;
int
xx
,
yy
;
double
slope
=
0
;
double
slope
=
0
;
// Using an horizontal line.
double
a
=
refy
-
slope
*
refx
;
double
a
=
refy
-
slope
*
refx
;
int
ics
,
ice
;
int
ics
,
ice
;
bool
inside
=
false
;
bool
inside
=
false
;
...
@@ -315,29 +314,23 @@ bool TestPointInsidePolygon( std::vector <CPolyPt> aPolysList,
...
@@ -315,29 +314,23 @@ bool TestPointInsidePolygon( std::vector <CPolyPt> aPolysList,
// find all intersection points of line with polyline sides
// find all intersection points of line with polyline sides
for
(
ics
=
istart
,
ice
=
iend
;
ics
<=
iend
;
ice
=
ics
++
)
for
(
ics
=
istart
,
ice
=
iend
;
ics
<=
iend
;
ice
=
ics
++
)
{
{
double
x
,
y
,
x2
,
y2
;
double
intersectx1
,
intersecty1
,
intersectx2
,
intersecty2
;
int
ok
=
FindLineSegmentIntersection
(
a
,
slope
,
int
ok
;
ok
=
FindLineSegmentIntersection
(
a
,
slope
,
aPolysList
[
ics
].
x
,
aPolysList
[
ics
].
y
,
aPolysList
[
ics
].
x
,
aPolysList
[
ics
].
y
,
aPolysList
[
ice
].
x
,
aPolysList
[
ice
].
y
,
aPolysList
[
ice
].
x
,
aPolysList
[
ice
].
y
,
0
,
CPolyLine
::
STRAIGHT
,
&
x
,
&
y
,
&
intersectx1
,
&
intersecty1
,
&
x2
,
&
y2
);
&
intersectx2
,
&
intersecty2
);
if
(
ok
)
{
/* FindLineSegmentIntersection() returns 0, 1 or 2 coordinates (ok = 0, 1, 2)
xx
=
(
int
)
x
;
* for straight line segments, only 0 or 1 are possible
yy
=
(
int
)
y
;
* (2 intersections points are possible only with arcs
#if OUTSIDE_IF_ON_SIDE
*/
if
(
xx
==
refx
&&
yy
==
refy
)
if
(
ok
)
// Intersection found
return
false
;
// (x,y) is on a side, call it outside
else
#endif
if
(
xx
>
refx
)
inside
=
not
inside
;
}
if
(
ok
==
2
)
{
{
xx
=
(
int
)
x2
;
xx
=
(
int
)
intersectx1
;
yy
=
(
int
)
y2
;
yy
=
(
int
)
intersecty1
;
#if OUTSIDE_IF_ON_SIDE
#if OUTSIDE_IF_ON_SIDE
if
(
xx
==
refx
&&
yy
==
refy
)
if
(
xx
==
refx
&&
yy
==
refy
)
return
false
;
// (x,y) is on a side, call it outside
return
false
;
// (x,y) is on a side, call it outside
...
...
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