diff --git a/pcbnew/class_zone_setting.h b/pcbnew/class_zone_setting.h index 8d69962bd4..4a1f861a48 100644 --- a/pcbnew/class_zone_setting.h +++ b/pcbnew/class_zone_setting.h @@ -1,48 +1,48 @@ -/****************************************************************/ -/* class ZONE_SETTING used to handle zones parameters in dialogs */ -/****************************************************************/ - -#ifndef ZONE_SETTING_H -#define ZONE_SETTING_H - - -#ifndef eda_global -#define eda_global extern -#endif - - -/*************************************************/ -/* Class ZONE_SETTING to handle zones parameters */ -/*************************************************/ -class ZONE_SETTING -{ -public: - int m_GridFillValue; // Grid value for filling zone by segments, 0 to used polygons to fill - int m_ZoneClearance; // Clearance value - int m_NetcodeSelection; // Net code selection for the current zone - int m_CurrentZone_Layer; // Layer used to create the current zone - int m_Zone_HatchingStyle; // Option to show the zone area (outlines only, short hatches or full hatches - int m_ArcToSegmentsCount; /* Option to select number of segments to approximate a circle - * 16 or 32 segments */ - int m_FilledAreasShowMode; // Used to select draw options for filled areas in a zone (currently normal =0, sketch = 1) - long m_ThermalReliefGapValue; // tickness of the gap in thermal reliefs - long m_ThermalReliefCopperBridgeValue; // tickness of the copper bridge in thermal reliefs - int m_Zone_Pad_Options; // How pads are covered by copper in zone -public: - ZONE_SETTING( void ); - - /** function ImportSetting - * copy settings from a given zone - * @param aSource: the given zone - */ - void ImportSetting( const ZONE_CONTAINER& aSource ); - - /** function ExportSetting - * copy settings to a given zone - * @param aTarget: the given zone - */ - void ExportSetting( ZONE_CONTAINER& aTarget ); -}; - - -#endif // ifndef ZONE_SETTING_H +/****************************************************************/ +/* class ZONE_SETTING used to handle zones parameters in dialogs */ +/****************************************************************/ + +#ifndef ZONE_SETTING_H +#define ZONE_SETTING_H + + +#ifndef eda_global +#define eda_global extern +#endif + + +/*************************************************/ +/* Class ZONE_SETTING to handle zones parameters */ +/*************************************************/ +class ZONE_SETTING +{ +public: + int m_GridFillValue; // Grid value for filling zone by segments, 0 to used polygons to fill + int m_ZoneClearance; // Clearance value + int m_NetcodeSelection; // Net code selection for the current zone + int m_CurrentZone_Layer; // Layer used to create the current zone + int m_Zone_HatchingStyle; // Option to show the zone area (outlines only, short hatches or full hatches + int m_ArcToSegmentsCount; /* Option to select number of segments to approximate a circle + * 16 or 32 segments */ + int m_FilledAreasShowMode; // Used to select draw options for filled areas in a zone (currently normal =0, sketch = 1) + long m_ThermalReliefGapValue; // tickness of the gap in thermal reliefs + long m_ThermalReliefCopperBridgeValue; // tickness of the copper bridge in thermal reliefs + int m_Zone_Pad_Options; // How pads are covered by copper in zone +public: + ZONE_SETTING( void ); + + /** function ImportSetting + * copy settings from a given zone + * @param aSource: the given zone + */ + void ImportSetting( const ZONE_CONTAINER& aSource ); + + /** function ExportSetting + * copy settings to a given zone + * @param aTarget: the given zone + */ + void ExportSetting( ZONE_CONTAINER& aTarget ); +}; + + +#endif // ifndef ZONE_SETTING_H diff --git a/pcbnew/dialog_copper_zones.cpp b/pcbnew/dialog_copper_zones.cpp index 8e059bdaba..f1b906c05c 100644 --- a/pcbnew/dialog_copper_zones.cpp +++ b/pcbnew/dialog_copper_zones.cpp @@ -1,486 +1,486 @@ -///////////////////////////////////////////////////////////////////////////// - -// Name: dialog_copper_zones.cpp -// Author: jean-pierre Charras -// Created: 09/oct/2008 -/// Licence: GNU License -///////////////////////////////////////////////////////////////////////////// - -#if defined (__GNUG__) && !defined (NO_GCC_PRAGMA) -#pragma implementation "zones.h" -#endif - -// For compilers that support precompilation, includes "wx/wx.h". -#include "wx/wxprec.h" - -#ifdef __BORLANDC__ -#pragma hdrstop -#endif - -#ifndef WX_PRECOMP -#include "wx/wx.h" -#endif - -#include "fctsys.h" -#include "wxstruct.h" - -#include "common.h" -#include "PolyLine.h" -#include "pcbnew.h" -#include "trigo.h" -#include "autorout.h" -#include "zones.h" - -#include "dialog_copper_zones.h" - - -/************************************************************************************************/ -dialog_copper_zone::dialog_copper_zone( WinEDA_PcbFrame* parent, ZONE_SETTING* zone_setting ) : - dialog_copper_zone_base( parent ) -/************************************************************************************************/ -{ - m_Parent = parent; - m_Zone_Setting = zone_setting; - m_NetSorting = 1; // 0 = alphabetic sort, 1 = pad count sort - if( m_Parent->m_Parent->m_EDA_Config ) - { - m_NetSorting = m_Parent->m_Parent->m_EDA_Config->Read( ZONE_NET_SORT_OPTION_KEY, 1l ); - } - - SetReturnCode( ZONE_ABORT ); // Will be changed on buttons click -} - - -/*****************************************************************/ -void dialog_copper_zone::OnInitDialog( wxInitDialogEvent& event ) -/*****************************************************************/ - -// Initialise all dialog options and values in wxTextCtrl -{ - BOARD* board = m_Parent->m_Pcb; - - SetFont( *g_DialogFont ); - - SetFocus(); // Required under wxGTK if we want to demiss the dialog with the ESC key - - wxString msg = _( "Zone clearance value:" ) + ReturnUnitSymbol( g_UnitMetric ); - m_ClearanceValueTitle->SetLabel( msg ); - - msg = _( "Grid :" ) + ReturnUnitSymbol( g_UnitMetric ); - m_GridCtrl->SetLabel( msg ); - - msg = ReturnStringFromValue( g_UnitMetric, - m_Zone_Setting->m_ZoneClearance, - m_Parent->m_InternalUnits ); - m_ZoneClearanceCtrl->SetValue( msg ); - - if( g_Zone_45_Only ) - m_OrientEdgesOpt->SetSelection( 1 ); - - static const int GridList[4] = { 25, 50, 100, 250 }; - int selection = 0; - - int grid_routing = m_Zone_Setting->m_GridFillValue; - - for( unsigned ii = 0; ii < 4; ii++ ) - { - msg = ReturnStringFromValue( g_UnitMetric, - GridList[ii], - m_Parent->m_InternalUnits ); - m_GridCtrl->SetString( ii, msg ); - if( grid_routing == GridList[ii] ) - selection = ii; - } - - if( grid_routing == 0 ) // No Grid: fill with polygons - selection = 4; - - m_GridCtrl->SetSelection( selection ); - - msg = ReturnStringFromValue( g_UnitMetric, - m_Zone_Setting->m_ZoneClearance, - m_Parent->m_InternalUnits ); - m_ZoneClearanceCtrl->SetValue( msg ); - - 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_FilledAreasShowMode == 1 ) - m_ShowFilledAreasInSketchOpt->SetValue( true ); - - - 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 ); - } - - AddUnitSymbol( *m_AntipadSizeText, g_UnitMetric ); - AddUnitSymbol( *m_CopperBridgeWidthText, g_UnitMetric ); - PutValueInLocalUnits( *m_AntipadSizeValue, - m_Zone_Setting->m_ThermalReliefGapValue, - PCB_INTERNAL_UNIT ); - PutValueInLocalUnits( *m_CopperWidthValue, - m_Zone_Setting->m_ThermalReliefCopperBridgeValue, - PCB_INTERNAL_UNIT ); - - 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; - } - - m_ArcApproximationOpt->SetSelection( m_Zone_Setting->m_ArcToSegmentsCount == 32 ? 1 : 0 ); - - /* build copper layers list */ - int layer_cnt = board->GetCopperLayerCount(); - for( int ii = 0; ii < board->GetCopperLayerCount(); ii++ ) - { - int layer_number = COPPER_LAYER_N; - - if( layer_cnt <= 1 || ii < layer_cnt - 1 ) - layer_number = ii; - else if( ii == layer_cnt - 1 ) - layer_number = LAYER_CMP_N; - - m_LayerId[ii] = layer_number; - - msg = board->GetLayerName( layer_number ).Trim(); - m_LayerSelectionCtrl->InsertItems( 1, &msg, ii ); - - if( m_Zone_Setting->m_CurrentZone_Layer == layer_number ) - m_LayerSelectionCtrl->SetSelection( ii ); - } - - m_NetSortingOption->SetSelection( m_NetSorting ); - - wxString NetNameFilter; - if( m_Parent->m_Parent->m_EDA_Config ) - { - NetNameFilter = - m_Parent->m_Parent->m_EDA_Config->Read( ZONE_NET_FILTER_STRING_KEY, wxT( "N_0*" ) ); - } - - m_NetNameFilter->SetValue( NetNameFilter ); - wxArrayString ListNetName; - m_Parent->m_Pcb->ReturnSortedNetnamesList( - ListNetName, - m_NetSorting == - 0 ? BOARD::ALPHA_SORT : BOARD::PAD_CNT_SORT ); - - if( m_NetSorting != 0 ) - { - wxString Filter = m_NetNameFilter->GetValue(); - for( unsigned ii = 0; ii < ListNetName.GetCount(); ii++ ) - { - if( ListNetName[ii].Matches( Filter.GetData() ) ) - { - ListNetName.RemoveAt( ii ); - ii--; - } - } - } - - m_ListNetNameSelection->InsertItems( ListNetName, 0 ); - - // Select net: - int net_select = m_Zone_Setting->m_NetcodeSelection; - - if( net_select > 0 ) - { - EQUIPOT* equipot = m_Parent->m_Pcb->FindNet( net_select ); - if( equipot ) // Search net in list and select it - { - for( unsigned ii = 0; ii < ListNetName.GetCount(); ii++ ) - { - if( ListNetName[ii] == equipot->m_Netname ) - { - m_ListNetNameSelection->SetSelection( ii ); - m_ListNetNameSelection->EnsureVisible( ii ); - break; - } - } - } - } - if( GetSizer() ) - { - GetSizer()->SetSizeHints( this ); - } - Center(); -} - - -/********************************************************************/ -void dialog_copper_zone::OnButtonCancelClick( wxCommandEvent& event ) -/********************************************************************/ -{ - EndModal( ZONE_ABORT ); -} - - -/********************************************************************************************/ -bool dialog_copper_zone::AcceptOptions( bool aPromptForErrors, bool aUseExportableSetupOnly ) -/********************************************************************************************/ - -/** Function dialog_copper_zone::AcceptOptions( - * @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; - } - - m_Zone_Setting->m_ArcToSegmentsCount = m_ArcApproximationOpt->GetSelection() == 1 ? 32 : 16; - - if( m_Parent->m_Parent->m_EDA_Config ) - { - m_Parent->m_Parent->m_EDA_Config->Write( ZONE_NET_OUTLINES_HATCH_OPTION_KEY, - (long) m_Zone_Setting->m_Zone_HatchingStyle ); - } - - switch( m_GridCtrl->GetSelection() ) - { - case 0: - m_Zone_Setting->m_GridFillValue = 25; - break; - - case 1: - m_Zone_Setting->m_GridFillValue = 50; - break; - - default: - case 2: - m_Zone_Setting->m_GridFillValue = 100; - break; - - case 3: - m_Zone_Setting->m_GridFillValue = 250; - break; - - case 4: - m_Zone_Setting->m_GridFillValue = 0; -#if 0 // I hope this feature works fine ( JP Charras) - DisplayInfo( this, wxT( - "You are using No grid for filling zones\nThis is currently in development and for tests only.\n Do not use for production" ) ); -#endif - break; - } - - wxString txtvalue = m_ZoneClearanceCtrl->GetValue(); - m_Zone_Setting->m_ZoneClearance = - ReturnValueFromString( g_UnitMetric, txtvalue, m_Parent->m_InternalUnits ); - if( m_OrientEdgesOpt->GetSelection() == 0 ) - g_Zone_45_Only = FALSE; - else - g_Zone_45_Only = TRUE; - - m_Zone_Setting->m_FilledAreasShowMode = m_ShowFilledAreasInSketchOpt->IsChecked() ? 1 : 0; - - m_Zone_Setting->m_ThermalReliefGapValue = ReturnValueFromTextCtrl( *m_AntipadSizeValue, - PCB_INTERNAL_UNIT ); - m_Zone_Setting->m_ThermalReliefCopperBridgeValue = ReturnValueFromTextCtrl( - *m_CopperWidthValue, - PCB_INTERNAL_UNIT ); - - m_Parent->m_Parent->m_EDA_Config->Write( ZONE_THERMAL_RELIEF_GAP_STRING_KEY, - (long) m_Zone_Setting->m_ThermalReliefGapValue ); - m_Parent->m_Parent->m_EDA_Config->Write( - ZONE_THERMAL_RELIEF_COPPER_WIDTH_STRING_KEY, - (long) m_Zone_Setting-> - m_ThermalReliefCopperBridgeValue ); - - // If we use only exportable to others zones parameters, exit here: - if( aUseExportableSetupOnly ) - return true; - - /* Get the layer selection for this zone */ - int ii = m_LayerSelectionCtrl->GetSelection(); - if( ii < 0 && aPromptForErrors ) - { - DisplayError( this, _( "Error : you must choose a layer" ) ); - 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 ) - { - DisplayError( this, _( "Error : you must choose a net name" ) ); - return false; - } - - wxString net_name = m_ListNetNameSelection->GetString( ii ); - - /* Search net_code for this net */ - EQUIPOT* net; - g_Zone_Default_Setting.m_NetcodeSelection = 0; - for( net = m_Parent->m_Pcb->m_Equipots; net; net = net->Next() ) - { - if( net->m_Netname == net_name ) - { - g_Zone_Default_Setting.m_NetcodeSelection = net->GetNet(); - break; - } - } - - return true; -} - - -/***************************************************************************/ -void dialog_copper_zone::OnNetSortingOptionSelected( wxCommandEvent& event ) -/***************************************************************************/ -{ - wxArrayString ListNetName; - - m_NetSorting = m_NetSortingOption->GetSelection(); - m_Parent->m_Pcb->ReturnSortedNetnamesList( - ListNetName, - m_NetSorting == - 0 ? BOARD::ALPHA_SORT : BOARD::PAD_CNT_SORT ); - if( m_NetSorting != 0 ) - { - wxString Filter = m_NetNameFilter->GetValue(); - for( unsigned ii = 0; ii < ListNetName.GetCount(); ii++ ) - { - if( ListNetName[ii].Matches( Filter.GetData() ) ) - { - ListNetName.RemoveAt( ii ); - ii--; - } - } - } - m_ListNetNameSelection->Clear(); - m_ListNetNameSelection->InsertItems( ListNetName, 0 ); - if( m_Parent->m_Parent->m_EDA_Config ) - { - m_Parent->m_Parent->m_EDA_Config->Write( ZONE_NET_SORT_OPTION_KEY, (long) m_NetSorting ); - m_Parent->m_Parent->m_EDA_Config->Write( ZONE_NET_FILTER_STRING_KEY, - m_NetNameFilter->GetValue() ); - } - - // Select and isplay current zone net name in listbox: - int net_select = m_Zone_Setting->m_NetcodeSelection; - if( net_select > 0 ) - { - EQUIPOT* equipot = m_Parent->m_Pcb->FindNet( net_select ); - if( equipot ) // Search net in list and select it - { - for( unsigned ii = 0; ii < ListNetName.GetCount(); ii++ ) - { - if( ListNetName[ii] == equipot->m_Netname ) - { - m_ListNetNameSelection->SetSelection( ii ); - m_ListNetNameSelection->EnsureVisible( ii ); - break; - } - } - } - } -} - - -/*****************************************************************/ -void dialog_copper_zone::OnButtonOkClick( wxCommandEvent& event ) -/*****************************************************************/ -{ - if( AcceptOptions( true ) ) - EndModal( ZONE_OK ); -} - - -/******************************************************************************/ -void dialog_copper_zone::ExportSetupToOtherCopperZones( wxCommandEvent& event ) -/******************************************************************************/ -{ - if( !AcceptOptions( true, true ) ) - return; - - // Export settings ( but layer ) to others zones: - BOARD* pcb = m_Parent->m_Pcb; - for( int ii = 0; ii < pcb->GetAreaCount(); ii++ ) - { - ZONE_CONTAINER* zone = pcb->GetArea( ii ); - int zone_layer = zone->GetLayer(); - m_Zone_Setting->ExportSetting( *zone ); - zone->SetLayer( zone_layer ); - m_Parent->GetScreen()->SetModify(); - } -} - - -/******************************************************************/ -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; - } -} +///////////////////////////////////////////////////////////////////////////// + +// Name: dialog_copper_zones.cpp +// Author: jean-pierre Charras +// Created: 09/oct/2008 +/// Licence: GNU License +///////////////////////////////////////////////////////////////////////////// + +#if defined (__GNUG__) && !defined (NO_GCC_PRAGMA) +#pragma implementation "zones.h" +#endif + +// For compilers that support precompilation, includes "wx/wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + +#ifndef WX_PRECOMP +#include "wx/wx.h" +#endif + +#include "fctsys.h" +#include "wxstruct.h" + +#include "common.h" +#include "PolyLine.h" +#include "pcbnew.h" +#include "trigo.h" +#include "autorout.h" +#include "zones.h" + +#include "dialog_copper_zones.h" + + +/************************************************************************************************/ +dialog_copper_zone::dialog_copper_zone( WinEDA_PcbFrame* parent, ZONE_SETTING* zone_setting ) : + dialog_copper_zone_base( parent ) +/************************************************************************************************/ +{ + m_Parent = parent; + m_Zone_Setting = zone_setting; + m_NetSorting = 1; // 0 = alphabetic sort, 1 = pad count sort + if( m_Parent->m_Parent->m_EDA_Config ) + { + m_NetSorting = m_Parent->m_Parent->m_EDA_Config->Read( ZONE_NET_SORT_OPTION_KEY, 1l ); + } + + SetReturnCode( ZONE_ABORT ); // Will be changed on buttons click +} + + +/*****************************************************************/ +void dialog_copper_zone::OnInitDialog( wxInitDialogEvent& event ) +/*****************************************************************/ + +// Initialise all dialog options and values in wxTextCtrl +{ + BOARD* board = m_Parent->m_Pcb; + + SetFont( *g_DialogFont ); + + SetFocus(); // Required under wxGTK if we want to demiss the dialog with the ESC key + + wxString msg = _( "Zone clearance value:" ) + ReturnUnitSymbol( g_UnitMetric ); + m_ClearanceValueTitle->SetLabel( msg ); + + msg = _( "Grid :" ) + ReturnUnitSymbol( g_UnitMetric ); + m_GridCtrl->SetLabel( msg ); + + msg = ReturnStringFromValue( g_UnitMetric, + m_Zone_Setting->m_ZoneClearance, + m_Parent->m_InternalUnits ); + m_ZoneClearanceCtrl->SetValue( msg ); + + if( g_Zone_45_Only ) + m_OrientEdgesOpt->SetSelection( 1 ); + + static const int GridList[4] = { 25, 50, 100, 250 }; + int selection = 0; + + int grid_routing = m_Zone_Setting->m_GridFillValue; + + for( unsigned ii = 0; ii < 4; ii++ ) + { + msg = ReturnStringFromValue( g_UnitMetric, + GridList[ii], + m_Parent->m_InternalUnits ); + m_GridCtrl->SetString( ii, msg ); + if( grid_routing == GridList[ii] ) + selection = ii; + } + + if( grid_routing == 0 ) // No Grid: fill with polygons + selection = 4; + + m_GridCtrl->SetSelection( selection ); + + msg = ReturnStringFromValue( g_UnitMetric, + m_Zone_Setting->m_ZoneClearance, + m_Parent->m_InternalUnits ); + m_ZoneClearanceCtrl->SetValue( msg ); + + 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_FilledAreasShowMode == 1 ) + m_ShowFilledAreasInSketchOpt->SetValue( true ); + + + 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 ); + } + + AddUnitSymbol( *m_AntipadSizeText, g_UnitMetric ); + AddUnitSymbol( *m_CopperBridgeWidthText, g_UnitMetric ); + PutValueInLocalUnits( *m_AntipadSizeValue, + m_Zone_Setting->m_ThermalReliefGapValue, + PCB_INTERNAL_UNIT ); + PutValueInLocalUnits( *m_CopperWidthValue, + m_Zone_Setting->m_ThermalReliefCopperBridgeValue, + PCB_INTERNAL_UNIT ); + + 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; + } + + m_ArcApproximationOpt->SetSelection( m_Zone_Setting->m_ArcToSegmentsCount == 32 ? 1 : 0 ); + + /* build copper layers list */ + int layer_cnt = board->GetCopperLayerCount(); + for( int ii = 0; ii < board->GetCopperLayerCount(); ii++ ) + { + int layer_number = COPPER_LAYER_N; + + if( layer_cnt <= 1 || ii < layer_cnt - 1 ) + layer_number = ii; + else if( ii == layer_cnt - 1 ) + layer_number = LAYER_CMP_N; + + m_LayerId[ii] = layer_number; + + msg = board->GetLayerName( layer_number ).Trim(); + m_LayerSelectionCtrl->InsertItems( 1, &msg, ii ); + + if( m_Zone_Setting->m_CurrentZone_Layer == layer_number ) + m_LayerSelectionCtrl->SetSelection( ii ); + } + + m_NetSortingOption->SetSelection( m_NetSorting ); + + wxString NetNameFilter; + if( m_Parent->m_Parent->m_EDA_Config ) + { + NetNameFilter = + m_Parent->m_Parent->m_EDA_Config->Read( ZONE_NET_FILTER_STRING_KEY, wxT( "N_0*" ) ); + } + + m_NetNameFilter->SetValue( NetNameFilter ); + wxArrayString ListNetName; + m_Parent->m_Pcb->ReturnSortedNetnamesList( + ListNetName, + m_NetSorting == + 0 ? BOARD::ALPHA_SORT : BOARD::PAD_CNT_SORT ); + + if( m_NetSorting != 0 ) + { + wxString Filter = m_NetNameFilter->GetValue(); + for( unsigned ii = 0; ii < ListNetName.GetCount(); ii++ ) + { + if( ListNetName[ii].Matches( Filter.GetData() ) ) + { + ListNetName.RemoveAt( ii ); + ii--; + } + } + } + + m_ListNetNameSelection->InsertItems( ListNetName, 0 ); + + // Select net: + int net_select = m_Zone_Setting->m_NetcodeSelection; + + if( net_select > 0 ) + { + EQUIPOT* equipot = m_Parent->m_Pcb->FindNet( net_select ); + if( equipot ) // Search net in list and select it + { + for( unsigned ii = 0; ii < ListNetName.GetCount(); ii++ ) + { + if( ListNetName[ii] == equipot->m_Netname ) + { + m_ListNetNameSelection->SetSelection( ii ); + m_ListNetNameSelection->EnsureVisible( ii ); + break; + } + } + } + } + if( GetSizer() ) + { + GetSizer()->SetSizeHints( this ); + } + Center(); +} + + +/********************************************************************/ +void dialog_copper_zone::OnButtonCancelClick( wxCommandEvent& event ) +/********************************************************************/ +{ + EndModal( ZONE_ABORT ); +} + + +/********************************************************************************************/ +bool dialog_copper_zone::AcceptOptions( bool aPromptForErrors, bool aUseExportableSetupOnly ) +/********************************************************************************************/ + +/** Function dialog_copper_zone::AcceptOptions( + * @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; + } + + m_Zone_Setting->m_ArcToSegmentsCount = m_ArcApproximationOpt->GetSelection() == 1 ? 32 : 16; + + if( m_Parent->m_Parent->m_EDA_Config ) + { + m_Parent->m_Parent->m_EDA_Config->Write( ZONE_NET_OUTLINES_HATCH_OPTION_KEY, + (long) m_Zone_Setting->m_Zone_HatchingStyle ); + } + + switch( m_GridCtrl->GetSelection() ) + { + case 0: + m_Zone_Setting->m_GridFillValue = 25; + break; + + case 1: + m_Zone_Setting->m_GridFillValue = 50; + break; + + default: + case 2: + m_Zone_Setting->m_GridFillValue = 100; + break; + + case 3: + m_Zone_Setting->m_GridFillValue = 250; + break; + + case 4: + m_Zone_Setting->m_GridFillValue = 0; +#if 0 // I hope this feature works fine ( JP Charras) + DisplayInfo( this, wxT( + "You are using No grid for filling zones\nThis is currently in development and for tests only.\n Do not use for production" ) ); +#endif + break; + } + + wxString txtvalue = m_ZoneClearanceCtrl->GetValue(); + m_Zone_Setting->m_ZoneClearance = + ReturnValueFromString( g_UnitMetric, txtvalue, m_Parent->m_InternalUnits ); + if( m_OrientEdgesOpt->GetSelection() == 0 ) + g_Zone_45_Only = FALSE; + else + g_Zone_45_Only = TRUE; + + m_Zone_Setting->m_FilledAreasShowMode = m_ShowFilledAreasInSketchOpt->IsChecked() ? 1 : 0; + + m_Zone_Setting->m_ThermalReliefGapValue = ReturnValueFromTextCtrl( *m_AntipadSizeValue, + PCB_INTERNAL_UNIT ); + m_Zone_Setting->m_ThermalReliefCopperBridgeValue = ReturnValueFromTextCtrl( + *m_CopperWidthValue, + PCB_INTERNAL_UNIT ); + + m_Parent->m_Parent->m_EDA_Config->Write( ZONE_THERMAL_RELIEF_GAP_STRING_KEY, + (long) m_Zone_Setting->m_ThermalReliefGapValue ); + m_Parent->m_Parent->m_EDA_Config->Write( + ZONE_THERMAL_RELIEF_COPPER_WIDTH_STRING_KEY, + (long) m_Zone_Setting-> + m_ThermalReliefCopperBridgeValue ); + + // If we use only exportable to others zones parameters, exit here: + if( aUseExportableSetupOnly ) + return true; + + /* Get the layer selection for this zone */ + int ii = m_LayerSelectionCtrl->GetSelection(); + if( ii < 0 && aPromptForErrors ) + { + DisplayError( this, _( "Error : you must choose a layer" ) ); + 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 ) + { + DisplayError( this, _( "Error : you must choose a net name" ) ); + return false; + } + + wxString net_name = m_ListNetNameSelection->GetString( ii ); + + /* Search net_code for this net */ + EQUIPOT* net; + g_Zone_Default_Setting.m_NetcodeSelection = 0; + for( net = m_Parent->m_Pcb->m_Equipots; net; net = net->Next() ) + { + if( net->m_Netname == net_name ) + { + g_Zone_Default_Setting.m_NetcodeSelection = net->GetNet(); + break; + } + } + + return true; +} + + +/***************************************************************************/ +void dialog_copper_zone::OnNetSortingOptionSelected( wxCommandEvent& event ) +/***************************************************************************/ +{ + wxArrayString ListNetName; + + m_NetSorting = m_NetSortingOption->GetSelection(); + m_Parent->m_Pcb->ReturnSortedNetnamesList( + ListNetName, + m_NetSorting == + 0 ? BOARD::ALPHA_SORT : BOARD::PAD_CNT_SORT ); + if( m_NetSorting != 0 ) + { + wxString Filter = m_NetNameFilter->GetValue(); + for( unsigned ii = 0; ii < ListNetName.GetCount(); ii++ ) + { + if( ListNetName[ii].Matches( Filter.GetData() ) ) + { + ListNetName.RemoveAt( ii ); + ii--; + } + } + } + m_ListNetNameSelection->Clear(); + m_ListNetNameSelection->InsertItems( ListNetName, 0 ); + if( m_Parent->m_Parent->m_EDA_Config ) + { + m_Parent->m_Parent->m_EDA_Config->Write( ZONE_NET_SORT_OPTION_KEY, (long) m_NetSorting ); + m_Parent->m_Parent->m_EDA_Config->Write( ZONE_NET_FILTER_STRING_KEY, + m_NetNameFilter->GetValue() ); + } + + // Select and isplay current zone net name in listbox: + int net_select = m_Zone_Setting->m_NetcodeSelection; + if( net_select > 0 ) + { + EQUIPOT* equipot = m_Parent->m_Pcb->FindNet( net_select ); + if( equipot ) // Search net in list and select it + { + for( unsigned ii = 0; ii < ListNetName.GetCount(); ii++ ) + { + if( ListNetName[ii] == equipot->m_Netname ) + { + m_ListNetNameSelection->SetSelection( ii ); + m_ListNetNameSelection->EnsureVisible( ii ); + break; + } + } + } + } +} + + +/*****************************************************************/ +void dialog_copper_zone::OnButtonOkClick( wxCommandEvent& event ) +/*****************************************************************/ +{ + if( AcceptOptions( true ) ) + EndModal( ZONE_OK ); +} + + +/******************************************************************************/ +void dialog_copper_zone::ExportSetupToOtherCopperZones( wxCommandEvent& event ) +/******************************************************************************/ +{ + if( !AcceptOptions( true, true ) ) + return; + + // Export settings ( but layer ) to others zones: + BOARD* pcb = m_Parent->m_Pcb; + for( int ii = 0; ii < pcb->GetAreaCount(); ii++ ) + { + ZONE_CONTAINER* zone = pcb->GetArea( ii ); + int zone_layer = zone->GetLayer(); + m_Zone_Setting->ExportSetting( *zone ); + zone->SetLayer( zone_layer ); + m_Parent->GetScreen()->SetModify(); + } +} + + +/******************************************************************/ +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; + } +} diff --git a/pcbnew/dialog_copper_zones.h b/pcbnew/dialog_copper_zones.h index 6051ba5a51..bdd2cfd512 100644 --- a/pcbnew/dialog_copper_zones.h +++ b/pcbnew/dialog_copper_zones.h @@ -1,29 +1,29 @@ -/* dialog_copper_zones.h */ - -#ifndef DIALOG_COPPER_ZONES -#define DIALOG_COPPER_ZONES - -#include "dialog_copper_zones_base.h" - -/* here is the derivated class from dialog_copper_zone_frame created by wxFormBuilder -*/ -class dialog_copper_zone: public dialog_copper_zone_base -{ -public: - WinEDA_PcbFrame* m_Parent; - ZONE_SETTING * m_Zone_Setting; - long m_NetSorting; - int m_LayerId[LAYER_COUNT]; // Handle the real layer number from layer name position in m_LayerSelectionCtrl - -public: - dialog_copper_zone( WinEDA_PcbFrame* parent, ZONE_SETTING * zone_setting); - void OnInitDialog( wxInitDialogEvent& event ); - void OnButtonOkClick( wxCommandEvent& event ); - void OnButtonCancelClick( wxCommandEvent& event ); - bool AcceptOptions(bool aPromptForErrors, bool aUseExportableSetupOnly = false); - void OnNetSortingOptionSelected( wxCommandEvent& event ); - void ExportSetupToOtherCopperZones( wxCommandEvent& event ); - void OnPadsInZoneClick( wxCommandEvent& event ); -}; - -#endif // #ifndef DIALOG_COPPER_ZONES +/* dialog_copper_zones.h */ + +#ifndef DIALOG_COPPER_ZONES +#define DIALOG_COPPER_ZONES + +#include "dialog_copper_zones_base.h" + +/* here is the derivated class from dialog_copper_zone_frame created by wxFormBuilder +*/ +class dialog_copper_zone: public dialog_copper_zone_base +{ +public: + WinEDA_PcbFrame* m_Parent; + ZONE_SETTING * m_Zone_Setting; + long m_NetSorting; + int m_LayerId[LAYER_COUNT]; // Handle the real layer number from layer name position in m_LayerSelectionCtrl + +public: + dialog_copper_zone( WinEDA_PcbFrame* parent, ZONE_SETTING * zone_setting); + void OnInitDialog( wxInitDialogEvent& event ); + void OnButtonOkClick( wxCommandEvent& event ); + void OnButtonCancelClick( wxCommandEvent& event ); + bool AcceptOptions(bool aPromptForErrors, bool aUseExportableSetupOnly = false); + void OnNetSortingOptionSelected( wxCommandEvent& event ); + void ExportSetupToOtherCopperZones( wxCommandEvent& event ); + void OnPadsInZoneClick( wxCommandEvent& event ); +}; + +#endif // #ifndef DIALOG_COPPER_ZONES diff --git a/pcbnew/dialog_copper_zones_base.cpp b/pcbnew/dialog_copper_zones_base.cpp index 9858c93e03..c30e7674d5 100644 --- a/pcbnew/dialog_copper_zones_base.cpp +++ b/pcbnew/dialog_copper_zones_base.cpp @@ -1,209 +1,209 @@ -/////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Apr 16 2008) -// http://www.wxformbuilder.org/ -// -// PLEASE DO "NOT" EDIT THIS FILE! -/////////////////////////////////////////////////////////////////////////// - -#include "dialog_copper_zones_base.h" - -/////////////////////////////////////////////////////////////////////////// - -BEGIN_EVENT_TABLE( dialog_copper_zone_base, wxDialog ) - EVT_INIT_DIALOG( dialog_copper_zone_base::_wxFB_OnInitDialog ) - EVT_RADIOBOX( wxID_PADS_IN_ZONE_OPTIONS, dialog_copper_zone_base::_wxFB_OnPadsInZoneClick ) - EVT_BUTTON( wxID_BUTTON_EXPORT, dialog_copper_zone_base::_wxFB_ExportSetupToOtherCopperZones ) - EVT_BUTTON( wxID_OK, dialog_copper_zone_base::_wxFB_OnButtonOkClick ) - EVT_BUTTON( wxID_CANCEL, dialog_copper_zone_base::_wxFB_OnButtonCancelClick ) - EVT_RADIOBOX( ID_NET_SORTING_OPTION, dialog_copper_zone_base::_wxFB_OnNetSortingOptionSelected ) -END_EVENT_TABLE() - -dialog_copper_zone_base::dialog_copper_zone_base( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) -{ - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* m_MainBoxSize; - m_MainBoxSize = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* m_OptionsBoxSizer; - m_OptionsBoxSizer = new wxBoxSizer( wxHORIZONTAL ); - - wxStaticBoxSizer* m_ExportableSetupSizer; - m_ExportableSetupSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Zone Setup:") ), wxHORIZONTAL ); - - wxBoxSizer* m_LeftBoxSizer; - m_LeftBoxSizer = new wxBoxSizer( wxVERTICAL ); - - wxStaticBoxSizer* m_FillOptionsBox; - m_FillOptionsBox = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Zone Fill Options:") ), wxVERTICAL ); - - wxString m_GridCtrlChoices[] = { _("0.00000"), _("0.00000"), _("0.00000"), _("0.00000"), _("No grid (For tests only!)") }; - int m_GridCtrlNChoices = sizeof( m_GridCtrlChoices ) / sizeof( wxString ); - m_GridCtrl = new wxRadioBox( this, ID_RADIOBOX_GRID_SELECTION, _("Grid Size for Filling:"), wxDefaultPosition, wxDefaultSize, m_GridCtrlNChoices, m_GridCtrlChoices, 1, wxRA_SPECIFY_COLS ); - m_GridCtrl->SetSelection( 4 ); - m_FillOptionsBox->Add( m_GridCtrl, 0, wxALL|wxEXPAND, 5 ); - - wxString m_PadInZoneOptChoices[] = { _("Include pads"), _("Thermal relief"), _("Exclude pads") }; - int m_PadInZoneOptNChoices = sizeof( m_PadInZoneOptChoices ) / sizeof( wxString ); - m_PadInZoneOpt = new wxRadioBox( this, wxID_PADS_IN_ZONE_OPTIONS, _("Pad in Zone:"), wxDefaultPosition, wxDefaultSize, m_PadInZoneOptNChoices, m_PadInZoneOptChoices, 1, wxRA_SPECIFY_COLS ); - m_PadInZoneOpt->SetSelection( 1 ); - m_FillOptionsBox->Add( m_PadInZoneOpt, 0, wxALL|wxEXPAND, 5 ); - - wxStaticBoxSizer* m_ThermalShapesParamsSizer; - m_ThermalShapesParamsSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Thermal Reliefs Parameters") ), wxVERTICAL ); - - m_AntipadSizeText = new wxStaticText( this, wxID_ANY, _("Antipad Size"), wxDefaultPosition, wxDefaultSize, 0 ); - m_AntipadSizeText->Wrap( -1 ); - m_ThermalShapesParamsSizer->Add( m_AntipadSizeText, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); - - m_AntipadSizeValue = new wxTextCtrl( this, wxID_ANTIPAD_SIZE, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_AntipadSizeValue->SetToolTip( _("Define the gap around the pad") ); - - m_ThermalShapesParamsSizer->Add( m_AntipadSizeValue, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); - - m_CopperBridgeWidthText = new wxStaticText( this, wxID_ANY, _("Copper Width"), wxDefaultPosition, wxDefaultSize, 0 ); - m_CopperBridgeWidthText->Wrap( -1 ); - m_ThermalShapesParamsSizer->Add( m_CopperBridgeWidthText, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); - - m_CopperWidthValue = new wxTextCtrl( this, wxID_COPPER_BRIDGE_VALUE, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_CopperWidthValue->SetToolTip( _("Define the tickness of copper in thermal reliefs") ); - - m_ThermalShapesParamsSizer->Add( m_CopperWidthValue, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); - - m_FillOptionsBox->Add( m_ThermalShapesParamsSizer, 0, wxEXPAND, 5 ); - - m_LeftBoxSizer->Add( m_FillOptionsBox, 1, wxEXPAND, 5 ); - - m_ExportableSetupSizer->Add( m_LeftBoxSizer, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); - - - m_ExportableSetupSizer->Add( 5, 5, 0, wxEXPAND, 5 ); - - wxBoxSizer* m_MiddleBox; - m_MiddleBox = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* m_MiddleBoxSizer; - m_MiddleBoxSizer = new wxBoxSizer( wxVERTICAL ); - - wxStaticBoxSizer* m_OutilinesBoxOpt; - m_OutilinesBoxOpt = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Outlines Options:") ), wxVERTICAL ); - - wxString m_OrientEdgesOptChoices[] = { _("Any"), _("H , V and 45 deg") }; - int m_OrientEdgesOptNChoices = sizeof( m_OrientEdgesOptChoices ) / sizeof( wxString ); - m_OrientEdgesOpt = new wxRadioBox( this, wxID_ANY, _("Zone edges orient:"), wxDefaultPosition, wxDefaultSize, m_OrientEdgesOptNChoices, m_OrientEdgesOptChoices, 1, wxRA_SPECIFY_COLS ); - m_OrientEdgesOpt->SetSelection( 0 ); - m_OutilinesBoxOpt->Add( m_OrientEdgesOpt, 0, wxALL|wxEXPAND, 5 ); - - wxString m_OutlineAppearanceCtrlChoices[] = { _("Line"), _("Hatched outline"), _("Full hatched") }; - int m_OutlineAppearanceCtrlNChoices = sizeof( m_OutlineAppearanceCtrlChoices ) / sizeof( wxString ); - m_OutlineAppearanceCtrl = new wxRadioBox( this, ID_RADIOBOX_OUTLINES_OPTION, _("Outlines Appearance"), wxDefaultPosition, wxDefaultSize, m_OutlineAppearanceCtrlNChoices, m_OutlineAppearanceCtrlChoices, 1, wxRA_SPECIFY_COLS ); - m_OutlineAppearanceCtrl->SetSelection( 1 ); - m_OutlineAppearanceCtrl->SetToolTip( _("Choose how a zone outline is displayed\n- Single line\n- Short hatching\n- Full zone area hatched") ); - - m_OutilinesBoxOpt->Add( m_OutlineAppearanceCtrl, 0, wxALL|wxEXPAND, 5 ); - - wxString m_ArcApproximationOptChoices[] = { _("16 segments / 360 deg"), _("32 segments / 360 deg") }; - int m_ArcApproximationOptNChoices = sizeof( m_ArcApproximationOptChoices ) / sizeof( wxString ); - m_ArcApproximationOpt = new wxRadioBox( this, wxID_ARC_APPROX, _("Arcs Approximation:"), wxDefaultPosition, wxDefaultSize, m_ArcApproximationOptNChoices, m_ArcApproximationOptChoices, 1, wxRA_SPECIFY_COLS ); - m_ArcApproximationOpt->SetSelection( 1 ); - m_ArcApproximationOpt->SetToolTip( _("Number of segments to approximate a circle in filling calculations.\n16 segment is faster to calculate and when redraw screen.\n32 segment give a better quality") ); - - m_OutilinesBoxOpt->Add( m_ArcApproximationOpt, 0, wxALL|wxEXPAND, 5 ); - - wxStaticBoxSizer* m_OthersOptionsSizer; - m_OthersOptionsSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Others Options:") ), wxVERTICAL ); - - m_ShowFilledAreasInSketchOpt = new wxCheckBox( this, wxID_ANY, _("Show filled areas in sketch mode"), wxDefaultPosition, wxDefaultSize, 0 ); - - m_ShowFilledAreasInSketchOpt->SetToolTip( _("If enabled, filled areas in is this zone will be displayed as non filled polygons.\nIf disabled, filled areas in is this zone will be displayed as \"solid\" areas (normal mode).") ); - - m_OthersOptionsSizer->Add( m_ShowFilledAreasInSketchOpt, 0, wxALL, 5 ); - - m_ClearanceValueTitle = new wxStaticText( this, wxID_ANY, _("Zone clearance value (mm):"), wxDefaultPosition, wxDefaultSize, 0 ); - m_ClearanceValueTitle->Wrap( -1 ); - m_OthersOptionsSizer->Add( m_ClearanceValueTitle, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); - - m_ZoneClearanceCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_OthersOptionsSizer->Add( m_ZoneClearanceCtrl, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - m_OutilinesBoxOpt->Add( m_OthersOptionsSizer, 1, wxEXPAND, 5 ); - - m_MiddleBoxSizer->Add( m_OutilinesBoxOpt, 1, wxEXPAND, 5 ); - - m_ExportSetupButton = new wxButton( this, wxID_BUTTON_EXPORT, _("Export to others zones"), wxDefaultPosition, wxDefaultSize, 0 ); - m_ExportSetupButton->SetToolTip( _("Export this zone setup to all others copper zones") ); - - m_MiddleBoxSizer->Add( m_ExportSetupButton, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_MiddleBox->Add( m_MiddleBoxSizer, 0, 0, 5 ); - - m_ExportableSetupSizer->Add( m_MiddleBox, 1, wxEXPAND, 5 ); - - m_OptionsBoxSizer->Add( m_ExportableSetupSizer, 1, wxEXPAND, 5 ); - - - m_OptionsBoxSizer->Add( 0, 0, 0, wxEXPAND, 5 ); - - wxBoxSizer* m_RightBoxSizer; - m_RightBoxSizer = new wxBoxSizer( wxVERTICAL ); - - m_OkButton = new wxButton( this, wxID_OK, _("Ok"), wxDefaultPosition, wxDefaultSize, 0 ); - m_OkButton->SetDefault(); - m_RightBoxSizer->Add( m_OkButton, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_ButtonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0 ); - m_RightBoxSizer->Add( m_ButtonCancel, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - - m_RightBoxSizer->Add( 5, 20, 0, wxEXPAND, 5 ); - - wxStaticBoxSizer* m_NetSortOptSizer; - m_NetSortOptSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Nets Display Options:") ), wxVERTICAL ); - - wxString m_NetSortingOptionChoices[] = { _("Alphabetic"), _("Advanced") }; - int m_NetSortingOptionNChoices = sizeof( m_NetSortingOptionChoices ) / sizeof( wxString ); - m_NetSortingOption = new wxRadioBox( this, ID_NET_SORTING_OPTION, _("Net sorting:"), wxDefaultPosition, wxDefaultSize, m_NetSortingOptionNChoices, m_NetSortingOptionChoices, 1, wxRA_SPECIFY_COLS ); - m_NetSortingOption->SetSelection( 1 ); - m_NetSortingOption->SetToolTip( _("Nets can be sorted:\nBy alphabetic order\nBy number of pads in the net (advanced)") ); - - m_NetSortOptSizer->Add( m_NetSortingOption, 0, wxALL|wxEXPAND, 5 ); - - m_staticText5 = new wxStaticText( this, wxID_ANY, _("Filter"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText5->Wrap( -1 ); - m_NetSortOptSizer->Add( m_staticText5, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); - - m_NetNameFilter = new wxTextCtrl( this, ID_TEXTCTRL_NETNAMES_FILTER, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_NetSortOptSizer->Add( m_NetNameFilter, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - m_RightBoxSizer->Add( m_NetSortOptSizer, 1, wxEXPAND, 5 ); - - m_OptionsBoxSizer->Add( m_RightBoxSizer, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_MainBoxSize->Add( m_OptionsBoxSizer, 0, 0, 5 ); - - wxBoxSizer* m_NetAndLayersLiastBoxSizer; - m_NetAndLayersLiastBoxSizer = new wxBoxSizer( wxVERTICAL ); - - m_staticText2 = new wxStaticText( this, wxID_ANY, _("Net:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText2->Wrap( -1 ); - m_NetAndLayersLiastBoxSizer->Add( m_staticText2, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); - - m_ListNetNameSelection = new wxListBox( this, ID_NETNAME_SELECTION, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - m_NetAndLayersLiastBoxSizer->Add( m_ListNetNameSelection, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - m_staticText3 = new wxStaticText( this, wxID_ANY, _("Layer:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText3->Wrap( -1 ); - m_NetAndLayersLiastBoxSizer->Add( m_staticText3, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); - - m_LayerSelectionCtrl = new wxListBox( this, ID_LAYER_CHOICE, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - m_NetAndLayersLiastBoxSizer->Add( m_LayerSelectionCtrl, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - m_MainBoxSize->Add( m_NetAndLayersLiastBoxSizer, 0, wxEXPAND, 5 ); - - this->SetSizer( m_MainBoxSize ); - this->Layout(); -} - -dialog_copper_zone_base::~dialog_copper_zone_base() -{ -} +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Apr 16 2008) +// http://www.wxformbuilder.org/ +// +// PLEASE DO "NOT" EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#include "dialog_copper_zones_base.h" + +/////////////////////////////////////////////////////////////////////////// + +BEGIN_EVENT_TABLE( dialog_copper_zone_base, wxDialog ) + EVT_INIT_DIALOG( dialog_copper_zone_base::_wxFB_OnInitDialog ) + EVT_RADIOBOX( wxID_PADS_IN_ZONE_OPTIONS, dialog_copper_zone_base::_wxFB_OnPadsInZoneClick ) + EVT_BUTTON( wxID_BUTTON_EXPORT, dialog_copper_zone_base::_wxFB_ExportSetupToOtherCopperZones ) + EVT_BUTTON( wxID_OK, dialog_copper_zone_base::_wxFB_OnButtonOkClick ) + EVT_BUTTON( wxID_CANCEL, dialog_copper_zone_base::_wxFB_OnButtonCancelClick ) + EVT_RADIOBOX( ID_NET_SORTING_OPTION, dialog_copper_zone_base::_wxFB_OnNetSortingOptionSelected ) +END_EVENT_TABLE() + +dialog_copper_zone_base::dialog_copper_zone_base( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) +{ + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* m_MainBoxSize; + m_MainBoxSize = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* m_OptionsBoxSizer; + m_OptionsBoxSizer = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBoxSizer* m_ExportableSetupSizer; + m_ExportableSetupSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Zone Setup:") ), wxHORIZONTAL ); + + wxBoxSizer* m_LeftBoxSizer; + m_LeftBoxSizer = new wxBoxSizer( wxVERTICAL ); + + wxStaticBoxSizer* m_FillOptionsBox; + m_FillOptionsBox = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Zone Fill Options:") ), wxVERTICAL ); + + wxString m_GridCtrlChoices[] = { _("0.00000"), _("0.00000"), _("0.00000"), _("0.00000"), _("No grid (For tests only!)") }; + int m_GridCtrlNChoices = sizeof( m_GridCtrlChoices ) / sizeof( wxString ); + m_GridCtrl = new wxRadioBox( this, ID_RADIOBOX_GRID_SELECTION, _("Grid Size for Filling:"), wxDefaultPosition, wxDefaultSize, m_GridCtrlNChoices, m_GridCtrlChoices, 1, wxRA_SPECIFY_COLS ); + m_GridCtrl->SetSelection( 4 ); + m_FillOptionsBox->Add( m_GridCtrl, 0, wxALL|wxEXPAND, 5 ); + + wxString m_PadInZoneOptChoices[] = { _("Include pads"), _("Thermal relief"), _("Exclude pads") }; + int m_PadInZoneOptNChoices = sizeof( m_PadInZoneOptChoices ) / sizeof( wxString ); + m_PadInZoneOpt = new wxRadioBox( this, wxID_PADS_IN_ZONE_OPTIONS, _("Pad in Zone:"), wxDefaultPosition, wxDefaultSize, m_PadInZoneOptNChoices, m_PadInZoneOptChoices, 1, wxRA_SPECIFY_COLS ); + m_PadInZoneOpt->SetSelection( 1 ); + m_FillOptionsBox->Add( m_PadInZoneOpt, 0, wxALL|wxEXPAND, 5 ); + + wxStaticBoxSizer* m_ThermalShapesParamsSizer; + m_ThermalShapesParamsSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Thermal Reliefs Parameters") ), wxVERTICAL ); + + m_AntipadSizeText = new wxStaticText( this, wxID_ANY, _("Antipad Size"), wxDefaultPosition, wxDefaultSize, 0 ); + m_AntipadSizeText->Wrap( -1 ); + m_ThermalShapesParamsSizer->Add( m_AntipadSizeText, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_AntipadSizeValue = new wxTextCtrl( this, wxID_ANTIPAD_SIZE, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_AntipadSizeValue->SetToolTip( _("Define the gap around the pad") ); + + m_ThermalShapesParamsSizer->Add( m_AntipadSizeValue, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + m_CopperBridgeWidthText = new wxStaticText( this, wxID_ANY, _("Copper Width"), wxDefaultPosition, wxDefaultSize, 0 ); + m_CopperBridgeWidthText->Wrap( -1 ); + m_ThermalShapesParamsSizer->Add( m_CopperBridgeWidthText, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_CopperWidthValue = new wxTextCtrl( this, wxID_COPPER_BRIDGE_VALUE, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_CopperWidthValue->SetToolTip( _("Define the tickness of copper in thermal reliefs") ); + + m_ThermalShapesParamsSizer->Add( m_CopperWidthValue, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + m_FillOptionsBox->Add( m_ThermalShapesParamsSizer, 0, wxEXPAND, 5 ); + + m_LeftBoxSizer->Add( m_FillOptionsBox, 1, wxEXPAND, 5 ); + + m_ExportableSetupSizer->Add( m_LeftBoxSizer, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + + + m_ExportableSetupSizer->Add( 5, 5, 0, wxEXPAND, 5 ); + + wxBoxSizer* m_MiddleBox; + m_MiddleBox = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* m_MiddleBoxSizer; + m_MiddleBoxSizer = new wxBoxSizer( wxVERTICAL ); + + wxStaticBoxSizer* m_OutilinesBoxOpt; + m_OutilinesBoxOpt = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Outlines Options:") ), wxVERTICAL ); + + wxString m_OrientEdgesOptChoices[] = { _("Any"), _("H , V and 45 deg") }; + int m_OrientEdgesOptNChoices = sizeof( m_OrientEdgesOptChoices ) / sizeof( wxString ); + m_OrientEdgesOpt = new wxRadioBox( this, wxID_ANY, _("Zone edges orient:"), wxDefaultPosition, wxDefaultSize, m_OrientEdgesOptNChoices, m_OrientEdgesOptChoices, 1, wxRA_SPECIFY_COLS ); + m_OrientEdgesOpt->SetSelection( 0 ); + m_OutilinesBoxOpt->Add( m_OrientEdgesOpt, 0, wxALL|wxEXPAND, 5 ); + + wxString m_OutlineAppearanceCtrlChoices[] = { _("Line"), _("Hatched outline"), _("Full hatched") }; + int m_OutlineAppearanceCtrlNChoices = sizeof( m_OutlineAppearanceCtrlChoices ) / sizeof( wxString ); + m_OutlineAppearanceCtrl = new wxRadioBox( this, ID_RADIOBOX_OUTLINES_OPTION, _("Outlines Appearance"), wxDefaultPosition, wxDefaultSize, m_OutlineAppearanceCtrlNChoices, m_OutlineAppearanceCtrlChoices, 1, wxRA_SPECIFY_COLS ); + m_OutlineAppearanceCtrl->SetSelection( 1 ); + m_OutlineAppearanceCtrl->SetToolTip( _("Choose how a zone outline is displayed\n- Single line\n- Short hatching\n- Full zone area hatched") ); + + m_OutilinesBoxOpt->Add( m_OutlineAppearanceCtrl, 0, wxALL|wxEXPAND, 5 ); + + wxString m_ArcApproximationOptChoices[] = { _("16 segments / 360 deg"), _("32 segments / 360 deg") }; + int m_ArcApproximationOptNChoices = sizeof( m_ArcApproximationOptChoices ) / sizeof( wxString ); + m_ArcApproximationOpt = new wxRadioBox( this, wxID_ARC_APPROX, _("Arcs Approximation:"), wxDefaultPosition, wxDefaultSize, m_ArcApproximationOptNChoices, m_ArcApproximationOptChoices, 1, wxRA_SPECIFY_COLS ); + m_ArcApproximationOpt->SetSelection( 1 ); + m_ArcApproximationOpt->SetToolTip( _("Number of segments to approximate a circle in filling calculations.\n16 segment is faster to calculate and when redraw screen.\n32 segment give a better quality") ); + + m_OutilinesBoxOpt->Add( m_ArcApproximationOpt, 0, wxALL|wxEXPAND, 5 ); + + wxStaticBoxSizer* m_OthersOptionsSizer; + m_OthersOptionsSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Others Options:") ), wxVERTICAL ); + + m_ShowFilledAreasInSketchOpt = new wxCheckBox( this, wxID_ANY, _("Show filled areas in sketch mode"), wxDefaultPosition, wxDefaultSize, 0 ); + + m_ShowFilledAreasInSketchOpt->SetToolTip( _("If enabled, filled areas in is this zone will be displayed as non filled polygons.\nIf disabled, filled areas in is this zone will be displayed as \"solid\" areas (normal mode).") ); + + m_OthersOptionsSizer->Add( m_ShowFilledAreasInSketchOpt, 0, wxALL, 5 ); + + m_ClearanceValueTitle = new wxStaticText( this, wxID_ANY, _("Zone clearance value (mm):"), wxDefaultPosition, wxDefaultSize, 0 ); + m_ClearanceValueTitle->Wrap( -1 ); + m_OthersOptionsSizer->Add( m_ClearanceValueTitle, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_ZoneClearanceCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_OthersOptionsSizer->Add( m_ZoneClearanceCtrl, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + m_OutilinesBoxOpt->Add( m_OthersOptionsSizer, 1, wxEXPAND, 5 ); + + m_MiddleBoxSizer->Add( m_OutilinesBoxOpt, 1, wxEXPAND, 5 ); + + m_ExportSetupButton = new wxButton( this, wxID_BUTTON_EXPORT, _("Export to others zones"), wxDefaultPosition, wxDefaultSize, 0 ); + m_ExportSetupButton->SetToolTip( _("Export this zone setup to all others copper zones") ); + + m_MiddleBoxSizer->Add( m_ExportSetupButton, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_MiddleBox->Add( m_MiddleBoxSizer, 0, 0, 5 ); + + m_ExportableSetupSizer->Add( m_MiddleBox, 1, wxEXPAND, 5 ); + + m_OptionsBoxSizer->Add( m_ExportableSetupSizer, 1, wxEXPAND, 5 ); + + + m_OptionsBoxSizer->Add( 0, 0, 0, wxEXPAND, 5 ); + + wxBoxSizer* m_RightBoxSizer; + m_RightBoxSizer = new wxBoxSizer( wxVERTICAL ); + + m_OkButton = new wxButton( this, wxID_OK, _("Ok"), wxDefaultPosition, wxDefaultSize, 0 ); + m_OkButton->SetDefault(); + m_RightBoxSizer->Add( m_OkButton, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_ButtonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0 ); + m_RightBoxSizer->Add( m_ButtonCancel, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + + m_RightBoxSizer->Add( 5, 20, 0, wxEXPAND, 5 ); + + wxStaticBoxSizer* m_NetSortOptSizer; + m_NetSortOptSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Nets Display Options:") ), wxVERTICAL ); + + wxString m_NetSortingOptionChoices[] = { _("Alphabetic"), _("Advanced") }; + int m_NetSortingOptionNChoices = sizeof( m_NetSortingOptionChoices ) / sizeof( wxString ); + m_NetSortingOption = new wxRadioBox( this, ID_NET_SORTING_OPTION, _("Net sorting:"), wxDefaultPosition, wxDefaultSize, m_NetSortingOptionNChoices, m_NetSortingOptionChoices, 1, wxRA_SPECIFY_COLS ); + m_NetSortingOption->SetSelection( 1 ); + m_NetSortingOption->SetToolTip( _("Nets can be sorted:\nBy alphabetic order\nBy number of pads in the net (advanced)") ); + + m_NetSortOptSizer->Add( m_NetSortingOption, 0, wxALL|wxEXPAND, 5 ); + + m_staticText5 = new wxStaticText( this, wxID_ANY, _("Filter"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText5->Wrap( -1 ); + m_NetSortOptSizer->Add( m_staticText5, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_NetNameFilter = new wxTextCtrl( this, ID_TEXTCTRL_NETNAMES_FILTER, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_NetSortOptSizer->Add( m_NetNameFilter, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + m_RightBoxSizer->Add( m_NetSortOptSizer, 1, wxEXPAND, 5 ); + + m_OptionsBoxSizer->Add( m_RightBoxSizer, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_MainBoxSize->Add( m_OptionsBoxSizer, 0, 0, 5 ); + + wxBoxSizer* m_NetAndLayersLiastBoxSizer; + m_NetAndLayersLiastBoxSizer = new wxBoxSizer( wxVERTICAL ); + + m_staticText2 = new wxStaticText( this, wxID_ANY, _("Net:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText2->Wrap( -1 ); + m_NetAndLayersLiastBoxSizer->Add( m_staticText2, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_ListNetNameSelection = new wxListBox( this, ID_NETNAME_SELECTION, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + m_NetAndLayersLiastBoxSizer->Add( m_ListNetNameSelection, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + m_staticText3 = new wxStaticText( this, wxID_ANY, _("Layer:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText3->Wrap( -1 ); + m_NetAndLayersLiastBoxSizer->Add( m_staticText3, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_LayerSelectionCtrl = new wxListBox( this, ID_LAYER_CHOICE, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + m_NetAndLayersLiastBoxSizer->Add( m_LayerSelectionCtrl, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + m_MainBoxSize->Add( m_NetAndLayersLiastBoxSizer, 0, wxEXPAND, 5 ); + + this->SetSizer( m_MainBoxSize ); + this->Layout(); +} + +dialog_copper_zone_base::~dialog_copper_zone_base() +{ +} diff --git a/pcbnew/dialog_copper_zones_base.fbp b/pcbnew/dialog_copper_zones_base.fbp index 43e10bf727..af7543a741 100644 --- a/pcbnew/dialog_copper_zones_base.fbp +++ b/pcbnew/dialog_copper_zones_base.fbp @@ -1,1423 +1,1423 @@ - - - - - - C++ - 1 - UTF-8 - table - dialog_copper_zones_base - 1000 - none - 1 - dialog_copper_zones_base - - . - - 1 - 1 - 0 - - - - - 1 - - - - 0 - wxID_ANY - - - dialog_copper_zone_base - - 545,493 - wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER - - Fill Zones Options - - - - - - - - - - - - - - OnInitDialog - - - - - - - - - - - - - - - - - - - - - - - m_MainBoxSize - wxVERTICAL - none - - 5 - - 0 - - - m_OptionsBoxSizer - wxHORIZONTAL - none - - 5 - wxEXPAND - 1 - - wxID_ANY - Zone Setup: - - m_ExportableSetupSizer - wxHORIZONTAL - none - - - 5 - wxEXPAND|wxALIGN_CENTER_VERTICAL - 0 - - - m_LeftBoxSizer - wxVERTICAL - none - - 5 - wxEXPAND - 1 - - wxID_ANY - Zone Fill Options: - - m_FillOptionsBox - wxVERTICAL - none - - - 5 - wxALL|wxEXPAND - 0 - - - "0.00000" "0.00000" "0.00000" "0.00000" "No grid (For tests only!)" - - 1 - - - 0 - ID_RADIOBOX_GRID_SELECTION - Grid Size for Filling: - 1 - - - m_GridCtrl - protected - - 4 - - wxRA_SPECIFY_COLS - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL|wxEXPAND - 0 - - - "Include pads" "Thermal relief" "Exclude pads" - - 1 - - - 0 - wxID_PADS_IN_ZONE_OPTIONS - Pad in Zone: - 1 - - - m_PadInZoneOpt - protected - - 1 - - wxRA_SPECIFY_COLS - - - - - - - - - - - - - - - - - - - - - - - OnPadsInZoneClick - - - - - - - - - - 5 - wxEXPAND - 0 - - wxID_ANY - Thermal Reliefs Parameters - - m_ThermalShapesParamsSizer - wxVERTICAL - none - - - 5 - wxTOP|wxRIGHT|wxLEFT - 0 - - - - 1 - - - 0 - wxID_ANY - Antipad Size - - - m_AntipadSizeText - protected - - - - - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND - 0 - - - - 1 - - - 0 - wxID_ANTIPAD_SIZE - - 0 - - m_AntipadSizeValue - protected - - - - - Define the gap around the pad - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxTOP|wxRIGHT|wxLEFT - 0 - - - - 1 - - - 0 - wxID_ANY - Copper Width - - - m_CopperBridgeWidthText - protected - - - - - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND - 0 - - - - 1 - - - 0 - wxID_COPPER_BRIDGE_VALUE - - 0 - - m_CopperWidthValue - protected - - - - - Define the tickness of copper in thermal reliefs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND - 0 - - 5 - protected - 5 - - - - 5 - wxEXPAND - 1 - - - m_MiddleBox - wxVERTICAL - none - - 5 - - 0 - - - m_MiddleBoxSizer - wxVERTICAL - none - - 5 - wxEXPAND - 1 - - wxID_ANY - Outlines Options: - - m_OutilinesBoxOpt - wxVERTICAL - none - - - 5 - wxALL|wxEXPAND - 0 - - - "Any" "H , V and 45 deg" - - 1 - - - 0 - wxID_ANY - Zone edges orient: - 1 - - - m_OrientEdgesOpt - protected - - 0 - - wxRA_SPECIFY_COLS - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL|wxEXPAND - 0 - - - "Line" "Hatched outline" "Full hatched" - - 1 - - - 0 - ID_RADIOBOX_OUTLINES_OPTION - Outlines Appearance - 1 - - - m_OutlineAppearanceCtrl - protected - - 1 - - wxRA_SPECIFY_COLS - - Choose how a zone outline is displayed - Single line - Short hatching - Full zone area hatched - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL|wxEXPAND - 0 - - - "16 segments / 360 deg" "32 segments / 360 deg" - - 1 - - - 0 - wxID_ARC_APPROX - Arcs Approximation: - 1 - - - m_ArcApproximationOpt - protected - - 1 - - wxRA_SPECIFY_COLS - - Number of segments to approximate a circle in filling calculations. 16 segment is faster to calculate and when redraw screen. 32 segment give a better quality - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND - 1 - - wxID_ANY - Others Options: - - m_OthersOptionsSizer - wxVERTICAL - none - - - 5 - wxALL - 0 - - - 0 - - 1 - - - 0 - wxID_ANY - Show filled areas in sketch mode - - - m_ShowFilledAreasInSketchOpt - protected - - - - - If enabled, filled areas in is this zone will be displayed as non filled polygons. If disabled, filled areas in is this zone will be displayed as "solid" areas (normal mode). - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxTOP|wxRIGHT|wxLEFT - 0 - - - - 1 - - - 0 - wxID_ANY - Zone clearance value (mm): - - - m_ClearanceValueTitle - protected - - - - - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT - 0 - - - - 1 - - - 0 - wxID_ANY - - 0 - - m_ZoneClearanceCtrl - protected - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL|wxALIGN_CENTER_HORIZONTAL - 0 - - - - 0 - 1 - - - 0 - wxID_BUTTON_EXPORT - Export to others zones - - - m_ExportSetupButton - protected - - - - - Export this zone setup to all others copper zones - - - - ExportSetupToOtherCopperZones - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND - 0 - - 0 - protected - 0 - - - - 5 - wxALIGN_CENTER_VERTICAL - 0 - - - m_RightBoxSizer - wxVERTICAL - none - - 5 - wxALL|wxALIGN_CENTER_HORIZONTAL - 0 - - - - 1 - 1 - - - 0 - wxID_OK - Ok - - - m_OkButton - protected - - - - - - - - - OnButtonOkClick - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL|wxALIGN_CENTER_HORIZONTAL - 0 - - - - 0 - 1 - - - 0 - wxID_CANCEL - Cancel - - - m_ButtonCancel - protected - - - - - - - - - OnButtonCancelClick - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND - 0 - - 20 - protected - 5 - - - - 5 - wxEXPAND - 1 - - wxID_ANY - Nets Display Options: - - m_NetSortOptSizer - wxVERTICAL - none - - - 5 - wxALL|wxEXPAND - 0 - - - "Alphabetic" "Advanced" - - 1 - - - 0 - ID_NET_SORTING_OPTION - Net sorting: - 1 - - - m_NetSortingOption - protected - - 1 - - wxRA_SPECIFY_COLS - - Nets can be sorted: By alphabetic order By number of pads in the net (advanced) - - - - - - - - - - - - - - - - - - - - - OnNetSortingOptionSelected - - - - - - - - - - 5 - wxTOP|wxRIGHT|wxLEFT - 0 - - - - 1 - - - 0 - wxID_ANY - Filter - - - m_staticText5 - protected - - - - - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT - 0 - - - - 1 - - - 0 - ID_TEXTCTRL_NETNAMES_FILTER - - 0 - - m_NetNameFilter - protected - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND - 0 - - - m_NetAndLayersLiastBoxSizer - wxVERTICAL - none - - 5 - wxTOP|wxRIGHT|wxLEFT - 0 - - - - 1 - - - 0 - wxID_ANY - Net: - - - m_staticText2 - protected - - - - - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT - 0 - - - - - 1 - - - 0 - ID_NETNAME_SELECTION - - - m_ListNetNameSelection - protected - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxTOP|wxRIGHT|wxLEFT - 0 - - - - 1 - - - 0 - wxID_ANY - Layer: - - - m_staticText3 - protected - - - - - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT - 0 - - - - - 1 - - - 0 - ID_LAYER_CHOICE - - - m_LayerSelectionCtrl - protected - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + C++ + 1 + UTF-8 + table + dialog_copper_zones_base + 1000 + none + 1 + dialog_copper_zones_base + + . + + 1 + 1 + 0 + + + + + 1 + + + + 0 + wxID_ANY + + + dialog_copper_zone_base + + 545,493 + wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER + + Fill Zones Options + + + + + + + + + + + + + + OnInitDialog + + + + + + + + + + + + + + + + + + + + + + + m_MainBoxSize + wxVERTICAL + none + + 5 + + 0 + + + m_OptionsBoxSizer + wxHORIZONTAL + none + + 5 + wxEXPAND + 1 + + wxID_ANY + Zone Setup: + + m_ExportableSetupSizer + wxHORIZONTAL + none + + + 5 + wxEXPAND|wxALIGN_CENTER_VERTICAL + 0 + + + m_LeftBoxSizer + wxVERTICAL + none + + 5 + wxEXPAND + 1 + + wxID_ANY + Zone Fill Options: + + m_FillOptionsBox + wxVERTICAL + none + + + 5 + wxALL|wxEXPAND + 0 + + + "0.00000" "0.00000" "0.00000" "0.00000" "No grid (For tests only!)" + + 1 + + + 0 + ID_RADIOBOX_GRID_SELECTION + Grid Size for Filling: + 1 + + + m_GridCtrl + protected + + 4 + + wxRA_SPECIFY_COLS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + + "Include pads" "Thermal relief" "Exclude pads" + + 1 + + + 0 + wxID_PADS_IN_ZONE_OPTIONS + Pad in Zone: + 1 + + + m_PadInZoneOpt + protected + + 1 + + wxRA_SPECIFY_COLS + + + + + + + + + + + + + + + + + + + + + + + OnPadsInZoneClick + + + + + + + + + + 5 + wxEXPAND + 0 + + wxID_ANY + Thermal Reliefs Parameters + + m_ThermalShapesParamsSizer + wxVERTICAL + none + + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + + + 1 + + + 0 + wxID_ANY + Antipad Size + + + m_AntipadSizeText + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND + 0 + + + + 1 + + + 0 + wxID_ANTIPAD_SIZE + + 0 + + m_AntipadSizeValue + protected + + + + + Define the gap around the pad + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + + + 1 + + + 0 + wxID_ANY + Copper Width + + + m_CopperBridgeWidthText + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND + 0 + + + + 1 + + + 0 + wxID_COPPER_BRIDGE_VALUE + + 0 + + m_CopperWidthValue + protected + + + + + Define the tickness of copper in thermal reliefs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 0 + + 5 + protected + 5 + + + + 5 + wxEXPAND + 1 + + + m_MiddleBox + wxVERTICAL + none + + 5 + + 0 + + + m_MiddleBoxSizer + wxVERTICAL + none + + 5 + wxEXPAND + 1 + + wxID_ANY + Outlines Options: + + m_OutilinesBoxOpt + wxVERTICAL + none + + + 5 + wxALL|wxEXPAND + 0 + + + "Any" "H , V and 45 deg" + + 1 + + + 0 + wxID_ANY + Zone edges orient: + 1 + + + m_OrientEdgesOpt + protected + + 0 + + wxRA_SPECIFY_COLS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + + "Line" "Hatched outline" "Full hatched" + + 1 + + + 0 + ID_RADIOBOX_OUTLINES_OPTION + Outlines Appearance + 1 + + + m_OutlineAppearanceCtrl + protected + + 1 + + wxRA_SPECIFY_COLS + + Choose how a zone outline is displayed - Single line - Short hatching - Full zone area hatched + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + + "16 segments / 360 deg" "32 segments / 360 deg" + + 1 + + + 0 + wxID_ARC_APPROX + Arcs Approximation: + 1 + + + m_ArcApproximationOpt + protected + + 1 + + wxRA_SPECIFY_COLS + + Number of segments to approximate a circle in filling calculations. 16 segment is faster to calculate and when redraw screen. 32 segment give a better quality + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 1 + + wxID_ANY + Others Options: + + m_OthersOptionsSizer + wxVERTICAL + none + + + 5 + wxALL + 0 + + + 0 + + 1 + + + 0 + wxID_ANY + Show filled areas in sketch mode + + + m_ShowFilledAreasInSketchOpt + protected + + + + + If enabled, filled areas in is this zone will be displayed as non filled polygons. If disabled, filled areas in is this zone will be displayed as "solid" areas (normal mode). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + + + 1 + + + 0 + wxID_ANY + Zone clearance value (mm): + + + m_ClearanceValueTitle + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT + 0 + + + + 1 + + + 0 + wxID_ANY + + 0 + + m_ZoneClearanceCtrl + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxALIGN_CENTER_HORIZONTAL + 0 + + + + 0 + 1 + + + 0 + wxID_BUTTON_EXPORT + Export to others zones + + + m_ExportSetupButton + protected + + + + + Export this zone setup to all others copper zones + + + + ExportSetupToOtherCopperZones + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 0 + + 0 + protected + 0 + + + + 5 + wxALIGN_CENTER_VERTICAL + 0 + + + m_RightBoxSizer + wxVERTICAL + none + + 5 + wxALL|wxALIGN_CENTER_HORIZONTAL + 0 + + + + 1 + 1 + + + 0 + wxID_OK + Ok + + + m_OkButton + protected + + + + + + + + + OnButtonOkClick + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxALIGN_CENTER_HORIZONTAL + 0 + + + + 0 + 1 + + + 0 + wxID_CANCEL + Cancel + + + m_ButtonCancel + protected + + + + + + + + + OnButtonCancelClick + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 0 + + 20 + protected + 5 + + + + 5 + wxEXPAND + 1 + + wxID_ANY + Nets Display Options: + + m_NetSortOptSizer + wxVERTICAL + none + + + 5 + wxALL|wxEXPAND + 0 + + + "Alphabetic" "Advanced" + + 1 + + + 0 + ID_NET_SORTING_OPTION + Net sorting: + 1 + + + m_NetSortingOption + protected + + 1 + + wxRA_SPECIFY_COLS + + Nets can be sorted: By alphabetic order By number of pads in the net (advanced) + + + + + + + + + + + + + + + + + + + + + OnNetSortingOptionSelected + + + + + + + + + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + + + 1 + + + 0 + wxID_ANY + Filter + + + m_staticText5 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT + 0 + + + + 1 + + + 0 + ID_TEXTCTRL_NETNAMES_FILTER + + 0 + + m_NetNameFilter + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 0 + + + m_NetAndLayersLiastBoxSizer + wxVERTICAL + none + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + + + 1 + + + 0 + wxID_ANY + Net: + + + m_staticText2 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT + 0 + + + + + 1 + + + 0 + ID_NETNAME_SELECTION + + + m_ListNetNameSelection + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + + + 1 + + + 0 + wxID_ANY + Layer: + + + m_staticText3 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT + 0 + + + + + 1 + + + 0 + ID_LAYER_CHOICE + + + m_LayerSelectionCtrl + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pcbnew/dialog_copper_zones_base.h b/pcbnew/dialog_copper_zones_base.h index 1b163d2980..23df121eb4 100644 --- a/pcbnew/dialog_copper_zones_base.h +++ b/pcbnew/dialog_copper_zones_base.h @@ -1,104 +1,104 @@ -/////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Apr 16 2008) -// http://www.wxformbuilder.org/ -// -// PLEASE DO "NOT" EDIT THIS FILE! -/////////////////////////////////////////////////////////////////////////// - -#ifndef __dialog_copper_zones_base__ -#define __dialog_copper_zones_base__ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////// -/// Class dialog_copper_zone_base -/////////////////////////////////////////////////////////////////////////////// -class dialog_copper_zone_base : public wxDialog -{ - DECLARE_EVENT_TABLE() - private: - - // Private event handlers - void _wxFB_OnInitDialog( wxInitDialogEvent& event ){ OnInitDialog( event ); } - void _wxFB_OnPadsInZoneClick( wxCommandEvent& event ){ OnPadsInZoneClick( event ); } - void _wxFB_ExportSetupToOtherCopperZones( wxCommandEvent& event ){ ExportSetupToOtherCopperZones( event ); } - void _wxFB_OnButtonOkClick( wxCommandEvent& event ){ OnButtonOkClick( event ); } - void _wxFB_OnButtonCancelClick( wxCommandEvent& event ){ OnButtonCancelClick( event ); } - void _wxFB_OnNetSortingOptionSelected( wxCommandEvent& event ){ OnNetSortingOptionSelected( event ); } - - - protected: - enum - { - ID_RADIOBOX_GRID_SELECTION = 1000, - wxID_PADS_IN_ZONE_OPTIONS, - wxID_ANTIPAD_SIZE, - wxID_COPPER_BRIDGE_VALUE, - ID_RADIOBOX_OUTLINES_OPTION, - wxID_ARC_APPROX, - wxID_BUTTON_EXPORT, - ID_NET_SORTING_OPTION, - ID_TEXTCTRL_NETNAMES_FILTER, - ID_NETNAME_SELECTION, - ID_LAYER_CHOICE, - }; - - wxRadioBox* m_GridCtrl; - wxRadioBox* m_PadInZoneOpt; - wxStaticText* m_AntipadSizeText; - wxTextCtrl* m_AntipadSizeValue; - wxStaticText* m_CopperBridgeWidthText; - wxTextCtrl* m_CopperWidthValue; - - wxRadioBox* m_OrientEdgesOpt; - wxRadioBox* m_OutlineAppearanceCtrl; - wxRadioBox* m_ArcApproximationOpt; - wxCheckBox* m_ShowFilledAreasInSketchOpt; - wxStaticText* m_ClearanceValueTitle; - wxTextCtrl* m_ZoneClearanceCtrl; - wxButton* m_ExportSetupButton; - - wxButton* m_OkButton; - wxButton* m_ButtonCancel; - - wxRadioBox* m_NetSortingOption; - wxStaticText* m_staticText5; - wxTextCtrl* m_NetNameFilter; - wxStaticText* m_staticText2; - wxListBox* m_ListNetNameSelection; - wxStaticText* m_staticText3; - wxListBox* m_LayerSelectionCtrl; - - // Virtual event handlers, overide them in your derived class - virtual void OnInitDialog( wxInitDialogEvent& event ){ event.Skip(); } - virtual void OnPadsInZoneClick( wxCommandEvent& event ){ event.Skip(); } - virtual void ExportSetupToOtherCopperZones( wxCommandEvent& event ){ event.Skip(); } - virtual void OnButtonOkClick( wxCommandEvent& event ){ event.Skip(); } - virtual void OnButtonCancelClick( wxCommandEvent& event ){ event.Skip(); } - virtual void OnNetSortingOptionSelected( wxCommandEvent& event ){ event.Skip(); } - - - public: - dialog_copper_zone_base( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Fill Zones Options"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 545,493 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); - ~dialog_copper_zone_base(); - -}; - -#endif //__dialog_copper_zones_base__ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Apr 16 2008) +// http://www.wxformbuilder.org/ +// +// PLEASE DO "NOT" EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#ifndef __dialog_copper_zones_base__ +#define __dialog_copper_zones_base__ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////// +/// Class dialog_copper_zone_base +/////////////////////////////////////////////////////////////////////////////// +class dialog_copper_zone_base : public wxDialog +{ + DECLARE_EVENT_TABLE() + private: + + // Private event handlers + void _wxFB_OnInitDialog( wxInitDialogEvent& event ){ OnInitDialog( event ); } + void _wxFB_OnPadsInZoneClick( wxCommandEvent& event ){ OnPadsInZoneClick( event ); } + void _wxFB_ExportSetupToOtherCopperZones( wxCommandEvent& event ){ ExportSetupToOtherCopperZones( event ); } + void _wxFB_OnButtonOkClick( wxCommandEvent& event ){ OnButtonOkClick( event ); } + void _wxFB_OnButtonCancelClick( wxCommandEvent& event ){ OnButtonCancelClick( event ); } + void _wxFB_OnNetSortingOptionSelected( wxCommandEvent& event ){ OnNetSortingOptionSelected( event ); } + + + protected: + enum + { + ID_RADIOBOX_GRID_SELECTION = 1000, + wxID_PADS_IN_ZONE_OPTIONS, + wxID_ANTIPAD_SIZE, + wxID_COPPER_BRIDGE_VALUE, + ID_RADIOBOX_OUTLINES_OPTION, + wxID_ARC_APPROX, + wxID_BUTTON_EXPORT, + ID_NET_SORTING_OPTION, + ID_TEXTCTRL_NETNAMES_FILTER, + ID_NETNAME_SELECTION, + ID_LAYER_CHOICE, + }; + + wxRadioBox* m_GridCtrl; + wxRadioBox* m_PadInZoneOpt; + wxStaticText* m_AntipadSizeText; + wxTextCtrl* m_AntipadSizeValue; + wxStaticText* m_CopperBridgeWidthText; + wxTextCtrl* m_CopperWidthValue; + + wxRadioBox* m_OrientEdgesOpt; + wxRadioBox* m_OutlineAppearanceCtrl; + wxRadioBox* m_ArcApproximationOpt; + wxCheckBox* m_ShowFilledAreasInSketchOpt; + wxStaticText* m_ClearanceValueTitle; + wxTextCtrl* m_ZoneClearanceCtrl; + wxButton* m_ExportSetupButton; + + wxButton* m_OkButton; + wxButton* m_ButtonCancel; + + wxRadioBox* m_NetSortingOption; + wxStaticText* m_staticText5; + wxTextCtrl* m_NetNameFilter; + wxStaticText* m_staticText2; + wxListBox* m_ListNetNameSelection; + wxStaticText* m_staticText3; + wxListBox* m_LayerSelectionCtrl; + + // Virtual event handlers, overide them in your derived class + virtual void OnInitDialog( wxInitDialogEvent& event ){ event.Skip(); } + virtual void OnPadsInZoneClick( wxCommandEvent& event ){ event.Skip(); } + virtual void ExportSetupToOtherCopperZones( wxCommandEvent& event ){ event.Skip(); } + virtual void OnButtonOkClick( wxCommandEvent& event ){ event.Skip(); } + virtual void OnButtonCancelClick( wxCommandEvent& event ){ event.Skip(); } + virtual void OnNetSortingOptionSelected( wxCommandEvent& event ){ event.Skip(); } + + + public: + dialog_copper_zone_base( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Fill Zones Options"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 545,493 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + ~dialog_copper_zone_base(); + +}; + +#endif //__dialog_copper_zones_base__ diff --git a/pcbnew/dialog_non_copper_zones_properties_base.cpp b/pcbnew/dialog_non_copper_zones_properties_base.cpp index b6f4b5ffce..faad72c93b 100644 --- a/pcbnew/dialog_non_copper_zones_properties_base.cpp +++ b/pcbnew/dialog_non_copper_zones_properties_base.cpp @@ -1,69 +1,69 @@ -/////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Apr 16 2008) -// http://www.wxformbuilder.org/ -// -// PLEASE DO "NOT" EDIT THIS FILE! -/////////////////////////////////////////////////////////////////////////// - -#include "dialog_non_copper_zones_properties_base.h" - -/////////////////////////////////////////////////////////////////////////// - -BEGIN_EVENT_TABLE( DialogNonCopperZonesPropertiesBase, wxDialog ) - EVT_INIT_DIALOG( DialogNonCopperZonesPropertiesBase::_wxFB_InitDialog ) - EVT_BUTTON( wxID_OK, DialogNonCopperZonesPropertiesBase::_wxFB_OnOkClick ) - EVT_BUTTON( wxID_CANCEL, DialogNonCopperZonesPropertiesBase::_wxFB_OnCancelClick ) -END_EVENT_TABLE() - -DialogNonCopperZonesPropertiesBase::DialogNonCopperZonesPropertiesBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) -{ - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* m_MainSizer; - m_MainSizer = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* m_UpperSizer; - m_UpperSizer = new wxBoxSizer( wxHORIZONTAL ); - - wxString m_OutlineAppearanceCtrlChoices[] = { _("Line"), _("Hatched Outline"), _("Full Hatched") }; - int m_OutlineAppearanceCtrlNChoices = sizeof( m_OutlineAppearanceCtrlChoices ) / sizeof( wxString ); - m_OutlineAppearanceCtrl = new wxRadioBox( this, wxID_ANY, _("Outlines Appearence"), wxDefaultPosition, wxDefaultSize, m_OutlineAppearanceCtrlNChoices, m_OutlineAppearanceCtrlChoices, 1, wxRA_SPECIFY_COLS ); - m_OutlineAppearanceCtrl->SetSelection( 1 ); - m_UpperSizer->Add( m_OutlineAppearanceCtrl, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - wxString m_OrientEdgesOptChoices[] = { _("Any"), _("H, V and 45 deg") }; - int m_OrientEdgesOptNChoices = sizeof( m_OrientEdgesOptChoices ) / sizeof( wxString ); - m_OrientEdgesOpt = new wxRadioBox( this, wxID_ANY, _("Zone Edges Orient"), wxDefaultPosition, wxDefaultSize, m_OrientEdgesOptNChoices, m_OrientEdgesOptChoices, 1, wxRA_SPECIFY_COLS ); - m_OrientEdgesOpt->SetSelection( 0 ); - m_UpperSizer->Add( m_OrientEdgesOpt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - wxBoxSizer* m_ButtonsSizer; - m_ButtonsSizer = new wxBoxSizer( wxVERTICAL ); - - m_buttonOk = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxDefaultSize, 0 ); - m_buttonOk->SetDefault(); - m_ButtonsSizer->Add( m_buttonOk, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0 ); - m_ButtonsSizer->Add( m_buttonCancel, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_UpperSizer->Add( m_ButtonsSizer, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_MainSizer->Add( m_UpperSizer, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_staticTextLayerSelection = new wxStaticText( this, wxID_ANY, _("Layer selection:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextLayerSelection->Wrap( -1 ); - m_MainSizer->Add( m_staticTextLayerSelection, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); - - m_LayerSelectionCtrl = new wxListBox( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - m_MainSizer->Add( m_LayerSelectionCtrl, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - this->SetSizer( m_MainSizer ); - this->Layout(); - - this->Centre( wxBOTH ); -} - -DialogNonCopperZonesPropertiesBase::~DialogNonCopperZonesPropertiesBase() -{ -} +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Apr 16 2008) +// http://www.wxformbuilder.org/ +// +// PLEASE DO "NOT" EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#include "dialog_non_copper_zones_properties_base.h" + +/////////////////////////////////////////////////////////////////////////// + +BEGIN_EVENT_TABLE( DialogNonCopperZonesPropertiesBase, wxDialog ) + EVT_INIT_DIALOG( DialogNonCopperZonesPropertiesBase::_wxFB_InitDialog ) + EVT_BUTTON( wxID_OK, DialogNonCopperZonesPropertiesBase::_wxFB_OnOkClick ) + EVT_BUTTON( wxID_CANCEL, DialogNonCopperZonesPropertiesBase::_wxFB_OnCancelClick ) +END_EVENT_TABLE() + +DialogNonCopperZonesPropertiesBase::DialogNonCopperZonesPropertiesBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) +{ + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* m_MainSizer; + m_MainSizer = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* m_UpperSizer; + m_UpperSizer = new wxBoxSizer( wxHORIZONTAL ); + + wxString m_OutlineAppearanceCtrlChoices[] = { _("Line"), _("Hatched Outline"), _("Full Hatched") }; + int m_OutlineAppearanceCtrlNChoices = sizeof( m_OutlineAppearanceCtrlChoices ) / sizeof( wxString ); + m_OutlineAppearanceCtrl = new wxRadioBox( this, wxID_ANY, _("Outlines Appearence"), wxDefaultPosition, wxDefaultSize, m_OutlineAppearanceCtrlNChoices, m_OutlineAppearanceCtrlChoices, 1, wxRA_SPECIFY_COLS ); + m_OutlineAppearanceCtrl->SetSelection( 1 ); + m_UpperSizer->Add( m_OutlineAppearanceCtrl, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + wxString m_OrientEdgesOptChoices[] = { _("Any"), _("H, V and 45 deg") }; + int m_OrientEdgesOptNChoices = sizeof( m_OrientEdgesOptChoices ) / sizeof( wxString ); + m_OrientEdgesOpt = new wxRadioBox( this, wxID_ANY, _("Zone Edges Orient"), wxDefaultPosition, wxDefaultSize, m_OrientEdgesOptNChoices, m_OrientEdgesOptChoices, 1, wxRA_SPECIFY_COLS ); + m_OrientEdgesOpt->SetSelection( 0 ); + m_UpperSizer->Add( m_OrientEdgesOpt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer* m_ButtonsSizer; + m_ButtonsSizer = new wxBoxSizer( wxVERTICAL ); + + m_buttonOk = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonOk->SetDefault(); + m_ButtonsSizer->Add( m_buttonOk, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0 ); + m_ButtonsSizer->Add( m_buttonCancel, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_UpperSizer->Add( m_ButtonsSizer, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_MainSizer->Add( m_UpperSizer, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_staticTextLayerSelection = new wxStaticText( this, wxID_ANY, _("Layer selection:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextLayerSelection->Wrap( -1 ); + m_MainSizer->Add( m_staticTextLayerSelection, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_LayerSelectionCtrl = new wxListBox( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + m_MainSizer->Add( m_LayerSelectionCtrl, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + this->SetSizer( m_MainSizer ); + this->Layout(); + + this->Centre( wxBOTH ); +} + +DialogNonCopperZonesPropertiesBase::~DialogNonCopperZonesPropertiesBase() +{ +} diff --git a/pcbnew/dialog_non_copper_zones_properties_base.fbp b/pcbnew/dialog_non_copper_zones_properties_base.fbp index 730503ba64..9d9d02bfef 100644 --- a/pcbnew/dialog_non_copper_zones_properties_base.fbp +++ b/pcbnew/dialog_non_copper_zones_properties_base.fbp @@ -1,418 +1,418 @@ - - - - - - C++ - 1 - UTF-8 - table - dialog_non_copper_zones_properties_base - 1000 - none - 1 - dialog_non_copper_zones_properties_base - - . - - 1 - 1 - 0 - - - wxBOTH - - 1 - - - - 0 - wxID_ANY - - - DialogNonCopperZonesPropertiesBase - - 366,221 - wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER - - Non Copper Zones Properties - - - - wxFULL_REPAINT_ON_RESIZE|wxSUNKEN_BORDER - - - - - - - - - - InitDialog - - - - - - - - - - - - - - - - - - - - - - - m_MainSizer - wxVERTICAL - none - - 5 - wxEXPAND|wxALIGN_CENTER_HORIZONTAL - 1 - - - m_UpperSizer - wxHORIZONTAL - none - - 5 - wxALL|wxALIGN_CENTER_VERTICAL - 0 - - - "Line" "Hatched Outline" "Full Hatched" - - 1 - - - 0 - wxID_ANY - Outlines Appearence - 1 - - - m_OutlineAppearanceCtrl - protected - - 1 - - wxRA_SPECIFY_COLS - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL|wxALIGN_CENTER_VERTICAL - 0 - - - "Any" "H, V and 45 deg" - - 1 - - - 0 - wxID_ANY - Zone Edges Orient - 1 - - - m_OrientEdgesOpt - protected - - 0 - - wxRA_SPECIFY_COLS - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALIGN_CENTER_VERTICAL - 1 - - - m_ButtonsSizer - wxVERTICAL - none - - 5 - wxALL|wxALIGN_CENTER_HORIZONTAL - 0 - - - - 1 - 1 - - - 0 - wxID_OK - OK - - - m_buttonOk - protected - - - - - - - - - OnOkClick - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL|wxALIGN_CENTER_HORIZONTAL - 0 - - - - 0 - 1 - - - 0 - wxID_CANCEL - Cancel - - - m_buttonCancel - protected - - - - - - - - - OnCancelClick - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxTOP|wxRIGHT|wxLEFT - 0 - - - - 1 - - - 0 - wxID_ANY - Layer selection: - - - m_staticTextLayerSelection - protected - - - - - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT - 0 - - - - - 1 - - - 0 - wxID_ANY - - - m_LayerSelectionCtrl - protected - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + C++ + 1 + UTF-8 + table + dialog_non_copper_zones_properties_base + 1000 + none + 1 + dialog_non_copper_zones_properties_base + + . + + 1 + 1 + 0 + + + wxBOTH + + 1 + + + + 0 + wxID_ANY + + + DialogNonCopperZonesPropertiesBase + + 366,221 + wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER + + Non Copper Zones Properties + + + + wxFULL_REPAINT_ON_RESIZE|wxSUNKEN_BORDER + + + + + + + + + + InitDialog + + + + + + + + + + + + + + + + + + + + + + + m_MainSizer + wxVERTICAL + none + + 5 + wxEXPAND|wxALIGN_CENTER_HORIZONTAL + 1 + + + m_UpperSizer + wxHORIZONTAL + none + + 5 + wxALL|wxALIGN_CENTER_VERTICAL + 0 + + + "Line" "Hatched Outline" "Full Hatched" + + 1 + + + 0 + wxID_ANY + Outlines Appearence + 1 + + + m_OutlineAppearanceCtrl + protected + + 1 + + wxRA_SPECIFY_COLS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxALIGN_CENTER_VERTICAL + 0 + + + "Any" "H, V and 45 deg" + + 1 + + + 0 + wxID_ANY + Zone Edges Orient + 1 + + + m_OrientEdgesOpt + protected + + 0 + + wxRA_SPECIFY_COLS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL + 1 + + + m_ButtonsSizer + wxVERTICAL + none + + 5 + wxALL|wxALIGN_CENTER_HORIZONTAL + 0 + + + + 1 + 1 + + + 0 + wxID_OK + OK + + + m_buttonOk + protected + + + + + + + + + OnOkClick + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxALIGN_CENTER_HORIZONTAL + 0 + + + + 0 + 1 + + + 0 + wxID_CANCEL + Cancel + + + m_buttonCancel + protected + + + + + + + + + OnCancelClick + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + + + 1 + + + 0 + wxID_ANY + Layer selection: + + + m_staticTextLayerSelection + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT + 0 + + + + + 1 + + + 0 + wxID_ANY + + + m_LayerSelectionCtrl + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pcbnew/dialog_non_copper_zones_properties_base.h b/pcbnew/dialog_non_copper_zones_properties_base.h index 4e5d5012c2..0bf36f0c1a 100644 --- a/pcbnew/dialog_non_copper_zones_properties_base.h +++ b/pcbnew/dialog_non_copper_zones_properties_base.h @@ -1,61 +1,61 @@ -/////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Apr 16 2008) -// http://www.wxformbuilder.org/ -// -// PLEASE DO "NOT" EDIT THIS FILE! -/////////////////////////////////////////////////////////////////////////// - -#ifndef __dialog_non_copper_zones_properties_base__ -#define __dialog_non_copper_zones_properties_base__ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////// -/// Class DialogNonCopperZonesPropertiesBase -/////////////////////////////////////////////////////////////////////////////// -class DialogNonCopperZonesPropertiesBase : public wxDialog -{ - DECLARE_EVENT_TABLE() - private: - - // Private event handlers - void _wxFB_InitDialog( wxInitDialogEvent& event ){ InitDialog( event ); } - void _wxFB_OnOkClick( wxCommandEvent& event ){ OnOkClick( event ); } - void _wxFB_OnCancelClick( wxCommandEvent& event ){ OnCancelClick( event ); } - - - protected: - wxRadioBox* m_OutlineAppearanceCtrl; - wxRadioBox* m_OrientEdgesOpt; - wxButton* m_buttonOk; - wxButton* m_buttonCancel; - wxStaticText* m_staticTextLayerSelection; - wxListBox* m_LayerSelectionCtrl; - - // Virtual event handlers, overide them in your derived class - virtual void InitDialog( wxInitDialogEvent& event ){ event.Skip(); } - virtual void OnOkClick( wxCommandEvent& event ){ event.Skip(); } - virtual void OnCancelClick( wxCommandEvent& event ){ event.Skip(); } - - - public: - DialogNonCopperZonesPropertiesBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Non Copper Zones Properties"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 366,221 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxFULL_REPAINT_ON_RESIZE|wxSUNKEN_BORDER ); - ~DialogNonCopperZonesPropertiesBase(); - -}; - -#endif //__dialog_non_copper_zones_properties_base__ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Apr 16 2008) +// http://www.wxformbuilder.org/ +// +// PLEASE DO "NOT" EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#ifndef __dialog_non_copper_zones_properties_base__ +#define __dialog_non_copper_zones_properties_base__ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////// +/// Class DialogNonCopperZonesPropertiesBase +/////////////////////////////////////////////////////////////////////////////// +class DialogNonCopperZonesPropertiesBase : public wxDialog +{ + DECLARE_EVENT_TABLE() + private: + + // Private event handlers + void _wxFB_InitDialog( wxInitDialogEvent& event ){ InitDialog( event ); } + void _wxFB_OnOkClick( wxCommandEvent& event ){ OnOkClick( event ); } + void _wxFB_OnCancelClick( wxCommandEvent& event ){ OnCancelClick( event ); } + + + protected: + wxRadioBox* m_OutlineAppearanceCtrl; + wxRadioBox* m_OrientEdgesOpt; + wxButton* m_buttonOk; + wxButton* m_buttonCancel; + wxStaticText* m_staticTextLayerSelection; + wxListBox* m_LayerSelectionCtrl; + + // Virtual event handlers, overide them in your derived class + virtual void InitDialog( wxInitDialogEvent& event ){ event.Skip(); } + virtual void OnOkClick( wxCommandEvent& event ){ event.Skip(); } + virtual void OnCancelClick( wxCommandEvent& event ){ event.Skip(); } + + + public: + DialogNonCopperZonesPropertiesBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Non Copper Zones Properties"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 366,221 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxFULL_REPAINT_ON_RESIZE|wxSUNKEN_BORDER ); + ~DialogNonCopperZonesPropertiesBase(); + +}; + +#endif //__dialog_non_copper_zones_properties_base__ diff --git a/pcbnew/zones_polygons_insulated_copper_islands.cpp b/pcbnew/zones_polygons_insulated_copper_islands.cpp index bbb1ad25c6..40154981a6 100644 --- a/pcbnew/zones_polygons_insulated_copper_islands.cpp +++ b/pcbnew/zones_polygons_insulated_copper_islands.cpp @@ -1,153 +1,153 @@ -///////////////////////////////////////////////////////////////////////////// - -// Name: zones_polygons_insulated_copper_islands.cpp -// Licence: GPL License -///////////////////////////////////////////////////////////////////////////// - -#ifndef WX_PRECOMP -#include "wx/wx.h" -#endif - - -// For compilers that support precompilation, includes "wx/wx.h". -#include "wx/wxprec.h" - -#ifdef __BORLANDC__ -#pragma hdrstop -#endif - -using namespace std; - -#include "fctsys.h" -#include "gr_basic.h" - -#include "common.h" -#include "pcbnew.h" -#include "PolyLine.h" - -#include "zones.h" - - -static void CalculateSubAreaBoundaryBox( EDA_Rect& aBbox, - std::vector aPolysList, - int aIndexStart, - int aIndexEnd ); - -/* Local variables */ -std::vector s_ListPoints; // list of coordinates of pads and vias on this layer and on this net. - - -/***************************************************************************************/ -void ZONE_CONTAINER::Test_For_Copper_Island_And_Remove_Insulated_Islands( BOARD* aPcb ) -/***************************************************************************************/ - -/** - * Function Test_For_Copper_Island_And_Remove__Insulated_Islands - * Remove insulated copper islands found in m_FilledPolysList. - * @param aPcb = the board to analyse - */ -{ - if( m_FilledPolysList.size() == 0 ) - return; - - // Build the list: - s_ListPoints.clear(); - for( MODULE* module = aPcb->m_Modules; module; module = module->Next() ) - { - for( D_PAD* pad = module->m_Pads; pad != NULL; pad = pad->Next() ) - { - if( !pad->IsOnLayer( GetLayer() ) ) - continue; - - if( pad->GetNet() != GetNet() ) - continue; - - s_ListPoints.push_back( pad->m_Pos ); - } - } - - for( TRACK* track = aPcb->m_Track; track; track = track->Next() ) - { - if( !track->IsOnLayer( GetLayer() ) ) - continue; - if( track->GetNet() != GetNet() ) - continue; - s_ListPoints.push_back( track->m_Start ); - if( track->Type() != TYPEVIA ) - s_ListPoints.push_back( track->m_End ); - } - - // test if a point is inside - unsigned indexstart = 0, indexend; - bool connected = false; - for( indexend = 0; indexend < m_FilledPolysList.size(); indexend++ ) - { - if( m_FilledPolysList[indexend].end_contour ) // end of area found - { - EDA_Rect bbox; - CalculateSubAreaBoundaryBox( bbox, m_FilledPolysList, indexstart, indexend ); - for( unsigned ic = 0; ic < s_ListPoints.size(); ic++ ) - { - wxPoint pos = s_ListPoints[ic]; - if( !bbox.Inside( pos ) ) - continue; - if( TestPointInsidePolygon( m_FilledPolysList, indexstart, indexend, pos.x, pos.y ) ) - { - connected = true; - break; - } - } - - if( connected ) // this polygon is connected: analyse next polygon - { - indexstart = indexend + 1; // indexstart points the first point of the next polygon - connected = false; - } - else // Not connected: remove this polygon - { - m_FilledPolysList.erase( - m_FilledPolysList.begin() + indexstart, - m_FilledPolysList.begin() + indexend + 1 ); - indexend = indexstart; /* indexstart points the first point of the next polygon - * because the current poly is removed */ - } - } - } -} - - -/******************************************************************/ -void CalculateSubAreaBoundaryBox( EDA_Rect& aBbox, - std::vector aPolysList, - int aIndexStart, - int aIndexEnd ) -/******************************************************************/ - -/** function CalculateSubAreaBoundaryBox - * Calculates the bounding box of a polygon stored in a vector - * @param aBbox = EDA_Rect to init as bounding box - * @param aPolysList = set of CPolyPt that are the corners of one or more polygons - * @param aIndexStart = index of the first corner of a polygon in aPolysList - * @param aIndexEnd = index of the last corner of a polygon in aPolysList - */ -{ - CPolyPt start_point, end_point; - - start_point = aPolysList[aIndexStart]; - end_point = start_point; - for( int ii = aIndexStart; ii <= aIndexEnd; ii++ ) - { - CPolyPt ptst = aPolysList[ii]; - if( start_point.x > ptst.x ) - start_point.x = ptst.x; - if( start_point.y > ptst.y ) - start_point.y = ptst.y; - if( end_point.x < ptst.x ) - end_point.x = ptst.x; - if( end_point.y < ptst.y ) - end_point.y = ptst.y; - } - - aBbox.SetOrigin( start_point.x, start_point.y ); - aBbox.SetEnd( wxPoint( end_point.x, end_point.y ) ); -} +///////////////////////////////////////////////////////////////////////////// + +// Name: zones_polygons_insulated_copper_islands.cpp +// Licence: GPL License +///////////////////////////////////////////////////////////////////////////// + +#ifndef WX_PRECOMP +#include "wx/wx.h" +#endif + + +// For compilers that support precompilation, includes "wx/wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + +using namespace std; + +#include "fctsys.h" +#include "gr_basic.h" + +#include "common.h" +#include "pcbnew.h" +#include "PolyLine.h" + +#include "zones.h" + + +static void CalculateSubAreaBoundaryBox( EDA_Rect& aBbox, + std::vector aPolysList, + int aIndexStart, + int aIndexEnd ); + +/* Local variables */ +std::vector s_ListPoints; // list of coordinates of pads and vias on this layer and on this net. + + +/***************************************************************************************/ +void ZONE_CONTAINER::Test_For_Copper_Island_And_Remove_Insulated_Islands( BOARD* aPcb ) +/***************************************************************************************/ + +/** + * Function Test_For_Copper_Island_And_Remove__Insulated_Islands + * Remove insulated copper islands found in m_FilledPolysList. + * @param aPcb = the board to analyse + */ +{ + if( m_FilledPolysList.size() == 0 ) + return; + + // Build the list: + s_ListPoints.clear(); + for( MODULE* module = aPcb->m_Modules; module; module = module->Next() ) + { + for( D_PAD* pad = module->m_Pads; pad != NULL; pad = pad->Next() ) + { + if( !pad->IsOnLayer( GetLayer() ) ) + continue; + + if( pad->GetNet() != GetNet() ) + continue; + + s_ListPoints.push_back( pad->m_Pos ); + } + } + + for( TRACK* track = aPcb->m_Track; track; track = track->Next() ) + { + if( !track->IsOnLayer( GetLayer() ) ) + continue; + if( track->GetNet() != GetNet() ) + continue; + s_ListPoints.push_back( track->m_Start ); + if( track->Type() != TYPEVIA ) + s_ListPoints.push_back( track->m_End ); + } + + // test if a point is inside + unsigned indexstart = 0, indexend; + bool connected = false; + for( indexend = 0; indexend < m_FilledPolysList.size(); indexend++ ) + { + if( m_FilledPolysList[indexend].end_contour ) // end of area found + { + EDA_Rect bbox; + CalculateSubAreaBoundaryBox( bbox, m_FilledPolysList, indexstart, indexend ); + for( unsigned ic = 0; ic < s_ListPoints.size(); ic++ ) + { + wxPoint pos = s_ListPoints[ic]; + if( !bbox.Inside( pos ) ) + continue; + if( TestPointInsidePolygon( m_FilledPolysList, indexstart, indexend, pos.x, pos.y ) ) + { + connected = true; + break; + } + } + + if( connected ) // this polygon is connected: analyse next polygon + { + indexstart = indexend + 1; // indexstart points the first point of the next polygon + connected = false; + } + else // Not connected: remove this polygon + { + m_FilledPolysList.erase( + m_FilledPolysList.begin() + indexstart, + m_FilledPolysList.begin() + indexend + 1 ); + indexend = indexstart; /* indexstart points the first point of the next polygon + * because the current poly is removed */ + } + } + } +} + + +/******************************************************************/ +void CalculateSubAreaBoundaryBox( EDA_Rect& aBbox, + std::vector aPolysList, + int aIndexStart, + int aIndexEnd ) +/******************************************************************/ + +/** function CalculateSubAreaBoundaryBox + * Calculates the bounding box of a polygon stored in a vector + * @param aBbox = EDA_Rect to init as bounding box + * @param aPolysList = set of CPolyPt that are the corners of one or more polygons + * @param aIndexStart = index of the first corner of a polygon in aPolysList + * @param aIndexEnd = index of the last corner of a polygon in aPolysList + */ +{ + CPolyPt start_point, end_point; + + start_point = aPolysList[aIndexStart]; + end_point = start_point; + for( int ii = aIndexStart; ii <= aIndexEnd; ii++ ) + { + CPolyPt ptst = aPolysList[ii]; + if( start_point.x > ptst.x ) + start_point.x = ptst.x; + if( start_point.y > ptst.y ) + start_point.y = ptst.y; + if( end_point.x < ptst.x ) + end_point.x = ptst.x; + if( end_point.y < ptst.y ) + end_point.y = ptst.y; + } + + aBbox.SetOrigin( start_point.x, start_point.y ); + aBbox.SetEnd( wxPoint( end_point.x, end_point.y ) ); +} diff --git a/polygon/kbool/include/kbool/statusb.h b/polygon/kbool/include/kbool/statusb.h index 6eea40d337..ea845df495 100644 --- a/polygon/kbool/include/kbool/statusb.h +++ b/polygon/kbool/include/kbool/statusb.h @@ -1,54 +1,54 @@ -/*! \file kbool/include/kbool/statusb.h - \author Probably Klaas Holwerda - - Copyright: 2001-2004 (C) Probably Klaas Holwerda - - Licence: wxWidgets Licence - - RCS-ID: $Id: statusb.h,v 1.2 2006/12/15 21:00:06 titato Exp $ -*/ - -/* @@(#) $Source: /cvsroot/wxart2d/wxArt2D/thirdparty/kbool/include/kbool/statusb.h,v $ $Revision: 1.2 $ $Date: 2006/12/15 21:00:06 $ */ - -/* -Program STATUSB.H -Purpose Controls the statusbar of the application (header) - This statusbar is a typical Windows statusbar - For porting to another platform there must be a StatusBar class - derived from this. - User interface element (See documentation for more details - about the functions needed in this class) -*/ - -#ifndef STATUSB_H -#define STATUSB_H -#include - -// abstract base class for own statusbar inherite from it -class A2DKBOOLDLLEXP StatusBar -{ -public: - // constructor & destructor - StatusBar(){}; - ~StatusBar(){}; - - virtual void SetXY( double = 0.0, double = 0.0 ) = 0; - virtual void ResetCoord() = 0; - virtual void SetFile( char* = 0 ) = 0; - virtual void SetProcess( char* = 0 ) = 0; - virtual void SetTime( time_t seconds = 0 ) = 0; - virtual void SetRecording( int status = 0 ) = 0; - virtual void SetZoom( float factor = 1 ) = 0; - virtual void Reset() = 0; - void StartDTimer(); - void EndDTimer(); - int GetDTimerOn(); - time_t GetDTimer(); - -protected: - int timer; - time_t oldtime; - time_t curtime; -}; - -#endif +/*! \file kbool/include/kbool/statusb.h + \author Probably Klaas Holwerda + + Copyright: 2001-2004 (C) Probably Klaas Holwerda + + Licence: wxWidgets Licence + + RCS-ID: $Id: statusb.h,v 1.2 2006/12/15 21:00:06 titato Exp $ +*/ + +/* @@(#) $Source: /cvsroot/wxart2d/wxArt2D/thirdparty/kbool/include/kbool/statusb.h,v $ $Revision: 1.2 $ $Date: 2006/12/15 21:00:06 $ */ + +/* +Program STATUSB.H +Purpose Controls the statusbar of the application (header) + This statusbar is a typical Windows statusbar + For porting to another platform there must be a StatusBar class + derived from this. + User interface element (See documentation for more details + about the functions needed in this class) +*/ + +#ifndef STATUSB_H +#define STATUSB_H +#include + +// abstract base class for own statusbar inherite from it +class A2DKBOOLDLLEXP StatusBar +{ +public: + // constructor & destructor + StatusBar(){}; + ~StatusBar(){}; + + virtual void SetXY( double = 0.0, double = 0.0 ) = 0; + virtual void ResetCoord() = 0; + virtual void SetFile( char* = 0 ) = 0; + virtual void SetProcess( char* = 0 ) = 0; + virtual void SetTime( time_t seconds = 0 ) = 0; + virtual void SetRecording( int status = 0 ) = 0; + virtual void SetZoom( float factor = 1 ) = 0; + virtual void Reset() = 0; + void StartDTimer(); + void EndDTimer(); + int GetDTimerOn(); + time_t GetDTimer(); + +protected: + int timer; + time_t oldtime; + time_t curtime; +}; + +#endif diff --git a/polygon/polygon_test_point_inside.cpp b/polygon/polygon_test_point_inside.cpp index c5f4354261..2bf9b5eab7 100644 --- a/polygon/polygon_test_point_inside.cpp +++ b/polygon/polygon_test_point_inside.cpp @@ -1,355 +1,355 @@ -///////////////////////////////////////////////////////////////////////////// - -// Name: polygon_test_point_inside.cpp -///////////////////////////////////////////////////////////////////////////// - -#include -#include -#include "PolyLine.h" - -using namespace std; - -/* this algo uses the the Jordan curve theorem to find if a point is inside or outside a polygon: - * It run a semi-infinite line horizontally (increasing x, fixed y) - * out from the test point, and count how many edges it crosses. - * At each crossing, the ray switches between inside and outside. - * If odd count, the test point is inside the polygon - * This is called the Jordan curve theorem, or sometimes referred to as the "even-odd" test. - */ - -/* 2 versions are given. - * the second version is GPL (currently used) - * the first version is for explanations and tests (used to test the second version) - * both use the same algorithm. - */ -#if 0 - -/* This text and the algorithm come from http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html - * - * PNPOLY - Point Inclusion in Polygon Test - * W. Randolph Franklin (WRF) - * - * Table of Contents - * - * 1. The C Code <#The C Code> - * 2. The Method <#The Method> - * 3. Originality <#Originality> - * 4. The Inequality Tests are Tricky <#The Inequality Tests are Tricky> - * 5. C Semantics <#C Semantics> - * 6. Point on a (Boundary) Edge <#Point on an Edge> - * 7. Multiple Components and Holes <#Listing the Vertices> - * 8. Testing Which One of Many Polygons Contains the Point <#Testing a - * Point Against Many Polygons> - * 9. Explanation of /"for (i = 0, j = nvert-1; i < nvert; j = i++)"/ - * <#Explanation> - * 10. Fortran Code for the Point in Polygon Test <#Fortran Code for the - * Point in Polygon Test> - * 11. Converting the Code to All Integers <#Converting the Code to All - * Integers> - * 12. License to Use <#License to Use> - * - * The C Code - * - * Here is the code, for reference. Excluding lines with only braces, there - * are only /7 lines/ of code. - * - * int pnpoly(int nvert, float *vertx, float *verty, float ref_pointX, float ref_pointY) - * { - * int i, j, c = 0; - * for (i = 0, j = nvert-1; i < nvert; j = i++) { - * if ( ((verty[i]>ref_pointY) != (verty[j]>ref_pointY)) && - * (ref_pointX < (vertx[j]-vertx[i]) * (ref_pointY-verty[i]) / (verty[j]-verty[i]) + vertx[i]) ) - * c = !c; - * } - * return c; - * } - * - * Argument Meaning - * nvert Number of vertices in the polygon. Whether to repeat the first - * vertex at the end is discussed below. - * vertx, verty Arrays containing the x- and y-coordinates of the - * polygon's vertices. - * ref_pointX, ref_pointY X- and y-coordinate of the test point. - * - * - * The Method - * - * I run a semi-infinite ray horizontally (increasing x, fixed y) out from - * the test point, and count how many edges it crosses. At each crossing, - * the ray switches between inside and outside. This is called the /Jordan - * curve theorem/. - * - * The case of the ray going thru a vertex is handled correctly via a - * careful selection of inequalities. Don't mess with this code unless - * you're familiar with the idea of /Simulation of Simplicity/. This - * pretends to shift the ray infinitesimally to one side so that it either - * clearly intersects, or clearly doesn't touch. Since this is merely a - * conceptual, infinitesimal, shift, it never creates an intersection that - * didn't exist before, and never destroys an intersection that clearly - * existed before. - * - * The ray is tested against each edge thus: - * - * 1. Is the point in the half-plane below the extended edge? and - * 2. Is the point's X coordinate within the edge's X-range? - * - * Handling endpoints here is tricky. - * - * - * Originality - * - * I make no claim to having invented the idea. However in 1970, I did - * produce the Fortran code given below on my own, and include it in a - * package of cartographic SW publicly-distributed by David Douglas, Dept - * of Geography, Simon Fraser U and U of Ottawa. - * - * Earlier implementations of point-in-polygon testing presumably exist, - * tho the code might never have been released. Pointers to prior art, - * especially publicly available code, are welcome. One early publication, - * which doesn't handle the point on an edge, and has a typo, is this: - * - * M Shimrat, "Algorithm 112, Position of Point Relative to Polygon", - * /Comm. ACM/ 5(8), Aug 1962, p 434. - * - * A well-written recent summary is this: - * - * E Haines, /Point in Polygon Strategies/, - * http://www.acm.org/pubs/tog/editors/erich/ptinpoly/, 1994. - * - * - * The Inequality Tests are Tricky - * - * If translating the program to another language, be sure to get the - * inequalities in the conditional correct. They were carefully chosen to - * make the program work correctly when the point is vertically below a vertex. - * - * Several people have thought that my program was wrong, when really - * /they/ had gotten the inequalities wrong. - * - * - * C Semantics - * - * My code uses the fact that, in the C language, when executing the code - |a&&b|, if |a| is false, then |b| must not be evaluated. If your - * compiler doesn't do this, then it's not implementing C, and you will get - * a divide-by-zero, i.a., when the test point is vertically in line with a - * vertical edge. When translating this code to another language with - * different semantics, then you must implement this test explicitly. - * - * - * Point on a (Boundary) Edge - * - * PNPOLY partitions the plane into points inside the polygon and points - * outside the polygon. Points that are on the boundary are classified as - * either inside or outside. - * - * 1. - * - * Any particular point is always classified consistently the same - * way. In the following figure, consider what PNPOLY would say when - * the red point, /P/, is tested against the two triangles, /T_L / - * and /T_R /. Depending on internal roundoff errors, PNPOLY may say - * that /P/ is in /T_L / or in /T_R /. However it will always give - * the same answer when /P/ is tested against those triangles. That - * is, if PNPOLY finds that /P/ is in /T_L /, then it will find that - * /P/ is not /T_R /. If PNPOLY finds that /P/ is not in /T_L /, then - * it will find that /P/ is in /T_R /. - * - * 2. If you want to know when a point is exactly on the boundary, you - * need another program. This is only one of many functions that - * PNPOLY lacks; it also doesn't predict tomorrow's weather. You are - * free to extend PNPOLY's source code. - * - * 3. The first reason for this is the numerical analysis position that - * you should not be testing exact equality unless your input is - * exact. Even then, computational roundoff error would often make - * the result wrong. - * - * 4. The second reason is that, if you partition a region of the plane - * into polygons, i.e., form a planar graph, then PNPOLY will locate - * each point into exactly one polygon. In other words, PNPOLY - * considers each polygon to be topologically a semi-open set. This - * makes things simpler, i.e., causes fewer special cases, if you use - * PNPOLY as part of a larger system. Examples of this include - * locating a point in a planar graph, and intersecting two planar - * graphs. - * - * - * Explanation of /"for (i = 0, j = nvert-1; i < nvert; j = i++)"/ - * - * The intention is to execute the loop for each i from 0 to nvert-1. For - * each iteration, j is i-1. However that wraps, so if i=0 then j=nvert-1. - * Therefore the current edge runs between verts j and i, and the loop is - * done once per edge. In detail: - * - * 1. Start by setting i and j: - * i = 0 - * j = nvert-1 - * 2. If i You may use my material for non-profit research - * and education, provided that you credit me, and link back to my home page. - * http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html, - * 05/20/2008 20:36:42 - */ - -bool TestPointInsidePolygon( std::vector aPolysList, - int istart, - int iend, - int refx, - int refy ) - -/** Function TestPointInsidePolygon - * test if a point is inside or outside a polygon. - * @param aPolysList: the list of polygons - * @param istart: the starting point of a given polygon in m_FilledPolysList. - * @param iend: the ending point of the polygon in m_FilledPolysList. - * @param refx, refy: the point coordinate to test - * @return true if the point is inside, false for outside - */ -{ - double ref_pointX = refx; - double ref_pointY = refy; - - bool inside = false; - - for( int ii = istart, jj = iend; ii <= iend; jj = ii++ ) - { - double seg_startX, seg_startY; // starting point for the segment to test - seg_startX = aPolysList[ii].x; - seg_startY = aPolysList[ii].y; - double seg_endX, seg_endY; // ending point for the segment to test - seg_endX = aPolysList[jj].x; - seg_endY = aPolysList[jj].y; - if( ( ( seg_startY > ref_pointY ) != (seg_endY > ref_pointY ) ) - && (ref_pointX < - (seg_endX - - seg_startX) * (ref_pointY - seg_startY) / (seg_endY - seg_startY) + seg_startX) ) - inside = not inside; - } - - return inside; -} - - -#else - -bool TestPointInsidePolygon( std::vector aPolysList, - int istart, - int iend, - int refx, - int refy ) - -/** Function TestPointInsidePolygon - * test if a point is inside or outside a polygon. - * if a point is on a outline segment, it is considered outside the polygon - * the polygon must have only lines (not arcs) for outlines. - * Use TestPointInside or TestPointInsideContour for more complex polygons - * @param aPolysList: the list of polygons - * @param istart: the starting point of a given polygon in m_FilledPolysList. - * @param iend: the ending point of the polygon in m_FilledPolysList. - * @param refx,refy: the point coordinate to test - * @return true if the point is inside, false for outside - */ -{ - #define OUTSIDE_IF_ON_SIDE 0 // = 1 if we consider point on a side outside the polygon - // define line passing through (x,y), with slope = 0 (horizontal line) - // get intersection points - // count intersection points to right of (x,y), if odd (x,y) is inside polyline - int xx, yy; - double slope = 0; // Using an horizontal line. - double a = refy - slope * refx; - int ics, ice; - bool inside = false; - - // find all intersection points of line with polyline sides - for( ics = istart, ice = iend; ics <= iend; ice = ics++ ) - { - double intersectx1, intersecty1, intersectx2, intersecty2; - int ok; - ok = FindLineSegmentIntersection( a, slope, - aPolysList[ics].x, aPolysList[ics].y, - aPolysList[ice].x, aPolysList[ice].y, - CPolyLine::STRAIGHT, - &intersectx1, &intersecty1, - &intersectx2, &intersecty2 ); - - /* FindLineSegmentIntersection() returns 0, 1 or 2 coordinates (ok = 0, 1, 2) - * for straight line segments, only 0 or 1 are possible - * (2 intersections points are possible only with arcs - */ - if( ok ) // Intersection found - { - xx = (int) intersectx1; - yy = (int) intersecty1; - - /* if the intersection point is on the start point of the current segment, - * do not count it, - * because it was already counted, as ending point of the previous segment - */ - if( xx == aPolysList[ics].x && yy == aPolysList[ics].y ) - continue; -#if OUTSIDE_IF_ON_SIDE - if( xx == refx && yy == refy ) - return false; // (x,y) is on a side, call it outside - else -#endif - if( xx > refx ) - inside = not inside; - } - } - - return inside; -} - - -#endif +///////////////////////////////////////////////////////////////////////////// + +// Name: polygon_test_point_inside.cpp +///////////////////////////////////////////////////////////////////////////// + +#include +#include +#include "PolyLine.h" + +using namespace std; + +/* this algo uses the the Jordan curve theorem to find if a point is inside or outside a polygon: + * It run a semi-infinite line horizontally (increasing x, fixed y) + * out from the test point, and count how many edges it crosses. + * At each crossing, the ray switches between inside and outside. + * If odd count, the test point is inside the polygon + * This is called the Jordan curve theorem, or sometimes referred to as the "even-odd" test. + */ + +/* 2 versions are given. + * the second version is GPL (currently used) + * the first version is for explanations and tests (used to test the second version) + * both use the same algorithm. + */ +#if 0 + +/* This text and the algorithm come from http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html + * + * PNPOLY - Point Inclusion in Polygon Test + * W. Randolph Franklin (WRF) + * + * Table of Contents + * + * 1. The C Code <#The C Code> + * 2. The Method <#The Method> + * 3. Originality <#Originality> + * 4. The Inequality Tests are Tricky <#The Inequality Tests are Tricky> + * 5. C Semantics <#C Semantics> + * 6. Point on a (Boundary) Edge <#Point on an Edge> + * 7. Multiple Components and Holes <#Listing the Vertices> + * 8. Testing Which One of Many Polygons Contains the Point <#Testing a + * Point Against Many Polygons> + * 9. Explanation of /"for (i = 0, j = nvert-1; i < nvert; j = i++)"/ + * <#Explanation> + * 10. Fortran Code for the Point in Polygon Test <#Fortran Code for the + * Point in Polygon Test> + * 11. Converting the Code to All Integers <#Converting the Code to All + * Integers> + * 12. License to Use <#License to Use> + * + * The C Code + * + * Here is the code, for reference. Excluding lines with only braces, there + * are only /7 lines/ of code. + * + * int pnpoly(int nvert, float *vertx, float *verty, float ref_pointX, float ref_pointY) + * { + * int i, j, c = 0; + * for (i = 0, j = nvert-1; i < nvert; j = i++) { + * if ( ((verty[i]>ref_pointY) != (verty[j]>ref_pointY)) && + * (ref_pointX < (vertx[j]-vertx[i]) * (ref_pointY-verty[i]) / (verty[j]-verty[i]) + vertx[i]) ) + * c = !c; + * } + * return c; + * } + * + * Argument Meaning + * nvert Number of vertices in the polygon. Whether to repeat the first + * vertex at the end is discussed below. + * vertx, verty Arrays containing the x- and y-coordinates of the + * polygon's vertices. + * ref_pointX, ref_pointY X- and y-coordinate of the test point. + * + * + * The Method + * + * I run a semi-infinite ray horizontally (increasing x, fixed y) out from + * the test point, and count how many edges it crosses. At each crossing, + * the ray switches between inside and outside. This is called the /Jordan + * curve theorem/. + * + * The case of the ray going thru a vertex is handled correctly via a + * careful selection of inequalities. Don't mess with this code unless + * you're familiar with the idea of /Simulation of Simplicity/. This + * pretends to shift the ray infinitesimally to one side so that it either + * clearly intersects, or clearly doesn't touch. Since this is merely a + * conceptual, infinitesimal, shift, it never creates an intersection that + * didn't exist before, and never destroys an intersection that clearly + * existed before. + * + * The ray is tested against each edge thus: + * + * 1. Is the point in the half-plane below the extended edge? and + * 2. Is the point's X coordinate within the edge's X-range? + * + * Handling endpoints here is tricky. + * + * + * Originality + * + * I make no claim to having invented the idea. However in 1970, I did + * produce the Fortran code given below on my own, and include it in a + * package of cartographic SW publicly-distributed by David Douglas, Dept + * of Geography, Simon Fraser U and U of Ottawa. + * + * Earlier implementations of point-in-polygon testing presumably exist, + * tho the code might never have been released. Pointers to prior art, + * especially publicly available code, are welcome. One early publication, + * which doesn't handle the point on an edge, and has a typo, is this: + * + * M Shimrat, "Algorithm 112, Position of Point Relative to Polygon", + * /Comm. ACM/ 5(8), Aug 1962, p 434. + * + * A well-written recent summary is this: + * + * E Haines, /Point in Polygon Strategies/, + * http://www.acm.org/pubs/tog/editors/erich/ptinpoly/, 1994. + * + * + * The Inequality Tests are Tricky + * + * If translating the program to another language, be sure to get the + * inequalities in the conditional correct. They were carefully chosen to + * make the program work correctly when the point is vertically below a vertex. + * + * Several people have thought that my program was wrong, when really + * /they/ had gotten the inequalities wrong. + * + * + * C Semantics + * + * My code uses the fact that, in the C language, when executing the code + |a&&b|, if |a| is false, then |b| must not be evaluated. If your + * compiler doesn't do this, then it's not implementing C, and you will get + * a divide-by-zero, i.a., when the test point is vertically in line with a + * vertical edge. When translating this code to another language with + * different semantics, then you must implement this test explicitly. + * + * + * Point on a (Boundary) Edge + * + * PNPOLY partitions the plane into points inside the polygon and points + * outside the polygon. Points that are on the boundary are classified as + * either inside or outside. + * + * 1. + * + * Any particular point is always classified consistently the same + * way. In the following figure, consider what PNPOLY would say when + * the red point, /P/, is tested against the two triangles, /T_L / + * and /T_R /. Depending on internal roundoff errors, PNPOLY may say + * that /P/ is in /T_L / or in /T_R /. However it will always give + * the same answer when /P/ is tested against those triangles. That + * is, if PNPOLY finds that /P/ is in /T_L /, then it will find that + * /P/ is not /T_R /. If PNPOLY finds that /P/ is not in /T_L /, then + * it will find that /P/ is in /T_R /. + * + * 2. If you want to know when a point is exactly on the boundary, you + * need another program. This is only one of many functions that + * PNPOLY lacks; it also doesn't predict tomorrow's weather. You are + * free to extend PNPOLY's source code. + * + * 3. The first reason for this is the numerical analysis position that + * you should not be testing exact equality unless your input is + * exact. Even then, computational roundoff error would often make + * the result wrong. + * + * 4. The second reason is that, if you partition a region of the plane + * into polygons, i.e., form a planar graph, then PNPOLY will locate + * each point into exactly one polygon. In other words, PNPOLY + * considers each polygon to be topologically a semi-open set. This + * makes things simpler, i.e., causes fewer special cases, if you use + * PNPOLY as part of a larger system. Examples of this include + * locating a point in a planar graph, and intersecting two planar + * graphs. + * + * + * Explanation of /"for (i = 0, j = nvert-1; i < nvert; j = i++)"/ + * + * The intention is to execute the loop for each i from 0 to nvert-1. For + * each iteration, j is i-1. However that wraps, so if i=0 then j=nvert-1. + * Therefore the current edge runs between verts j and i, and the loop is + * done once per edge. In detail: + * + * 1. Start by setting i and j: + * i = 0 + * j = nvert-1 + * 2. If i You may use my material for non-profit research + * and education, provided that you credit me, and link back to my home page. + * http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html, + * 05/20/2008 20:36:42 + */ + +bool TestPointInsidePolygon( std::vector aPolysList, + int istart, + int iend, + int refx, + int refy ) + +/** Function TestPointInsidePolygon + * test if a point is inside or outside a polygon. + * @param aPolysList: the list of polygons + * @param istart: the starting point of a given polygon in m_FilledPolysList. + * @param iend: the ending point of the polygon in m_FilledPolysList. + * @param refx, refy: the point coordinate to test + * @return true if the point is inside, false for outside + */ +{ + double ref_pointX = refx; + double ref_pointY = refy; + + bool inside = false; + + for( int ii = istart, jj = iend; ii <= iend; jj = ii++ ) + { + double seg_startX, seg_startY; // starting point for the segment to test + seg_startX = aPolysList[ii].x; + seg_startY = aPolysList[ii].y; + double seg_endX, seg_endY; // ending point for the segment to test + seg_endX = aPolysList[jj].x; + seg_endY = aPolysList[jj].y; + if( ( ( seg_startY > ref_pointY ) != (seg_endY > ref_pointY ) ) + && (ref_pointX < + (seg_endX - + seg_startX) * (ref_pointY - seg_startY) / (seg_endY - seg_startY) + seg_startX) ) + inside = not inside; + } + + return inside; +} + + +#else + +bool TestPointInsidePolygon( std::vector aPolysList, + int istart, + int iend, + int refx, + int refy ) + +/** Function TestPointInsidePolygon + * test if a point is inside or outside a polygon. + * if a point is on a outline segment, it is considered outside the polygon + * the polygon must have only lines (not arcs) for outlines. + * Use TestPointInside or TestPointInsideContour for more complex polygons + * @param aPolysList: the list of polygons + * @param istart: the starting point of a given polygon in m_FilledPolysList. + * @param iend: the ending point of the polygon in m_FilledPolysList. + * @param refx,refy: the point coordinate to test + * @return true if the point is inside, false for outside + */ +{ + #define OUTSIDE_IF_ON_SIDE 0 // = 1 if we consider point on a side outside the polygon + // define line passing through (x,y), with slope = 0 (horizontal line) + // get intersection points + // count intersection points to right of (x,y), if odd (x,y) is inside polyline + int xx, yy; + double slope = 0; // Using an horizontal line. + double a = refy - slope * refx; + int ics, ice; + bool inside = false; + + // find all intersection points of line with polyline sides + for( ics = istart, ice = iend; ics <= iend; ice = ics++ ) + { + double intersectx1, intersecty1, intersectx2, intersecty2; + int ok; + ok = FindLineSegmentIntersection( a, slope, + aPolysList[ics].x, aPolysList[ics].y, + aPolysList[ice].x, aPolysList[ice].y, + CPolyLine::STRAIGHT, + &intersectx1, &intersecty1, + &intersectx2, &intersecty2 ); + + /* FindLineSegmentIntersection() returns 0, 1 or 2 coordinates (ok = 0, 1, 2) + * for straight line segments, only 0 or 1 are possible + * (2 intersections points are possible only with arcs + */ + if( ok ) // Intersection found + { + xx = (int) intersectx1; + yy = (int) intersecty1; + + /* if the intersection point is on the start point of the current segment, + * do not count it, + * because it was already counted, as ending point of the previous segment + */ + if( xx == aPolysList[ics].x && yy == aPolysList[ics].y ) + continue; +#if OUTSIDE_IF_ON_SIDE + if( xx == refx && yy == refy ) + return false; // (x,y) is on a side, call it outside + else +#endif + if( xx > refx ) + inside = not inside; + } + } + + return inside; +} + + +#endif diff --git a/polygon/polygon_test_point_inside.h b/polygon/polygon_test_point_inside.h index 89d22da25c..924423951a 100644 --- a/polygon/polygon_test_point_inside.h +++ b/polygon/polygon_test_point_inside.h @@ -1,19 +1,19 @@ -///////////////////////////////////////////////////////////////////////////// -// Name: polygon_test_point_inside.h -///////////////////////////////////////////////////////////////////////////// - -using namespace std; - -/** Function TestPointInsidePolygon - * test if a point is inside or outside a polygon. - * @param aPolysList: the list of polygons - * @param istart: the starting point of a given polygon in m_FilledPolysList. - * @param iend: the ending point of the polygon in m_FilledPolysList. - * @param refx, refy: the point coordinate to test - * @return true if the point is inside, false for outside - */ -bool TestPointInsidePolygon( std::vector aPolysList, - int istart, - int iend, - int refx, - int refy); +///////////////////////////////////////////////////////////////////////////// +// Name: polygon_test_point_inside.h +///////////////////////////////////////////////////////////////////////////// + +using namespace std; + +/** Function TestPointInsidePolygon + * test if a point is inside or outside a polygon. + * @param aPolysList: the list of polygons + * @param istart: the starting point of a given polygon in m_FilledPolysList. + * @param iend: the ending point of the polygon in m_FilledPolysList. + * @param refx, refy: the point coordinate to test + * @return true if the point is inside, false for outside + */ +bool TestPointInsidePolygon( std::vector aPolysList, + int istart, + int iend, + int refx, + int refy);