2008-11-14 22:40:31 +00:00
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
// Name: dialog_copper_zones.cpp
|
|
|
|
// Author: jean-pierre Charras
|
|
|
|
// Created: 09/oct/2008
|
|
|
|
/// Licence: GNU License
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2011-02-19 10:13:09 +00:00
|
|
|
#include <wx/wx.h>
|
|
|
|
#include <wx/imaglist.h>
|
2008-11-14 22:40:31 +00:00
|
|
|
#include "fctsys.h"
|
2009-02-04 15:25:03 +00:00
|
|
|
#include "appl_wxstruct.h"
|
2008-11-14 22:40:31 +00:00
|
|
|
#include "common.h"
|
2009-02-04 15:25:03 +00:00
|
|
|
#include "confirm.h"
|
2008-11-14 22:40:31 +00:00
|
|
|
#include "PolyLine.h"
|
|
|
|
#include "pcbnew.h"
|
2009-07-30 11:04:07 +00:00
|
|
|
#include "wxPcbStruct.h"
|
2008-11-14 22:40:31 +00:00
|
|
|
#include "trigo.h"
|
|
|
|
#include "zones.h"
|
|
|
|
|
|
|
|
#include "dialog_copper_zones.h"
|
2011-02-21 19:43:59 +00:00
|
|
|
#include "class_zone_setting.h"
|
2008-11-14 22:40:31 +00:00
|
|
|
|
2011-02-19 10:13:09 +00:00
|
|
|
#define LAYER_BITMAP_SIZE_X 20
|
|
|
|
#define LAYER_BITMAP_SIZE_Y 10
|
|
|
|
|
2010-11-13 19:21:16 +00:00
|
|
|
/* the filter to show nets (default * "*").
|
|
|
|
* static to keep this pattern for an entire pcbnew session
|
|
|
|
*/
|
|
|
|
wxString dialog_copper_zone::m_netNameShowFilter( wxT( "*" ) );
|
2008-11-14 22:40:31 +00:00
|
|
|
|
|
|
|
/************************************************************************************************/
|
|
|
|
dialog_copper_zone::dialog_copper_zone( WinEDA_PcbFrame* parent, ZONE_SETTING* zone_setting ) :
|
|
|
|
dialog_copper_zone_base( parent )
|
|
|
|
/************************************************************************************************/
|
|
|
|
{
|
|
|
|
m_Parent = parent;
|
2008-12-08 15:27:13 +00:00
|
|
|
m_Config = wxGetApp().m_EDA_Config;
|
2008-11-14 22:40:31 +00:00
|
|
|
m_Zone_Setting = zone_setting;
|
2010-11-13 19:21:16 +00:00
|
|
|
m_NetSortingByPadCount = true; /* false = alphabetic sort.
|
|
|
|
* true = pad count sort.
|
|
|
|
*/
|
|
|
|
m_OnExitCode = ZONE_ABORT;
|
2009-08-23 15:22:44 +00:00
|
|
|
|
2008-11-14 22:40:31 +00:00
|
|
|
SetReturnCode( ZONE_ABORT ); // Will be changed on buttons click
|
2010-02-19 13:23:58 +00:00
|
|
|
|
2011-02-19 10:13:09 +00:00
|
|
|
m_LayerSelectionCtrl = new wxListView( this, wxID_ANY,
|
|
|
|
wxDefaultPosition, wxDefaultSize,
|
|
|
|
wxLC_NO_HEADER | wxLC_REPORT
|
|
|
|
| wxLC_SINGLE_SEL | wxRAISED_BORDER );
|
|
|
|
wxListItem col0;
|
|
|
|
col0.SetId( 0 );
|
|
|
|
m_LayerSelectionCtrl->InsertColumn( 0, col0 );
|
|
|
|
m_layerSizer->Add( m_LayerSelectionCtrl, 1,
|
|
|
|
wxGROW | wxLEFT | wxRIGHT | wxBOTTOM, 5 );
|
|
|
|
|
2010-02-03 17:38:32 +00:00
|
|
|
initDialog();
|
2010-01-20 12:43:05 +00:00
|
|
|
|
2010-02-03 17:38:32 +00:00
|
|
|
GetSizer()->SetSizeHints( this );
|
2010-01-20 12:43:05 +00:00
|
|
|
Center();
|
2008-11-14 22:40:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************/
|
2010-08-23 12:13:48 +00:00
|
|
|
void dialog_copper_zone::initDialog()
|
2008-11-14 22:40:31 +00:00
|
|
|
/*****************************************************************/
|
|
|
|
|
|
|
|
// Initialise all dialog options and values in wxTextCtrl
|
|
|
|
{
|
2009-01-05 05:21:35 +00:00
|
|
|
BOARD* board = m_Parent->GetBoard();
|
2008-11-14 22:40:31 +00:00
|
|
|
|
|
|
|
SetFocus(); // Required under wxGTK if we want to demiss the dialog with the ESC key
|
|
|
|
|
2008-11-22 20:50:30 +00:00
|
|
|
wxString msg;
|
2008-11-14 22:40:31 +00:00
|
|
|
|
|
|
|
if( g_Zone_45_Only )
|
|
|
|
m_OrientEdgesOpt->SetSelection( 1 );
|
|
|
|
|
2009-01-24 19:30:39 +00:00
|
|
|
m_FillModeCtrl->SetSelection( m_Zone_Setting->m_FillMode ? 1 : 0 );
|
2008-11-14 22:40:31 +00:00
|
|
|
|
2010-07-12 14:07:09 +00:00
|
|
|
AddUnitSymbol( *m_ClearanceValueTitle, g_UserUnit );
|
|
|
|
msg = ReturnStringFromValue( g_UserUnit,
|
2009-01-24 19:30:39 +00:00
|
|
|
m_Zone_Setting->m_ZoneClearance,
|
|
|
|
m_Parent->m_InternalUnits );
|
2008-11-14 22:40:31 +00:00
|
|
|
m_ZoneClearanceCtrl->SetValue( msg );
|
|
|
|
|
2010-07-12 14:07:09 +00:00
|
|
|
AddUnitSymbol( *m_MinThicknessValueTitle, g_UserUnit );
|
|
|
|
msg = ReturnStringFromValue( g_UserUnit,
|
2009-01-24 19:30:39 +00:00
|
|
|
m_Zone_Setting->m_ZoneMinThickness,
|
|
|
|
m_Parent->m_InternalUnits );
|
2008-11-22 20:50:30 +00:00
|
|
|
m_ZoneMinThicknessCtrl->SetValue( msg );
|
|
|
|
|
2008-11-14 22:40:31 +00:00
|
|
|
switch( m_Zone_Setting->m_Zone_Pad_Options )
|
|
|
|
{
|
|
|
|
case PAD_NOT_IN_ZONE: // Pads are not covered
|
|
|
|
m_PadInZoneOpt->SetSelection( 2 );
|
|
|
|
break;
|
|
|
|
|
|
|
|
case THERMAL_PAD: // Use thermal relief for pads
|
|
|
|
m_PadInZoneOpt->SetSelection( 1 );
|
|
|
|
break;
|
|
|
|
|
|
|
|
case PAD_IN_ZONE: // pads are covered by copper
|
|
|
|
m_PadInZoneOpt->SetSelection( 0 );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if( m_Zone_Setting->m_Zone_Pad_Options != THERMAL_PAD )
|
|
|
|
{
|
|
|
|
m_AntipadSizeValue->Enable( false );
|
|
|
|
m_CopperWidthValue->Enable( false );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
m_AntipadSizeValue->Enable( true );
|
|
|
|
m_CopperWidthValue->Enable( true );
|
|
|
|
}
|
|
|
|
|
2010-07-12 14:07:09 +00:00
|
|
|
AddUnitSymbol( *m_AntipadSizeText, g_UserUnit );
|
|
|
|
AddUnitSymbol( *m_CopperBridgeWidthText, g_UserUnit );
|
2008-11-14 22:40:31 +00:00
|
|
|
PutValueInLocalUnits( *m_AntipadSizeValue,
|
2009-01-24 19:30:39 +00:00
|
|
|
m_Zone_Setting->m_ThermalReliefGapValue,
|
|
|
|
PCB_INTERNAL_UNIT );
|
2008-11-14 22:40:31 +00:00
|
|
|
PutValueInLocalUnits( *m_CopperWidthValue,
|
2009-01-24 19:30:39 +00:00
|
|
|
m_Zone_Setting->m_ThermalReliefCopperBridgeValue,
|
|
|
|
PCB_INTERNAL_UNIT );
|
2008-11-14 22:40:31 +00:00
|
|
|
|
2011-02-21 19:43:59 +00:00
|
|
|
m_cornerSmoothingChoice->SetSelection( m_Zone_Setting->GetCornerSmoothingType() );
|
|
|
|
|
|
|
|
AddUnitSymbol( *m_cornerSmoothingTitle, g_UserUnit );
|
|
|
|
PutValueInLocalUnits( *m_cornerSmoothingCtrl,
|
|
|
|
m_Zone_Setting->GetCornerRadius(),
|
|
|
|
PCB_INTERNAL_UNIT );
|
|
|
|
|
2008-11-14 22:40:31 +00:00
|
|
|
switch( m_Zone_Setting->m_Zone_HatchingStyle )
|
|
|
|
{
|
|
|
|
case CPolyLine::NO_HATCH:
|
|
|
|
m_OutlineAppearanceCtrl->SetSelection( 0 );
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CPolyLine::DIAGONAL_EDGE:
|
|
|
|
m_OutlineAppearanceCtrl->SetSelection( 1 );
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CPolyLine::DIAGONAL_FULL:
|
|
|
|
m_OutlineAppearanceCtrl->SetSelection( 2 );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2010-01-12 13:15:13 +00:00
|
|
|
m_ArcApproximationOpt->SetSelection(
|
|
|
|
m_Zone_Setting->m_ArcToSegmentsCount == ARC_APPROX_SEGMENTS_COUNT_HIGHT_DEF ? 1 : 0 );
|
2008-11-14 22:40:31 +00:00
|
|
|
|
2011-02-19 10:13:09 +00:00
|
|
|
// Build copper layer list and append to layer widget
|
|
|
|
int layerCount = board->GetCopperLayerCount();
|
|
|
|
int layerNumber, itemIndex, layerColor;
|
|
|
|
wxImageList* imageList = new wxImageList( LAYER_BITMAP_SIZE_X, LAYER_BITMAP_SIZE_Y );
|
|
|
|
m_LayerSelectionCtrl->AssignImageList( imageList, wxIMAGE_LIST_SMALL );
|
|
|
|
for( int ii = 0; ii < layerCount; ii++ )
|
2008-11-14 22:40:31 +00:00
|
|
|
{
|
2011-02-19 10:13:09 +00:00
|
|
|
layerNumber = LAYER_N_BACK;
|
2008-11-14 22:40:31 +00:00
|
|
|
|
2011-02-19 10:13:09 +00:00
|
|
|
if( layerCount <= 1 || ii < layerCount - 1 )
|
|
|
|
layerNumber = ii;
|
|
|
|
else if( ii == layerCount - 1 )
|
|
|
|
layerNumber = LAYER_N_FRONT;
|
2008-11-14 22:40:31 +00:00
|
|
|
|
2011-02-19 10:13:09 +00:00
|
|
|
m_LayerId.insert( m_LayerId.begin(), layerNumber );
|
2008-11-14 22:40:31 +00:00
|
|
|
|
2011-02-19 10:13:09 +00:00
|
|
|
msg = board->GetLayerName( layerNumber ).Trim();
|
|
|
|
layerColor = board->GetLayerColor( layerNumber );
|
|
|
|
imageList->Add( makeLayerBitmap( layerColor ) );
|
|
|
|
itemIndex = m_LayerSelectionCtrl->InsertItem( 0, msg, ii );
|
2008-11-14 22:40:31 +00:00
|
|
|
|
2011-02-19 10:13:09 +00:00
|
|
|
if( m_Zone_Setting->m_CurrentZone_Layer == layerNumber )
|
|
|
|
m_LayerSelectionCtrl->Select( itemIndex );
|
2008-11-14 22:40:31 +00:00
|
|
|
}
|
|
|
|
|
2011-02-19 10:13:09 +00:00
|
|
|
// Set layer list column width to widget width
|
|
|
|
m_LayerSelectionCtrl->SetColumnWidth( 0, m_LayerSelectionCtrl->GetSize().x );
|
|
|
|
|
2010-08-23 12:13:48 +00:00
|
|
|
wxString netNameDoNotShowFilter = wxT( "N-*" );
|
2008-11-22 11:10:40 +00:00
|
|
|
if( m_Config )
|
2008-11-14 22:40:31 +00:00
|
|
|
{
|
2010-08-23 12:13:48 +00:00
|
|
|
int opt = m_Config->Read( ZONE_NET_SORT_OPTION_KEY, 1l );
|
|
|
|
m_NetDisplayOption->SetSelection( opt );
|
|
|
|
m_Config->Read( ZONE_NET_FILTER_STRING_KEY, netNameDoNotShowFilter );
|
2008-11-14 22:40:31 +00:00
|
|
|
}
|
2010-08-23 12:13:48 +00:00
|
|
|
else
|
|
|
|
m_NetDisplayOption->SetSelection( 1 );
|
2008-11-14 22:40:31 +00:00
|
|
|
|
2010-11-13 19:21:16 +00:00
|
|
|
m_ShowNetNameFilter->SetValue( m_netNameShowFilter );
|
2010-08-23 12:13:48 +00:00
|
|
|
initListNetsParams();
|
2008-11-14 22:40:31 +00:00
|
|
|
|
2010-08-23 12:13:48 +00:00
|
|
|
// Build list of nets:
|
|
|
|
m_DoNotShowNetNameFilter->SetValue( netNameDoNotShowFilter );
|
|
|
|
buildAvailableListOfNets();
|
2011-02-21 19:43:59 +00:00
|
|
|
|
|
|
|
wxCommandEvent event;
|
|
|
|
OnCornerSmoothingModeChoice( event );
|
2008-11-14 22:40:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/********************************************************************/
|
|
|
|
void dialog_copper_zone::OnButtonCancelClick( wxCommandEvent& event )
|
|
|
|
/********************************************************************/
|
2011-02-19 10:13:09 +00:00
|
|
|
{
|
|
|
|
Close( true );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void dialog_copper_zone::OnClose( wxCloseEvent& event )
|
2008-11-14 22:40:31 +00:00
|
|
|
{
|
2009-08-23 15:22:44 +00:00
|
|
|
EndModal( m_OnExitCode );
|
2008-11-14 22:40:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-02-21 19:43:59 +00:00
|
|
|
void dialog_copper_zone::OnCornerSmoothingModeChoice( wxCommandEvent& event )
|
|
|
|
{
|
|
|
|
int selection = m_cornerSmoothingChoice->GetSelection();
|
|
|
|
|
|
|
|
switch( selection )
|
|
|
|
{
|
|
|
|
case ZONE_SETTING::SMOOTHING_NONE:
|
|
|
|
m_cornerSmoothingTitle->Enable( false );
|
|
|
|
m_cornerSmoothingCtrl->Enable( false );
|
|
|
|
break;
|
|
|
|
case ZONE_SETTING::SMOOTHING_CHAMFER:
|
|
|
|
m_cornerSmoothingTitle->Enable( true );
|
|
|
|
m_cornerSmoothingCtrl->Enable( true );
|
|
|
|
m_cornerSmoothingTitle->SetLabel( wxT( "Chamfer distance" ) );
|
|
|
|
AddUnitSymbol( *m_cornerSmoothingTitle, g_UserUnit );
|
|
|
|
break;
|
|
|
|
case ZONE_SETTING::SMOOTHING_FILLET:
|
|
|
|
m_cornerSmoothingTitle->Enable( true );
|
|
|
|
m_cornerSmoothingCtrl->Enable( true );
|
|
|
|
m_cornerSmoothingTitle->SetLabel( wxT( "Fillet radius" ) );
|
|
|
|
AddUnitSymbol( *m_cornerSmoothingTitle, g_UserUnit );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
Layout();
|
|
|
|
m_MainBoxSizer->SetSizeHints( this );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2008-11-14 22:40:31 +00:00
|
|
|
/********************************************************************************************/
|
|
|
|
bool dialog_copper_zone::AcceptOptions( bool aPromptForErrors, bool aUseExportableSetupOnly )
|
|
|
|
/********************************************************************************************/
|
|
|
|
|
2010-11-12 16:36:43 +00:00
|
|
|
/**
|
2010-11-12 16:59:16 +00:00
|
|
|
* Function AcceptOptions(
|
2008-11-14 22:40:31 +00:00
|
|
|
* @return false if incorrect options, true if Ok.
|
|
|
|
* @param aPromptForErrors = true to prompt user on incorrectparams
|
|
|
|
* @param aUseExportableSetupOnly = true to use exportable parametres only (used to export this setup to other zones)
|
|
|
|
*/
|
|
|
|
{
|
|
|
|
switch( m_PadInZoneOpt->GetSelection() )
|
|
|
|
{
|
|
|
|
case 2:
|
|
|
|
m_Zone_Setting->m_Zone_Pad_Options = PAD_NOT_IN_ZONE; // Pads are not covered
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 1:
|
|
|
|
m_Zone_Setting->m_Zone_Pad_Options = THERMAL_PAD; // Use thermal relief for pads
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 0:
|
|
|
|
m_Zone_Setting->m_Zone_Pad_Options = PAD_IN_ZONE; // pads are covered by copper
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch( m_OutlineAppearanceCtrl->GetSelection() )
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
m_Zone_Setting->m_Zone_HatchingStyle = CPolyLine::NO_HATCH;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 1:
|
|
|
|
m_Zone_Setting->m_Zone_HatchingStyle = CPolyLine::DIAGONAL_EDGE;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 2:
|
|
|
|
m_Zone_Setting->m_Zone_HatchingStyle = CPolyLine::DIAGONAL_FULL;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2010-01-12 13:15:13 +00:00
|
|
|
m_Zone_Setting->m_ArcToSegmentsCount = m_ArcApproximationOpt->GetSelection() == 1 ?
|
|
|
|
ARC_APPROX_SEGMENTS_COUNT_HIGHT_DEF :
|
|
|
|
ARC_APPROX_SEGMENTS_COUNT_LOW_DEF;
|
2008-11-14 22:40:31 +00:00
|
|
|
|
2008-11-22 11:10:40 +00:00
|
|
|
if( m_Config )
|
2008-11-14 22:40:31 +00:00
|
|
|
{
|
2008-11-22 11:10:40 +00:00
|
|
|
m_Config->Write( ZONE_NET_OUTLINES_HATCH_OPTION_KEY,
|
2009-01-24 19:30:39 +00:00
|
|
|
(long) m_Zone_Setting->m_Zone_HatchingStyle );
|
2010-08-23 12:13:48 +00:00
|
|
|
wxString Filter = m_DoNotShowNetNameFilter->GetValue();
|
2008-11-22 11:10:40 +00:00
|
|
|
m_Config->Write( ZONE_NET_FILTER_STRING_KEY, Filter );
|
2008-11-14 22:40:31 +00:00
|
|
|
}
|
|
|
|
|
2010-08-23 12:13:48 +00:00
|
|
|
m_netNameShowFilter = m_ShowNetNameFilter->GetValue();
|
2008-12-03 10:32:53 +00:00
|
|
|
m_Zone_Setting->m_FillMode = (m_FillModeCtrl->GetSelection() == 0) ? 0 : 1;
|
2008-11-14 22:40:31 +00:00
|
|
|
|
|
|
|
wxString txtvalue = m_ZoneClearanceCtrl->GetValue();
|
|
|
|
m_Zone_Setting->m_ZoneClearance =
|
2010-07-12 14:07:09 +00:00
|
|
|
ReturnValueFromString( g_UserUnit, txtvalue, m_Parent->m_InternalUnits );
|
2008-11-22 20:50:30 +00:00
|
|
|
|
2009-03-03 19:42:49 +00:00
|
|
|
// Test if this is a reasonnable value for this parameter
|
|
|
|
// A too large value can hang pcbnew
|
|
|
|
#define CLEARANCE_MAX_VALUE 5000 // in 1/10000 inch
|
2009-08-23 15:22:44 +00:00
|
|
|
if( m_Zone_Setting->m_ZoneClearance > CLEARANCE_MAX_VALUE )
|
2009-03-03 19:42:49 +00:00
|
|
|
{
|
2011-02-19 10:13:09 +00:00
|
|
|
DisplayError( this, _( "Clearance must be smaller than 0.5\" / 12.7 mm." ) );
|
2009-03-03 19:42:49 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2008-11-22 20:50:30 +00:00
|
|
|
txtvalue = m_ZoneMinThicknessCtrl->GetValue();
|
|
|
|
m_Zone_Setting->m_ZoneMinThickness =
|
2010-07-12 14:07:09 +00:00
|
|
|
ReturnValueFromString( g_UserUnit, txtvalue, m_Parent->m_InternalUnits );
|
2009-01-24 19:30:39 +00:00
|
|
|
if( m_Zone_Setting->m_ZoneMinThickness < 10 )
|
2008-12-03 10:32:53 +00:00
|
|
|
{
|
|
|
|
DisplayError( this,
|
2011-02-19 10:13:09 +00:00
|
|
|
_( "Minimum width must be larger than 0.001\" / 0.0254 mm." ) );
|
2008-12-03 10:32:53 +00:00
|
|
|
return false;
|
|
|
|
}
|
2008-11-22 20:50:30 +00:00
|
|
|
|
2011-02-21 19:43:59 +00:00
|
|
|
m_Zone_Setting->SetCornerSmoothingType( m_cornerSmoothingChoice->GetSelection() );
|
|
|
|
txtvalue = m_cornerSmoothingCtrl->GetValue();
|
|
|
|
m_Zone_Setting->SetCornerRadius( ReturnValueFromString( g_UserUnit, txtvalue, m_Parent->m_InternalUnits ) );
|
|
|
|
|
2008-11-14 22:40:31 +00:00
|
|
|
if( m_OrientEdgesOpt->GetSelection() == 0 )
|
|
|
|
g_Zone_45_Only = FALSE;
|
|
|
|
else
|
|
|
|
g_Zone_45_Only = TRUE;
|
|
|
|
|
|
|
|
m_Zone_Setting->m_ThermalReliefGapValue = ReturnValueFromTextCtrl( *m_AntipadSizeValue,
|
2009-01-24 19:30:39 +00:00
|
|
|
PCB_INTERNAL_UNIT );
|
2008-11-14 22:40:31 +00:00
|
|
|
m_Zone_Setting->m_ThermalReliefCopperBridgeValue = ReturnValueFromTextCtrl(
|
|
|
|
*m_CopperWidthValue,
|
|
|
|
PCB_INTERNAL_UNIT );
|
|
|
|
|
2008-11-22 11:10:40 +00:00
|
|
|
m_Config->Write( ZONE_THERMAL_RELIEF_GAP_STRING_KEY,
|
2009-01-24 19:30:39 +00:00
|
|
|
(long) m_Zone_Setting->m_ThermalReliefGapValue );
|
2008-11-22 11:10:40 +00:00
|
|
|
m_Config->Write(
|
2008-11-14 22:40:31 +00:00
|
|
|
ZONE_THERMAL_RELIEF_COPPER_WIDTH_STRING_KEY,
|
2008-11-24 20:46:41 +00:00
|
|
|
(long) m_Zone_Setting->m_ThermalReliefCopperBridgeValue );
|
|
|
|
|
|
|
|
if( m_Zone_Setting->m_ThermalReliefCopperBridgeValue <= m_Zone_Setting->m_ZoneMinThickness )
|
|
|
|
{
|
2009-01-24 19:30:39 +00:00
|
|
|
DisplayError( this,
|
2011-02-19 10:13:09 +00:00
|
|
|
_( "Thermal relief spoke width is larger than the minimum width." ) );
|
2008-11-24 20:46:41 +00:00
|
|
|
return false;
|
|
|
|
}
|
2008-11-14 22:40:31 +00:00
|
|
|
|
|
|
|
// If we use only exportable to others zones parameters, exit here:
|
|
|
|
if( aUseExportableSetupOnly )
|
|
|
|
return true;
|
|
|
|
|
|
|
|
/* Get the layer selection for this zone */
|
2011-02-19 10:13:09 +00:00
|
|
|
int ii = m_LayerSelectionCtrl->GetFirstSelected();
|
2008-11-14 22:40:31 +00:00
|
|
|
if( ii < 0 && aPromptForErrors )
|
|
|
|
{
|
2011-02-19 10:13:09 +00:00
|
|
|
DisplayError( this, _( "No layer selected." ) );
|
2008-11-14 22:40:31 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
m_Zone_Setting->m_CurrentZone_Layer = m_LayerId[ii];
|
|
|
|
|
|
|
|
/* Get the net name selection for this zone */
|
|
|
|
ii = m_ListNetNameSelection->GetSelection();
|
|
|
|
if( ii < 0 && aPromptForErrors )
|
|
|
|
{
|
2011-02-19 10:13:09 +00:00
|
|
|
DisplayError( this, _( "No net selected." ) );
|
2008-11-14 22:40:31 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2009-08-23 15:22:44 +00:00
|
|
|
if( ii == 0 ) // the not connected option was selected: this is not a good practice: warn:
|
2009-01-24 19:30:39 +00:00
|
|
|
{
|
2009-08-23 15:22:44 +00:00
|
|
|
if( !IsOK( this, _(
|
|
|
|
"You have chosen the \"not connected\" option. This will create insulated copper islands. Are you sure ?" ) )
|
2009-01-24 19:30:39 +00:00
|
|
|
)
|
2009-08-23 15:22:44 +00:00
|
|
|
return false;
|
|
|
|
}
|
2009-01-24 19:30:39 +00:00
|
|
|
|
2008-11-14 22:40:31 +00:00
|
|
|
wxString net_name = m_ListNetNameSelection->GetString( ii );
|
|
|
|
|
|
|
|
g_Zone_Default_Setting.m_NetcodeSelection = 0;
|
2009-01-24 19:30:39 +00:00
|
|
|
|
|
|
|
/* Search net_code for this net, if a net was selected */
|
|
|
|
if( m_ListNetNameSelection->GetSelection() > 0 )
|
2008-11-14 22:40:31 +00:00
|
|
|
{
|
2009-08-23 15:22:44 +00:00
|
|
|
NETINFO_ITEM* net = m_Parent->GetBoard()->FindNet( net_name );
|
2009-05-24 18:28:36 +00:00
|
|
|
if( net )
|
|
|
|
g_Zone_Default_Setting.m_NetcodeSelection = net->GetNet();
|
2008-11-14 22:40:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/***************************************************************************/
|
|
|
|
void dialog_copper_zone::OnNetSortingOptionSelected( wxCommandEvent& event )
|
|
|
|
/***************************************************************************/
|
|
|
|
{
|
2010-08-23 12:13:48 +00:00
|
|
|
initListNetsParams();
|
|
|
|
buildAvailableListOfNets();
|
2008-11-14 22:40:31 +00:00
|
|
|
|
2010-08-23 12:13:48 +00:00
|
|
|
m_netNameShowFilter = m_ShowNetNameFilter->GetValue();
|
2008-11-22 11:10:40 +00:00
|
|
|
if( m_Config )
|
2008-11-14 22:40:31 +00:00
|
|
|
{
|
2010-08-23 12:13:48 +00:00
|
|
|
m_Config->Write( ZONE_NET_SORT_OPTION_KEY, (long) m_NetDisplayOption->GetSelection() );
|
|
|
|
wxString Filter = m_DoNotShowNetNameFilter->GetValue();
|
2008-11-22 11:10:40 +00:00
|
|
|
m_Config->Write( ZONE_NET_FILTER_STRING_KEY, Filter );
|
2008-11-14 22:40:31 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************/
|
|
|
|
void dialog_copper_zone::OnButtonOkClick( wxCommandEvent& event )
|
|
|
|
/*****************************************************************/
|
|
|
|
{
|
2010-08-23 12:13:48 +00:00
|
|
|
m_netNameShowFilter = m_ShowNetNameFilter->GetValue();
|
2008-11-14 22:40:31 +00:00
|
|
|
if( AcceptOptions( true ) )
|
|
|
|
EndModal( ZONE_OK );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
void dialog_copper_zone::ExportSetupToOtherCopperZones( wxCommandEvent& event )
|
|
|
|
/******************************************************************************/
|
|
|
|
{
|
|
|
|
if( !AcceptOptions( true, true ) )
|
|
|
|
return;
|
|
|
|
|
2008-12-03 10:32:53 +00:00
|
|
|
// Export settings ( but layer and netcode ) to others zones:
|
2009-01-05 05:21:35 +00:00
|
|
|
BOARD* pcb = m_Parent->GetBoard();
|
2008-11-14 22:40:31 +00:00
|
|
|
for( int ii = 0; ii < pcb->GetAreaCount(); ii++ )
|
|
|
|
{
|
|
|
|
ZONE_CONTAINER* zone = pcb->GetArea( ii );
|
2008-12-03 10:32:53 +00:00
|
|
|
m_Zone_Setting->ExportSetting( *zone, false ); // false = partiel export
|
2010-02-19 13:23:58 +00:00
|
|
|
m_Parent->OnModify();
|
2008-11-14 22:40:31 +00:00
|
|
|
}
|
2010-01-12 13:15:13 +00:00
|
|
|
|
2009-08-23 15:22:44 +00:00
|
|
|
m_OnExitCode = ZONE_EXPORT_VALUES; // values are exported to others zones
|
2008-11-14 22:40:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************/
|
|
|
|
void dialog_copper_zone::OnPadsInZoneClick( wxCommandEvent& event )
|
|
|
|
/******************************************************************/
|
|
|
|
{
|
|
|
|
switch( m_PadInZoneOpt->GetSelection() )
|
|
|
|
{
|
|
|
|
default:
|
|
|
|
m_AntipadSizeValue->Enable( false );
|
|
|
|
m_CopperWidthValue->Enable( false );
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 1:
|
|
|
|
m_AntipadSizeValue->Enable( true );
|
|
|
|
m_CopperWidthValue->Enable( true );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2010-08-23 12:13:48 +00:00
|
|
|
|
|
|
|
|
2010-11-13 19:21:16 +00:00
|
|
|
/** init m_NetSortingByPadCount and m_NetFiltering values
|
2010-08-23 12:13:48 +00:00
|
|
|
* according to m_NetDisplayOption selection
|
|
|
|
*/
|
|
|
|
void dialog_copper_zone::initListNetsParams()
|
|
|
|
{
|
|
|
|
switch( m_NetDisplayOption->GetSelection() )
|
|
|
|
{
|
|
|
|
case 0:
|
2010-11-13 19:21:16 +00:00
|
|
|
m_NetSortingByPadCount = false;
|
2010-08-23 12:13:48 +00:00
|
|
|
m_NetFiltering = false;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 1:
|
2010-11-13 19:21:16 +00:00
|
|
|
m_NetSortingByPadCount = true;
|
2010-08-23 12:13:48 +00:00
|
|
|
m_NetFiltering = false;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 2:
|
2010-11-13 19:21:16 +00:00
|
|
|
m_NetSortingByPadCount = false;
|
2010-08-23 12:13:48 +00:00
|
|
|
m_NetFiltering = true;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 3:
|
2010-11-13 19:21:16 +00:00
|
|
|
m_NetSortingByPadCount = true;
|
2010-08-23 12:13:48 +00:00
|
|
|
m_NetFiltering = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* Called when clicking on Apply Filter button
|
|
|
|
* Rebuild the list of nets with the currents filters settings.
|
|
|
|
* If the net display options is not a filtered option, force this option
|
|
|
|
*/
|
|
|
|
void dialog_copper_zone::OnRunFiltersButtonClick( wxCommandEvent& event )
|
|
|
|
{
|
|
|
|
m_netNameShowFilter = m_ShowNetNameFilter->GetValue();
|
2010-11-13 19:21:16 +00:00
|
|
|
|
2010-08-23 12:13:48 +00:00
|
|
|
// Ensure filtered option for nets:
|
|
|
|
if( m_NetDisplayOption->GetSelection() == 0 )
|
|
|
|
m_NetDisplayOption->SetSelection( 2 );
|
|
|
|
else if( m_NetDisplayOption->GetSelection() == 1 )
|
|
|
|
m_NetDisplayOption->SetSelection( 3 );
|
|
|
|
initListNetsParams();
|
|
|
|
buildAvailableListOfNets();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void dialog_copper_zone::buildAvailableListOfNets()
|
|
|
|
{
|
|
|
|
wxArrayString listNetName;
|
|
|
|
|
2010-11-13 19:21:16 +00:00
|
|
|
m_Parent->GetBoard()->ReturnSortedNetnamesList( listNetName, m_NetSortingByPadCount );
|
2010-08-23 12:13:48 +00:00
|
|
|
|
|
|
|
if( m_NetFiltering )
|
|
|
|
{
|
|
|
|
wxString doNotShowFilter = m_DoNotShowNetNameFilter->GetValue();
|
|
|
|
wxString ShowFilter = m_ShowNetNameFilter->GetValue();
|
|
|
|
for( unsigned ii = 0; ii < listNetName.GetCount(); ii++ )
|
|
|
|
{
|
|
|
|
if( listNetName[ii].Matches( doNotShowFilter ) )
|
|
|
|
{
|
|
|
|
listNetName.RemoveAt( ii );
|
|
|
|
ii--;
|
|
|
|
}
|
|
|
|
else if( !listNetName[ii].Matches( ShowFilter ) )
|
|
|
|
{
|
|
|
|
listNetName.RemoveAt( ii );
|
|
|
|
ii--;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
m_ListNetNameSelection->Clear();
|
|
|
|
listNetName.Insert( wxT( "<no net>" ), 0 );
|
|
|
|
m_ListNetNameSelection->InsertItems( listNetName, 0 );
|
2011-02-21 19:43:59 +00:00
|
|
|
m_ListNetNameSelection->SetSelection( 0 );
|
2010-08-23 12:13:48 +00:00
|
|
|
|
|
|
|
// Ensure current select net for the zone is visible:
|
|
|
|
int net_select = m_Zone_Setting->m_NetcodeSelection;
|
|
|
|
if( net_select > 0 )
|
|
|
|
{
|
|
|
|
NETINFO_ITEM* equipot = m_Parent->GetBoard()->FindNet( net_select );
|
|
|
|
if( equipot ) // Search net in list and select it
|
|
|
|
{
|
|
|
|
for( unsigned ii = 0; ii < listNetName.GetCount(); ii++ )
|
|
|
|
{
|
|
|
|
if( listNetName[ii] == equipot->GetNetname() )
|
|
|
|
{
|
|
|
|
m_ListNetNameSelection->SetSelection( ii );
|
|
|
|
m_ListNetNameSelection->EnsureVisible( ii );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2011-02-19 10:13:09 +00:00
|
|
|
|
|
|
|
|
|
|
|
wxBitmap dialog_copper_zone::makeLayerBitmap( int aColor )
|
|
|
|
{
|
|
|
|
wxBitmap bitmap( LAYER_BITMAP_SIZE_X, LAYER_BITMAP_SIZE_Y );
|
|
|
|
wxBrush brush;
|
|
|
|
wxMemoryDC iconDC;
|
|
|
|
|
|
|
|
iconDC.SelectObject( bitmap );
|
|
|
|
|
|
|
|
brush.SetColour( MakeColour( aColor ) );
|
|
|
|
brush.SetStyle( wxSOLID );
|
|
|
|
iconDC.SetBrush( brush );
|
|
|
|
|
|
|
|
iconDC.DrawRectangle( 0, 0, LAYER_BITMAP_SIZE_X, LAYER_BITMAP_SIZE_Y );
|
|
|
|
|
|
|
|
return bitmap;
|
|
|
|
}
|