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
43ee94b7
Commit
43ee94b7
authored
Oct 19, 2008
by
charras
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
zones in pcbnew: some optimizations
parent
fff34db7
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
77 additions
and
40 deletions
+77
-40
class_pad.h
pcbnew/class_pad.h
+2
-2
class_zone.cpp
pcbnew/class_zone.cpp
+18
-15
dialog_copper_zones.cpp
pcbnew/dialog_copper_zones.cpp
+9
-10
zones.h
pcbnew/zones.h
+1
-0
zones_by_polygon.cpp
pcbnew/zones_by_polygon.cpp
+22
-3
zones_convert_brd_items_to_polygons.cpp
pcbnew/zones_convert_brd_items_to_polygons.cpp
+25
-10
No files found.
pcbnew/class_pad.h
View file @
43ee94b7
...
...
@@ -174,8 +174,8 @@ public:
/**
* Function GetBoundingBox
* returns the bounding box of this
Footprint
* Mainly used to redraw the screen area occuped by the
footprint
* returns the bounding box of this
pad
* Mainly used to redraw the screen area occuped by the
pad
*/
EDA_Rect
GetBoundingBox
();
...
...
pcbnew/class_zone.cpp
View file @
43ee94b7
...
...
@@ -11,6 +11,8 @@
#include "PolyLine.h"
#include "pcbnew.h"
#include "trigo.h"
#include "zones.h"
#include "autorout.h"
/************************/
...
...
@@ -21,18 +23,18 @@ ZONE_CONTAINER::ZONE_CONTAINER( BOARD* parent ) :
BOARD_ITEM
(
parent
,
TYPEZONE_CONTAINER
)
{
m_NetCode
=
-
1
;
// Net number for fast comparisons
m_NetCode
=
-
1
;
// Net number for fast comparisons
m_CornerSelection
=
-
1
;
m_ZoneClearance
=
200
;
// a reasonnable clerance value
m_GridFillValue
=
50
;
// a reasonnable grid used for filling
m_PadOption
=
THERMAL_PAD
;
utility
=
0
;
// flags used in polygon calculations
utility2
=
0
;
// flags used in polygon calculations
m_Poly
=
new
CPolyLine
();
// Outlines
m_ArcToSegmentsCount
=
16
;
// Use 16
segment to convert a circle to a polygon
m_ZoneClearance
=
g_DesignSettings
.
m_ZoneClearence
;
// a reasonnable clerance value
m_GridFillValue
=
g_GridRoutingSize
;
// a reasonnable grid used for filling
m_PadOption
=
g_Zone_Pad_Options
;
utility
=
0
;
// flags used in polygon calculations
utility2
=
0
;
// flags used in polygon calculations
m_Poly
=
new
CPolyLine
();
// Outlines
m_ArcToSegmentsCount
=
g_Zone_Arc_Approximation
;
// Use 16 or 32
segment to convert a circle to a polygon
m_DrawOptions
=
0
;
m_ThermalReliefGapValue
=
200
;
// tickness of the gap in thermal reliefs
m_ThermalReliefCopperBridgeValue
=
200
;
// tickness of the copper bridge in thermal reliefs
m_ThermalReliefGapValue
=
g_ThermalReliefGapValue
;
// tickness of the gap in thermal reliefs
m_ThermalReliefCopperBridgeValue
=
g_ThermalReliefCopperBridgeValue
;
// tickness of the copper bridge in thermal reliefs
}
...
...
@@ -141,7 +143,7 @@ bool ZONE_CONTAINER::Save( FILE* aFile ) const
return
false
;
ret
=
fprintf
(
aFile
,
"ZOptions %d %d %c %d %d
\n
"
,
m_GridFillValue
,
m_ArcToSegmentsCount
,
m_DrawOptions
?
'S'
:
'F'
,
m_ThermalReliefGapValue
,
m_ThermalReliefCopperBridgeValue
);
m_DrawOptions
?
'S'
:
'F'
,
m_ThermalReliefGapValue
,
m_ThermalReliefCopperBridgeValue
);
if
(
ret
<
3
)
return
false
;
...
...
@@ -274,8 +276,8 @@ int ZONE_CONTAINER::ReadDescr( FILE* aFile, int* aLineNum )
}
if
(
strnicmp
(
Line
,
"ZOptions"
,
8
)
==
0
)
// Options info found
{
int
gridsize
=
50
;
int
arcsegmentcount
=
16
;
int
gridsize
=
50
;
int
arcsegmentcount
=
16
;
char
drawopt
=
'F'
;
text
=
Line
+
8
;
ret
=
sscanf
(
text
,
"%d %d %c %d %d"
,
&
gridsize
,
&
arcsegmentcount
,
&
drawopt
,
...
...
@@ -587,7 +589,7 @@ void ZONE_CONTAINER::DrawWhileCreateOutline( WinEDA_DrawPanel* panel, wxDC* DC,
// draw the lines
wxPoint
start_contour_pos
=
GetCornerPosition
(
0
);
int
icmax
=
GetNumCorners
()
-
1
;
int
icmax
=
GetNumCorners
()
-
1
;
for
(
int
ic
=
0
;
ic
<=
icmax
;
ic
++
)
{
int
xi
=
GetCornerPosition
(
ic
).
x
;
...
...
@@ -609,8 +611,9 @@ void ZONE_CONTAINER::DrawWhileCreateOutline( WinEDA_DrawPanel* panel, wxDC* DC,
current_gr_mode
=
GR_XOR
;
xf
=
start_contour_pos
.
x
;
yf
=
start_contour_pos
.
y
;
// Prepare the next contour for drawing, if exists
if
(
ic
<
icmax
)
if
(
ic
<
icmax
)
start_contour_pos
=
GetCornerPosition
(
ic
+
1
);
}
GRSetDrawMode
(
DC
,
current_gr_mode
);
...
...
pcbnew/dialog_copper_zones.cpp
View file @
43ee94b7
...
...
@@ -61,18 +61,18 @@ void dialog_copper_zone::OnInitDialog( wxInitDialogEvent& event )
SetFocus
();
// Required under wxGTK if we want to demiss the dialog with the ESC key
wxString
title
=
_
(
"Zone clearance value:"
)
+
ReturnUnitSymbol
(
g_UnitMetric
);
m_ClearanceValueTitle
->
SetLabel
(
title
);
wxString
msg
=
_
(
"Zone clearance value:"
)
+
ReturnUnitSymbol
(
g_UnitMetric
);
m_ClearanceValueTitle
->
SetLabel
(
msg
);
title
=
_
(
"Grid :"
)
+
ReturnUnitSymbol
(
g_UnitMetric
);
m_GridCtrl
->
SetLabel
(
title
);
msg
=
_
(
"Grid :"
)
+
ReturnUnitSymbol
(
g_UnitMetric
);
m_GridCtrl
->
SetLabel
(
msg
);
if
(
g_DesignSettings
.
m_ZoneClearence
==
0
)
g_DesignSettings
.
m_ZoneClearence
=
g_DesignSettings
.
m_TrackClearence
;
title
=
ReturnStringFromValue
(
g_UnitMetric
,
msg
=
ReturnStringFromValue
(
g_UnitMetric
,
g_DesignSettings
.
m_ZoneClearence
,
m_Parent
->
m_InternalUnits
);
m_ZoneClearanceCtrl
->
SetValue
(
title
);
m_ZoneClearanceCtrl
->
SetValue
(
msg
);
if
(
g_Zone_45_Only
)
m_OrientEdgesOpt
->
SetSelection
(
1
);
...
...
@@ -87,7 +87,7 @@ void dialog_copper_zone::OnInitDialog( wxInitDialogEvent& event )
for
(
unsigned
ii
=
0
;
ii
<
4
;
ii
++
)
{
wxString
msg
=
ReturnStringFromValue
(
g_UnitMetric
,
msg
=
ReturnStringFromValue
(
g_UnitMetric
,
GridList
[
ii
],
m_Parent
->
m_InternalUnits
);
m_GridCtrl
->
SetString
(
ii
,
msg
);
...
...
@@ -101,10 +101,10 @@ void dialog_copper_zone::OnInitDialog( wxInitDialogEvent& event )
if
(
m_Zone_Container
)
{
title
=
ReturnStringFromValue
(
g_UnitMetric
,
msg
=
ReturnStringFromValue
(
g_UnitMetric
,
m_Zone_Container
->
m_ZoneClearance
,
m_Parent
->
m_InternalUnits
);
m_ZoneClearanceCtrl
->
SetValue
(
title
);
m_ZoneClearanceCtrl
->
SetValue
(
msg
);
switch
(
m_Zone_Container
->
m_PadOption
)
{
...
...
@@ -193,7 +193,6 @@ void dialog_copper_zone::OnInitDialog( wxInitDialogEvent& event )
int
layer_cnt
=
board
->
GetCopperLayerCount
();
for
(
int
ii
=
0
;
ii
<
board
->
GetCopperLayerCount
();
ii
++
)
{
wxString
msg
;
int
layer_number
=
COPPER_LAYER_N
;
if
(
layer_cnt
<=
1
||
ii
<
layer_cnt
-
1
)
...
...
pcbnew/zones.h
View file @
43ee94b7
...
...
@@ -28,6 +28,7 @@ enum zone_cmd {
/* variables used in zone dialogs and functions */
/************************************************/
// @todo: make a class like ZONE_GENERAL_SETTING instead of many global variables
eda_global
bool
g_Zone_45_Only
#ifdef MAIN
=
FALSE
...
...
pcbnew/zones_by_polygon.cpp
View file @
43ee94b7
...
...
@@ -68,6 +68,16 @@ void WinEDA_PcbFrame::Add_Similar_Zone( wxDC* DC, ZONE_CONTAINER* zone_container
return
;
s_AddCutoutToCurrentZone
=
false
;
s_CurrentZone
=
zone_container
;
/* set zones setup to the current zone */
g_Zone_Hatching
=
zone_container
->
m_Poly
->
GetHatchStyle
();
g_Zone_Arc_Approximation
=
zone_container
->
m_ArcToSegmentsCount
;
g_ThermalReliefGapValue
=
zone_container
->
m_ThermalReliefGapValue
;
g_ThermalReliefCopperBridgeValue
=
zone_container
->
m_ThermalReliefCopperBridgeValue
;
g_GridRoutingSize
=
zone_container
->
m_GridFillValue
;
g_Zone_Pad_Options
=
zone_container
->
m_PadOption
;
// Use the general event handle to set others params (like toolbar) */
wxCommandEvent
evt
;
evt
.
SetId
(
ID_PCB_ZONES_BUTT
);
Process_Special_Functions
(
evt
);
...
...
@@ -89,6 +99,16 @@ void WinEDA_PcbFrame::Add_Zone_Cutout( wxDC* DC, ZONE_CONTAINER* zone_container
return
;
s_AddCutoutToCurrentZone
=
true
;
s_CurrentZone
=
zone_container
;
/* set zones setup to the current zone */
g_Zone_Hatching
=
zone_container
->
m_Poly
->
GetHatchStyle
();
g_Zone_Arc_Approximation
=
zone_container
->
m_ArcToSegmentsCount
;
g_ThermalReliefGapValue
=
zone_container
->
m_ThermalReliefGapValue
;
g_ThermalReliefCopperBridgeValue
=
zone_container
->
m_ThermalReliefCopperBridgeValue
;
g_GridRoutingSize
=
zone_container
->
m_GridFillValue
;
g_Zone_Pad_Options
=
zone_container
->
m_PadOption
;
// Use the general event handle to set others params (like toolbar) */
wxCommandEvent
evt
;
evt
.
SetId
(
ID_PCB_ZONES_BUTT
);
Process_Special_Functions
(
evt
);
...
...
@@ -909,17 +929,16 @@ int WinEDA_PcbFrame::Fill_Zone( wxDC* DC, ZONE_CONTAINER* zone_container, bool v
wxBusyCursor
dummy
;
// Shows an hourglass cursor (removed by its destructor)
int
error_level
=
0
;
zone_container
->
m_FilledPolysList
.
clear
();
if
(
zone_container
->
m_GridFillValue
==
0
)
{
zone_container
->
m_FilledPolysList
.
clear
();
zone_container
->
BuildFilledPolysListData
(
m_Pcb
);
if
(
DC
)
DrawPanel
->
Refresh
();
}
else
{
zone_container
->
m_FilledPolysList
.
clear
();
zone_container
->
m_GridFillValue
=
g_GridRoutingSize
;
g_GridRoutingSize
=
zone_container
->
m_GridFillValue
;
error_level
=
zone_container
->
Fill_Zone
(
this
,
DC
,
verbose
);
}
...
...
pcbnew/zones_convert_brd_items_to_polygons.cpp
View file @
43ee94b7
...
...
@@ -91,6 +91,12 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
/* Add holes (i.e. tracks and pads areas as polygons outlines)
* in GroupB in Bool_Engine
*/
/* items ouside the zone bounding box are skipped */
EDA_Rect
item_boundingbox
;
EDA_Rect
zone_boundingbox
=
GetBoundingBox
();
zone_boundingbox
.
Inflate
(
m_ZoneClearance
,
m_ZoneClearance
);
/*
* First : Add pads
*/
for
(
MODULE
*
module
=
aPcb
->
m_Modules
;
module
;
module
=
module
->
Next
()
)
...
...
@@ -102,19 +108,26 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
if
(
pad
->
GetNet
()
!=
GetNet
()
)
{
AddPadWithClearancePolygon
(
booleng
,
*
pad
,
m_ZoneClearance
);
item_boundingbox
=
pad
->
GetBoundingBox
();
if
(
item_boundingbox
.
Intersects
(
zone_boundingbox
)
)
AddPadWithClearancePolygon
(
booleng
,
*
pad
,
m_ZoneClearance
);
continue
;
}
switch
(
m_PadOption
)
{
case
PAD_NOT_IN_ZONE
:
AddPadWithClearancePolygon
(
booleng
,
*
pad
,
m_ZoneClearance
);
item_boundingbox
=
pad
->
GetBoundingBox
();
if
(
item_boundingbox
.
Intersects
(
zone_boundingbox
)
)
AddPadWithClearancePolygon
(
booleng
,
*
pad
,
m_ZoneClearance
);
break
;
case
THERMAL_PAD
:
AddThermalReliefPadPolygon
(
booleng
,
*
pad
,
m_ThermalReliefGapValue
,
m_ThermalReliefCopperBridgeValue
);
item_boundingbox
=
pad
->
GetBoundingBox
();
item_boundingbox
.
Inflate
(
m_ThermalReliefGapValue
,
m_ThermalReliefGapValue
);
if
(
item_boundingbox
.
Intersects
(
zone_boundingbox
)
)
AddThermalReliefPadPolygon
(
booleng
,
*
pad
,
m_ThermalReliefGapValue
,
m_ThermalReliefCopperBridgeValue
);
break
;
case
PAD_IN_ZONE
:
...
...
@@ -133,7 +146,9 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
continue
;
if
(
track
->
GetNet
()
==
GetNet
()
)
continue
;
AddTrackWithClearancePolygon
(
booleng
,
*
track
,
m_ZoneClearance
);
item_boundingbox
=
track
->
GetBoundingBox
();
if
(
item_boundingbox
.
Intersects
(
zone_boundingbox
)
)
AddTrackWithClearancePolygon
(
booleng
,
*
track
,
m_ZoneClearance
);
}
// Draw graphic items (copper texts) and board edges
...
...
@@ -501,7 +516,7 @@ void AddThermalReliefPadPolygon( Bool_Engine* aBooleng,
{
if
(
aBooleng
->
StartPolygonAdd
(
GROUP_B
)
)
{
for
(
int
ic
=
0
;
ic
<
corners_buffer
.
size
();
ic
++
)
for
(
unsigned
ic
=
0
;
ic
<
corners_buffer
.
size
();
ic
++
)
{
wxPoint
cpos
=
corners_buffer
[
ic
];
RotatePoint
(
&
cpos
,
angle
);
...
...
@@ -517,11 +532,11 @@ void AddThermalReliefPadPolygon( Bool_Engine* aBooleng,
}
// Create holes, that are the mirrored from the previous holes
for
(
int
i
=
0
;
i
<
corners_buffer
.
size
();
i
++
)
for
(
unsigned
ic
=
0
;
ic
<
corners_buffer
.
size
();
ic
++
)
{
wxPoint
swap
=
corners_buffer
[
i
];
wxPoint
swap
=
corners_buffer
[
i
c
];
swap
=
wxPoint
(
-
swap
.
x
,
swap
.
y
);
corners_buffer
[
i
]
=
swap
;
corners_buffer
[
i
c
]
=
swap
;
}
// Now add corner 4 and 2 (2 is the corner 4 rotated by 180 deg
...
...
@@ -530,7 +545,7 @@ void AddThermalReliefPadPolygon( Bool_Engine* aBooleng,
{
if
(
aBooleng
->
StartPolygonAdd
(
GROUP_B
)
)
{
for
(
int
ic
=
0
;
ic
<
corners_buffer
.
size
();
ic
++
)
for
(
unsigned
ic
=
0
;
ic
<
corners_buffer
.
size
();
ic
++
)
{
wxPoint
cpos
=
corners_buffer
[
ic
];
RotatePoint
(
&
cpos
,
angle
);
...
...
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