pcbnew: new zone filling algorithm using ClipperLib. Possibility to fall back to the old one
This commit is contained in:
parent
feaa403266
commit
eba3a55bb2
|
@ -72,8 +72,6 @@ void SHAPE_FILE_IO::EndGroup()
|
||||||
|
|
||||||
void SHAPE_FILE_IO::Write( const SHAPE *aShape, const std::string aName )
|
void SHAPE_FILE_IO::Write( const SHAPE *aShape, const std::string aName )
|
||||||
{
|
{
|
||||||
printf("write %p f %p\n", aShape, m_file );
|
|
||||||
|
|
||||||
if(!m_file)
|
if(!m_file)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
@ -330,8 +330,10 @@ public:
|
||||||
* BuildFilledSolidAreasPolygons() call this function just after creating the
|
* BuildFilledSolidAreasPolygons() call this function just after creating the
|
||||||
* filled copper area polygon (without clearance areas
|
* filled copper area polygon (without clearance areas
|
||||||
* @param aPcb: the current board
|
* @param aPcb: the current board
|
||||||
|
* _NG version uses SHAPE_POLY_SET instead of Boost.Polygon
|
||||||
*/
|
*/
|
||||||
void AddClearanceAreasPolygonsToPolysList( BOARD* aPcb );
|
void AddClearanceAreasPolygonsToPolysList( BOARD* aPcb );
|
||||||
|
void AddClearanceAreasPolygonsToPolysList_NG( BOARD* aPcb );
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -578,7 +580,10 @@ public:
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void buildFeatureHoleList( BOARD* aPcb, CPOLYGONS_LIST& aFeatures );
|
||||||
|
|
||||||
CPolyLine* m_Poly; ///< Outline of the zone.
|
CPolyLine* m_Poly; ///< Outline of the zone.
|
||||||
CPolyLine* m_smoothedPoly; // Corner-smoothed version of m_Poly
|
CPolyLine* m_smoothedPoly; // Corner-smoothed version of m_Poly
|
||||||
int m_cornerSmoothingType;
|
int m_cornerSmoothingType;
|
||||||
|
|
|
@ -95,6 +95,10 @@ void DIALOG_GENERALOPTIONS::init()
|
||||||
|
|
||||||
m_MagneticPadOptCtrl->SetSelection( g_MagneticPadOption );
|
m_MagneticPadOptCtrl->SetSelection( g_MagneticPadOption );
|
||||||
m_MagneticTrackOptCtrl->SetSelection( g_MagneticTrackOption );
|
m_MagneticTrackOptCtrl->SetSelection( g_MagneticTrackOption );
|
||||||
|
|
||||||
|
m_UseOldZoneFillingAlgo->SetValue ( g_UseOldZoneFillingAlgo );
|
||||||
|
m_DumpZonesWhenFilling->SetValue ( g_DumpZonesWhenFilling );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -143,6 +147,8 @@ void DIALOG_GENERALOPTIONS::OnOkClick( wxCommandEvent& event )
|
||||||
g_TwoSegmentTrackBuild = m_Track_DoubleSegm_Ctrl->GetValue();
|
g_TwoSegmentTrackBuild = m_Track_DoubleSegm_Ctrl->GetValue();
|
||||||
g_MagneticPadOption = m_MagneticPadOptCtrl->GetSelection();
|
g_MagneticPadOption = m_MagneticPadOptCtrl->GetSelection();
|
||||||
g_MagneticTrackOption = m_MagneticTrackOptCtrl->GetSelection();
|
g_MagneticTrackOption = m_MagneticTrackOptCtrl->GetSelection();
|
||||||
|
g_UseOldZoneFillingAlgo = m_UseOldZoneFillingAlgo->GetValue();
|
||||||
|
g_DumpZonesWhenFilling = m_DumpZonesWhenFilling->GetValue();
|
||||||
|
|
||||||
EndModal( wxID_OK );
|
EndModal( wxID_OK );
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
// C++ code generated with wxFormBuilder (version Oct 8 2012)
|
// C++ code generated with wxFormBuilder (version Jun 6 2014)
|
||||||
// http://www.wxformbuilder.org/
|
// http://www.wxformbuilder.org/
|
||||||
//
|
//
|
||||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||||
|
@ -176,7 +176,23 @@ DIALOG_GENERALOPTIONS_BOARDEDITOR_BASE::DIALOG_GENERALOPTIONS_BOARDEDITOR_BASE(
|
||||||
sbSizer2PAN->Add( m_AutoPANOpt, 0, wxALL, 5 );
|
sbSizer2PAN->Add( m_AutoPANOpt, 0, wxALL, 5 );
|
||||||
|
|
||||||
|
|
||||||
bRightSizer->Add( sbSizer2PAN, 1, wxALL|wxEXPAND, 5 );
|
bRightSizer->Add( sbSizer2PAN, 1, wxEXPAND, 5 );
|
||||||
|
|
||||||
|
wxStaticBoxSizer* sbSizer2Adv;
|
||||||
|
sbSizer2Adv = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Advanced/Developer") ), wxVERTICAL );
|
||||||
|
|
||||||
|
m_UseOldZoneFillingAlgo = new wxCheckBox( this, wxID_ANY, _("Use legacy zone filling algorithm"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
m_UseOldZoneFillingAlgo->SetToolTip( _("Keep the cursor at its current location when zooming") );
|
||||||
|
|
||||||
|
sbSizer2Adv->Add( m_UseOldZoneFillingAlgo, 0, wxLEFT|wxRIGHT|wxTOP, 5 );
|
||||||
|
|
||||||
|
m_DumpZonesWhenFilling = new wxCheckBox( this, wxID_ANY, _("Dump zone geometry to files when filling"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
m_DumpZonesWhenFilling->SetToolTip( _("Use middle mouse button dragging to pan") );
|
||||||
|
|
||||||
|
sbSizer2Adv->Add( m_DumpZonesWhenFilling, 0, wxLEFT|wxRIGHT|wxTOP, 5 );
|
||||||
|
|
||||||
|
|
||||||
|
bRightSizer->Add( sbSizer2Adv, 1, wxALL|wxEXPAND, 5 );
|
||||||
|
|
||||||
|
|
||||||
bSizerUpper->Add( bRightSizer, 0, wxALL|wxEXPAND, 5 );
|
bSizerUpper->Add( bRightSizer, 0, wxALL|wxEXPAND, 5 );
|
||||||
|
@ -203,6 +219,7 @@ DIALOG_GENERALOPTIONS_BOARDEDITOR_BASE::DIALOG_GENERALOPTIONS_BOARDEDITOR_BASE(
|
||||||
|
|
||||||
// Connect Events
|
// Connect Events
|
||||||
m_MiddleButtonPANOpt->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_GENERALOPTIONS_BOARDEDITOR_BASE::OnMiddleBtnPanEnbl ), NULL, this );
|
m_MiddleButtonPANOpt->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_GENERALOPTIONS_BOARDEDITOR_BASE::OnMiddleBtnPanEnbl ), NULL, this );
|
||||||
|
m_DumpZonesWhenFilling->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_GENERALOPTIONS_BOARDEDITOR_BASE::OnMiddleBtnPanEnbl ), NULL, this );
|
||||||
m_sdbSizerCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_GENERALOPTIONS_BOARDEDITOR_BASE::OnCancelClick ), NULL, this );
|
m_sdbSizerCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_GENERALOPTIONS_BOARDEDITOR_BASE::OnCancelClick ), NULL, this );
|
||||||
m_sdbSizerOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_GENERALOPTIONS_BOARDEDITOR_BASE::OnOkClick ), NULL, this );
|
m_sdbSizerOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_GENERALOPTIONS_BOARDEDITOR_BASE::OnOkClick ), NULL, this );
|
||||||
}
|
}
|
||||||
|
@ -211,6 +228,7 @@ DIALOG_GENERALOPTIONS_BOARDEDITOR_BASE::~DIALOG_GENERALOPTIONS_BOARDEDITOR_BASE(
|
||||||
{
|
{
|
||||||
// Disconnect Events
|
// Disconnect Events
|
||||||
m_MiddleButtonPANOpt->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_GENERALOPTIONS_BOARDEDITOR_BASE::OnMiddleBtnPanEnbl ), NULL, this );
|
m_MiddleButtonPANOpt->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_GENERALOPTIONS_BOARDEDITOR_BASE::OnMiddleBtnPanEnbl ), NULL, this );
|
||||||
|
m_DumpZonesWhenFilling->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_GENERALOPTIONS_BOARDEDITOR_BASE::OnMiddleBtnPanEnbl ), NULL, this );
|
||||||
m_sdbSizerCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_GENERALOPTIONS_BOARDEDITOR_BASE::OnCancelClick ), NULL, this );
|
m_sdbSizerCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_GENERALOPTIONS_BOARDEDITOR_BASE::OnCancelClick ), NULL, this );
|
||||||
m_sdbSizerOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_GENERALOPTIONS_BOARDEDITOR_BASE::OnOkClick ), NULL, this );
|
m_sdbSizerOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_GENERALOPTIONS_BOARDEDITOR_BASE::OnOkClick ), NULL, this );
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
|
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
|
||||||
<wxFormBuilder_Project>
|
<wxFormBuilder_Project>
|
||||||
<FileVersion major="1" minor="11" />
|
<FileVersion major="1" minor="13" />
|
||||||
<object class="Project" expanded="1">
|
<object class="Project" expanded="1">
|
||||||
<property name="class_decoration"></property>
|
<property name="class_decoration"></property>
|
||||||
<property name="code_generation">C++</property>
|
<property name="code_generation">C++</property>
|
||||||
|
@ -20,8 +20,10 @@
|
||||||
<property name="path">.</property>
|
<property name="path">.</property>
|
||||||
<property name="precompiled_header"></property>
|
<property name="precompiled_header"></property>
|
||||||
<property name="relative_path">1</property>
|
<property name="relative_path">1</property>
|
||||||
|
<property name="skip_lua_events">1</property>
|
||||||
<property name="skip_php_events">1</property>
|
<property name="skip_php_events">1</property>
|
||||||
<property name="skip_python_events">1</property>
|
<property name="skip_python_events">1</property>
|
||||||
|
<property name="ui_table">UI</property>
|
||||||
<property name="use_enum">1</property>
|
<property name="use_enum">1</property>
|
||||||
<property name="use_microsoft_bom">0</property>
|
<property name="use_microsoft_bom">0</property>
|
||||||
<object class="Dialog" expanded="1">
|
<object class="Dialog" expanded="1">
|
||||||
|
@ -573,6 +575,7 @@
|
||||||
<event name="OnSize"></event>
|
<event name="OnSize"></event>
|
||||||
<event name="OnSpinCtrl"></event>
|
<event name="OnSpinCtrl"></event>
|
||||||
<event name="OnSpinCtrlText"></event>
|
<event name="OnSpinCtrlText"></event>
|
||||||
|
<event name="OnTextEnter"></event>
|
||||||
<event name="OnUpdateUI"></event>
|
<event name="OnUpdateUI"></event>
|
||||||
</object>
|
</object>
|
||||||
</object>
|
</object>
|
||||||
|
@ -743,6 +746,7 @@
|
||||||
<event name="OnSize"></event>
|
<event name="OnSize"></event>
|
||||||
<event name="OnSpinCtrl"></event>
|
<event name="OnSpinCtrl"></event>
|
||||||
<event name="OnSpinCtrlText"></event>
|
<event name="OnSpinCtrlText"></event>
|
||||||
|
<event name="OnTextEnter"></event>
|
||||||
<event name="OnUpdateUI"></event>
|
<event name="OnUpdateUI"></event>
|
||||||
</object>
|
</object>
|
||||||
</object>
|
</object>
|
||||||
|
@ -1745,7 +1749,7 @@
|
||||||
</object>
|
</object>
|
||||||
<object class="sizeritem" expanded="1">
|
<object class="sizeritem" expanded="1">
|
||||||
<property name="border">5</property>
|
<property name="border">5</property>
|
||||||
<property name="flag">wxALL|wxEXPAND</property>
|
<property name="flag">wxEXPAND</property>
|
||||||
<property name="proportion">1</property>
|
<property name="proportion">1</property>
|
||||||
<object class="wxStaticBoxSizer" expanded="1">
|
<object class="wxStaticBoxSizer" expanded="1">
|
||||||
<property name="id">wxID_ANY</property>
|
<property name="id">wxID_ANY</property>
|
||||||
|
@ -1843,11 +1847,11 @@
|
||||||
<event name="OnUpdateUI"></event>
|
<event name="OnUpdateUI"></event>
|
||||||
</object>
|
</object>
|
||||||
</object>
|
</object>
|
||||||
<object class="sizeritem" expanded="0">
|
<object class="sizeritem" expanded="1">
|
||||||
<property name="border">5</property>
|
<property name="border">5</property>
|
||||||
<property name="flag">wxLEFT|wxRIGHT|wxTOP</property>
|
<property name="flag">wxLEFT|wxRIGHT|wxTOP</property>
|
||||||
<property name="proportion">0</property>
|
<property name="proportion">0</property>
|
||||||
<object class="wxCheckBox" expanded="0">
|
<object class="wxCheckBox" expanded="1">
|
||||||
<property name="BottomDockable">1</property>
|
<property name="BottomDockable">1</property>
|
||||||
<property name="LeftDockable">1</property>
|
<property name="LeftDockable">1</property>
|
||||||
<property name="RightDockable">1</property>
|
<property name="RightDockable">1</property>
|
||||||
|
@ -1931,11 +1935,11 @@
|
||||||
<event name="OnUpdateUI"></event>
|
<event name="OnUpdateUI"></event>
|
||||||
</object>
|
</object>
|
||||||
</object>
|
</object>
|
||||||
<object class="sizeritem" expanded="0">
|
<object class="sizeritem" expanded="1">
|
||||||
<property name="border">5</property>
|
<property name="border">5</property>
|
||||||
<property name="flag">wxLEFT|wxRIGHT|wxTOP</property>
|
<property name="flag">wxLEFT|wxRIGHT|wxTOP</property>
|
||||||
<property name="proportion">0</property>
|
<property name="proportion">0</property>
|
||||||
<object class="wxCheckBox" expanded="0">
|
<object class="wxCheckBox" expanded="1">
|
||||||
<property name="BottomDockable">1</property>
|
<property name="BottomDockable">1</property>
|
||||||
<property name="LeftDockable">1</property>
|
<property name="LeftDockable">1</property>
|
||||||
<property name="RightDockable">1</property>
|
<property name="RightDockable">1</property>
|
||||||
|
@ -2019,11 +2023,11 @@
|
||||||
<event name="OnUpdateUI"></event>
|
<event name="OnUpdateUI"></event>
|
||||||
</object>
|
</object>
|
||||||
</object>
|
</object>
|
||||||
<object class="sizeritem" expanded="0">
|
<object class="sizeritem" expanded="1">
|
||||||
<property name="border">5</property>
|
<property name="border">5</property>
|
||||||
<property name="flag">wxALL</property>
|
<property name="flag">wxALL</property>
|
||||||
<property name="proportion">0</property>
|
<property name="proportion">0</property>
|
||||||
<object class="wxCheckBox" expanded="0">
|
<object class="wxCheckBox" expanded="1">
|
||||||
<property name="BottomDockable">1</property>
|
<property name="BottomDockable">1</property>
|
||||||
<property name="LeftDockable">1</property>
|
<property name="LeftDockable">1</property>
|
||||||
<property name="RightDockable">1</property>
|
<property name="RightDockable">1</property>
|
||||||
|
@ -2109,6 +2113,196 @@
|
||||||
</object>
|
</object>
|
||||||
</object>
|
</object>
|
||||||
</object>
|
</object>
|
||||||
|
<object class="sizeritem" expanded="1">
|
||||||
|
<property name="border">5</property>
|
||||||
|
<property name="flag">wxALL|wxEXPAND</property>
|
||||||
|
<property name="proportion">1</property>
|
||||||
|
<object class="wxStaticBoxSizer" expanded="0">
|
||||||
|
<property name="id">wxID_ANY</property>
|
||||||
|
<property name="label">Advanced/Developer</property>
|
||||||
|
<property name="minimum_size"></property>
|
||||||
|
<property name="name">sbSizer2Adv</property>
|
||||||
|
<property name="orient">wxVERTICAL</property>
|
||||||
|
<property name="permission">none</property>
|
||||||
|
<event name="OnUpdateUI"></event>
|
||||||
|
<object class="sizeritem" expanded="0">
|
||||||
|
<property name="border">5</property>
|
||||||
|
<property name="flag">wxLEFT|wxRIGHT|wxTOP</property>
|
||||||
|
<property name="proportion">0</property>
|
||||||
|
<object class="wxCheckBox" expanded="0">
|
||||||
|
<property name="BottomDockable">1</property>
|
||||||
|
<property name="LeftDockable">1</property>
|
||||||
|
<property name="RightDockable">1</property>
|
||||||
|
<property name="TopDockable">1</property>
|
||||||
|
<property name="aui_layer"></property>
|
||||||
|
<property name="aui_name"></property>
|
||||||
|
<property name="aui_position"></property>
|
||||||
|
<property name="aui_row"></property>
|
||||||
|
<property name="best_size"></property>
|
||||||
|
<property name="bg"></property>
|
||||||
|
<property name="caption"></property>
|
||||||
|
<property name="caption_visible">1</property>
|
||||||
|
<property name="center_pane">0</property>
|
||||||
|
<property name="checked">0</property>
|
||||||
|
<property name="close_button">1</property>
|
||||||
|
<property name="context_help"></property>
|
||||||
|
<property name="context_menu">1</property>
|
||||||
|
<property name="default_pane">0</property>
|
||||||
|
<property name="dock">Dock</property>
|
||||||
|
<property name="dock_fixed">0</property>
|
||||||
|
<property name="docking">Left</property>
|
||||||
|
<property name="enabled">1</property>
|
||||||
|
<property name="fg"></property>
|
||||||
|
<property name="floatable">1</property>
|
||||||
|
<property name="font"></property>
|
||||||
|
<property name="gripper">0</property>
|
||||||
|
<property name="hidden">0</property>
|
||||||
|
<property name="id">wxID_ANY</property>
|
||||||
|
<property name="label">Use legacy zone filling algorithm</property>
|
||||||
|
<property name="max_size"></property>
|
||||||
|
<property name="maximize_button">0</property>
|
||||||
|
<property name="maximum_size"></property>
|
||||||
|
<property name="min_size"></property>
|
||||||
|
<property name="minimize_button">0</property>
|
||||||
|
<property name="minimum_size"></property>
|
||||||
|
<property name="moveable">1</property>
|
||||||
|
<property name="name">m_UseOldZoneFillingAlgo</property>
|
||||||
|
<property name="pane_border">1</property>
|
||||||
|
<property name="pane_position"></property>
|
||||||
|
<property name="pane_size"></property>
|
||||||
|
<property name="permission">protected</property>
|
||||||
|
<property name="pin_button">1</property>
|
||||||
|
<property name="pos"></property>
|
||||||
|
<property name="resize">Resizable</property>
|
||||||
|
<property name="show">1</property>
|
||||||
|
<property name="size"></property>
|
||||||
|
<property name="style"></property>
|
||||||
|
<property name="subclass"></property>
|
||||||
|
<property name="toolbar_pane">0</property>
|
||||||
|
<property name="tooltip">Keep the cursor at its current location when zooming</property>
|
||||||
|
<property name="validator_data_type"></property>
|
||||||
|
<property name="validator_style">wxFILTER_NONE</property>
|
||||||
|
<property name="validator_type">wxDefaultValidator</property>
|
||||||
|
<property name="validator_variable"></property>
|
||||||
|
<property name="window_extra_style"></property>
|
||||||
|
<property name="window_name"></property>
|
||||||
|
<property name="window_style"></property>
|
||||||
|
<event name="OnChar"></event>
|
||||||
|
<event name="OnCheckBox"></event>
|
||||||
|
<event name="OnEnterWindow"></event>
|
||||||
|
<event name="OnEraseBackground"></event>
|
||||||
|
<event name="OnKeyDown"></event>
|
||||||
|
<event name="OnKeyUp"></event>
|
||||||
|
<event name="OnKillFocus"></event>
|
||||||
|
<event name="OnLeaveWindow"></event>
|
||||||
|
<event name="OnLeftDClick"></event>
|
||||||
|
<event name="OnLeftDown"></event>
|
||||||
|
<event name="OnLeftUp"></event>
|
||||||
|
<event name="OnMiddleDClick"></event>
|
||||||
|
<event name="OnMiddleDown"></event>
|
||||||
|
<event name="OnMiddleUp"></event>
|
||||||
|
<event name="OnMotion"></event>
|
||||||
|
<event name="OnMouseEvents"></event>
|
||||||
|
<event name="OnMouseWheel"></event>
|
||||||
|
<event name="OnPaint"></event>
|
||||||
|
<event name="OnRightDClick"></event>
|
||||||
|
<event name="OnRightDown"></event>
|
||||||
|
<event name="OnRightUp"></event>
|
||||||
|
<event name="OnSetFocus"></event>
|
||||||
|
<event name="OnSize"></event>
|
||||||
|
<event name="OnUpdateUI"></event>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
|
<object class="sizeritem" expanded="0">
|
||||||
|
<property name="border">5</property>
|
||||||
|
<property name="flag">wxLEFT|wxRIGHT|wxTOP</property>
|
||||||
|
<property name="proportion">0</property>
|
||||||
|
<object class="wxCheckBox" expanded="0">
|
||||||
|
<property name="BottomDockable">1</property>
|
||||||
|
<property name="LeftDockable">1</property>
|
||||||
|
<property name="RightDockable">1</property>
|
||||||
|
<property name="TopDockable">1</property>
|
||||||
|
<property name="aui_layer"></property>
|
||||||
|
<property name="aui_name"></property>
|
||||||
|
<property name="aui_position"></property>
|
||||||
|
<property name="aui_row"></property>
|
||||||
|
<property name="best_size"></property>
|
||||||
|
<property name="bg"></property>
|
||||||
|
<property name="caption"></property>
|
||||||
|
<property name="caption_visible">1</property>
|
||||||
|
<property name="center_pane">0</property>
|
||||||
|
<property name="checked">0</property>
|
||||||
|
<property name="close_button">1</property>
|
||||||
|
<property name="context_help"></property>
|
||||||
|
<property name="context_menu">1</property>
|
||||||
|
<property name="default_pane">0</property>
|
||||||
|
<property name="dock">Dock</property>
|
||||||
|
<property name="dock_fixed">0</property>
|
||||||
|
<property name="docking">Left</property>
|
||||||
|
<property name="enabled">1</property>
|
||||||
|
<property name="fg"></property>
|
||||||
|
<property name="floatable">1</property>
|
||||||
|
<property name="font"></property>
|
||||||
|
<property name="gripper">0</property>
|
||||||
|
<property name="hidden">0</property>
|
||||||
|
<property name="id">wxID_ANY</property>
|
||||||
|
<property name="label">Dump zone geometry to files when filling</property>
|
||||||
|
<property name="max_size"></property>
|
||||||
|
<property name="maximize_button">0</property>
|
||||||
|
<property name="maximum_size"></property>
|
||||||
|
<property name="min_size"></property>
|
||||||
|
<property name="minimize_button">0</property>
|
||||||
|
<property name="minimum_size"></property>
|
||||||
|
<property name="moveable">1</property>
|
||||||
|
<property name="name">m_DumpZonesWhenFilling</property>
|
||||||
|
<property name="pane_border">1</property>
|
||||||
|
<property name="pane_position"></property>
|
||||||
|
<property name="pane_size"></property>
|
||||||
|
<property name="permission">protected</property>
|
||||||
|
<property name="pin_button">1</property>
|
||||||
|
<property name="pos"></property>
|
||||||
|
<property name="resize">Resizable</property>
|
||||||
|
<property name="show">1</property>
|
||||||
|
<property name="size"></property>
|
||||||
|
<property name="style"></property>
|
||||||
|
<property name="subclass"></property>
|
||||||
|
<property name="toolbar_pane">0</property>
|
||||||
|
<property name="tooltip">Use middle mouse button dragging to pan</property>
|
||||||
|
<property name="validator_data_type"></property>
|
||||||
|
<property name="validator_style">wxFILTER_NONE</property>
|
||||||
|
<property name="validator_type">wxDefaultValidator</property>
|
||||||
|
<property name="validator_variable"></property>
|
||||||
|
<property name="window_extra_style"></property>
|
||||||
|
<property name="window_name"></property>
|
||||||
|
<property name="window_style"></property>
|
||||||
|
<event name="OnChar"></event>
|
||||||
|
<event name="OnCheckBox">OnMiddleBtnPanEnbl</event>
|
||||||
|
<event name="OnEnterWindow"></event>
|
||||||
|
<event name="OnEraseBackground"></event>
|
||||||
|
<event name="OnKeyDown"></event>
|
||||||
|
<event name="OnKeyUp"></event>
|
||||||
|
<event name="OnKillFocus"></event>
|
||||||
|
<event name="OnLeaveWindow"></event>
|
||||||
|
<event name="OnLeftDClick"></event>
|
||||||
|
<event name="OnLeftDown"></event>
|
||||||
|
<event name="OnLeftUp"></event>
|
||||||
|
<event name="OnMiddleDClick"></event>
|
||||||
|
<event name="OnMiddleDown"></event>
|
||||||
|
<event name="OnMiddleUp"></event>
|
||||||
|
<event name="OnMotion"></event>
|
||||||
|
<event name="OnMouseEvents"></event>
|
||||||
|
<event name="OnMouseWheel"></event>
|
||||||
|
<event name="OnPaint"></event>
|
||||||
|
<event name="OnRightDClick"></event>
|
||||||
|
<event name="OnRightDown"></event>
|
||||||
|
<event name="OnRightUp"></event>
|
||||||
|
<event name="OnSetFocus"></event>
|
||||||
|
<event name="OnSize"></event>
|
||||||
|
<event name="OnUpdateUI"></event>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
</object>
|
</object>
|
||||||
</object>
|
</object>
|
||||||
</object>
|
</object>
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
// C++ code generated with wxFormBuilder (version Oct 8 2012)
|
// C++ code generated with wxFormBuilder (version Jun 6 2014)
|
||||||
// http://www.wxformbuilder.org/
|
// http://www.wxformbuilder.org/
|
||||||
//
|
//
|
||||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||||
|
@ -78,6 +78,8 @@ class DIALOG_GENERALOPTIONS_BOARDEDITOR_BASE : public DIALOG_SHIM
|
||||||
wxCheckBox* m_MiddleButtonPANOpt;
|
wxCheckBox* m_MiddleButtonPANOpt;
|
||||||
wxCheckBox* m_OptMiddleButtonPanLimited;
|
wxCheckBox* m_OptMiddleButtonPanLimited;
|
||||||
wxCheckBox* m_AutoPANOpt;
|
wxCheckBox* m_AutoPANOpt;
|
||||||
|
wxCheckBox* m_UseOldZoneFillingAlgo;
|
||||||
|
wxCheckBox* m_DumpZonesWhenFilling;
|
||||||
wxStaticLine* m_staticline1;
|
wxStaticLine* m_staticline1;
|
||||||
wxStdDialogButtonSizer* m_sdbSizer;
|
wxStdDialogButtonSizer* m_sdbSizer;
|
||||||
wxButton* m_sdbSizerOK;
|
wxButton* m_sdbSizerOK;
|
||||||
|
|
|
@ -93,6 +93,9 @@ wxString g_DocModulesFileName = wxT( "footprints_doc/footprints.pdf" );
|
||||||
*/
|
*/
|
||||||
DLIST<TRACK> g_CurrentTrackList;
|
DLIST<TRACK> g_CurrentTrackList;
|
||||||
|
|
||||||
|
bool g_UseOldZoneFillingAlgo = false;
|
||||||
|
bool g_DumpZonesWhenFilling = false;
|
||||||
|
|
||||||
namespace PCB {
|
namespace PCB {
|
||||||
|
|
||||||
static struct IFACE : public KIFACE_I
|
static struct IFACE : public KIFACE_I
|
||||||
|
|
|
@ -93,6 +93,9 @@ extern bool g_TwoSegmentTrackBuild;
|
||||||
extern int g_MagneticPadOption;
|
extern int g_MagneticPadOption;
|
||||||
extern int g_MagneticTrackOption;
|
extern int g_MagneticTrackOption;
|
||||||
|
|
||||||
|
extern bool g_UseOldZoneFillingAlgo;
|
||||||
|
extern bool g_DumpZonesWhenFilling;
|
||||||
|
|
||||||
extern wxPoint g_Offset_Module; // Offset trace when moving footprint.
|
extern wxPoint g_Offset_Module; // Offset trace when moving footprint.
|
||||||
|
|
||||||
/// List of segments of the trace currently being drawn.
|
/// List of segments of the trace currently being drawn.
|
||||||
|
|
|
@ -234,7 +234,7 @@ void ROUTER_PREVIEW_ITEM::ViewDraw( int aLayer, KIGFX::GAL* aGal ) const
|
||||||
}
|
}
|
||||||
|
|
||||||
case SH_CONVEX:
|
case SH_CONVEX:
|
||||||
case SH_POLYGON:
|
case SH_POLY_SET:
|
||||||
case SH_COMPOUND:
|
case SH_COMPOUND:
|
||||||
break; // Not yet in use
|
break; // Not yet in use
|
||||||
}
|
}
|
||||||
|
|
|
@ -104,10 +104,15 @@ bool ZONE_CONTAINER::BuildFilledSolidAreasPolygons( BOARD* aPcb, CPOLYGONS_LIST*
|
||||||
m_FilledPolysList.RemoveAllContours();
|
m_FilledPolysList.RemoveAllContours();
|
||||||
|
|
||||||
if( IsOnCopperLayer() )
|
if( IsOnCopperLayer() )
|
||||||
AddClearanceAreasPolygonsToPolysList( aPcb );
|
{
|
||||||
|
if(g_UseOldZoneFillingAlgo)
|
||||||
|
AddClearanceAreasPolygonsToPolysList( aPcb );
|
||||||
|
else
|
||||||
|
AddClearanceAreasPolygonsToPolysList_NG( aPcb );
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int margin = m_ZoneMinThickness / 2;
|
int margin = m_ZoneMinThickness / 2;
|
||||||
m_smoothedPoly->m_CornersList.InflateOutline(m_FilledPolysList, -margin, true );
|
m_smoothedPoly->m_CornersList.InflateOutline(m_FilledPolysList, -margin, true );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,6 +45,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
#include <fctsys.h>
|
#include <fctsys.h>
|
||||||
#include <polygons_defs.h>
|
#include <polygons_defs.h>
|
||||||
|
@ -58,11 +59,16 @@
|
||||||
#include <class_drawsegment.h>
|
#include <class_drawsegment.h>
|
||||||
#include <class_pcb_text.h>
|
#include <class_pcb_text.h>
|
||||||
#include <class_zone.h>
|
#include <class_zone.h>
|
||||||
|
#include <project.h>
|
||||||
|
|
||||||
#include <pcbnew.h>
|
#include <pcbnew.h>
|
||||||
#include <zones.h>
|
#include <zones.h>
|
||||||
#include <convert_basic_shapes_to_polygon.h>
|
#include <convert_basic_shapes_to_polygon.h>
|
||||||
|
|
||||||
|
#include <geometry/shape_poly_set.h>
|
||||||
|
#include <geometry/shape_file_io.h>
|
||||||
|
|
||||||
|
#include <boost/foreach.hpp>
|
||||||
|
|
||||||
extern void BuildUnconnectedThermalStubsPolygonList( CPOLYGONS_LIST& aCornerBuffer,
|
extern void BuildUnconnectedThermalStubsPolygonList( CPOLYGONS_LIST& aCornerBuffer,
|
||||||
BOARD* aPcb, ZONE_CONTAINER* aZone,
|
BOARD* aPcb, ZONE_CONTAINER* aZone,
|
||||||
|
@ -84,116 +90,28 @@ extern void CreateThermalReliefPadPolygon( CPOLYGONS_LIST& aCornerBuffer,
|
||||||
// Local Variables:
|
// Local Variables:
|
||||||
static double s_thermalRot = 450; // angle of stubs in thermal reliefs for round pads
|
static double s_thermalRot = 450; // angle of stubs in thermal reliefs for round pads
|
||||||
|
|
||||||
// how many segments are used to create a polygon from a circle:
|
void ZONE_CONTAINER::buildFeatureHoleList( BOARD* aPcb, CPOLYGONS_LIST& aFeatures )
|
||||||
static int s_CircleToSegmentsCount = ARC_APPROX_SEGMENTS_COUNT_LOW_DEF; /* default value. the real value will be changed to
|
|
||||||
* ARC_APPROX_SEGMENTS_COUNT_HIGHT_DEF
|
|
||||||
* if m_ArcToSegmentsCount == ARC_APPROX_SEGMENTS_COUNT_HIGHT_DEF
|
|
||||||
*/
|
|
||||||
double s_Correction; /* mult coeff used to enlarge rounded and oval pads (and vias)
|
|
||||||
* because the segment approximation for arcs and circles
|
|
||||||
* create a smaller gap than a true circle
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function AddClearanceAreasPolygonsToPolysList
|
|
||||||
* Supports a min thickness area constraint.
|
|
||||||
* Add non copper areas polygons (pads and tracks with clearance)
|
|
||||||
* to the filled copper area found
|
|
||||||
* in BuildFilledPolysListData after calculating filled areas in a zone
|
|
||||||
* Non filled copper areas are pads and track and their clearance areas
|
|
||||||
* The filled copper area must be computed just before.
|
|
||||||
* BuildFilledPolysListData() call this function just after creating the
|
|
||||||
* filled copper area polygon (without clearance areas)
|
|
||||||
* to do that this function:
|
|
||||||
* 1 - Creates the main outline (zone outline) using a correction to shrink the resulting area
|
|
||||||
* with m_ZoneMinThickness/2 value.
|
|
||||||
* The result is areas with a margin of m_ZoneMinThickness/2
|
|
||||||
* When drawing outline with segments having a thickness of m_ZoneMinThickness, the
|
|
||||||
* outlines will match exactly the initial outlines
|
|
||||||
* 3 - Add all non filled areas (pads, tracks) in group B with a clearance of m_Clearance +
|
|
||||||
* m_ZoneMinThickness/2
|
|
||||||
* in a buffer
|
|
||||||
* - If Thermal shapes are wanted, add non filled area, in order to create these thermal shapes
|
|
||||||
* 4 - calculates the polygon A - B
|
|
||||||
* 5 - put resulting list of polygons (filled areas) in m_FilledPolysList
|
|
||||||
* This zone contains pads with the same net.
|
|
||||||
* 6 - Remove insulated copper islands
|
|
||||||
* 7 - If Thermal shapes are wanted, remove unconnected stubs in thermal shapes:
|
|
||||||
* creates a buffer of polygons corresponding to stubs to remove
|
|
||||||
* sub them to the filled areas.
|
|
||||||
* Remove new insulated copper islands
|
|
||||||
*/
|
|
||||||
void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
|
|
||||||
{
|
{
|
||||||
|
int segsPerCircle;
|
||||||
|
double correctionFactor;
|
||||||
|
|
||||||
// Set the number of segments in arc approximations
|
// Set the number of segments in arc approximations
|
||||||
if( m_ArcToSegmentsCount == ARC_APPROX_SEGMENTS_COUNT_HIGHT_DEF )
|
if( m_ArcToSegmentsCount == ARC_APPROX_SEGMENTS_COUNT_HIGHT_DEF )
|
||||||
s_CircleToSegmentsCount = ARC_APPROX_SEGMENTS_COUNT_HIGHT_DEF;
|
segsPerCircle = ARC_APPROX_SEGMENTS_COUNT_HIGHT_DEF;
|
||||||
else
|
else
|
||||||
s_CircleToSegmentsCount = ARC_APPROX_SEGMENTS_COUNT_LOW_DEF;
|
segsPerCircle = ARC_APPROX_SEGMENTS_COUNT_LOW_DEF;
|
||||||
|
|
||||||
/* calculates the coeff to compensate radius reduction of holes clearance
|
/* calculates the coeff to compensate radius reduction of holes clearance
|
||||||
* due to the segment approx.
|
* due to the segment approx.
|
||||||
* For a circle the min radius is radius * cos( 2PI / s_CircleToSegmentsCount / 2)
|
* For a circle the min radius is radius * cos( 2PI / s_CircleToSegmentsCount / 2)
|
||||||
* s_Correction is 1 /cos( PI/s_CircleToSegmentsCount )
|
* s_Correction is 1 /cos( PI/s_CircleToSegmentsCount )
|
||||||
*/
|
*/
|
||||||
s_Correction = 1.0 / cos( M_PI / s_CircleToSegmentsCount );
|
correctionFactor = 1.0 / cos( M_PI / (double) segsPerCircle );
|
||||||
|
|
||||||
// this is a place to store holes (i.e. tracks, pads ... areas as polygons outlines)
|
aFeatures.RemoveAllContours();
|
||||||
// static to avoid unnecessary memory allocation when filling many zones.
|
|
||||||
static CPOLYGONS_LIST cornerBufferPolysToSubstract;
|
|
||||||
cornerBufferPolysToSubstract.RemoveAllContours();
|
|
||||||
|
|
||||||
// This KI_POLYGON_SET is the area(s) to fill, with m_ZoneMinThickness/2
|
|
||||||
KI_POLYGON_SET polyset_zone_solid_areas;
|
|
||||||
int outline_half_thickness = m_ZoneMinThickness / 2;
|
int outline_half_thickness = m_ZoneMinThickness / 2;
|
||||||
|
|
||||||
/* First, creates the main polygon (i.e. the filled area using only one outline)
|
|
||||||
* to reserve a m_ZoneMinThickness/2 margin around the outlines and holes
|
|
||||||
* this margin is the room to redraw outlines with segments having a width set to
|
|
||||||
* m_ZoneMinThickness
|
|
||||||
* so m_ZoneMinThickness is the min thickness of the filled zones areas
|
|
||||||
* the main polygon is stored in polyset_zone_solid_areas
|
|
||||||
*/
|
|
||||||
#if 0
|
|
||||||
m_smoothedPoly->m_CornersList.ExportTo( polyset_zone_solid_areas );
|
|
||||||
|
|
||||||
if( polyset_zone_solid_areas.size() == 0 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Extract holes (cutout areas) and add them to the hole buffer
|
|
||||||
KI_POLYGON_SET outlineHoles;
|
|
||||||
|
|
||||||
while( polyset_zone_solid_areas.size() > 1 )
|
|
||||||
{
|
|
||||||
outlineHoles.push_back( polyset_zone_solid_areas.back() );
|
|
||||||
polyset_zone_solid_areas.pop_back();
|
|
||||||
}
|
|
||||||
|
|
||||||
// deflate main outline reserve room for thick outline
|
|
||||||
polyset_zone_solid_areas -= outline_half_thickness;
|
|
||||||
// inflate outline holes
|
|
||||||
if( outlineHoles.size() )
|
|
||||||
outlineHoles += outline_half_thickness;
|
|
||||||
|
|
||||||
if( outlineHoles.size() )
|
|
||||||
cornerBufferPolysToSubstract.ImportFrom( outlineHoles );
|
|
||||||
#else
|
|
||||||
CPOLYGONS_LIST tmp;
|
|
||||||
m_smoothedPoly->m_CornersList.InflateOutline( tmp, -outline_half_thickness, true );
|
|
||||||
tmp.ExportTo( polyset_zone_solid_areas );
|
|
||||||
|
|
||||||
if( polyset_zone_solid_areas.size() == 0 )
|
|
||||||
return;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Calculates the clearance value that meet DRC requirements
|
|
||||||
* from m_ZoneClearance and clearance from the corresponding netclass
|
|
||||||
* We have a "local" clearance in zones because most of time
|
|
||||||
* clearance between a zone and others items is bigger than the netclass clearance
|
|
||||||
* this is more true for small clearance values
|
|
||||||
* Note also the "local" clearance is used for clearance between non copper items
|
|
||||||
* or items like texts on copper layers
|
|
||||||
*/
|
|
||||||
int zone_clearance = std::max( m_ZoneClearance, GetClearance() );
|
int zone_clearance = std::max( m_ZoneClearance, GetClearance() );
|
||||||
zone_clearance += outline_half_thickness;
|
zone_clearance += outline_half_thickness;
|
||||||
|
|
||||||
|
@ -266,10 +184,10 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
|
||||||
if( item_boundingbox.Intersects( zone_boundingbox ) )
|
if( item_boundingbox.Intersects( zone_boundingbox ) )
|
||||||
{
|
{
|
||||||
int clearance = std::max( zone_clearance, item_clearance );
|
int clearance = std::max( zone_clearance, item_clearance );
|
||||||
pad->TransformShapeWithClearanceToPolygon( cornerBufferPolysToSubstract,
|
pad->TransformShapeWithClearanceToPolygon( aFeatures,
|
||||||
clearance,
|
clearance,
|
||||||
s_CircleToSegmentsCount,
|
segsPerCircle,
|
||||||
s_Correction );
|
correctionFactor );
|
||||||
}
|
}
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
|
@ -284,10 +202,10 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
|
||||||
|
|
||||||
if( item_boundingbox.Intersects( zone_boundingbox ) )
|
if( item_boundingbox.Intersects( zone_boundingbox ) )
|
||||||
{
|
{
|
||||||
pad->TransformShapeWithClearanceToPolygon( cornerBufferPolysToSubstract,
|
pad->TransformShapeWithClearanceToPolygon( aFeatures,
|
||||||
gap,
|
gap,
|
||||||
s_CircleToSegmentsCount,
|
segsPerCircle,
|
||||||
s_Correction );
|
correctionFactor );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -310,10 +228,10 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
|
||||||
if( item_boundingbox.Intersects( zone_boundingbox ) )
|
if( item_boundingbox.Intersects( zone_boundingbox ) )
|
||||||
{
|
{
|
||||||
int clearance = std::max( zone_clearance, item_clearance );
|
int clearance = std::max( zone_clearance, item_clearance );
|
||||||
track->TransformShapeWithClearanceToPolygon( cornerBufferPolysToSubstract,
|
track->TransformShapeWithClearanceToPolygon( aFeatures,
|
||||||
clearance,
|
clearance,
|
||||||
s_CircleToSegmentsCount,
|
segsPerCircle,
|
||||||
s_Correction );
|
correctionFactor );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -336,8 +254,8 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
|
||||||
if( item_boundingbox.Intersects( zone_boundingbox ) )
|
if( item_boundingbox.Intersects( zone_boundingbox ) )
|
||||||
{
|
{
|
||||||
( (EDGE_MODULE*) item )->TransformShapeWithClearanceToPolygon(
|
( (EDGE_MODULE*) item )->TransformShapeWithClearanceToPolygon(
|
||||||
cornerBufferPolysToSubstract, zone_clearance,
|
aFeatures, zone_clearance,
|
||||||
s_CircleToSegmentsCount, s_Correction );
|
segsPerCircle, correctionFactor );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -352,13 +270,13 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
|
||||||
{
|
{
|
||||||
case PCB_LINE_T:
|
case PCB_LINE_T:
|
||||||
( (DRAWSEGMENT*) item )->TransformShapeWithClearanceToPolygon(
|
( (DRAWSEGMENT*) item )->TransformShapeWithClearanceToPolygon(
|
||||||
cornerBufferPolysToSubstract,
|
aFeatures,
|
||||||
zone_clearance, s_CircleToSegmentsCount, s_Correction );
|
zone_clearance, segsPerCircle, correctionFactor );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PCB_TEXT_T:
|
case PCB_TEXT_T:
|
||||||
( (TEXTE_PCB*) item )->TransformBoundingBoxWithClearanceToPolygon(
|
( (TEXTE_PCB*) item )->TransformBoundingBoxWithClearanceToPolygon(
|
||||||
cornerBufferPolysToSubstract, zone_clearance );
|
aFeatures, zone_clearance );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -409,7 +327,7 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
|
||||||
}
|
}
|
||||||
|
|
||||||
zone->TransformOutlinesShapeWithClearanceToPolygon(
|
zone->TransformOutlinesShapeWithClearanceToPolygon(
|
||||||
cornerBufferPolysToSubstract,
|
aFeatures,
|
||||||
min_clearance, use_net_clearance );
|
min_clearance, use_net_clearance );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -438,26 +356,304 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
|
||||||
|
|
||||||
if( item_boundingbox.Intersects( zone_boundingbox ) )
|
if( item_boundingbox.Intersects( zone_boundingbox ) )
|
||||||
{
|
{
|
||||||
CreateThermalReliefPadPolygon( cornerBufferPolysToSubstract,
|
CreateThermalReliefPadPolygon( aFeatures,
|
||||||
*pad, thermalGap,
|
*pad, thermalGap,
|
||||||
GetThermalReliefCopperBridge( pad ),
|
GetThermalReliefCopperBridge( pad ),
|
||||||
m_ZoneMinThickness,
|
m_ZoneMinThickness,
|
||||||
s_CircleToSegmentsCount,
|
segsPerCircle,
|
||||||
s_Correction, s_thermalRot );
|
correctionFactor, s_thermalRot );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static const SHAPE_POLY_SET convertPolyListToPolySet(const CPOLYGONS_LIST& aList)
|
||||||
|
{
|
||||||
|
SHAPE_POLY_SET rv;
|
||||||
|
|
||||||
|
unsigned corners_count = aList.GetCornersCount();
|
||||||
|
|
||||||
|
// Enter main outline: this is the first contour
|
||||||
|
unsigned ic = 0;
|
||||||
|
|
||||||
|
if(!corners_count)
|
||||||
|
return rv;
|
||||||
|
|
||||||
|
while( ic < corners_count )
|
||||||
|
{
|
||||||
|
rv.NewOutline( );
|
||||||
|
|
||||||
|
while( ic < corners_count )
|
||||||
|
{
|
||||||
|
rv.AppendVertex( aList.GetX(ic), aList.GetY(ic) );
|
||||||
|
if( aList.IsEndContour( ic ) )
|
||||||
|
break;
|
||||||
|
|
||||||
|
ic++;
|
||||||
|
}
|
||||||
|
ic++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const CPOLYGONS_LIST convertPolySetToPolyList(const SHAPE_POLY_SET& aPolyset)
|
||||||
|
{
|
||||||
|
CPOLYGONS_LIST list;
|
||||||
|
|
||||||
|
CPolyPt corner, firstCorner;
|
||||||
|
|
||||||
|
for( int ii = 0; ii < aPolyset.OutlineCount(); ii++ )
|
||||||
|
{
|
||||||
|
|
||||||
|
for( int jj = 0; jj < aPolyset.VertexCount(ii); jj++ )
|
||||||
|
{
|
||||||
|
VECTOR2I v = aPolyset.GetVertex( jj, ii );
|
||||||
|
|
||||||
|
|
||||||
|
corner.x = v.x;
|
||||||
|
corner.y = v.y;
|
||||||
|
corner.end_contour = false;
|
||||||
|
|
||||||
|
if(!jj)
|
||||||
|
firstCorner = corner;
|
||||||
|
|
||||||
|
list.AddCorner( corner );
|
||||||
|
}
|
||||||
|
|
||||||
|
firstCorner.end_contour = true;
|
||||||
|
list.AddCorner( firstCorner );
|
||||||
|
}
|
||||||
|
|
||||||
|
return list;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static const SHAPE_POLY_SET convertBoostToPolySet ( const KI_POLYGON_SET& aSet )
|
||||||
|
{
|
||||||
|
SHAPE_POLY_SET rv;
|
||||||
|
|
||||||
|
BOOST_FOREACH ( const KI_POLYGON &poly, aSet )
|
||||||
|
{
|
||||||
|
rv.NewOutline();
|
||||||
|
for ( KI_POLYGON::iterator_type corner = poly.begin(); corner != poly.end(); ++ corner )
|
||||||
|
{
|
||||||
|
rv.AppendVertex ( corner->x(), corner->y() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function AddClearanceAreasPolygonsToPolysList
|
||||||
|
* Supports a min thickness area constraint.
|
||||||
|
* Add non copper areas polygons (pads and tracks with clearance)
|
||||||
|
* to the filled copper area found
|
||||||
|
* in BuildFilledPolysListData after calculating filled areas in a zone
|
||||||
|
* Non filled copper areas are pads and track and their clearance areas
|
||||||
|
* The filled copper area must be computed just before.
|
||||||
|
* BuildFilledPolysListData() call this function just after creating the
|
||||||
|
* filled copper area polygon (without clearance areas)
|
||||||
|
* to do that this function:
|
||||||
|
* 1 - Creates the main outline (zone outline) using a correction to shrink the resulting area
|
||||||
|
* with m_ZoneMinThickness/2 value.
|
||||||
|
* The result is areas with a margin of m_ZoneMinThickness/2
|
||||||
|
* When drawing outline with segments having a thickness of m_ZoneMinThickness, the
|
||||||
|
* outlines will match exactly the initial outlines
|
||||||
|
* 3 - Add all non filled areas (pads, tracks) in group B with a clearance of m_Clearance +
|
||||||
|
* m_ZoneMinThickness/2
|
||||||
|
* in a buffer
|
||||||
|
* - If Thermal shapes are wanted, add non filled area, in order to create these thermal shapes
|
||||||
|
* 4 - calculates the polygon A - B
|
||||||
|
* 5 - put resulting list of polygons (filled areas) in m_FilledPolysList
|
||||||
|
* This zone contains pads with the same net.
|
||||||
|
* 6 - Remove insulated copper islands
|
||||||
|
* 7 - If Thermal shapes are wanted, remove unconnected stubs in thermal shapes:
|
||||||
|
* creates a buffer of polygons corresponding to stubs to remove
|
||||||
|
* sub them to the filled areas.
|
||||||
|
* Remove new insulated copper islands
|
||||||
|
*/
|
||||||
|
|
||||||
|
void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList_NG( BOARD* aPcb )
|
||||||
|
{
|
||||||
|
int segsPerCircle;
|
||||||
|
double correctionFactor;
|
||||||
|
int outline_half_thickness = m_ZoneMinThickness / 2;
|
||||||
|
|
||||||
|
std::auto_ptr<SHAPE_FILE_IO> dumper( new SHAPE_FILE_IO( "zones_dump.txt", true ) );
|
||||||
|
|
||||||
|
// Set the number of segments in arc approximations
|
||||||
|
if( m_ArcToSegmentsCount == ARC_APPROX_SEGMENTS_COUNT_HIGHT_DEF )
|
||||||
|
segsPerCircle = ARC_APPROX_SEGMENTS_COUNT_HIGHT_DEF;
|
||||||
|
else
|
||||||
|
segsPerCircle = ARC_APPROX_SEGMENTS_COUNT_LOW_DEF;
|
||||||
|
|
||||||
|
/* calculates the coeff to compensate radius reduction of holes clearance
|
||||||
|
* due to the segment approx.
|
||||||
|
* For a circle the min radius is radius * cos( 2PI / s_CircleToSegmentsCount / 2)
|
||||||
|
* s_Correction is 1 /cos( PI/s_CircleToSegmentsCount )
|
||||||
|
*/
|
||||||
|
correctionFactor = 1.0 / cos( M_PI / (double) segsPerCircle );
|
||||||
|
|
||||||
|
CPOLYGONS_LIST tmp;
|
||||||
|
|
||||||
|
if(g_DumpZonesWhenFilling)
|
||||||
|
dumper->BeginGroup("clipper-zone");
|
||||||
|
|
||||||
|
m_smoothedPoly->m_CornersList.InflateOutline( tmp, -outline_half_thickness, true );
|
||||||
|
SHAPE_POLY_SET solidAreas = convertPolyListToPolySet( tmp );
|
||||||
|
|
||||||
|
if(g_DumpZonesWhenFilling)
|
||||||
|
dumper->Write ( &solidAreas, "solid-areas" );
|
||||||
|
|
||||||
|
|
||||||
|
tmp.RemoveAllContours();
|
||||||
|
buildFeatureHoleList( aPcb, tmp );
|
||||||
|
SHAPE_POLY_SET holes = convertPolyListToPolySet( tmp );
|
||||||
|
|
||||||
|
if(g_DumpZonesWhenFilling)
|
||||||
|
dumper->Write ( &holes, "feature-holes" );
|
||||||
|
|
||||||
|
holes.Simplify();
|
||||||
|
|
||||||
|
if (g_DumpZonesWhenFilling)
|
||||||
|
dumper->Write ( &holes, "feature-holes-postsimplify" );
|
||||||
|
|
||||||
|
solidAreas.Subtract ( holes );
|
||||||
|
|
||||||
|
if (g_DumpZonesWhenFilling)
|
||||||
|
dumper->Write ( &solidAreas, "solid-areas-minus-holes" );
|
||||||
|
|
||||||
|
m_FilledPolysList.RemoveAllContours();
|
||||||
|
|
||||||
|
SHAPE_POLY_SET fractured = solidAreas;
|
||||||
|
fractured.Fracture();
|
||||||
|
|
||||||
|
if (g_DumpZonesWhenFilling)
|
||||||
|
dumper->Write ( &fractured, "fractured" );
|
||||||
|
|
||||||
|
m_FilledPolysList = convertPolySetToPolyList( fractured );
|
||||||
|
|
||||||
|
if (g_DumpZonesWhenFilling)
|
||||||
|
{
|
||||||
|
SHAPE_POLY_SET dupa = convertPolyListToPolySet ( m_FilledPolysList );
|
||||||
|
dumper->Write ( &dupa, "verify-conv" );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Remove insulated islands:
|
||||||
|
if( GetNetCode() > 0 )
|
||||||
|
TestForCopperIslandAndRemoveInsulatedIslands( aPcb );
|
||||||
|
|
||||||
|
tmp.RemoveAllContours();
|
||||||
|
// Test thermal stubs connections and add polygons to remove unconnected stubs.
|
||||||
|
// (this is a refinement for thermal relief shapes)
|
||||||
|
if( GetNetCode() > 0 )
|
||||||
|
BuildUnconnectedThermalStubsPolygonList( tmp, aPcb, this,
|
||||||
|
correctionFactor, s_thermalRot );
|
||||||
|
|
||||||
|
// remove copper areas corresponding to not connected stubs
|
||||||
|
if( tmp.GetCornersCount() )
|
||||||
|
{
|
||||||
|
SHAPE_POLY_SET thermalHoles = convertPolyListToPolySet ( tmp );
|
||||||
|
thermalHoles.Simplify();
|
||||||
|
// Remove unconnected stubs
|
||||||
|
solidAreas.Subtract ( thermalHoles );
|
||||||
|
|
||||||
|
if (g_DumpZonesWhenFilling)
|
||||||
|
dumper->Write ( &thermalHoles, "thermal-holes" );
|
||||||
|
|
||||||
|
|
||||||
|
// put these areas in m_FilledPolysList
|
||||||
|
m_FilledPolysList.RemoveAllContours();
|
||||||
|
|
||||||
|
SHAPE_POLY_SET fractured = solidAreas;
|
||||||
|
fractured.Fracture();
|
||||||
|
|
||||||
|
if (g_DumpZonesWhenFilling)
|
||||||
|
dumper->Write ( &fractured, "fractured" );
|
||||||
|
|
||||||
|
m_FilledPolysList = convertPolySetToPolyList( fractured );
|
||||||
|
|
||||||
|
if( GetNetCode() > 0 )
|
||||||
|
TestForCopperIslandAndRemoveInsulatedIslands( aPcb );
|
||||||
|
}
|
||||||
|
|
||||||
|
if(g_DumpZonesWhenFilling)
|
||||||
|
dumper->EndGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
|
||||||
|
{
|
||||||
|
int segsPerCircle;
|
||||||
|
double correctionFactor;
|
||||||
|
|
||||||
|
std::auto_ptr<SHAPE_FILE_IO> dumper( new SHAPE_FILE_IO( "zones_dump.txt", true ) );
|
||||||
|
|
||||||
|
|
||||||
|
if(g_DumpZonesWhenFilling)
|
||||||
|
dumper->BeginGroup("boost-zone");
|
||||||
|
|
||||||
|
// Set the number of segments in arc approximations
|
||||||
|
if( m_ArcToSegmentsCount == ARC_APPROX_SEGMENTS_COUNT_HIGHT_DEF )
|
||||||
|
segsPerCircle = ARC_APPROX_SEGMENTS_COUNT_HIGHT_DEF;
|
||||||
|
else
|
||||||
|
segsPerCircle = ARC_APPROX_SEGMENTS_COUNT_LOW_DEF;
|
||||||
|
|
||||||
|
/* calculates the coeff to compensate radius reduction of holes clearance
|
||||||
|
* due to the segment approx.
|
||||||
|
* For a circle the min radius is radius * cos( 2PI / s_CircleToSegmentsCount / 2)
|
||||||
|
* s_Correction is 1 /cos( PI/s_CircleToSegmentsCount )
|
||||||
|
*/
|
||||||
|
correctionFactor = 1.0 / cos( M_PI / (double) segsPerCircle );
|
||||||
|
|
||||||
|
// this is a place to store holes (i.e. tracks, pads ... areas as polygons outlines)
|
||||||
|
// static to avoid unnecessary memory allocation when filling many zones.
|
||||||
|
CPOLYGONS_LIST cornerBufferPolysToSubstract;
|
||||||
|
|
||||||
|
// This KI_POLYGON_SET is the area(s) to fill, with m_ZoneMinThickness/2
|
||||||
|
KI_POLYGON_SET polyset_zone_solid_areas;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int outline_half_thickness = m_ZoneMinThickness / 2;
|
||||||
|
|
||||||
|
/* First, creates the main polygon (i.e. the filled area using only one outline)
|
||||||
|
* to reserve a m_ZoneMinThickness/2 margin around the outlines and holes
|
||||||
|
* this margin is the room to redraw outlines with segments having a width set to
|
||||||
|
* m_ZoneMinThickness
|
||||||
|
* so m_ZoneMinThickness is the min thickness of the filled zones areas
|
||||||
|
* the main polygon is stored in polyset_zone_solid_areas
|
||||||
|
*/
|
||||||
|
CPOLYGONS_LIST tmp;
|
||||||
|
m_smoothedPoly->m_CornersList.InflateOutline( tmp, -outline_half_thickness, true );
|
||||||
|
tmp.ExportTo( polyset_zone_solid_areas );
|
||||||
|
|
||||||
|
if( polyset_zone_solid_areas.size() == 0 )
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (g_DumpZonesWhenFilling)
|
||||||
|
dumper->Write ( convertBoostToPolySet( polyset_zone_solid_areas ), "solid-areas" );
|
||||||
|
|
||||||
|
buildFeatureHoleList( aPcb, cornerBufferPolysToSubstract );
|
||||||
|
|
||||||
// cornerBufferPolysToSubstract contains polygons to substract.
|
// cornerBufferPolysToSubstract contains polygons to substract.
|
||||||
// polyset_zone_solid_areas contains the main filled area
|
// polyset_zone_solid_areas contains the main filled area
|
||||||
// Calculate now actual solid areas
|
// Calculate now actual solid areas
|
||||||
if( cornerBufferPolysToSubstract.GetCornersCount() > 0 )
|
if( cornerBufferPolysToSubstract.GetCornersCount() > 0 )
|
||||||
{
|
{
|
||||||
KI_POLYGON_SET polyset_holes;
|
KI_POLYGON_SET polyset_holes;
|
||||||
|
|
||||||
cornerBufferPolysToSubstract.ExportTo( polyset_holes );
|
cornerBufferPolysToSubstract.ExportTo( polyset_holes );
|
||||||
|
|
||||||
|
if (g_DumpZonesWhenFilling)
|
||||||
|
dumper->Write ( convertBoostToPolySet( polyset_holes ), "feature-holes" );
|
||||||
|
|
||||||
// Remove holes from initial area.:
|
// Remove holes from initial area.:
|
||||||
polyset_zone_solid_areas -= polyset_holes;
|
polyset_zone_solid_areas -= polyset_holes;
|
||||||
}
|
}
|
||||||
|
|
||||||
// put solid areas in m_FilledPolysList:
|
// put solid areas in m_FilledPolysList:
|
||||||
m_FilledPolysList.RemoveAllContours();
|
m_FilledPolysList.RemoveAllContours();
|
||||||
|
@ -474,7 +670,7 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
|
||||||
// (this is a refinement for thermal relief shapes)
|
// (this is a refinement for thermal relief shapes)
|
||||||
if( GetNetCode() > 0 )
|
if( GetNetCode() > 0 )
|
||||||
BuildUnconnectedThermalStubsPolygonList( cornerBufferPolysToSubstract, aPcb, this,
|
BuildUnconnectedThermalStubsPolygonList( cornerBufferPolysToSubstract, aPcb, this,
|
||||||
s_Correction, s_thermalRot );
|
correctionFactor, s_thermalRot );
|
||||||
|
|
||||||
// remove copper areas corresponding to not connected stubs
|
// remove copper areas corresponding to not connected stubs
|
||||||
if( cornerBufferPolysToSubstract.GetCornersCount() )
|
if( cornerBufferPolysToSubstract.GetCornersCount() )
|
||||||
|
@ -482,6 +678,9 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
|
||||||
KI_POLYGON_SET polyset_holes;
|
KI_POLYGON_SET polyset_holes;
|
||||||
cornerBufferPolysToSubstract.ExportTo( polyset_holes );
|
cornerBufferPolysToSubstract.ExportTo( polyset_holes );
|
||||||
|
|
||||||
|
if (g_DumpZonesWhenFilling)
|
||||||
|
dumper->Write ( convertBoostToPolySet( polyset_holes ), "thermal-holes" );
|
||||||
|
|
||||||
// Remove unconnected stubs
|
// Remove unconnected stubs
|
||||||
polyset_zone_solid_areas -= polyset_holes;
|
polyset_zone_solid_areas -= polyset_holes;
|
||||||
|
|
||||||
|
@ -493,6 +692,10 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
|
||||||
TestForCopperIslandAndRemoveInsulatedIslands( aPcb );
|
TestForCopperIslandAndRemoveInsulatedIslands( aPcb );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (g_DumpZonesWhenFilling)
|
||||||
|
dumper->Write ( convertBoostToPolySet( polyset_zone_solid_areas ), "complete" );
|
||||||
|
|
||||||
cornerBufferPolysToSubstract.RemoveAllContours();
|
cornerBufferPolysToSubstract.RemoveAllContours();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -502,9 +705,3 @@ void ZONE_CONTAINER::CopyPolygonsFromKiPolygonListToFilledPolysList( KI_POLYGON_
|
||||||
m_FilledPolysList.RemoveAllContours();
|
m_FilledPolysList.RemoveAllContours();
|
||||||
m_FilledPolysList.ImportFrom( aKiPolyList );
|
m_FilledPolysList.ImportFrom( aKiPolyList );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ZONE_CONTAINER::CopyPolygonsFromFilledPolysListToKiPolygonList( KI_POLYGON_SET& aKiPolyList )
|
|
||||||
{
|
|
||||||
m_FilledPolysList.ExportTo( aKiPolyList );
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue