Commit 2a0524e1 authored by jean-pierre charras's avatar jean-pierre charras

Pcbnew: fixed a serious bug in zone filling, for pads with hole but not on all layers

parents e1b5d49f c580d5d7
...@@ -4,6 +4,15 @@ KiCad ChangeLog 2010 ...@@ -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: ...@@ -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 ) ...@@ -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 ) ...@@ -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 ...@@ -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 @@ ...@@ -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 @@ ...@@ -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>
......
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 ) ...@@ -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] = ...@@ -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() ...@@ -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 ) ...@@ -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 ) ...@@ -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 @@ ...@@ -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 ) ...@@ -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 ) ...@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment