Pcbnew: fixed a serious bug in zone filling, for pads with hole but not on all layers
This commit is contained in:
commit
2a0524e197
|
@ -4,6 +4,15 @@ KiCad ChangeLog 2010
|
||||||
Please add newer entries at the top, list the date and your name with
|
Please add newer entries at the top, list the date and your name with
|
||||||
email address.
|
email address.
|
||||||
|
|
||||||
|
2010-jun-24 UPDATE Wayne Stambaugh <stambaughw@verizon.net>
|
||||||
|
================================================================================
|
||||||
|
++EESchema component library and hierarchical sheet label object improvements.
|
||||||
|
* Continue component library class clean up and encapsulation work.
|
||||||
|
* Change hierarchical sheet label container to boost::vector_ptr.
|
||||||
|
* Encapsulate hierarchical label handling in hierarchical sheet class.
|
||||||
|
* Convert some missed occurrences of wxString::GetData() to GetChars( wxString ).
|
||||||
|
* Fix some minor code formatting issues.
|
||||||
|
|
||||||
2010-jun-23, UPDATE Jean-Pierre Charras <jean-pierre.charras@gipsa-lab.inpg.fr>
|
2010-jun-23, UPDATE Jean-Pierre Charras <jean-pierre.charras@gipsa-lab.inpg.fr>
|
||||||
================================================================================
|
================================================================================
|
||||||
++eeschema:
|
++eeschema:
|
||||||
|
|
|
@ -71,7 +71,7 @@ private:
|
||||||
void OnLoadFile( wxCommandEvent& event );
|
void OnLoadFile( wxCommandEvent& event );
|
||||||
void OnExportEeschema( wxCommandEvent& event );
|
void OnExportEeschema( wxCommandEvent& event );
|
||||||
void OnExportPcbnew( wxCommandEvent& event );
|
void OnExportPcbnew( wxCommandEvent& event );
|
||||||
void Binarize( int aThreshold );
|
void Binarize( double aThreshold ); // aThreshold = 0.0 (black level) to 1.0 (white level)
|
||||||
void OnOptionsSelection( wxCommandEvent& event );
|
void OnOptionsSelection( wxCommandEvent& event );
|
||||||
void OnThresholdChange( wxScrollEvent& event );
|
void OnThresholdChange( wxScrollEvent& event );
|
||||||
void NegateGreyscaleImage( );
|
void NegateGreyscaleImage( );
|
||||||
|
@ -196,18 +196,18 @@ void BM2CMP_FRAME::OnLoadFile( wxCommandEvent& event )
|
||||||
m_Greyscale_Bitmap = wxBitmap( m_Greyscale_Image );
|
m_Greyscale_Bitmap = wxBitmap( m_Greyscale_Image );
|
||||||
|
|
||||||
m_NB_Image = m_Greyscale_Image;
|
m_NB_Image = m_Greyscale_Image;
|
||||||
Binarize( m_sliderThreshold->GetValue() );
|
Binarize( (double)m_sliderThreshold->GetValue()/m_sliderThreshold->GetMax() );
|
||||||
Refresh();
|
Refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void BM2CMP_FRAME::Binarize( int aThreshold )
|
void BM2CMP_FRAME::Binarize( double aThreshold )
|
||||||
{
|
{
|
||||||
unsigned int pixin;
|
unsigned int pixin;
|
||||||
unsigned char pixout;
|
unsigned char pixout;
|
||||||
int h = m_Greyscale_Image.GetHeight();
|
int h = m_Greyscale_Image.GetHeight();
|
||||||
int w = m_Greyscale_Image.GetWidth();
|
int w = m_Greyscale_Image.GetWidth();
|
||||||
unsigned int threshold = (aThreshold * 256) / 10;
|
unsigned int threshold = (int)(aThreshold * 256);
|
||||||
|
|
||||||
for( int y = 1; y < h; y++ )
|
for( int y = 1; y < h; y++ )
|
||||||
for( int x = 1; x < w; x++ )
|
for( int x = 1; x < w; x++ )
|
||||||
|
@ -243,13 +243,13 @@ void BM2CMP_FRAME::OnOptionsSelection( wxCommandEvent& event )
|
||||||
{
|
{
|
||||||
NegateGreyscaleImage( );
|
NegateGreyscaleImage( );
|
||||||
m_Greyscale_Bitmap = wxBitmap( m_Greyscale_Image );
|
m_Greyscale_Bitmap = wxBitmap( m_Greyscale_Image );
|
||||||
Binarize( m_sliderThreshold->GetValue() );
|
Binarize( (double)m_sliderThreshold->GetValue()/m_sliderThreshold->GetMax() );
|
||||||
Refresh();
|
Refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BM2CMP_FRAME::OnThresholdChange( wxScrollEvent& event )
|
void BM2CMP_FRAME::OnThresholdChange( wxScrollEvent& event )
|
||||||
{
|
{
|
||||||
Binarize( m_sliderThreshold->GetValue() );
|
Binarize( (double)m_sliderThreshold->GetValue()/m_sliderThreshold->GetMax() );
|
||||||
Refresh();
|
Refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -87,7 +87,7 @@ BM2CMP_FRAME_BASE::BM2CMP_FRAME_BASE( wxWindow* parent, wxWindowID id, const wxS
|
||||||
m_ThresholdText->Wrap( -1 );
|
m_ThresholdText->Wrap( -1 );
|
||||||
brightSizer->Add( m_ThresholdText, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
brightSizer->Add( m_ThresholdText, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
m_sliderThreshold = new wxSlider( this, wxID_ANY, 5, 0, 10, wxDefaultPosition, wxDefaultSize, wxSL_AUTOTICKS|wxSL_HORIZONTAL|wxSL_LABELS|wxSL_TOP );
|
m_sliderThreshold = new wxSlider( this, wxID_ANY, 25, 0, 50, wxDefaultPosition, wxDefaultSize, wxSL_AUTOTICKS|wxSL_HORIZONTAL|wxSL_TOP );
|
||||||
brightSizer->Add( m_sliderThreshold, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
brightSizer->Add( m_sliderThreshold, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
bMainSizer->Add( brightSizer, 0, wxEXPAND, 5 );
|
bMainSizer->Add( brightSizer, 0, wxEXPAND, 5 );
|
||||||
|
|
|
@ -670,7 +670,7 @@
|
||||||
<property name="font"></property>
|
<property name="font"></property>
|
||||||
<property name="hidden">0</property>
|
<property name="hidden">0</property>
|
||||||
<property name="id">wxID_ANY</property>
|
<property name="id">wxID_ANY</property>
|
||||||
<property name="maxValue">10</property>
|
<property name="maxValue">50</property>
|
||||||
<property name="maximum_size"></property>
|
<property name="maximum_size"></property>
|
||||||
<property name="minValue">0</property>
|
<property name="minValue">0</property>
|
||||||
<property name="minimum_size"></property>
|
<property name="minimum_size"></property>
|
||||||
|
@ -678,10 +678,10 @@
|
||||||
<property name="permission">protected</property>
|
<property name="permission">protected</property>
|
||||||
<property name="pos"></property>
|
<property name="pos"></property>
|
||||||
<property name="size"></property>
|
<property name="size"></property>
|
||||||
<property name="style">wxSL_AUTOTICKS|wxSL_HORIZONTAL|wxSL_LABELS|wxSL_TOP</property>
|
<property name="style">wxSL_AUTOTICKS|wxSL_HORIZONTAL|wxSL_TOP</property>
|
||||||
<property name="subclass"></property>
|
<property name="subclass"></property>
|
||||||
<property name="tooltip"></property>
|
<property name="tooltip"></property>
|
||||||
<property name="value">5</property>
|
<property name="value">25</property>
|
||||||
<property name="window_extra_style"></property>
|
<property name="window_extra_style"></property>
|
||||||
<property name="window_name"></property>
|
<property name="window_name"></property>
|
||||||
<property name="window_style"></property>
|
<property name="window_style"></property>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
update=23/06/2010 18:43:01
|
update=24/06/2010 21:06:23
|
||||||
last_client=pcbnew
|
last_client=pcbnew
|
||||||
[general]
|
[general]
|
||||||
version=1
|
version=1
|
||||||
|
|
|
@ -81,7 +81,7 @@ void NETLIST_OBJECT::Show( std::ostream& out, int ndx )
|
||||||
|
|
||||||
out << " <start " << m_Start << "/> <end " << m_End << "/>\n";
|
out << " <start " << m_Start << "/> <end " << m_End << "/>\n";
|
||||||
|
|
||||||
if( m_Label )
|
if( !m_Label.IsEmpty() )
|
||||||
out << " <label>" << m_Label.mb_str() << "</label>\n";
|
out << " <label>" << m_Label.mb_str() << "</label>\n";
|
||||||
|
|
||||||
if( m_Comp )
|
if( m_Comp )
|
||||||
|
|
|
@ -174,8 +174,11 @@ static int MinimalReq[PIN_NMAX][PIN_NMAX] =
|
||||||
/** Function TestDuplicateSheetNames( )
|
/** Function TestDuplicateSheetNames( )
|
||||||
* inside a given sheet, one cannot have sheets with duplicate names (file
|
* inside a given sheet, one cannot have sheets with duplicate names (file
|
||||||
* names can be duplicated).
|
* names can be duplicated).
|
||||||
|
* @return the error count
|
||||||
|
* @param aCreateMarker: true = create error markers in schematic,
|
||||||
|
* false = calculate error count only
|
||||||
*/
|
*/
|
||||||
int TestDuplicateSheetNames()
|
int TestDuplicateSheetNames(bool aCreateMarker)
|
||||||
{
|
{
|
||||||
int err_count = 0;
|
int err_count = 0;
|
||||||
EDA_ScreenList ScreenList; // Created the list of screen
|
EDA_ScreenList ScreenList; // Created the list of screen
|
||||||
|
@ -203,17 +206,20 @@ int TestDuplicateSheetNames()
|
||||||
( ( SCH_SHEET* ) item_to_test )-> m_SheetName )
|
( ( SCH_SHEET* ) item_to_test )-> m_SheetName )
|
||||||
== 0 )
|
== 0 )
|
||||||
{
|
{
|
||||||
/* Create a new marker type ERC error*/
|
if( aCreateMarker )
|
||||||
SCH_MARKER* Marker = new SCH_MARKER();
|
{
|
||||||
Marker->m_TimeStamp = GetTimeStamp();
|
/* Create a new marker type ERC error*/
|
||||||
Marker->SetData( ERCE_DUPLICATE_SHEET_NAME,
|
SCH_MARKER* Marker = new SCH_MARKER();
|
||||||
( (SCH_SHEET*) item_to_test )->m_Pos,
|
Marker->m_TimeStamp = GetTimeStamp();
|
||||||
_( "Duplicate Sheet name" ),
|
Marker->SetData( ERCE_DUPLICATE_SHEET_NAME,
|
||||||
( (SCH_SHEET*) item_to_test )->m_Pos );
|
( (SCH_SHEET*) item_to_test )->m_Pos,
|
||||||
Marker->SetMarkerType( MARK_ERC );
|
_( "Duplicate Sheet name" ),
|
||||||
Marker->SetErrorLevel( ERR );
|
( (SCH_SHEET*) item_to_test )->m_Pos );
|
||||||
Marker->SetNext( Screen->EEDrawList );
|
Marker->SetMarkerType( MARK_ERC );
|
||||||
Screen->EEDrawList = Marker;
|
Marker->SetErrorLevel( ERR );
|
||||||
|
Marker->SetNext( Screen->EEDrawList );
|
||||||
|
Screen->EEDrawList = Marker;
|
||||||
|
}
|
||||||
err_count++;
|
err_count++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -279,9 +285,8 @@ void DIALOG_ERC::TestErc( wxArrayString* aMessagesList )
|
||||||
* inside a given sheet, one cannot have sheets with duplicate names (file
|
* inside a given sheet, one cannot have sheets with duplicate names (file
|
||||||
* names can be duplicated).
|
* names can be duplicated).
|
||||||
*/
|
*/
|
||||||
int errcnt = TestDuplicateSheetNames();
|
int errcnt = TestDuplicateSheetNames( true );
|
||||||
g_EESchemaVar.NbErrorErc += errcnt;
|
g_EESchemaVar.NbErrorErc += errcnt;
|
||||||
g_EESchemaVar.NbWarningErc += errcnt;
|
|
||||||
|
|
||||||
m_Parent->BuildNetListBase();
|
m_Parent->BuildNetListBase();
|
||||||
|
|
||||||
|
@ -290,7 +295,6 @@ void DIALOG_ERC::TestErc( wxArrayString* aMessagesList )
|
||||||
for( unsigned ii = 0; ii < g_NetObjectslist.size(); ii++ )
|
for( unsigned ii = 0; ii < g_NetObjectslist.size(); ii++ )
|
||||||
g_NetObjectslist[ii]->m_FlagOfConnection = UNCONNECTED;
|
g_NetObjectslist[ii]->m_FlagOfConnection = UNCONNECTED;
|
||||||
|
|
||||||
|
|
||||||
StartNet = OldItem = 0;
|
StartNet = OldItem = 0;
|
||||||
NetNbItems = 0;
|
NetNbItems = 0;
|
||||||
MinConn = NOC;
|
MinConn = NOC;
|
||||||
|
|
|
@ -24,6 +24,8 @@
|
||||||
#include "protos.h"
|
#include "protos.h"
|
||||||
#include "netlist_control.h"
|
#include "netlist_control.h"
|
||||||
|
|
||||||
|
//Imported function:
|
||||||
|
int TestDuplicateSheetNames(bool aCreateMarker);
|
||||||
|
|
||||||
// ID for configuration:
|
// ID for configuration:
|
||||||
#define CUSTOM_NETLIST_TITLE wxT( "CustomNetlistTitle" )
|
#define CUSTOM_NETLIST_TITLE wxT( "CustomNetlistTitle" )
|
||||||
|
@ -492,6 +494,13 @@ void WinEDA_NetlistFrame::GenNetlist( wxCommandEvent& event )
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Test duplicate sheet names:
|
||||||
|
if( TestDuplicateSheetNames(false ) > 0 )
|
||||||
|
{
|
||||||
|
if( !IsOK( this, _( "Error: duplicate sheet names. Continue?" ) ) )
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* Cleanup the entire hierarchy */
|
/* Cleanup the entire hierarchy */
|
||||||
EDA_ScreenList ScreenList;
|
EDA_ScreenList ScreenList;
|
||||||
for( SCH_SCREEN* screen = ScreenList.GetFirst();
|
for( SCH_SCREEN* screen = ScreenList.GetFirst();
|
||||||
|
|
|
@ -216,11 +216,12 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
|
||||||
have_poly_to_substract = false;
|
have_poly_to_substract = false;
|
||||||
|
|
||||||
D_PAD dummyPad((MODULE*)NULL);
|
D_PAD dummyPad((MODULE*)NULL);
|
||||||
|
D_PAD * nextpad;
|
||||||
for( MODULE* module = aPcb->m_Modules; module; module = module->Next() )
|
for( MODULE* module = aPcb->m_Modules; module; module = module->Next() )
|
||||||
{
|
{
|
||||||
for( D_PAD* pad = module->m_Pads; pad != NULL; pad = pad->Next() )
|
for( D_PAD* pad = module->m_Pads; pad != NULL; pad = nextpad )
|
||||||
{
|
{
|
||||||
|
nextpad = pad->Next(); // pad pointer can be modified by next code, so calculate the next pad here
|
||||||
if( !pad->IsOnLayer( GetLayer() ) )
|
if( !pad->IsOnLayer( GetLayer() ) )
|
||||||
{ /* Test fo pads that are on top or bottom only and have a hole.
|
{ /* Test fo pads that are on top or bottom only and have a hole.
|
||||||
* There are curious pads but they can be used for some components that are inside the
|
* There are curious pads but they can be used for some components that are inside the
|
||||||
|
|
Loading…
Reference in New Issue