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
f96d557e
Commit
f96d557e
authored
Jul 30, 2012
by
jean-pierre charras
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix issues in zones creation (DRC and merging) I created in 3658.1
parent
1c9433fb
Changes
13
Show whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
263 additions
and
116 deletions
+263
-116
class_zone.cpp
pcbnew/class_zone.cpp
+2
-1
class_zone.h
pcbnew/class_zone.h
+1
-1
class_zone_settings.cpp
pcbnew/class_zone_settings.cpp
+4
-1
drc_clearance_test_functions.cpp
pcbnew/drc_clearance_test_functions.cpp
+1
-0
eagle_plugin.cpp
pcbnew/eagle_plugin.cpp
+8
-6
legacy_plugin.cpp
pcbnew/legacy_plugin.cpp
+5
-3
pcb_parser.cpp
pcbnew/pcb_parser.cpp
+3
-3
zones_by_polygon.cpp
pcbnew/zones_by_polygon.cpp
+6
-2
zones_test_and_combine_areas.cpp
pcbnew/zones_test_and_combine_areas.cpp
+92
-21
PolyLine.cpp
polygon/PolyLine.cpp
+81
-29
PolyLine.h
polygon/PolyLine.h
+24
-13
math_for_graphics.cpp
polygon/math_for_graphics.cpp
+36
-13
math_for_graphics.h
polygon/math_for_graphics.h
+0
-23
No files found.
pcbnew/class_zone.cpp
View file @
f96d557e
...
@@ -46,6 +46,7 @@
...
@@ -46,6 +46,7 @@
#include <pcbnew.h>
#include <pcbnew.h>
#include <zones.h>
#include <zones.h>
#include <math_for_graphics.h>
ZONE_CONTAINER
::
ZONE_CONTAINER
(
BOARD
*
aBoard
)
:
ZONE_CONTAINER
::
ZONE_CONTAINER
(
BOARD
*
aBoard
)
:
...
@@ -912,7 +913,7 @@ void ZONE_CONTAINER::AddPolygon( std::vector< wxPoint >& aPolygon )
...
@@ -912,7 +913,7 @@ void ZONE_CONTAINER::AddPolygon( std::vector< wxPoint >& aPolygon )
AppendCorner
(
aPolygon
[
i
]
);
AppendCorner
(
aPolygon
[
i
]
);
}
}
m_Poly
->
Close
();
m_Poly
->
Close
LastContour
();
}
}
...
...
pcbnew/class_zone.h
View file @
f96d557e
...
@@ -429,7 +429,7 @@ public:
...
@@ -429,7 +429,7 @@ public:
return
m_Poly
->
GetHatchStyle
();
return
m_Poly
->
GetHatchStyle
();
}
}
void
SetHatchStyle
(
CPolyLine
::
hatch_style
aStyle
)
void
SetHatchStyle
(
CPolyLine
::
HATCH_STYLE
aStyle
)
{
{
m_Poly
->
SetHatchStyle
(
aStyle
);
m_Poly
->
SetHatchStyle
(
aStyle
);
}
}
...
...
pcbnew/class_zone_settings.cpp
View file @
f96d557e
...
@@ -99,7 +99,6 @@ void ZONE_SETTINGS::ExportSetting( ZONE_CONTAINER& aTarget, bool aFullExport ) c
...
@@ -99,7 +99,6 @@ void ZONE_SETTINGS::ExportSetting( ZONE_CONTAINER& aTarget, bool aFullExport ) c
aTarget
.
m_FillMode
=
m_FillMode
;
aTarget
.
m_FillMode
=
m_FillMode
;
aTarget
.
m_ZoneClearance
=
m_ZoneClearance
;
aTarget
.
m_ZoneClearance
=
m_ZoneClearance
;
aTarget
.
m_ZoneMinThickness
=
m_ZoneMinThickness
;
aTarget
.
m_ZoneMinThickness
=
m_ZoneMinThickness
;
aTarget
.
m_Poly
->
SetHatch
(
m_Zone_HatchingStyle
,
Mils2iu
(
20
)
);
aTarget
.
m_ArcToSegmentsCount
=
m_ArcToSegmentsCount
;
aTarget
.
m_ArcToSegmentsCount
=
m_ArcToSegmentsCount
;
aTarget
.
m_ThermalReliefGap
=
m_ThermalReliefGap
;
aTarget
.
m_ThermalReliefGap
=
m_ThermalReliefGap
;
aTarget
.
m_ThermalReliefCopperBridge
=
m_ThermalReliefCopperBridge
;
aTarget
.
m_ThermalReliefCopperBridge
=
m_ThermalReliefCopperBridge
;
...
@@ -118,4 +117,8 @@ void ZONE_SETTINGS::ExportSetting( ZONE_CONTAINER& aTarget, bool aFullExport ) c
...
@@ -118,4 +117,8 @@ void ZONE_SETTINGS::ExportSetting( ZONE_CONTAINER& aTarget, bool aFullExport ) c
aTarget
.
SetLayer
(
m_CurrentZone_Layer
);
aTarget
.
SetLayer
(
m_CurrentZone_Layer
);
aTarget
.
m_Poly
->
SetLayer
(
m_CurrentZone_Layer
);
aTarget
.
m_Poly
->
SetLayer
(
m_CurrentZone_Layer
);
}
}
// call SetHatch last, because hatch lines will be rebuilt,
// using new parameters values
aTarget
.
m_Poly
->
SetHatch
(
m_Zone_HatchingStyle
,
Mils2iu
(
20
),
true
);
}
}
pcbnew/drc_clearance_test_functions.cpp
View file @
f96d557e
...
@@ -44,6 +44,7 @@
...
@@ -44,6 +44,7 @@
#include <class_track.h>
#include <class_track.h>
#include <class_zone.h>
#include <class_zone.h>
#include <class_marker_pcb.h>
#include <class_marker_pcb.h>
#include <math_for_graphics.h>
/* compare 2 trapezoids (can be rectangle) and return true if distance > aDist
/* compare 2 trapezoids (can be rectangle) and return true if distance > aDist
...
...
pcbnew/eagle_plugin.cpp
View file @
f96d557e
...
@@ -1404,17 +1404,18 @@ void EAGLE_PLUGIN::loadPlain( CPTREE& aGraphics )
...
@@ -1404,17 +1404,18 @@ void EAGLE_PLUGIN::loadPlain( CPTREE& aGraphics )
zone
->
SetLayer
(
layer
);
zone
->
SetLayer
(
layer
);
zone
->
SetNet
(
0
);
zone
->
SetNet
(
0
);
int
outline_hatch
=
CPolyLine
::
DIAGONAL_EDGE
;
CPolyLine
::
HATCH_STYLE
outline_hatch
=
CPolyLine
::
DIAGONAL_EDGE
;
zone
->
m_Poly
->
Start
(
layer
,
kicad_x
(
r
.
x1
),
kicad_y
(
r
.
y1
),
outline_hatch
);
zone
->
m_Poly
->
Start
(
layer
,
kicad_x
(
r
.
x1
),
kicad_y
(
r
.
y1
),
outline_hatch
);
zone
->
AppendCorner
(
wxPoint
(
kicad_x
(
r
.
x2
),
kicad_y
(
r
.
y1
)
)
);
zone
->
AppendCorner
(
wxPoint
(
kicad_x
(
r
.
x2
),
kicad_y
(
r
.
y1
)
)
);
zone
->
AppendCorner
(
wxPoint
(
kicad_x
(
r
.
x2
),
kicad_y
(
r
.
y2
)
)
);
zone
->
AppendCorner
(
wxPoint
(
kicad_x
(
r
.
x2
),
kicad_y
(
r
.
y2
)
)
);
zone
->
AppendCorner
(
wxPoint
(
kicad_x
(
r
.
x1
),
kicad_y
(
r
.
y2
)
)
);
zone
->
AppendCorner
(
wxPoint
(
kicad_x
(
r
.
x1
),
kicad_y
(
r
.
y2
)
)
);
zone
->
m_Poly
->
Close
();
zone
->
m_Poly
->
Close
LastContour
();
// this is not my fault:
// this is not my fault:
zone
->
m_Poly
->
SetHatch
(
outline_hatch
,
zone
->
m_Poly
->
SetHatch
(
outline_hatch
,
Mils2iu
(
zone
->
m_Poly
->
GetDefaultHatchPitchMils
()
)
);
Mils2iu
(
zone
->
m_Poly
->
GetDefaultHatchPitchMils
()
),
true
);
}
}
m_xpath
->
pop
();
m_xpath
->
pop
();
}
}
...
@@ -2360,7 +2361,7 @@ void EAGLE_PLUGIN::loadSignals( CPTREE& aSignals )
...
@@ -2360,7 +2361,7 @@ void EAGLE_PLUGIN::loadSignals( CPTREE& aSignals )
zone
->
SetNet
(
netCode
);
zone
->
SetNet
(
netCode
);
zone
->
SetNetName
(
netName
);
zone
->
SetNetName
(
netName
);
int
outline_hatch
=
CPolyLine
::
DIAGONAL_EDGE
;
CPolyLine
::
HATCH_STYLE
outline_hatch
=
CPolyLine
::
DIAGONAL_EDGE
;
bool
first
=
true
;
bool
first
=
true
;
for
(
CITER
vi
=
it
->
second
.
begin
();
vi
!=
it
->
second
.
end
();
++
vi
)
for
(
CITER
vi
=
it
->
second
.
begin
();
vi
!=
it
->
second
.
end
();
++
vi
)
...
@@ -2380,10 +2381,11 @@ void EAGLE_PLUGIN::loadSignals( CPTREE& aSignals )
...
@@ -2380,10 +2381,11 @@ void EAGLE_PLUGIN::loadSignals( CPTREE& aSignals )
zone
->
AppendCorner
(
wxPoint
(
kicad_x
(
v
.
x
),
kicad_y
(
v
.
y
)
)
);
zone
->
AppendCorner
(
wxPoint
(
kicad_x
(
v
.
x
),
kicad_y
(
v
.
y
)
)
);
}
}
zone
->
m_Poly
->
Close
();
zone
->
m_Poly
->
Close
LastContour
();
zone
->
m_Poly
->
SetHatch
(
outline_hatch
,
zone
->
m_Poly
->
SetHatch
(
outline_hatch
,
Mils2iu
(
zone
->
m_Poly
->
GetDefaultHatchPitchMils
()
)
);
Mils2iu
(
zone
->
m_Poly
->
GetDefaultHatchPitchMils
()
),
true
);
// clearances, etc.
// clearances, etc.
zone
->
SetArcSegCount
(
32
);
// @todo: should be a constructor default?
zone
->
SetArcSegCount
(
32
);
// @todo: should be a constructor default?
...
...
pcbnew/legacy_plugin.cpp
View file @
f96d557e
...
@@ -2109,7 +2109,7 @@ void LEGACY_PLUGIN::loadZONE_CONTAINER()
...
@@ -2109,7 +2109,7 @@ void LEGACY_PLUGIN::loadZONE_CONTAINER()
{
{
auto_ptr
<
ZONE_CONTAINER
>
zc
(
new
ZONE_CONTAINER
(
m_board
)
);
auto_ptr
<
ZONE_CONTAINER
>
zc
(
new
ZONE_CONTAINER
(
m_board
)
);
int
outline_hatch
=
CPolyLine
::
NO_HATCH
;
CPolyLine
::
HATCH_STYLE
outline_hatch
=
CPolyLine
::
NO_HATCH
;
bool
sawCorner
=
false
;
bool
sawCorner
=
false
;
char
buf
[
1024
];
char
buf
[
1024
];
...
@@ -2133,7 +2133,7 @@ void LEGACY_PLUGIN::loadZONE_CONTAINER()
...
@@ -2133,7 +2133,7 @@ void LEGACY_PLUGIN::loadZONE_CONTAINER()
sawCorner
=
true
;
sawCorner
=
true
;
if
(
flag
)
if
(
flag
)
zc
->
m_Poly
->
Close
();
zc
->
m_Poly
->
Close
LastContour
();
}
}
else
if
(
TESTLINE
(
"ZInfo"
)
)
// general info found
else
if
(
TESTLINE
(
"ZInfo"
)
)
// general info found
...
@@ -2350,9 +2350,11 @@ void LEGACY_PLUGIN::loadZONE_CONTAINER()
...
@@ -2350,9 +2350,11 @@ void LEGACY_PLUGIN::loadZONE_CONTAINER()
zc
->
SetNet
(
0
);
zc
->
SetNet
(
0
);
}
}
// Hatch here, after outlines corners are read
// Set hatch here, after outlines corners are read
// Set hatch here, after outlines corners are read
zc
->
m_Poly
->
SetHatch
(
outline_hatch
,
zc
->
m_Poly
->
SetHatch
(
outline_hatch
,
Mils2iu
(
zc
->
m_Poly
->
GetDefaultHatchPitchMils
()
)
);
Mils2iu
(
CPolyLine
::
GetDefaultHatchPitchMils
()
),
true
);
m_board
->
Add
(
zc
.
release
()
);
m_board
->
Add
(
zc
.
release
()
);
}
}
...
...
pcbnew/pcb_parser.cpp
View file @
f96d557e
...
@@ -2292,8 +2292,8 @@ ZONE_CONTAINER* PCB_PARSER::parseZONE_CONTAINER() throw( IO_ERROR, PARSE_ERROR )
...
@@ -2292,8 +2292,8 @@ ZONE_CONTAINER* PCB_PARSER::parseZONE_CONTAINER() throw( IO_ERROR, PARSE_ERROR )
wxT
(
"Cannot parse "
)
+
GetTokenString
(
CurTok
()
)
+
wxT
(
"Cannot parse "
)
+
GetTokenString
(
CurTok
()
)
+
wxT
(
" as ZONE_CONTAINER."
)
);
wxT
(
" as ZONE_CONTAINER."
)
);
int
hatchStyle
=
CPolyLine
::
NO_HATCH
;
// Fix compile warning
CPolyLine
::
HATCH_STYLE
hatchStyle
=
CPolyLine
::
NO_HATCH
;
int
hatchPitch
=
0
;
// Fix compile warning
int
hatchPitch
=
Mils2iu
(
CPolyLine
::
GetDefaultHatchPitchMils
()
);
wxPoint
pt
;
wxPoint
pt
;
T
token
;
T
token
;
...
@@ -2587,7 +2587,7 @@ ZONE_CONTAINER* PCB_PARSER::parseZONE_CONTAINER() throw( IO_ERROR, PARSE_ERROR )
...
@@ -2587,7 +2587,7 @@ ZONE_CONTAINER* PCB_PARSER::parseZONE_CONTAINER() throw( IO_ERROR, PARSE_ERROR )
}
}
// Set hatch here, after outlines corners are read
// Set hatch here, after outlines corners are read
zone
->
m_Poly
->
SetHatch
(
hatchStyle
,
hatchPitch
);
zone
->
m_Poly
->
SetHatch
(
hatchStyle
,
hatchPitch
,
true
);
}
}
if
(
pts
.
size
()
)
if
(
pts
.
size
()
)
...
...
pcbnew/zones_by_polygon.cpp
View file @
f96d557e
...
@@ -679,8 +679,12 @@ int PCB_EDIT_FRAME::Begin_Zone( wxDC* DC )
...
@@ -679,8 +679,12 @@ int PCB_EDIT_FRAME::Begin_Zone( wxDC* DC )
if
(
!
Drc_On
||
!
zone
->
IsOnCopperLayer
()
||
(
m_drc
->
Drc
(
zone
,
ii
-
1
)
==
OK_DRC
)
)
if
(
!
Drc_On
||
!
zone
->
IsOnCopperLayer
()
||
(
m_drc
->
Drc
(
zone
,
ii
-
1
)
==
OK_DRC
)
)
{
{
// Ok, we can add a new corner
// Ok, we can add a new corner
if
(
m_canvas
->
IsMouseCaptured
()
)
m_canvas
->
CallMouseCapture
(
DC
,
wxPoint
(
0
,
0
),
false
);
zone
->
AppendCorner
(
GetScreen
()
->
GetCrossHairPosition
()
);
zone
->
AppendCorner
(
GetScreen
()
->
GetCrossHairPosition
()
);
SetCurItem
(
zone
);
// calls DisplayInfo().
SetCurItem
(
zone
);
// calls DisplayInfo().
if
(
m_canvas
->
IsMouseCaptured
()
)
m_canvas
->
CallMouseCapture
(
DC
,
wxPoint
(
0
,
0
),
false
);
}
}
}
}
}
}
...
@@ -738,7 +742,7 @@ bool PCB_EDIT_FRAME::End_Zone( wxDC* DC )
...
@@ -738,7 +742,7 @@ bool PCB_EDIT_FRAME::End_Zone( wxDC* DC )
// Put new zone in list
// Put new zone in list
if
(
!
s_CurrentZone
)
if
(
!
s_CurrentZone
)
{
{
zone
->
m_Poly
->
Close
();
// Close the current corner list
zone
->
m_Poly
->
Close
LastContour
();
// Close the current corner list
GetBoard
()
->
Add
(
zone
);
GetBoard
()
->
Add
(
zone
);
GetBoard
()
->
m_CurrentZoneContour
=
NULL
;
GetBoard
()
->
m_CurrentZoneContour
=
NULL
;
...
@@ -753,7 +757,7 @@ bool PCB_EDIT_FRAME::End_Zone( wxDC* DC )
...
@@ -753,7 +757,7 @@ bool PCB_EDIT_FRAME::End_Zone( wxDC* DC )
s_CurrentZone
->
AppendCorner
(
zone
->
GetCornerPosition
(
ii
)
);
s_CurrentZone
->
AppendCorner
(
zone
->
GetCornerPosition
(
ii
)
);
}
}
s_CurrentZone
->
m_Poly
->
Close
();
// Close the current corner list
s_CurrentZone
->
m_Poly
->
Close
LastContour
();
// Close the current corner list
zone
->
RemoveAllContours
();
// All corners are copied in s_CurrentZone. Free corner list.
zone
->
RemoveAllContours
();
// All corners are copied in s_CurrentZone. Free corner list.
zone
=
s_CurrentZone
;
zone
=
s_CurrentZone
;
}
}
...
...
pcbnew/zones_test_and_combine_areas.cpp
View file @
f96d557e
...
@@ -41,6 +41,7 @@
...
@@ -41,6 +41,7 @@
#include <pcbnew.h>
#include <pcbnew.h>
#include <drc_stuff.h>
#include <drc_stuff.h>
#include <math_for_graphics.h>
static
bool
bDontShowSelfIntersectionArcsWarning
;
static
bool
bDontShowSelfIntersectionArcsWarning
;
...
@@ -311,19 +312,15 @@ int BOARD::ClipAreaPolygon( PICKED_ITEMS_LIST * aNewZonesList,
...
@@ -311,19 +312,15 @@ int BOARD::ClipAreaPolygon( PICKED_ITEMS_LIST * aNewZonesList,
str
+=
wxT
(
"This may result in splitting the area.
\n
"
);
str
+=
wxT
(
"This may result in splitting the area.
\n
"
);
str
+=
wxT
(
"If the area is complex, this may take a few seconds."
);
str
+=
wxT
(
"If the area is complex, this may take a few seconds."
);
wxMessageBox
(
str
);
wxMessageBox
(
str
);
// bDontShowSelfIntersectionWarning = dlg.bDontShowBoxState;
}
}
}
}
//** TODO test for cutouts outside of area
//** if( test == 1 )
{
{
std
::
vector
<
CPolyLine
*>*
pa
=
new
std
::
vector
<
CPolyLine
*>
;
std
::
vector
<
CPolyLine
*>*
pa
=
new
std
::
vector
<
CPolyLine
*>
;
curr_polygon
->
UnHatch
();
curr_polygon
->
UnHatch
();
int
n_poly
=
aCurrArea
->
m_Poly
->
NormalizeAreaOutlines
(
pa
,
bRetainArcs
);
int
n_poly
=
aCurrArea
->
m_Poly
->
NormalizeAreaOutlines
(
pa
,
bRetainArcs
);
//
i.e i
f clipping has created some polygons, we must add these new copper areas.
//
I
f clipping has created some polygons, we must add these new copper areas.
if
(
n_poly
>
1
)
if
(
n_poly
>
1
)
{
{
ZONE_CONTAINER
*
NewArea
;
ZONE_CONTAINER
*
NewArea
;
...
@@ -803,10 +800,10 @@ int BOARD::CombineAreas( PICKED_ITEMS_LIST* aDeletedList, ZONE_CONTAINER* area_r
...
@@ -803,10 +800,10 @@ int BOARD::CombineAreas( PICKED_ITEMS_LIST* aDeletedList, ZONE_CONTAINER* area_r
}
}
// polygons intersect, combine them
// polygons intersect, combine them
// std::vector<CArc> arc_array1;
// TODO: test here if areas intersect and combine only if so
// std::vector<CArc> arc_array2;
bool
keep_area_to_combine
=
false
;
// TODO test if areas intersect
#if 0
// do not set to 1 (not fully working): only for me (JP. Charras) until this code is finished
KI_POLYGON_WITH_HOLES areaRefPoly;
KI_POLYGON_WITH_HOLES areaRefPoly;
KI_POLYGON_WITH_HOLES areaToMergePoly;
KI_POLYGON_WITH_HOLES areaToMergePoly;
CopyPolysListToKiPolygonWithHole( area_ref->m_Poly->m_CornersList, areaRefPoly );
CopyPolysListToKiPolygonWithHole( area_ref->m_Poly->m_CornersList, areaRefPoly );
...
@@ -814,14 +811,12 @@ int BOARD::CombineAreas( PICKED_ITEMS_LIST* aDeletedList, ZONE_CONTAINER* area_r
...
@@ -814,14 +811,12 @@ int BOARD::CombineAreas( PICKED_ITEMS_LIST* aDeletedList, ZONE_CONTAINER* area_r
KI_POLYGON_WITH_HOLES_SET mergedOutlines;
KI_POLYGON_WITH_HOLES_SET mergedOutlines;
mergedOutlines.push_back( areaRefPoly );
mergedOutlines.push_back( areaRefPoly );
mergedOutlines
+
=
areaToMergePoly
;
mergedOutlines
|
= areaToMergePoly;
// We should have only one polygon with holes in mergedOutlines
// We can have more than one polygon with holes in mergedOutlines
// or the 2 initial outlines do not intersect
// depending on the complexity of outlines
if
(
mergedOutlines
.
size
()
>
1
)
return
0
;
areaRefPoly
=
mergedOutlines
[
0
];
areaRefPoly = mergedOutlines[0];
// TODO: read and create all created polygons
area_ref->m_Poly->RemoveAllContours();
area_ref->m_Poly->RemoveAllContours();
KI_POLYGON_WITH_HOLES::iterator_type corner = areaRefPoly.begin();
KI_POLYGON_WITH_HOLES::iterator_type corner = areaRefPoly.begin();
...
@@ -833,7 +828,7 @@ int BOARD::CombineAreas( PICKED_ITEMS_LIST* aDeletedList, ZONE_CONTAINER* area_r
...
@@ -833,7 +828,7 @@ int BOARD::CombineAreas( PICKED_ITEMS_LIST* aDeletedList, ZONE_CONTAINER* area_r
area_ref->m_Poly->AppendCorner( corner->x(), corner->y() );
area_ref->m_Poly->AppendCorner( corner->x(), corner->y() );
}
}
area_ref
->
m_Poly
->
Close
();
area_ref->m_Poly->Close
LastContour
();
// add holes (set of polygons)
// add holes (set of polygons)
KI_POLYGON_WITH_HOLES::iterator_holes_type hole = areaRefPoly.begin_holes();
KI_POLYGON_WITH_HOLES::iterator_holes_type hole = areaRefPoly.begin_holes();
...
@@ -846,17 +841,83 @@ int BOARD::CombineAreas( PICKED_ITEMS_LIST* aDeletedList, ZONE_CONTAINER* area_r
...
@@ -846,17 +841,83 @@ int BOARD::CombineAreas( PICKED_ITEMS_LIST* aDeletedList, ZONE_CONTAINER* area_r
area_ref->m_Poly->AppendCorner( hole_corner->x(), hole_corner->y() );
area_ref->m_Poly->AppendCorner( hole_corner->x(), hole_corner->y() );
hole_corner++;
hole_corner++;
}
}
area_ref
->
m_Poly
->
Close
();
area_ref->m_Poly->Close
LastContour
();
hole++;
hole++;
}
}
#else
void
armBoolEng
(
Bool_Engine
*
aBooleng
,
bool
aConvertHoles
=
false
);
Bool_Engine
*
booleng
=
new
Bool_Engine
();
armBoolEng
(
booleng
);
area_ref
->
m_Poly
->
AddPolygonsToBoolEng
(
booleng
,
GROUP_A
);
area_to_combine
->
m_Poly
->
AddPolygonsToBoolEng
(
booleng
,
GROUP_B
);
booleng
->
Do_Operation
(
BOOL_OR
);
// create area with external contour: Recreate only area edges, NOT holes
if
(
booleng
->
StartPolygonGet
()
)
{
if
(
booleng
->
GetPolygonPointEdgeType
()
==
KB_INSIDE_EDGE
)
{
DisplayError
(
NULL
,
wxT
(
"BOARD::CombineAreas() error: unexpected hole descriptor"
)
);
}
area_ref
->
m_Poly
->
RemoveAllContours
();
// foreach point in the polygon
bool
first
=
true
;
while
(
booleng
->
PolygonHasMorePoints
()
)
{
int
x
=
(
int
)
booleng
->
GetPolygonXPoint
();
int
y
=
(
int
)
booleng
->
GetPolygonYPoint
();
if
(
first
)
{
first
=
false
;
area_ref
->
m_Poly
->
Start
(
area_ref
->
GetLayer
(
),
x
,
y
,
area_ref
->
m_Poly
->
GetHatchStyle
()
);
}
else
{
area_ref
->
m_Poly
->
AppendCorner
(
x
,
y
);
}
}
booleng
->
EndPolygonGet
();
area_ref
->
m_Poly
->
CloseLastContour
();
}
// add holes
bool
show_error
=
true
;
while
(
booleng
->
StartPolygonGet
()
)
{
// we expect all vertex are holes inside the main outline
if
(
booleng
->
GetPolygonPointEdgeType
()
!=
KB_INSIDE_EDGE
)
{
if
(
show_error
)
// show this error only once, if happens
DisplayError
(
NULL
,
wxT
(
"BOARD::CombineAreas() error: unexpected outside contour descriptor"
)
);
show_error
=
false
;
continue
;
}
while
(
booleng
->
PolygonHasMorePoints
()
)
{
int
x
=
(
int
)
booleng
->
GetPolygonXPoint
();
int
y
=
(
int
)
booleng
->
GetPolygonYPoint
();
area_ref
->
m_Poly
->
AppendCorner
(
x
,
y
);
}
area_ref
->
m_Poly
->
CloseLastContour
();
booleng
->
EndPolygonGet
();
}
#endif
if
(
!
keep_area_to_combine
)
RemoveArea
(
aDeletedList
,
area_to_combine
);
RemoveArea
(
aDeletedList
,
area_to_combine
);
area_ref
->
utility
=
1
;
area_ref
->
utility
=
1
;
// area_ref->m_Poly->RestoreArcs( &arc_array1 );
// area_ref->m_Poly->RestoreArcs( &arc_array2 );
area_ref
->
m_Poly
->
Hatch
();
area_ref
->
m_Poly
->
Hatch
();
return
1
;
return
1
;
...
@@ -917,6 +978,11 @@ int BOARD::Test_Drc_Areas_Outlines_To_Areas_Outlines( ZONE_CONTAINER* aArea_To_E
...
@@ -917,6 +978,11 @@ int BOARD::Test_Drc_Areas_Outlines_To_Areas_Outlines( ZONE_CONTAINER* aArea_To_E
// ZONE_CONTAINER::GetClearance().
// ZONE_CONTAINER::GetClearance().
int
zone2zoneClearance
=
Area_Ref
->
GetClearance
(
area_to_test
);
int
zone2zoneClearance
=
Area_Ref
->
GetClearance
(
area_to_test
);
// Keepout areas have no clearance, so set zone2zoneClearance to 1
// ( zone2zoneClearance = 0 can create problems in test functions)
if
(
Area_Ref
->
GetIsKeepout
()
)
zone2zoneClearance
=
1
;
// test for some corners of Area_Ref inside area_to_test
// test for some corners of Area_Ref inside area_to_test
for
(
int
ic
=
0
;
ic
<
refSmoothedPoly
->
GetNumCorners
();
ic
++
)
for
(
int
ic
=
0
;
ic
<
refSmoothedPoly
->
GetNumCorners
();
ic
++
)
{
{
...
@@ -1114,6 +1180,11 @@ bool DRC::doEdgeZoneDrc( ZONE_CONTAINER* aArea, int aCornerIndex )
...
@@ -1114,6 +1180,11 @@ bool DRC::doEdgeZoneDrc( ZONE_CONTAINER* aArea, int aCornerIndex )
if
(
area_to_test
->
GetIsKeepout
()
!=
aArea
->
GetIsKeepout
()
)
if
(
area_to_test
->
GetIsKeepout
()
!=
aArea
->
GetIsKeepout
()
)
continue
;
continue
;
// For keepout, there is no clearance, so use a minimal value for it
// use 1, not 0 as value to avoid some issues in tests
if
(
area_to_test
->
GetIsKeepout
()
)
zone_clearance
=
1
;
// test for ending line inside area_to_test
// test for ending line inside area_to_test
if
(
area_to_test
->
m_Poly
->
TestPointInside
(
end
.
x
,
end
.
y
)
)
if
(
area_to_test
->
m_Poly
->
TestPointInside
(
end
.
x
,
end
.
y
)
)
{
{
...
@@ -1159,7 +1230,7 @@ bool DRC::doEdgeZoneDrc( ZONE_CONTAINER* aArea, int aCornerIndex )
...
@@ -1159,7 +1230,7 @@ bool DRC::doEdgeZoneDrc( ZONE_CONTAINER* aArea, int aCornerIndex )
0
,
0
,
ax1
,
ay1
,
ax2
,
ay2
,
astyle
,
ax1
,
ay1
,
ax2
,
ay2
,
astyle
,
0
,
0
,
0
,
zone_clearance
,
&
x
,
&
y
);
&
x
,
&
y
);
if
(
d
<
zone_clearance
)
if
(
d
<
zone_clearance
)
...
...
polygon/PolyLine.cpp
View file @
f96d557e
...
@@ -13,11 +13,13 @@
...
@@ -13,11 +13,13 @@
#include <PolyLine.h>
#include <PolyLine.h>
#include <bezier_curves.h>
#include <bezier_curves.h>
#include <polygon_test_point_inside.h>
#include <polygon_test_point_inside.h>
#include <math_for_graphics.h>
CPolyLine
::
CPolyLine
()
CPolyLine
::
CPolyLine
()
{
{
m_hatchStyle
=
NO_HATCH
;
m_hatchStyle
=
NO_HATCH
;
m_hatchPitch
=
0
;
m_hatchPitch
=
0
;
m_layer
=
0
;
m_width
=
0
;
m_width
=
0
;
m_utility
=
0
;
m_utility
=
0
;
m_Kbool_Poly_Engine
=
NULL
;
m_Kbool_Poly_Engine
=
NULL
;
...
@@ -44,7 +46,7 @@ CPolyLine::~CPolyLine()
...
@@ -44,7 +46,7 @@ CPolyLine::~CPolyLine()
* false: holes are not linked: in this mode contours are added clockwise
* false: holes are not linked: in this mode contours are added clockwise
* and polygons added counter clockwise are holes (default)
* and polygons added counter clockwise are holes (default)
*/
*/
static
void
armBoolEng
(
Bool_Engine
*
aBooleng
,
bool
aConvertHoles
=
false
);
void
armBoolEng
(
Bool_Engine
*
aBooleng
,
bool
aConvertHoles
=
false
);
/**
/**
* Function NormalizeWithKbool
* Function NormalizeWithKbool
...
@@ -128,12 +130,15 @@ int CPolyLine::NormalizeWithKbool( std::vector<CPolyLine*>* aExtraPolyList, bool
...
@@ -128,12 +130,15 @@ int CPolyLine::NormalizeWithKbool( std::vector<CPolyLine*>* aExtraPolyList, bool
}
}
m_Kbool_Poly_Engine
->
EndPolygonGet
();
m_Kbool_Poly_Engine
->
EndPolygonGet
();
Close
();
Close
LastContour
();
n_ext_cont
++
;
n_ext_cont
++
;
}
}
else
if
(
aExtraPolyList
)
// a new outside contour is found: create a new CPolyLine
else
if
(
aExtraPolyList
)
// a new outside contour is found: create a new CPolyLine
{
{
polyline
=
new
CPolyLine
;
// create new poly
polyline
=
new
CPolyLine
;
polyline
->
SetLayer
(
GetLayer
()
);
polyline
->
SetHatchStyle
(
GetHatchStyle
()
);
polyline
->
SetHatchPitch
(
GetHatchPitch
()
);
aExtraPolyList
->
push_back
(
polyline
);
// put it in array
aExtraPolyList
->
push_back
(
polyline
);
// put it in array
bool
first
=
true
;
bool
first
=
true
;
...
@@ -152,7 +157,7 @@ int CPolyLine::NormalizeWithKbool( std::vector<CPolyLine*>* aExtraPolyList, bool
...
@@ -152,7 +157,7 @@ int CPolyLine::NormalizeWithKbool( std::vector<CPolyLine*>* aExtraPolyList, bool
}
}
m_Kbool_Poly_Engine
->
EndPolygonGet
();
m_Kbool_Poly_Engine
->
EndPolygonGet
();
polyline
->
Close
(
STRAIGHT
,
false
);
polyline
->
Close
LastContour
(
);
n_ext_cont
++
;
n_ext_cont
++
;
}
}
}
}
...
@@ -201,7 +206,7 @@ int CPolyLine::NormalizeWithKbool( std::vector<CPolyLine*>* aExtraPolyList, bool
...
@@ -201,7 +206,7 @@ int CPolyLine::NormalizeWithKbool( std::vector<CPolyLine*>* aExtraPolyList, bool
polyline
->
AppendCorner
(
x
,
y
,
STRAIGHT
,
false
);
polyline
->
AppendCorner
(
x
,
y
,
STRAIGHT
,
false
);
}
}
polyline
->
Close
(
STRAIGHT
,
false
);
polyline
->
Close
LastContour
(
);
}
}
}
}
...
@@ -219,6 +224,42 @@ int CPolyLine::NormalizeWithKbool( std::vector<CPolyLine*>* aExtraPolyList, bool
...
@@ -219,6 +224,42 @@ int CPolyLine::NormalizeWithKbool( std::vector<CPolyLine*>* aExtraPolyList, bool
}
}
/**
* Function AddPolygonsToBoolEng
* Add a CPolyLine to a kbool engine, preparing a boolean op between polygons
* @param aBooleng : pointer on a bool engine (handle a set of polygons)
* @param aGroup : group to fill (aGroup = GROUP_A or GROUP_B) operations are made between GROUP_A and GROUP_B
*/
int
CPolyLine
::
AddPolygonsToBoolEng
(
Bool_Engine
*
aBooleng
,
GroupType
aGroup
)
{
int
count
=
0
;
/* Convert the current polyline contour to a kbool polygon: */
MakeKboolPoly
();
/* add the resulting kbool set of polygons to the current kcool engine */
while
(
m_Kbool_Poly_Engine
->
StartPolygonGet
()
)
{
if
(
aBooleng
->
StartPolygonAdd
(
GROUP_A
)
)
{
while
(
m_Kbool_Poly_Engine
->
PolygonHasMorePoints
()
)
{
int
x
=
(
int
)
m_Kbool_Poly_Engine
->
GetPolygonXPoint
();
int
y
=
(
int
)
m_Kbool_Poly_Engine
->
GetPolygonYPoint
();
aBooleng
->
AddPoint
(
x
,
y
);
count
++
;
}
aBooleng
->
EndPolygonAdd
();
}
m_Kbool_Poly_Engine
->
EndPolygonGet
();
}
delete
m_Kbool_Poly_Engine
;
m_Kbool_Poly_Engine
=
NULL
;
return
count
;
}
/**
/**
* Function MakeKboolPoly
* Function MakeKboolPoly
* fill a kbool engine with a closed polyline contour
* fill a kbool engine with a closed polyline contour
...
@@ -247,13 +288,32 @@ int CPolyLine::MakeKboolPoly( std::vector<CArc>* arc_array )
...
@@ -247,13 +288,32 @@ int CPolyLine::MakeKboolPoly( std::vector<CArc>* arc_array )
int
iarc
=
0
;
int
iarc
=
0
;
for
(
int
icont
=
0
;
icont
<=
last_contour
;
icont
++
)
for
(
int
icont
=
0
;
icont
<=
last_contour
;
icont
++
)
{
{
// Fill a kbool engine for this contour,
// Fill a kbool engine for this contour,
// and combine it with previous contours
// and combine it with previous contours
Bool_Engine
*
booleng
=
new
Bool_Engine
();
Bool_Engine
*
booleng
=
new
Bool_Engine
();
armBoolEng
(
booleng
,
false
);
armBoolEng
(
booleng
,
false
);
if
(
m_Kbool_Poly_Engine
)
// a previous contour exists. Put it in new engine
{
while
(
m_Kbool_Poly_Engine
->
StartPolygonGet
()
)
{
if
(
booleng
->
StartPolygonAdd
(
GROUP_A
)
)
{
while
(
m_Kbool_Poly_Engine
->
PolygonHasMorePoints
()
)
{
int
x
=
(
int
)
m_Kbool_Poly_Engine
->
GetPolygonXPoint
();
int
y
=
(
int
)
m_Kbool_Poly_Engine
->
GetPolygonYPoint
();
booleng
->
AddPoint
(
x
,
y
);
}
booleng
->
EndPolygonAdd
();
}
m_Kbool_Poly_Engine
->
EndPolygonGet
();
}
}
// first, calculate number of vertices in contour
// first, calculate number of vertices in contour
int
n_vertices
=
0
;
int
n_vertices
=
0
;
int
ic_st
=
GetContourStart
(
icont
);
int
ic_st
=
GetContourStart
(
icont
);
...
@@ -735,7 +795,7 @@ int CPolyLine::RestoreArcs( std::vector<CArc>* arc_array, std::vector<CPolyLine*
...
@@ -735,7 +795,7 @@ int CPolyLine::RestoreArcs( std::vector<CArc>* arc_array, std::vector<CPolyLine*
void
CPolyLine
::
Start
(
int
layer
,
int
x
,
int
y
,
int
hatch
)
void
CPolyLine
::
Start
(
int
layer
,
int
x
,
int
y
,
int
hatch
)
{
{
m_layer
=
layer
;
m_layer
=
layer
;
SetHatchStyle
(
(
enum
hatch_style
)
hatch
);
SetHatchStyle
(
(
enum
HATCH_STYLE
)
hatch
);
CPolyPt
poly_pt
(
x
,
y
);
CPolyPt
poly_pt
(
x
,
y
);
poly_pt
.
end_contour
=
false
;
poly_pt
.
end_contour
=
false
;
...
@@ -766,19 +826,9 @@ void CPolyLine::AppendCorner( int x, int y, int style, bool bDraw )
...
@@ -766,19 +826,9 @@ void CPolyLine::AppendCorner( int x, int y, int style, bool bDraw )
// close last polyline contour
// close last polyline contour
//
//
void
CPolyLine
::
Close
(
int
style
,
bool
bDraw
)
void
CPolyLine
::
Close
LastContour
(
)
{
{
if
(
GetClosed
()
)
{
wxASSERT
(
0
);
}
UnHatch
();
m_SideStyle
[
m_CornersList
.
size
()
-
1
]
=
style
;
m_CornersList
[
m_CornersList
.
size
()
-
1
].
end_contour
=
true
;
m_CornersList
[
m_CornersList
.
size
()
-
1
].
end_contour
=
true
;
if
(
bDraw
)
Hatch
();
}
}
...
@@ -944,7 +994,7 @@ CPolyLine* CPolyLine::Chamfer( unsigned int aDistance )
...
@@ -944,7 +994,7 @@ CPolyLine* CPolyLine::Chamfer( unsigned int aDistance )
newPoly
->
AppendCorner
(
x1
+
nx
,
y1
+
ny
);
newPoly
->
AppendCorner
(
x1
+
nx
,
y1
+
ny
);
}
}
newPoly
->
Close
();
newPoly
->
Close
LastContour
();
}
}
return
newPoly
;
return
newPoly
;
...
@@ -1072,7 +1122,7 @@ CPolyLine* CPolyLine::Fillet( unsigned int aRadius, unsigned int aSegments )
...
@@ -1072,7 +1122,7 @@ CPolyLine* CPolyLine::Fillet( unsigned int aRadius, unsigned int aSegments )
}
}
}
}
newPoly
->
Close
();
newPoly
->
Close
LastContour
();
}
}
return
newPoly
;
return
newPoly
;
...
@@ -1632,11 +1682,13 @@ void CPolyLine::SetEndContour( int ic, bool end_contour )
...
@@ -1632,11 +1682,13 @@ void CPolyLine::SetEndContour( int ic, bool end_contour )
m_CornersList
[
ic
].
end_contour
=
end_contour
;
m_CornersList
[
ic
].
end_contour
=
end_contour
;
}
}
/*
* AppendArc adds segments to current contour to approximate the given arc
*/
void
CPolyLine
::
AppendArc
(
int
xi
,
int
yi
,
int
xf
,
int
yf
,
int
xc
,
int
yc
,
int
num
)
void
CPolyLine
::
AppendArc
(
int
xi
,
int
yi
,
int
xf
,
int
yf
,
int
xc
,
int
yc
,
int
num
)
{
{
// get radius
// get radius
double
r
=
sqrt
(
(
double
)
(
xi
-
xc
)
*
(
xi
-
xc
)
+
(
double
)
(
yi
-
yc
)
*
(
yi
-
yc
)
);
double
r
adius
=
hypot
(
(
double
)
(
xi
-
xc
),
(
double
)
(
yi
-
yc
)
);
// get angles of start and finish
// get angles of start and finish
double
th_i
=
atan2
(
(
double
)
(
yi
-
yc
),
(
double
)
(
xi
-
xc
)
);
double
th_i
=
atan2
(
(
double
)
(
yi
-
yc
),
(
double
)
(
xi
-
xc
)
);
...
@@ -1645,15 +1697,15 @@ void CPolyLine::AppendArc( int xi, int yi, int xf, int yf, int xc, int yc, int n
...
@@ -1645,15 +1697,15 @@ void CPolyLine::AppendArc( int xi, int yi, int xf, int yf, int xc, int yc, int n
double
theta
=
th_i
;
double
theta
=
th_i
;
// generate arc
// generate arc
for
(
int
ic
=
0
;
ic
<
num
;
ic
++
)
for
(
int
ic
=
0
;
ic
<
num
;
ic
++
)
{
{
int
x
=
KiROUND
(
xc
+
r
*
cos
(
theta
)
);
int
x
=
KiROUND
(
xc
+
r
adius
*
cos
(
theta
)
);
int
y
=
KiROUND
(
yc
+
r
*
sin
(
theta
)
);
int
y
=
KiROUND
(
yc
+
r
adius
*
sin
(
theta
)
);
AppendCorner
(
x
,
y
,
STRAIGHT
,
0
);
AppendCorner
(
x
,
y
,
STRAIGHT
,
0
);
theta
+=
th_d
;
theta
+=
th_d
;
}
}
Close
(
STRAIGHT
);
Close
LastContour
(
);
}
}
...
...
polygon/PolyLine.h
View file @
f96d557e
...
@@ -58,9 +58,6 @@ public:
...
@@ -58,9 +58,6 @@ public:
}
}
};
};
#include <math_for_graphics.h>
class
CArc
class
CArc
{
{
public
:
public
:
...
@@ -107,7 +104,7 @@ class CPolyLine
...
@@ -107,7 +104,7 @@ class CPolyLine
{
{
public
:
public
:
enum
m_SideStyle
{
STRAIGHT
,
ARC_CW
,
ARC_CCW
};
// side styles
enum
m_SideStyle
{
STRAIGHT
,
ARC_CW
,
ARC_CCW
};
// side styles
enum
hatch_style
{
NO_HATCH
,
DIAGONAL_FULL
,
DIAGONAL_EDGE
};
// hatch styles
enum
HATCH_STYLE
{
NO_HATCH
,
DIAGONAL_FULL
,
DIAGONAL_EDGE
};
// hatch styles
// constructors/destructor
// constructors/destructor
CPolyLine
();
CPolyLine
();
...
@@ -119,7 +116,7 @@ public:
...
@@ -119,7 +116,7 @@ public:
void
InsertCorner
(
int
ic
,
int
x
,
int
y
);
void
InsertCorner
(
int
ic
,
int
x
,
int
y
);
void
DeleteCorner
(
int
ic
,
bool
bDraw
=
false
);
void
DeleteCorner
(
int
ic
,
bool
bDraw
=
false
);
void
MoveCorner
(
int
ic
,
int
x
,
int
y
);
void
MoveCorner
(
int
ic
,
int
x
,
int
y
);
void
Close
(
int
style
=
STRAIGHT
,
bool
bDraw
=
false
);
void
Close
LastContour
(
);
void
RemoveContour
(
int
icont
);
void
RemoveContour
(
int
icont
);
/**
/**
...
@@ -155,6 +152,11 @@ public:
...
@@ -155,6 +152,11 @@ public:
void
Copy
(
CPolyLine
*
src
);
void
Copy
(
CPolyLine
*
src
);
bool
TestPointInside
(
int
x
,
int
y
);
bool
TestPointInside
(
int
x
,
int
y
);
bool
IsCutoutContour
(
int
icont
);
bool
IsCutoutContour
(
int
icont
);
/**
* Function AppendArc.
* Adds segments to current contour to approximate the given arc
*/
void
AppendArc
(
int
xi
,
int
yi
,
int
xf
,
int
yf
,
int
xc
,
int
yc
,
int
num
);
void
AppendArc
(
int
xi
,
int
yi
,
int
xf
,
int
yf
,
int
xc
,
int
yc
,
int
num
);
// access functions
// access functions
...
@@ -181,13 +183,14 @@ public:
...
@@ -181,13 +183,14 @@ public:
int
GetSideStyle
(
int
is
);
int
GetSideStyle
(
int
is
);
int
GetHatchPitch
()
{
return
m_hatchPitch
;
}
int
GetHatchPitch
()
{
return
m_hatchPitch
;
}
int
GetDefaultHatchPitchMils
()
{
return
20
;
}
// default hatch pitch value in mils
static
int
GetDefaultHatchPitchMils
()
{
return
20
;
}
// default hatch pitch value in mils
enum
hatch_style
GetHatchStyle
()
{
return
m_hatchStyle
;
}
enum
HATCH_STYLE
GetHatchStyle
()
{
return
m_hatchStyle
;
}
void
SetHatch
(
int
hatch
,
int
pi
tch
)
void
SetHatch
(
int
aHatchStyle
,
int
aHatchPitch
,
bool
aRebuildHa
tch
)
{
{
SetHatchPitch
(
pitch
);
SetHatchPitch
(
aHatchPitch
);
m_hatchStyle
=
(
enum
hatch_style
)
hatch
;
m_hatchStyle
=
(
enum
HATCH_STYLE
)
aHatchStyle
;
if
(
aRebuildHatch
)
Hatch
();
Hatch
();
}
}
...
@@ -196,7 +199,7 @@ public:
...
@@ -196,7 +199,7 @@ public:
void
SetEndContour
(
int
ic
,
bool
end_contour
);
void
SetEndContour
(
int
ic
,
bool
end_contour
);
void
SetSideStyle
(
int
is
,
int
style
);
void
SetSideStyle
(
int
is
,
int
style
);
void
SetHatchStyle
(
enum
hatch_style
style
)
void
SetHatchStyle
(
enum
HATCH_STYLE
style
)
{
{
m_hatchStyle
=
style
;
m_hatchStyle
=
style
;
}
}
...
@@ -210,6 +213,14 @@ public:
...
@@ -210,6 +213,14 @@ public:
// KBOOL functions
// KBOOL functions
/**
* Function AddPolygonsToBoolEng
* Add a CPolyLine to a kbool engine, preparing a boolean op between polygons
* @param aBooleng : pointer on a bool engine (handle a set of polygons)
* @param aGroup : group to fill (aGroup = GROUP_A or GROUP_B) operations are made between GROUP_A and GROUP_B
*/
int
AddPolygonsToBoolEng
(
Bool_Engine
*
aBooleng
,
GroupType
aGroup
);
/**
/**
* Function MakeKboolPoly
* Function MakeKboolPoly
* fill a kbool engine with a closed polyline contour
* fill a kbool engine with a closed polyline contour
...
@@ -261,7 +272,7 @@ public:
...
@@ -261,7 +272,7 @@ public:
private
:
private
:
int
m_layer
;
// layer to draw on
int
m_layer
;
// layer to draw on
int
m_width
;
// lines width when drawing. Provided but not really used
int
m_width
;
// lines width when drawing. Provided but not really used
enum
hatch_style
m_hatchStyle
;
// hatch style, see enum above
enum
HATCH_STYLE
m_hatchStyle
;
// hatch style, see enum above
int
m_hatchPitch
;
// for DIAGONAL_EDGE hatched outlines, basic distance between 2 hatch lines
int
m_hatchPitch
;
// for DIAGONAL_EDGE hatched outlines, basic distance between 2 hatch lines
// and the len of eacvh segment
// and the len of eacvh segment
// for DIAGONAL_FULL, the pitch is twice this value
// for DIAGONAL_FULL, the pitch is twice this value
...
...
polygon/math_for_graphics.cpp
View file @
f96d557e
...
@@ -9,9 +9,23 @@
...
@@ -9,9 +9,23 @@
#include <fctsys.h>
#include <fctsys.h>
#include <PolyLine.h>
#include <PolyLine.h>
#include <math_for_graphics.h>
#define NM_PER_MIL 25400
#define NM_PER_MIL 25400
typedef
struct
PointTag
{
double
X
,
Y
;
}
PointT
;
typedef
struct
EllipseTag
{
PointT
Center
;
/* ellipse center */
double
xrad
,
yrad
;
// radii on x and y
double
theta1
,
theta2
;
// start and end angle for arc
}
EllipseKH
;
double
Distance
(
double
x1
,
double
y1
,
double
x2
,
double
y2
)
double
Distance
(
double
x1
,
double
y1
,
double
x2
,
double
y2
)
{
{
double
dx
=
x1
-
x2
;
double
dx
=
x1
-
x2
;
...
@@ -21,6 +35,13 @@ double Distance( double x1, double y1, double x2, double y2 )
...
@@ -21,6 +35,13 @@ double Distance( double x1, double y1, double x2, double y2 )
}
}
static
int
GetArcIntersections
(
EllipseKH
*
el1
,
EllipseKH
*
el2
,
double
*
x1
=
NULL
,
double
*
y1
=
NULL
,
double
*
x2
=
NULL
,
double
*
y2
=
NULL
);
static
bool
InRange
(
double
x
,
double
xi
,
double
xf
);
/**
/**
* Function TestLineHit
* Function TestLineHit
* test for hit on line segment i.e. a point within a given distance from segment
* test for hit on line segment i.e. a point within a given distance from segment
...
@@ -862,26 +883,26 @@ bool FindLineEllipseIntersections( double a, double b, double c, double d, doubl
...
@@ -862,26 +883,26 @@ bool FindLineEllipseIntersections( double a, double b, double c, double d, doubl
// Get clearance between 2 segments
// Get clearance between 2 segments
// Returns point in segment closest to other segment in x, y
// Returns point in segment closest to other segment in x, y
// in clearance > max_cl, just returns max_cl and doesn't return x,y
// in clearance > max_cl, just returns max_cl
+1
and doesn't return x,y
//
//
int
GetClearanceBetweenSegments
(
int
x1i
,
int
y1i
,
int
x1f
,
int
y1f
,
int
style1
,
int
w1
,
int
GetClearanceBetweenSegments
(
int
x1i
,
int
y1i
,
int
x1f
,
int
y1f
,
int
style1
,
int
w1
,
int
x2i
,
int
y2i
,
int
x2f
,
int
y2f
,
int
style2
,
int
w2
,
int
x2i
,
int
y2i
,
int
x2f
,
int
y2f
,
int
style2
,
int
w2
,
int
max_cl
,
int
*
x
,
int
*
y
)
int
max_cl
,
int
*
x
,
int
*
y
)
{
{
// check clearance between bounding rectangles
// check clearance between bounding rectangles
int
test
=
max_cl
+
w1
/
2
+
w2
/
2
;
int
min_dist
=
max_cl
+
(
(
w1
+
w2
)
/
2
)
;
if
(
min
(
x1i
,
x1f
)
-
max
(
x2i
,
x2f
)
>
te
st
)
if
(
min
(
x1i
,
x1f
)
-
max
(
x2i
,
x2f
)
>
min_di
st
)
return
max_cl
;
return
max_cl
+
1
;
if
(
min
(
x2i
,
x2f
)
-
max
(
x1i
,
x1f
)
>
te
st
)
if
(
min
(
x2i
,
x2f
)
-
max
(
x1i
,
x1f
)
>
min_di
st
)
return
max_cl
;
return
max_cl
+
1
;
if
(
min
(
y1i
,
y1f
)
-
max
(
y2i
,
y2f
)
>
te
st
)
if
(
min
(
y1i
,
y1f
)
-
max
(
y2i
,
y2f
)
>
min_di
st
)
return
max_cl
;
return
max_cl
+
1
;
if
(
min
(
y2i
,
y2f
)
-
max
(
y1i
,
y1f
)
>
te
st
)
if
(
min
(
y2i
,
y2f
)
-
max
(
y1i
,
y1f
)
>
min_di
st
)
return
max_cl
;
return
max_cl
+
1
;
if
(
style1
==
CPolyLine
::
STRAIGHT
&&
style1
==
CPolyLine
::
STRAIGHT
)
if
(
style1
==
CPolyLine
::
STRAIGHT
&&
style1
==
CPolyLine
::
STRAIGHT
)
{
{
...
@@ -890,7 +911,9 @@ int GetClearanceBetweenSegments( int x1i, int y1i, int x1f, int y1f, int style1,
...
@@ -890,7 +911,9 @@ int GetClearanceBetweenSegments( int x1i, int y1i, int x1f, int y1f, int style1,
double
dd
;
double
dd
;
TestForIntersectionOfStraightLineSegments
(
x1i
,
y1i
,
x1f
,
y1f
,
TestForIntersectionOfStraightLineSegments
(
x1i
,
y1i
,
x1f
,
y1f
,
x2i
,
y2i
,
x2f
,
y2f
,
&
xx
,
&
yy
,
&
dd
);
x2i
,
y2i
,
x2f
,
y2f
,
&
xx
,
&
yy
,
&
dd
);
int
d
=
max
(
0
,
(
int
)
dd
-
w1
/
2
-
w2
/
2
);
int
d
=
(
int
)
dd
-
(
(
w1
+
w2
)
/
2
);
if
(
d
<
0
)
d
=
0
;
if
(
x
)
if
(
x
)
*
x
=
xx
;
*
x
=
xx
;
...
@@ -905,10 +928,10 @@ int GetClearanceBetweenSegments( int x1i, int y1i, int x1f, int y1f, int style1,
...
@@ -905,10 +928,10 @@ int GetClearanceBetweenSegments( int x1i, int y1i, int x1f, int y1f, int style1,
// see if segments intersect
// see if segments intersect
double
xr
[
2
];
double
xr
[
2
];
double
yr
[
2
];
double
yr
[
2
];
tes
t
=
int
coun
t
=
FindSegmentIntersections
(
x1i
,
y1i
,
x1f
,
y1f
,
style1
,
x2i
,
y2i
,
x2f
,
y2f
,
style2
,
xr
,
yr
);
FindSegmentIntersections
(
x1i
,
y1i
,
x1f
,
y1f
,
style1
,
x2i
,
y2i
,
x2f
,
y2f
,
style2
,
xr
,
yr
);
if
(
tes
t
)
if
(
coun
t
)
{
{
if
(
x
)
if
(
x
)
*
x
=
(
int
)
xr
[
0
];
*
x
=
(
int
)
xr
[
0
];
...
...
polygon/math_for_graphics.h
View file @
f96d557e
// math stuff for graphics, from FreePCB
// math stuff for graphics, from FreePCB
#ifndef abs
#define abs(x) (((x) >=0) ? (x) : (-(x)))
#endif
typedef
struct
PointTag
{
double
X
,
Y
;
}
PointT
;
typedef
struct
EllipseTag
{
PointT
Center
;
/* ellipse center */
double
xrad
,
yrad
;
// radii on x and y
double
theta1
,
theta2
;
// start and end angle for arc
}
EllipseKH
;
// math stuff for graphics
// math stuff for graphics
bool
Quadratic
(
double
a
,
double
b
,
double
c
,
double
*
x1
,
double
*
x2
);
bool
Quadratic
(
double
a
,
double
b
,
double
c
,
double
*
x1
,
double
*
x2
);
...
@@ -70,11 +53,5 @@ int GetClearanceBetweenSegments( int x1i, int y1i, int x1f, int y1f, int style1,
...
@@ -70,11 +53,5 @@ int GetClearanceBetweenSegments( int x1i, int y1i, int x1f, int y1f, int style1,
double
GetPointToLineSegmentDistance
(
int
x
,
int
y
,
int
xi
,
int
yi
,
int
xf
,
int
yf
);
double
GetPointToLineSegmentDistance
(
int
x
,
int
y
,
int
xi
,
int
yi
,
int
xf
,
int
yf
);
double
GetPointToLineDistance
(
double
a
,
double
b
,
int
x
,
int
y
,
double
*
xp
=
NULL
,
double
*
yp
=
NULL
);
double
GetPointToLineDistance
(
double
a
,
double
b
,
int
x
,
int
y
,
double
*
xp
=
NULL
,
double
*
yp
=
NULL
);
bool
InRange
(
double
x
,
double
xi
,
double
xf
);
double
Distance
(
double
x1
,
double
y1
,
double
x2
,
double
y2
);
double
Distance
(
double
x1
,
double
y1
,
double
x2
,
double
y2
);
int
GetArcIntersections
(
EllipseKH
*
el1
,
EllipseKH
*
el2
,
double
*
x1
=
NULL
,
double
*
y1
=
NULL
,
double
*
x2
=
NULL
,
double
*
y2
=
NULL
);
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