diff --git a/cvpcb/cvframe.cpp b/cvpcb/cvframe.cpp index 26e7ad0817..9a3e40ed62 100644 --- a/cvpcb/cvframe.cpp +++ b/cvpcb/cvframe.cpp @@ -1,6 +1,6 @@ - /*********************/ - /* File: cvframe.cpp */ - /*********************/ +/*********************/ +/* File: cvframe.cpp */ +/*********************/ #include "fctsys.h" #include "common.h" #include @@ -18,66 +18,70 @@ #define FRAME_MIN_SIZE_X 450 #define FRAME_MIN_SIZE_Y 300 - /*******************************************************/ - /* Constructeur de WinEDA_CvpcbFrame: la fenetre generale */ - /*******************************************************/ -WinEDA_CvpcbFrame::WinEDA_CvpcbFrame(WinEDA_App *parent, const wxString & title, long style ): - WinEDA_BasicFrame(NULL, CVPCB_FRAME, parent, title, wxDefaultPosition, wxDefaultSize, style ) +/*******************************************************/ +/* Constructeur de WinEDA_CvpcbFrame: la fenetre generale */ +/*******************************************************/ +WinEDA_CvpcbFrame::WinEDA_CvpcbFrame( WinEDA_App* parent, const wxString& title, long style ) : + WinEDA_BasicFrame( NULL, CVPCB_FRAME, parent, title, wxDefaultPosition, wxDefaultSize, style ) { - m_FrameName = wxT("CvpcbFrame"); - m_ListCmp = NULL; - m_FootprintList = NULL; - DrawFrame = NULL; - m_FilesMenu = NULL; - m_HToolBar = NULL; + m_FrameName = wxT( "CvpcbFrame" ); + m_ListCmp = NULL; + m_FootprintList = NULL; + DrawFrame = NULL; + m_FilesMenu = NULL; + m_HToolBar = NULL; - // Give an icon - #ifdef __WINDOWS__ - SetIcon( wxICON(a_icon_cvpcb)); - #else - SetIcon( wxICON(icon_cvpcb)); - #endif + // Give an icon + #ifdef __WINDOWS__ + SetIcon( wxICON( a_icon_cvpcb ) ); + #else + SetIcon( wxICON( icon_cvpcb ) ); + #endif - SetFont(*g_StdFont); + SetFont( *g_StdFont ); - SetAutoLayout(TRUE); + SetAutoLayout( TRUE ); - GetSettings(); - if ( m_FrameSize.x < FRAME_MIN_SIZE_X ) m_FrameSize.x = FRAME_MIN_SIZE_X; - if ( m_FrameSize.y < FRAME_MIN_SIZE_Y ) m_FrameSize.y = FRAME_MIN_SIZE_Y; + GetSettings(); + if( m_FrameSize.x < FRAME_MIN_SIZE_X ) + m_FrameSize.x = FRAME_MIN_SIZE_X; + if( m_FrameSize.y < FRAME_MIN_SIZE_Y ) + m_FrameSize.y = FRAME_MIN_SIZE_Y; - // create the status bar -int dims[3] = { -1, -1, 250}; - CreateStatusBar(3); - SetStatusWidths(3,dims); - ReCreateMenuBar(); + // create the status bar + int dims[3] = { -1, -1, 250 }; + CreateStatusBar( 3 ); + SetStatusWidths( 3, dims ); + ReCreateMenuBar(); ReCreateHToolbar(); - // Creation des listes de modules disponibles et des composants du schema - // Create child subwindows. - BuildCmpListBox(); - BuildFootprintListBox(); + // Creation des listes de modules disponibles et des composants du schema + // Create child subwindows. + BuildCmpListBox(); + BuildFootprintListBox(); - /* Creation des contraintes de dimension de la fenetre d'affichage des composants - du schema */ - wxLayoutConstraints * linkpos = new wxLayoutConstraints; - linkpos->top.SameAs(this,wxTop); - linkpos->bottom.SameAs(this,wxBottom); - linkpos->left.SameAs(this,wxLeft); - linkpos->width.PercentOf(this,wxWidth,66); - if ( m_ListCmp ) m_ListCmp->SetConstraints(linkpos); + /* Creation des contraintes de dimension de la fenetre d'affichage des composants + * du schema */ + wxLayoutConstraints* linkpos = new wxLayoutConstraints; + linkpos->top.SameAs( this, wxTop ); + linkpos->bottom.SameAs( this, wxBottom ); + linkpos->left.SameAs( this, wxLeft ); + linkpos->width.PercentOf( this, wxWidth, 66 ); + if( m_ListCmp ) + m_ListCmp->SetConstraints( linkpos ); - /* Creation des contraintes de dimension de la fenetre d'affichage des modules - de la librairie */ - linkpos = new wxLayoutConstraints; - linkpos->top.SameAs(m_ListCmp,wxTop); - linkpos->bottom.SameAs(m_ListCmp,wxBottom); - linkpos->right.SameAs(this,wxRight); - linkpos->left.SameAs(m_ListCmp,wxRight); - if ( m_FootprintList ) m_FootprintList->SetConstraints(linkpos); + /* Creation des contraintes de dimension de la fenetre d'affichage des modules + * de la librairie */ + linkpos = new wxLayoutConstraints; + linkpos->top.SameAs( m_ListCmp, wxTop ); + linkpos->bottom.SameAs( m_ListCmp, wxBottom ); + linkpos->right.SameAs( this, wxRight ); + linkpos->left.SameAs( m_ListCmp, wxRight ); + if( m_FootprintList ) + m_FootprintList->SetConstraints( linkpos ); - SetSizeHints(FRAME_MIN_SIZE_X,FRAME_MIN_SIZE_Y, -1,-1, -1,-1); // Set minimal size to w,h - SetSize(m_FramePos.x, m_FramePos.y, m_FrameSize.x, m_FrameSize.y); + SetSizeHints( FRAME_MIN_SIZE_X, FRAME_MIN_SIZE_Y, -1, -1, -1, -1 ); // Set minimal size to w,h + SetSize( m_FramePos.x, m_FramePos.y, m_FrameSize.x, m_FrameSize.y ); } @@ -85,439 +89,472 @@ int dims[3] = { -1, -1, 250}; WinEDA_CvpcbFrame::~WinEDA_CvpcbFrame() /******************************************/ { - if( m_Parent->m_EDA_Config ) - { - int state = m_HToolBar->GetToolState(ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST); - m_Parent->m_EDA_Config->Write(wxT(FILTERFOOTPRINTKEY), state); - } + if( m_Parent->m_EDA_Config ) + { + int state = m_HToolBar->GetToolState( ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST ); + m_Parent->m_EDA_Config->Write( wxT( FILTERFOOTPRINTKEY ), state ); + } } + /************************************************/ -void WinEDA_CvpcbFrame::OnSize(wxSizeEvent& event) +void WinEDA_CvpcbFrame::OnSize( wxSizeEvent& event ) /************************************************/ { - event.Skip(); + event.Skip(); } + /***************************************************************/ /* Construction de la table des evenements pour WinEDA_CvpcbFrame */ /***************************************************************/ -BEGIN_EVENT_TABLE(WinEDA_CvpcbFrame, wxFrame) +BEGIN_EVENT_TABLE( WinEDA_CvpcbFrame, wxFrame ) - EVT_MENU_RANGE(ID_LOAD_PROJECT,ID_LOAD_FILE_10, - WinEDA_CvpcbFrame::LoadNetList) - EVT_MENU(ID_SAVE_PROJECT, WinEDA_CvpcbFrame::SaveQuitCvpcb) - EVT_MENU(ID_CVPCB_QUIT, WinEDA_CvpcbFrame::OnQuit) - EVT_MENU(ID_CVPCB_DISPLAY_HELP, WinEDA_CvpcbFrame::GetKicadHelp) - EVT_MENU(ID_CVPCB_DISPLAY_LICENCE, WinEDA_CvpcbFrame::GetKicadAbout) - EVT_MENU(ID_CONFIG_REQ,WinEDA_CvpcbFrame::ConfigCvpcb) - EVT_MENU(ID_CONFIG_SAVE,WinEDA_CvpcbFrame::Update_Config) +EVT_MENU_RANGE( ID_LOAD_PROJECT, ID_LOAD_FILE_10, + WinEDA_CvpcbFrame::LoadNetList ) +EVT_MENU( ID_SAVE_PROJECT, WinEDA_CvpcbFrame::SaveQuitCvpcb ) +EVT_MENU( ID_CVPCB_QUIT, WinEDA_CvpcbFrame::OnQuit ) +EVT_MENU( ID_CVPCB_DISPLAY_HELP, WinEDA_CvpcbFrame::GetKicadHelp ) +EVT_MENU( ID_CVPCB_DISPLAY_LICENCE, WinEDA_CvpcbFrame::GetKicadAbout ) +EVT_MENU( ID_CONFIG_REQ, WinEDA_CvpcbFrame::ConfigCvpcb ) +EVT_MENU( ID_CONFIG_SAVE, WinEDA_CvpcbFrame::Update_Config ) - EVT_MENU_RANGE(ID_PREFERENCES_FONT_INFOSCREEN, ID_PREFERENCES_FONT_END, - WinEDA_CvpcbFrame::ProcessFontPreferences) +EVT_MENU_RANGE( ID_PREFERENCES_FONT_INFOSCREEN, ID_PREFERENCES_FONT_END, + WinEDA_CvpcbFrame::ProcessFontPreferences ) - EVT_MENU_RANGE(ID_LANGUAGE_CHOICE, ID_LANGUAGE_CHOICE_END, - WinEDA_CvpcbFrame::SetLanguage) +EVT_MENU_RANGE( ID_LANGUAGE_CHOICE, ID_LANGUAGE_CHOICE_END, + WinEDA_CvpcbFrame::SetLanguage ) - EVT_TOOL(ID_CVPCB_QUIT, WinEDA_CvpcbFrame::OnQuit) - EVT_TOOL(ID_CVPCB_READ_INPUT_NETLIST, WinEDA_CvpcbFrame::LoadNetList) - EVT_TOOL(ID_CVPCB_SAVEQUITCVPCB, WinEDA_CvpcbFrame::SaveQuitCvpcb) - EVT_TOOL(ID_CVPCB_CREATE_CONFIGWINDOW,WinEDA_CvpcbFrame::ConfigCvpcb) - EVT_TOOL(ID_CVPCB_CREATE_SCREENCMP, WinEDA_CvpcbFrame::DisplayModule) - EVT_TOOL(ID_CVPCB_GOTO_FIRSTNA, WinEDA_CvpcbFrame::ToFirstNA) - EVT_TOOL(ID_CVPCB_GOTO_PREVIOUSNA, WinEDA_CvpcbFrame::ToPreviousNA) - EVT_TOOL(ID_CVPCB_DEL_ASSOCIATIONS, WinEDA_CvpcbFrame::DelAssociations) - EVT_TOOL(ID_CVPCB_AUTO_ASSOCIE, WinEDA_CvpcbFrame::AssocieModule) - EVT_TOOL(ID_CVPCB_CREATE_STUFF_FILE, WinEDA_CvpcbFrame::WriteStuffList) - EVT_TOOL(ID_PCB_DISPLAY_FOOTPRINT_DOC, WinEDA_CvpcbFrame::DisplayDocFile) - EVT_TOOL(ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST, WinEDA_CvpcbFrame::OnSelectFilteringFootprint) - EVT_TOOL(ID_CVPCB_FOOTPRINT_DISPLAY_FULL_LIST, WinEDA_CvpcbFrame::OnSelectFilteringFootprint) +EVT_TOOL( ID_CVPCB_QUIT, WinEDA_CvpcbFrame::OnQuit ) +EVT_TOOL( ID_CVPCB_READ_INPUT_NETLIST, WinEDA_CvpcbFrame::LoadNetList ) +EVT_TOOL( ID_CVPCB_SAVEQUITCVPCB, WinEDA_CvpcbFrame::SaveQuitCvpcb ) +EVT_TOOL( ID_CVPCB_CREATE_CONFIGWINDOW, WinEDA_CvpcbFrame::ConfigCvpcb ) +EVT_TOOL( ID_CVPCB_CREATE_SCREENCMP, WinEDA_CvpcbFrame::DisplayModule ) +EVT_TOOL( ID_CVPCB_GOTO_FIRSTNA, WinEDA_CvpcbFrame::ToFirstNA ) +EVT_TOOL( ID_CVPCB_GOTO_PREVIOUSNA, WinEDA_CvpcbFrame::ToPreviousNA ) +EVT_TOOL( ID_CVPCB_DEL_ASSOCIATIONS, WinEDA_CvpcbFrame::DelAssociations ) +EVT_TOOL( ID_CVPCB_AUTO_ASSOCIE, WinEDA_CvpcbFrame::AssocieModule ) +EVT_TOOL( ID_CVPCB_CREATE_STUFF_FILE, WinEDA_CvpcbFrame::WriteStuffList ) +EVT_TOOL( ID_PCB_DISPLAY_FOOTPRINT_DOC, WinEDA_CvpcbFrame::DisplayDocFile ) +EVT_TOOL( ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST, WinEDA_CvpcbFrame::OnSelectFilteringFootprint ) +EVT_TOOL( ID_CVPCB_FOOTPRINT_DISPLAY_FULL_LIST, WinEDA_CvpcbFrame::OnSelectFilteringFootprint ) - EVT_CHAR_HOOK(WinEDA_CvpcbFrame::OnChar) - EVT_CLOSE(WinEDA_CvpcbFrame::OnCloseWindow) - EVT_SIZE( WinEDA_CvpcbFrame::OnSize) +EVT_CHAR_HOOK( WinEDA_CvpcbFrame::OnChar ) +EVT_CLOSE( WinEDA_CvpcbFrame::OnCloseWindow ) +EVT_SIZE( WinEDA_CvpcbFrame::OnSize ) - EVT_LIST_ITEM_SELECTED (ID_CVPCB_FOOTPRINT_LIST, WinEDA_CvpcbFrame::OnLeftClick) - EVT_LIST_ITEM_ACTIVATED (ID_CVPCB_FOOTPRINT_LIST, WinEDA_CvpcbFrame::OnLeftDClick) +EVT_LIST_ITEM_SELECTED( ID_CVPCB_FOOTPRINT_LIST, WinEDA_CvpcbFrame::OnLeftClick ) +EVT_LIST_ITEM_ACTIVATED( ID_CVPCB_FOOTPRINT_LIST, WinEDA_CvpcbFrame::OnLeftDClick ) - EVT_LIST_ITEM_SELECTED(ID_CVPCB_COMPONENT_LIST, WinEDA_CvpcbFrame::OnSelectComponent) +EVT_LIST_ITEM_SELECTED( ID_CVPCB_COMPONENT_LIST, WinEDA_CvpcbFrame::OnSelectComponent ) END_EVENT_TABLE() - /************************************************************/ - /* Fonctions de base de WinEDA_CvpcbFrame: la fenetre generale */ - /************************************************************/ +/************************************************************/ +/* Fonctions de base de WinEDA_CvpcbFrame: la fenetre generale */ +/************************************************************/ /* Sortie de CVPCB */ -void WinEDA_CvpcbFrame::OnQuit(wxCommandEvent& event) +void WinEDA_CvpcbFrame::OnQuit( wxCommandEvent& event ) { - Close(TRUE); + Close( TRUE ); } + /**********************************************************/ -void WinEDA_CvpcbFrame::OnCloseWindow(wxCloseEvent & Event) +void WinEDA_CvpcbFrame::OnCloseWindow( wxCloseEvent& Event ) /**********************************************************/ { -int diag; + int diag; - if( modified ) - { - unsigned ii; - wxMessageDialog dialog(this, _("Netlist and Cmp list modified, Save before exit ?"), - _("Confirmation"), wxYES_NO | wxCANCEL | wxICON_EXCLAMATION | wxYES_DEFAULT); - ii = dialog.ShowModal(); - switch ( ii ) - { - case wxID_CANCEL: - Event.Veto(); - return; + if( modified ) + { + unsigned ii; + wxMessageDialog dialog( this, _( "Netlist and Cmp list modified, Save before exit ?" ), + _( + "Confirmation" ), wxYES_NO | wxCANCEL | wxICON_EXCLAMATION | + wxYES_DEFAULT ); - case wxID_NO: - break; + ii = dialog.ShowModal(); - case wxID_OK: - case wxID_YES: - diag = SaveNetList(wxEmptyString); - if( diag > 0 ) modified = 0; - else if ( diag == 0 ) - { - if( ! IsOK(this, _("Problem when saving files, Exit anyway") ) ) - { - Event.Veto(); return; - } - } - break; - } - } + switch( ii ) + { + case wxID_CANCEL: + Event.Veto(); + return; - // Close the help frame - if ( m_Parent->m_HtmlCtrl ) - { - if ( m_Parent->m_HtmlCtrl->GetFrame() ) // returns NULL if no help frame active - m_Parent->m_HtmlCtrl->GetFrame()->Close(TRUE); - } + case wxID_NO: + break; - if ( ! NetInNameBuffer.IsEmpty() ) - { - SetLastProject(NetInNameBuffer); - } + case wxID_OK: + case wxID_YES: + diag = SaveNetList( wxEmptyString ); + if( diag > 0 ) + modified = 0; + else if( diag == 0 ) + { + if( !IsOK( this, _( "Problem when saving files, Exit anyway" ) ) ) + { + Event.Veto(); return; + } + } + break; + } + } - FreeMemoryModules(); - FreeMemoryComponants(); - modified = 0; + // Close the help frame + if( m_Parent->m_HtmlCtrl ) + { + if( m_Parent->m_HtmlCtrl->GetFrame() ) // returns NULL if no help frame active + m_Parent->m_HtmlCtrl->GetFrame()->Close( TRUE ); + } - SaveSettings(); + if( !NetInNameBuffer.IsEmpty() ) + { + SetLastProject( NetInNameBuffer ); + } - Destroy(); - return; + FreeMemoryModules(); + FreeMemoryComponants(); + modified = 0; + + SaveSettings(); + + Destroy(); + return; } /************************************************/ -void WinEDA_CvpcbFrame::OnChar(wxKeyEvent& event) +void WinEDA_CvpcbFrame::OnChar( wxKeyEvent& event ) /************************************************/ { - event.Skip(); + event.Skip(); } - /*******************************************************/ -void WinEDA_CvpcbFrame::ToFirstNA(wxCommandEvent& event) +void WinEDA_CvpcbFrame::ToFirstNA( wxCommandEvent& event ) /*******************************************************/ { -STORECMP * Composant; -int ii, selection;; + STORECMP* Composant; + int ii, selection;; - Composant = g_BaseListeCmp; - selection= m_ListCmp->GetSelection(); - if(selection < 0) selection = 0; - for (ii = 0 ; Composant != NULL; Composant = Composant->Pnext) - { - if( Composant->m_Module.IsEmpty() && (ii > selection) ) - break; - ii++; - } + Composant = g_BaseListeCmp; + selection = m_ListCmp->GetSelection(); + if( selection < 0 ) + selection = 0; + for( ii = 0; Composant != NULL; Composant = Composant->Pnext ) + { + if( Composant->m_Module.IsEmpty() && (ii > selection) ) + break; + ii++; + } - if ( Composant == NULL ) - { - wxBell(); ii = selection; - } + if( Composant == NULL ) + { + wxBell(); ii = selection; + } - if ( g_BaseListeCmp ) m_ListCmp->SetSelection(ii); + if( g_BaseListeCmp ) + m_ListCmp->SetSelection( ii ); } + /**********************************************************/ -void WinEDA_CvpcbFrame::ToPreviousNA(wxCommandEvent& event) +void WinEDA_CvpcbFrame::ToPreviousNA( wxCommandEvent& event ) /**********************************************************/ { -STORECMP * Composant; -int ii, selection; + STORECMP* Composant; + int ii, selection; - Composant = g_BaseListeCmp; - selection = m_ListCmp->GetSelection(); - if(selection < 0) selection = 0; + Composant = g_BaseListeCmp; + selection = m_ListCmp->GetSelection(); + if( selection < 0 ) + selection = 0; - for (ii = 0 ; Composant != NULL; Composant = Composant->Pnext) - { - if( ii == selection ) break; - ii ++; - } + for( ii = 0; Composant != NULL; Composant = Composant->Pnext ) + { + if( ii == selection ) + break; + ii++; + } - for ( ; Composant != NULL ; Composant = Composant->Pback) - { - if( Composant->m_Module.IsEmpty() && (ii != selection) ) - break; - ii--; - } + for( ; Composant != NULL; Composant = Composant->Pback ) + { + if( Composant->m_Module.IsEmpty() && (ii != selection) ) + break; + ii--; + } - if ( Composant == NULL ) - { - wxBell(); ii = selection; - } + if( Composant == NULL ) + { + wxBell(); ii = selection; + } - if ( g_BaseListeCmp ) m_ListCmp->SetSelection(ii); + if( g_BaseListeCmp ) + m_ListCmp->SetSelection( ii ); } /**********************************************************/ -void WinEDA_CvpcbFrame::SaveQuitCvpcb(wxCommandEvent& event) +void WinEDA_CvpcbFrame::SaveQuitCvpcb( wxCommandEvent& event ) /**********************************************************/ { - if( SaveNetList(wxEmptyString) > 0) - { - modified = 0; - Close(TRUE); - } + if( SaveNetList( wxEmptyString ) > 0 ) + { + modified = 0; + Close( TRUE ); + } } + /*************************************************************/ -void WinEDA_CvpcbFrame::DelAssociations(wxCommandEvent& event) +void WinEDA_CvpcbFrame::DelAssociations( wxCommandEvent& event ) /*************************************************************/ + /* Supprime toutes les associations deja faites -*/ + */ { -int ii; -STORECMP * Composant; -wxString Line; + int ii; + STORECMP* Composant; + wxString Line; - if( IsOK(this, _("Delete selections")) ) - { - Composant = g_BaseListeCmp; - for ( ii = 0; Composant != NULL; Composant = Composant->Pnext, ii++) - { - Composant->m_Module.Empty(); - m_ListCmp->SetSelection(ii); - SetNewPkg(wxEmptyString); - } - m_ListCmp->SetSelection(0); - composants_non_affectes = nbcomp; - } + if( IsOK( this, _( "Delete selections" ) ) ) + { + Composant = g_BaseListeCmp; + for( ii = 0; Composant != NULL; Composant = Composant->Pnext, ii++ ) + { + Composant->m_Module.Empty(); + m_ListCmp->SetSelection( ii ); + SetNewPkg( wxEmptyString ); + } - Line.Printf( _("Componants: %d (free: %d)"), nbcomp, composants_non_affectes); - SetStatusText(Line,1); + m_ListCmp->SetSelection( 0 ); + composants_non_affectes = nbcomp; + } + + Line.Printf( _( "Componants: %d (free: %d)" ), nbcomp, composants_non_affectes ); + SetStatusText( Line, 1 ); } /***********************************************************/ -void WinEDA_CvpcbFrame::LoadNetList(wxCommandEvent& event) +void WinEDA_CvpcbFrame::LoadNetList( wxCommandEvent& event ) /***********************************************************/ + /* Fonction liee au boutton "Load" - Lit la netliste -*/ + * Lit la netliste + */ { -int id = event.GetId(); -wxString fullfilename; -wxString oldfilename; -bool newfile; + int id = event.GetId(); + wxString fullfilename; + wxString oldfilename; + bool newfile; - if ( ! NetInNameBuffer.IsEmpty() ) - { - oldfilename = NetInNameBuffer; - } + if( !NetInNameBuffer.IsEmpty() ) + { + oldfilename = NetInNameBuffer; + } - switch ( id ) - { - case ID_LOAD_FILE_1: - case ID_LOAD_FILE_2: - case ID_LOAD_FILE_3: - case ID_LOAD_FILE_4: - case ID_LOAD_FILE_5: - case ID_LOAD_FILE_6: - case ID_LOAD_FILE_7: - case ID_LOAD_FILE_8: - case ID_LOAD_FILE_9: - case ID_LOAD_FILE_10: - id -= ID_LOAD_FILE_1; - fullfilename = GetLastProject(id); - break; - } - newfile = ReadInputNetList(fullfilename); - if (newfile && ! oldfilename.IsEmpty() ) - { - SetLastProject(NetInNameBuffer); - ReCreateMenuBar(); - } + switch( id ) + { + case ID_LOAD_FILE_1: + case ID_LOAD_FILE_2: + case ID_LOAD_FILE_3: + case ID_LOAD_FILE_4: + case ID_LOAD_FILE_5: + case ID_LOAD_FILE_6: + case ID_LOAD_FILE_7: + case ID_LOAD_FILE_8: + case ID_LOAD_FILE_9: + case ID_LOAD_FILE_10: + id -= ID_LOAD_FILE_1; + fullfilename = GetLastProject( id ); + break; + } + + newfile = ReadInputNetList( fullfilename ); + if( newfile && !oldfilename.IsEmpty() ) + { + SetLastProject( NetInNameBuffer ); + ReCreateMenuBar(); + } } /***********************************************************/ -void WinEDA_CvpcbFrame::ConfigCvpcb(wxCommandEvent& event) +void WinEDA_CvpcbFrame::ConfigCvpcb( wxCommandEvent& event ) /***********************************************************/ + /* Fonction liee au boutton "Config" - Affiche le panneau de configuration -*/ + * Affiche le panneau de configuration + */ { - CreateConfigWindow(); + CreateConfigWindow(); } + /************************************************************/ -void WinEDA_CvpcbFrame::DisplayModule(wxCommandEvent& event) +void WinEDA_CvpcbFrame::DisplayModule( wxCommandEvent& event ) /************************************************************/ + /* Fonction liee au boutton "Visu" - Affiche l'ecran de visualisation des modules -*/ + * Affiche l'ecran de visualisation des modules + */ { - CreateScreenCmp(); - DrawFrame->AdjustScrollBars(); - DrawFrame->Recadre_Trace(FALSE); + CreateScreenCmp(); + DrawFrame->AdjustScrollBars(); + DrawFrame->Recadre_Trace( FALSE ); } /****************************************************************/ -void WinEDA_CvpcbFrame::AddFontSelectionMenu(wxMenu * main_menu) +void WinEDA_CvpcbFrame::AddFontSelectionMenu( wxMenu* main_menu ) /*****************************************************************/ + /* create the submenu for fonte selection and setup fonte size -*/ + */ { -wxMenu * fontmenu = new wxMenu(); - ADD_MENUITEM(fontmenu, ID_PREFERENCES_FONT_DIALOG, _("font for dialog boxes"), - fonts_xpm ); - ADD_MENUITEM(fontmenu, ID_PREFERENCES_FONT_INFOSCREEN, _("font for Lists"), - fonts_xpm ); - ADD_MENUITEM(fontmenu, ID_PREFERENCES_FONT_STATUS, _("font for Status Line"), - fonts_xpm ); - ADD_MENUITEM_WITH_HELP_AND_SUBMENU(main_menu, fontmenu, - ID_PREFERENCES_FONT, _("&Font selection"), - _("Choose font type and size for dialogs, infos and status box"), - fonts_xpm); + wxMenu* fontmenu = new wxMenu(); + + ADD_MENUITEM( fontmenu, ID_PREFERENCES_FONT_DIALOG, _( "font for dialog boxes" ), + fonts_xpm ); + ADD_MENUITEM( fontmenu, ID_PREFERENCES_FONT_INFOSCREEN, _( "font for Lists" ), + fonts_xpm ); + ADD_MENUITEM( fontmenu, ID_PREFERENCES_FONT_STATUS, _( "font for Status Line" ), + fonts_xpm ); + ADD_MENUITEM_WITH_HELP_AND_SUBMENU( main_menu, fontmenu, + ID_PREFERENCES_FONT, _( "&Font selection" ), + _( + "Choose font type and size for dialogs, infos and status box" ), + fonts_xpm ); } /********************************************************/ -void WinEDA_CvpcbFrame::SetLanguage(wxCommandEvent& event) +void WinEDA_CvpcbFrame::SetLanguage( wxCommandEvent& event ) /********************************************************/ { -int id = event.GetId(); + int id = event.GetId(); - m_Parent->SetLanguageIdentifier(id ); - m_Parent->SetLanguage(); + m_Parent->SetLanguageIdentifier( id ); + m_Parent->SetLanguage(); } + /*************************************************************/ -void WinEDA_CvpcbFrame::DisplayDocFile(wxCommandEvent & event) +void WinEDA_CvpcbFrame::DisplayDocFile( wxCommandEvent& event ) /*************************************************************/ { - wxString msg = FindKicadHelpPath(); - msg += wxT("pcbnew/footprints.pdf"); - GetAssociatedDocument(this, wxEmptyString, msg); + wxString msg = FindKicadHelpPath(); + + msg += wxT( "pcbnew/footprints.pdf" ); + GetAssociatedDocument( this, wxEmptyString, msg ); } + /********************************************************************/ -void WinEDA_CvpcbFrame::ProcessFontPreferences(wxCommandEvent& event) +void WinEDA_CvpcbFrame::ProcessFontPreferences( wxCommandEvent& event ) /********************************************************************/ { -int id = event.GetId(); -wxFont font; + int id = event.GetId(); + wxFont font; - switch (id) - { - - case ID_PREFERENCES_FONT: - case ID_PREFERENCES_FONT_DIALOG: - case ID_PREFERENCES_FONT_STATUS: - WinEDA_BasicFrame::ProcessFontPreferences(id); - break; + switch( id ) + { + case ID_PREFERENCES_FONT: + case ID_PREFERENCES_FONT_DIALOG: + case ID_PREFERENCES_FONT_STATUS: + WinEDA_BasicFrame::ProcessFontPreferences( id ); + break; - case ID_PREFERENCES_FONT_INFOSCREEN: - { - font = wxGetFontFromUser(this, *g_FixedFont); - if ( font.Ok() ) - { - int pointsize = font.GetPointSize(); - *g_FixedFont = font; - g_FixedFontPointSize = pointsize; - m_FootprintList->SetFont(*g_FixedFont); - m_ListCmp->SetFont(*g_FixedFont); - } - break; - } - default: DisplayError(this, wxT("WinEDA_DrawFrame::ProcessFontPreferences Internal Error") ); - break; - } + case ID_PREFERENCES_FONT_INFOSCREEN: + { + font = wxGetFontFromUser( this, *g_FixedFont ); + if( font.Ok() ) + { + int pointsize = font.GetPointSize(); + *g_FixedFont = font; + g_FixedFontPointSize = pointsize; + m_FootprintList->SetFont( *g_FixedFont ); + m_ListCmp->SetFont( *g_FixedFont ); + } + break; + } + + default: + DisplayError( this, wxT( "WinEDA_DrawFrame::ProcessFontPreferences Internal Error" ) ); + break; + } } + /******************************************************/ -void WinEDA_CvpcbFrame::OnLeftClick(wxListEvent& event) +void WinEDA_CvpcbFrame::OnLeftClick( wxListEvent& event ) /******************************************************/ { - m_FootprintList->OnLeftClick(event); + m_FootprintList->OnLeftClick( event ); } + /******************************************************/ -void WinEDA_CvpcbFrame::OnLeftDClick(wxListEvent& event) +void WinEDA_CvpcbFrame::OnLeftDClick( wxListEvent& event ) /******************************************************/ { - m_FootprintList->OnLeftDClick(event); + m_FootprintList->OnLeftDClick( event ); } + /*************************************************************/ -void WinEDA_CvpcbFrame::OnSelectComponent(wxListEvent& event) +void WinEDA_CvpcbFrame::OnSelectComponent( wxListEvent& event ) /*************************************************************/ { -STORECMP * Component; -int selection; + STORECMP* Component; + int selection; - if ( ! m_HToolBar->GetToolState(ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST) ) - { - m_FootprintList->SetActiveFootprintList(TRUE, TRUE); - return; - } + if( !m_HToolBar->GetToolState( ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST ) ) + { + m_FootprintList->SetActiveFootprintList( TRUE, TRUE ); + return; + } - selection = m_ListCmp->GetSelection(); - if(selection < 0) - { - m_FootprintList->SetActiveFootprintList(TRUE, TRUE); - return; - } + selection = m_ListCmp->GetSelection(); + if( selection < 0 ) + { + m_FootprintList->SetActiveFootprintList( TRUE, TRUE ); + return; + } - Component = g_BaseListeCmp; - for (int ii = 0 ; Component != NULL; Component = Component->Pnext) - { - if( ii == selection ) break; - ii ++; - } - - if ( Component == NULL ) - { - m_FootprintList->SetActiveFootprintList(TRUE, TRUE); - return; - } - - m_FootprintList->SetFootprintFilteredList(Component); + Component = g_BaseListeCmp; + for( int ii = 0; Component != NULL; Component = Component->Pnext ) + { + if( ii == selection ) + break; + ii++; + } + + if( Component == NULL ) + { + m_FootprintList->SetActiveFootprintList( TRUE, TRUE ); + return; + } + + m_FootprintList->SetFootprintFilteredList( Component ); } /************************************************************************/ -void WinEDA_CvpcbFrame::OnSelectFilteringFootprint(wxCommandEvent & event) +void WinEDA_CvpcbFrame::OnSelectFilteringFootprint( wxCommandEvent& event ) /************************************************************************/ + /* Select full/filtered footprint display on tool click -*/ + */ { -wxListEvent l_event; - OnSelectComponent(l_event); -} + wxListEvent l_event; + OnSelectComponent( l_event ); +} diff --git a/pcbnew/dialog_drc.cpp b/pcbnew/dialog_drc.cpp index 427c6173a7..a3c049f5df 100644 --- a/pcbnew/dialog_drc.cpp +++ b/pcbnew/dialog_drc.cpp @@ -97,6 +97,81 @@ public: }; +/** + * Class DRC_LIST_UNCONNECTED + * is an implementation of the interface named DRC_ITEM_LIST which uses + * a vector of pointers to DRC_ITEMs to fulfill the interface. No ownership is taken of the + * vector, which will reside in class DRC + */ +class DRC_LIST_UNCONNECTED : public DRC_ITEM_LIST +{ + DRC_LIST* m_vector; + +public: + + DRC_LIST_UNCONNECTED( DRC_LIST* aList ) : + m_vector(aList) + { + } + + /* no destructor since we do not own anything to delete, not even the BOARD. + ~DRC_LIST_UNCONNECTED() {} + */ + + + //-------------------------------------------- + + void DeleteAllItems() + { + if( m_vector ) + { + for( unsigned i=0; isize(); ++i ) + delete (*m_vector)[i]; + + m_vector->clear(); + } + } + + + const DRC_ITEM* GetItem( int aIndex ) + { + if( m_vector && (unsigned)aIndex < m_vector->size() ) + { + const DRC_ITEM* item = (*m_vector)[aIndex]; + return item; + } + return NULL; + } + + void DeleteItem( int aIndex ) + { + if( m_vector && (unsigned)aIndex < m_vector->size() ) + { + delete (*m_vector)[aIndex]; + m_vector->erase( m_vector->begin()+aIndex ); + } + } + + + /** + * Function GetCount + * returns the number of items in the list. + */ + int GetCount() + { + if( m_vector ) + { + return m_vector->size(); + } + return 0; + } + + //------------------------------------------- + +}; + + + /** * Class DRCLISTBOX * is used to display a DRC_ITEM_LIST. @@ -192,15 +267,16 @@ public: { if( m_list ) { + int selection = GetSelection(); + m_list->DeleteItem( aIndex ); int count = m_list->GetCount(); SetItemCount( count ); - - if( aIndex < count ) - SetSelection( aIndex ); - else - SetSelection( aIndex-1 ); // -1 is no selection - Refresh(); + + // if old selection >= new count + if( selection >= count ) + SetSelection( count-1 ); // -1 is "no selection" + Refresh(); } } @@ -283,9 +359,6 @@ DrcDialog::DrcDialog( DRC* aTester, WinEDA_PcbFrame* parent, m_Parent = parent; Create(parent, id, caption, pos, size, style); - - PutValueInLocalUnits( *m_SetClearance, g_DesignSettings.m_TrackClearence, - m_Parent->m_InternalUnits ); } /*! @@ -556,7 +629,7 @@ void DrcDialog::OnStartdrcClick( wxCommandEvent& event ) SetCursor( wxCursor( wxCURSOR_WAIT ) ); - wxYield(); // process the cursor change event and the redraw. + wxYield(); // attempt to process the cursor change // run all the tests, with no UI at this time. m_tester->RunTests(); @@ -566,12 +639,19 @@ void DrcDialog::OnStartdrcClick( wxCommandEvent& event ) { FILE* fp = wxFopen( reportName, wxT( "w" ) ); - m_tester->WriteReport( fp ); + writeReport( fp ); fclose(fp); - // @todo put up message box saying we created the report - //msg.Printf( _( "Report file <%s> created\n" ), s_RptFilename.GetData() ); + wxString msg; + + msg.Printf( _( "Report file \"%s\" created" ), reportName.GetData() ); + + wxString caption( _("Disk File Report Completed") ); + + wxMessageDialog popupWindow( this, msg, caption ); + + popupWindow.ShowModal(); } SetCursor( wxCursor( wxCURSOR_ARROW ) ); @@ -624,9 +704,8 @@ void DrcDialog::OnListUnconnectedClick( wxCommandEvent& event ) SetCursor( wxCursor( wxCURSOR_WAIT ) ); - wxYield(); + wxYield(); // attempt to process the cursor change - // run all the tests, with no UI at this time. m_tester->ListUnconnectedPads(); // Generate the report @@ -634,19 +713,26 @@ void DrcDialog::OnListUnconnectedClick( wxCommandEvent& event ) { FILE* fp = wxFopen( reportName, wxT( "w" ) ); - m_tester->WriteReport( fp ); + writeReport( fp ); fclose(fp); - // @todo put up message box saying we created the report - //msg.Printf( _( "Report file <%s> created\n" ), s_RptFilename.GetData() ); + wxString msg; + + msg.Printf( _( "Report file \"%s\" created" ), reportName.GetData() ); + + wxString caption( _("Disk File Report Completed") ); + + wxMessageDialog popupWindow( this, msg, caption ); + + popupWindow.ShowModal(); } SetCursor( wxCursor( wxCURSOR_ARROW ) ); - - // @todo set the list counts in the DRCLISTITEMS here. - + + /* there is currently nothing visible on the DrawPanel for unconnected pads RedrawDrawPanel(); + */ } /*! @@ -690,8 +776,7 @@ void DrcDialog::OnOkClick( wxCommandEvent& event ) #endif SetReturnCode( wxID_OK ); - m_tester->DestroyDialog(); -// event.Skip(); + m_tester->DestroyDialog( wxID_OK ); } @@ -706,8 +791,7 @@ void DrcDialog::OnCancelClick( wxCommandEvent& event ) #endif SetReturnCode( wxID_CANCEL ); - m_tester->DestroyDialog(); -// event.Skip(); + m_tester->DestroyDialog( wxID_CANCEL ); } @@ -759,6 +843,10 @@ void DrcDialog::OnInitDialog( wxInitDialogEvent& event ) void DrcDialog::OnLeftDClickClearance( wxMouseEvent& event ) { + event.Skip(); + + // I am assuming that the double click actually changed the selected item. + // please verify this. int selection = m_ClearanceListBox->GetSelection(); if( selection != wxNOT_FOUND ) @@ -768,19 +856,21 @@ void DrcDialog::OnLeftDClickClearance( wxMouseEvent& event ) const DRC_ITEM* item = m_ClearanceListBox->GetItem( selection ); if( item ) { - // after the goto, process a button OK command later. + // after the goto, process a button OK command later. + /* wxCommandEvent cmd( wxEVT_COMMAND_BUTTON_CLICKED, wxID_OK ); ::wxPostEvent( GetEventHandler(), cmd ); + */ m_Parent->CursorGoto( item->GetPosition() ); + + // turn control over to m_Parent, hide this DrcDialog window, + // no destruction so we can preserve listbox cursor + Hide(); + + event.StopPropagation(); // still get the popup window. } } - - // On linux, the double click is being propagated to the parent. The - // call to StopPropagation was an attempt to prevent this. - - event.StopPropagation(); // we handled the double click event here. - // well that didn't work, we still get a popup menu } @@ -812,28 +902,28 @@ void DrcDialog::OnRightUpClearance( wxMouseEvent& event ) void DrcDialog::OnLeftDClickUnconnected( wxMouseEvent& event ) { + event.Skip(); + + // I am assuming that the double click actually changed the selected item. + // please verify this. int selection = m_UnconnectedListBox->GetSelection(); if( selection != wxNOT_FOUND ) { - // Find the selected DRC_ITEM in the DRC, position cursor there. - // Then close the dialog. + // Find the selected DRC_ITEM in the listbox, position cursor there, + // at the first of the two pads. + // Then hide the dialog. const DRC_ITEM* item = m_UnconnectedListBox->GetItem( selection ); if( item ) { - // after the goto, process a button OK command later. - wxCommandEvent cmd( wxEVT_COMMAND_BUTTON_CLICKED, wxID_OK ); - ::wxPostEvent( GetEventHandler(), cmd ); - m_Parent->CursorGoto( item->GetPosition() ); + + Hide(); + + // intermittently, still get the popup window, even with this. + event.StopPropagation(); } } - - // On linux, the double click is being propagated to the parent. The - // call to StopPropagation was an attempt to prevent this. - - event.StopPropagation(); // we handled the double click event here. - // well that didn't work, we still get a popup menu } @@ -879,6 +969,33 @@ void DrcDialog::DelDRCMarkers() } +void DrcDialog::writeReport( FILE* fp ) +{ + int count; + + fprintf( fp, "** Drc report for %s **\n", + CONV_TO_UTF8( m_Parent->GetScreen()->m_FileName ) ); + + char line[256]; + fprintf( fp, "** Created on %s **\n", DateAndTime( line ) ); //@todo make DateAndTime use localtime, not gmtime + + count = m_ClearanceListBox->GetItemCount(); + + fprintf( fp, "\n** Found %d DRC errors **\n", count ); + + for( int i=0; iGetItem(i)->ShowReport().mb_str() ); + + count = m_UnconnectedListBox->GetItemCount(); + + fprintf( fp, "\n** Found %d unconnected pads **\n", count ); + + for( int i=0; iGetItem(i)->ShowReport().mb_str() ); + + fprintf( fp, "\n** End of Report **\n" ); +} + /*! * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_DELETE_ONE @@ -895,6 +1012,8 @@ void DrcDialog::OnDeleteOneClick( wxCommandEvent& event ) if( selectedIndex != wxNOT_FOUND ) { m_ClearanceListBox->DeleteItem( selectedIndex ); + + // redraw the pcb RedrawDrawPanel(); } } @@ -905,7 +1024,10 @@ void DrcDialog::OnDeleteOneClick( wxCommandEvent& event ) if( selectedIndex != wxNOT_FOUND ) { m_UnconnectedListBox->DeleteItem( selectedIndex ); + + /* these unconnected DRC_ITEMs are not currently visible on the pcb RedrawDrawPanel(); + */ } } diff --git a/pcbnew/dialog_drc.h b/pcbnew/dialog_drc.h index 615572de99..c16b19b801 100644 --- a/pcbnew/dialog_drc.h +++ b/pcbnew/dialog_drc.h @@ -85,6 +85,16 @@ class DrcDialog: public wxDialog DECLARE_DYNAMIC_CLASS( DrcDialog ) DECLARE_EVENT_TABLE() + /** + * Function writeReport + * outputs the MARKER items and unconnecte DRC_ITEMs with commentary to an + * open text file. + * @param fpOut The text file to write the report to. + */ + void writeReport( FILE* fpOut ); + + + public: /// Constructors DrcDialog( ); diff --git a/pcbnew/drc.cpp b/pcbnew/drc.cpp index be65bb5e46..c4351a5fb6 100644 --- a/pcbnew/drc.cpp +++ b/pcbnew/drc.cpp @@ -44,15 +44,9 @@ #include "dialog_drc.cpp" -#define EC_INC // ++m_errorCount don't need this anymore, vector counts - - /******************************************************/ void WinEDA_PcbFrame::Install_Test_DRC_Frame( wxDC* DC ) /******************************************************/ - -/* install a dialog box to handle the general DRC control - */ { m_drc->ShowDialog(); } @@ -63,24 +57,41 @@ void DRC::ShowDialog() if( !m_ui ) { m_ui = new DrcDialog( this, m_mainWindow ); + updatePointers(); + + // copy data retained in this DRC object into the m_ui DrcPanel: + + PutValueInLocalUnits( *m_ui->m_SetClearance, g_DesignSettings.m_TrackClearence, + m_mainWindow->m_InternalUnits );; + + m_ui->m_Pad2PadTestCtrl->SetValue( m_doPad2PadTest ); + m_ui->m_ZonesTestCtrl->SetValue( m_doZonesTest ); + m_ui->m_UnconnectedTestCtrl->SetValue( m_doUnconnectedTest ); + + m_ui->m_CreateRptCtrl->SetValue( m_doCreateRptFile ); + m_ui->m_RptFilenameCtrl->SetValue( m_rptFilename ); } - - updatePointers(); - - - - // @todo enter retentitive member data into the DrcDialog here - + else + updatePointers(); + m_ui->Show(true); - - // @todo capture the UI entered data into this DRC object. BUT in the OK handler } -void DRC::DestroyDialog() +void DRC::DestroyDialog( int aReason ) { if( m_ui ) { + if( aReason == wxID_OK ) + { + // if user clicked OK, save his choices in this DRC object. + m_doCreateRptFile = m_ui->m_CreateRptCtrl->GetValue(); + m_doPad2PadTest = m_ui->m_Pad2PadTestCtrl->GetValue(); + m_doZonesTest = m_ui->m_ZonesTestCtrl->GetValue(); + m_doUnconnectedTest = m_ui->m_UnconnectedTestCtrl->GetValue(); + m_rptFilename = m_ui->m_RptFilenameCtrl->GetValue(); + } + m_ui->Destroy(); m_ui = 0; } @@ -103,7 +114,6 @@ DRC::DRC( WinEDA_PcbFrame* aPcbWindow ) // m_rptFilename set to empty by its constructor - //m_errorCount = 0; m_currentMarker = 0; m_spotcx = 0; @@ -119,10 +129,15 @@ DRC::DRC( WinEDA_PcbFrame* aPcbWindow ) m_xcliphi = 0; m_ycliphi = 0; - m_unconnectedCount = 0; m_drawPanel = 0; } +DRC::~DRC() +{ + // maybe someday look at pointainer.h <- google for "pointainer.h" + for( unsigned i=0; iGetScreen()->m_FileName ) ); - - char line[256]; - fprintf( fp, "** Created on %s **\n", DateAndTime( line ) ); - - - fprintf( fp, "** Found %d DRC errors **\n", m_pcb->GetMARKERCount() ); - - for( int i=0; iGetMARKERCount(); ++i ) - fprintf( fp, m_pcb->GetMARKER(i)->GetReporter().ShowReport().mb_str() ); - - // @todo: the unconnected report comes here: - - /* - for( int i=0; iGetOPENNETCount(); ++i ) - fprintf( fp, m_pcb->GetOPENNET(i)->GetReporter().ShowReport().mb_str() ); - */ - - fprintf( fp, "** End of Report **\n" ); -} - - void DRC::RunTests() { - // erase the MARKERs here. - m_pcb->DeleteMARKERs(); - + // someone should have cleared the two lists before calling this. // test pad to pad clearances, nothing to do with tracks, vias or zones. if( m_doPad2PadTest ) @@ -188,7 +176,7 @@ void DRC::RunTests() if( m_doUnconnectedTest ) testUnconnected(); - // update the listboxes + // update the m_ui listboxes updatePointers(); } @@ -198,10 +186,10 @@ void DRC::RunTests() void DRC::ListUnconnectedPads() /***************************************************************/ { - // erase the MARKERs here. - m_pcb->DeleteMARKERs(); - testUnconnected(); + + // update the m_ui listboxes + updatePointers(); } @@ -212,10 +200,11 @@ void DRC::updatePointers() m_pcb = m_mainWindow->m_Pcb; m_ui->m_ClearanceListBox->SetList( new DRC_LIST_MARKERS( m_pcb ) ); + + m_ui->m_UnconnectedListBox->SetList( new DRC_LIST_UNCONNECTED( &m_unconnected ) ); } - void DRC::testTracks() { for( TRACK* segm = m_pcb->m_Track; segm && segm->Next(); segm=segm->Next() ) @@ -273,22 +262,20 @@ void DRC::testUnconnected() if( m_pcb->m_Ratsnest == NULL ) return; - m_unconnectedCount = 0; - CHEVELU* rat = m_pcb->m_Ratsnest; for( int i=0; iGetNumRatsnests(); ++i, ++rat ) { if( (rat->status & CH_ACTIF) == 0 ) continue; - m_unconnectedCount++; - D_PAD* padStart = rat->pad_start; D_PAD* padEnd = rat->pad_end; - MARKER* marker = fillMarker( padStart, padEnd, DRCE_UNCONNECTED_PADS, NULL ); + DRC_ITEM* uncItem = new DRC_ITEM( DRCE_UNCONNECTED_PADS, padStart->GetPosition(), + padStart->MenuText(m_pcb), padEnd->MenuText(m_pcb), + padStart->GetPosition(), padEnd->GetPosition() ); - m_pcb->Add( marker ); + m_unconnected.push_back( uncItem ); } } @@ -466,7 +453,6 @@ bool DRC::doTrackDrc( TRACK* aRefSeg, TRACK* aStart ) if( !checkClearanceSegmToPad( &pseudo_pad, w_dist, g_DesignSettings.m_TrackClearence ) ) { - EC_INC; m_currentMarker = fillMarker( aRefSeg, pad, DRCE_TRACK_NEAR_THROUGH_HOLE, m_currentMarker ); return false; @@ -487,7 +473,6 @@ bool DRC::doTrackDrc( TRACK* aRefSeg, TRACK* aStart ) m_spotcy = shape_pos.y - org_Y; if( !checkClearanceSegmToPad( pad, w_dist, g_DesignSettings.m_TrackClearence ) ) { - EC_INC; m_currentMarker = fillMarker( aRefSeg, pad, DRCE_TRACK_NEAR_PAD, m_currentMarker ); return false; @@ -543,7 +528,6 @@ bool DRC::doTrackDrc( TRACK* aRefSeg, TRACK* aStart ) // Test distance between two vias if( (int) hypot( x0, y0 ) < w_dist ) { - EC_INC; m_currentMarker = fillMarker( aRefSeg, track, DRCE_VIA_NEAR_VIA, m_currentMarker ); return false; @@ -560,7 +544,6 @@ bool DRC::doTrackDrc( TRACK* aRefSeg, TRACK* aStart ) if( !checkMarginToCircle( x0, y0, w_dist, dx ) ) { - EC_INC; m_currentMarker = fillMarker( aRefSeg, track, DRCE_VIA_NEAR_TRACK, m_currentMarker ); return false; @@ -587,7 +570,6 @@ bool DRC::doTrackDrc( TRACK* aRefSeg, TRACK* aStart ) if( checkMarginToCircle( x0, y0, w_dist, m_segmLength ) ) continue; - EC_INC; m_currentMarker = fillMarker( aRefSeg, track, DRCE_TRACK_NEAR_VIA, m_currentMarker ); return false; @@ -611,14 +593,12 @@ bool DRC::doTrackDrc( TRACK* aRefSeg, TRACK* aStart ) /* Fine test : we consider the rounded shape of the ends */ if( x0 >= 0 && x0 <= m_segmLength ) { - EC_INC; m_currentMarker = fillMarker( aRefSeg, track, DRCE_TRACK_ENDS1, m_currentMarker ); return false; } if( !checkMarginToCircle( x0, y0, w_dist, m_segmLength ) ) { - EC_INC; m_currentMarker = fillMarker( aRefSeg, track, DRCE_TRACK_ENDS2, m_currentMarker ); return false; @@ -629,14 +609,12 @@ bool DRC::doTrackDrc( TRACK* aRefSeg, TRACK* aStart ) /* Fine test : we consider the rounded shape of the ends */ if( xf >= 0 && xf <= m_segmLength ) { - EC_INC; m_currentMarker = fillMarker( aRefSeg, track, DRCE_TRACK_ENDS3, m_currentMarker ); return false; } if( !checkMarginToCircle( xf, yf, w_dist, m_segmLength ) ) { - EC_INC; m_currentMarker = fillMarker( aRefSeg, track, DRCE_TRACK_ENDS4, m_currentMarker ); return false; @@ -645,7 +623,6 @@ bool DRC::doTrackDrc( TRACK* aRefSeg, TRACK* aStart ) if( x0 <=0 && xf >= 0 ) { - EC_INC; m_currentMarker = fillMarker( aRefSeg, track, DRCE_TRACK_UNKNOWN1, m_currentMarker ); return false; @@ -661,7 +638,6 @@ bool DRC::doTrackDrc( TRACK* aRefSeg, TRACK* aStart ) EXCHG( y0, yf ); if( (y0 < 0) && (yf > 0) ) { - EC_INC; m_currentMarker = fillMarker( aRefSeg, track, DRCE_TRACKS_CROSSING, m_currentMarker ); return false; @@ -670,14 +646,12 @@ bool DRC::doTrackDrc( TRACK* aRefSeg, TRACK* aStart ) // At this point the drc error is due to an end near a reference segm end if( !checkMarginToCircle( x0, y0, w_dist, m_segmLength ) ) { - EC_INC; m_currentMarker = fillMarker( aRefSeg, track, DRCE_ENDS_PROBLEM1, m_currentMarker ); return false; } if( !checkMarginToCircle( xf, yf, w_dist, m_segmLength ) ) { - EC_INC; m_currentMarker = fillMarker( aRefSeg, track, DRCE_ENDS_PROBLEM2, m_currentMarker ); return false; @@ -706,7 +680,6 @@ bool DRC::doTrackDrc( TRACK* aRefSeg, TRACK* aStart ) if( !checkLine( x0, y0, xf, yf ) ) { - EC_INC; m_currentMarker = fillMarker( aRefSeg, track, DRCE_ENDS_PROBLEM3, m_currentMarker ); return false; @@ -742,14 +715,12 @@ bool DRC::doTrackDrc( TRACK* aRefSeg, TRACK* aStart ) RotatePoint( &rxf, &ryf, angle ); if( !checkMarginToCircle( rx0, ry0, w_dist, dx ) ) { - EC_INC; m_currentMarker = fillMarker( aRefSeg, track, DRCE_ENDS_PROBLEM4, m_currentMarker ); return false; } if( !checkMarginToCircle( rxf, ryf, w_dist, dx ) ) { - EC_INC; m_currentMarker = fillMarker( aRefSeg, track, DRCE_ENDS_PROBLEM5, m_currentMarker ); return false; @@ -801,7 +772,6 @@ bool DRC::doPadToPadsDrc( D_PAD* aRefPad, LISTE_PAD* aStart, LISTE_PAD* aEnd, if( !checkClearancePadToPad( aRefPad, pad, g_DesignSettings.m_TrackClearence ) ) { // here we have a drc error! - EC_INC; m_currentMarker = fillMarker( aRefPad, pad, DRCE_PAD_NEAR_PAD1, m_currentMarker ); return false; @@ -832,16 +802,16 @@ bool DRC::checkClearancePadToPad( D_PAD* aRefPad, D_PAD* aPad, const int dist_mi bool diag = true; - /* tst rapide: si les cercles exinscrits sont distants de dist_min au moins, * il n'y a pas de risque: */ if( (dist - aRefPad->m_Rayon - aPad->m_Rayon) >= dist_min ) - return OK_DRC; + goto exit; /* Ici les pads sont proches et les cercles exinxcrits sont trop proches * Selon les formes relatives il peut y avoir ou non erreur */ - bool swap_pads = false; + bool swap_pads; + swap_pads = false; if( (aRefPad->m_PadShape != CIRCLE) && (aPad->m_PadShape == CIRCLE) ) swap_pads = true; else if( (aRefPad->m_PadShape != OVALE) && (aPad->m_PadShape == OVALE) ) @@ -939,6 +909,8 @@ bool DRC::checkClearancePadToPad( D_PAD* aRefPad, D_PAD* aPad, const int dist_mi break; } +exit: // the only way out (hopefully) for simpler debugging + return diag; } diff --git a/pcbnew/drc_stuff.h b/pcbnew/drc_stuff.h index 28586536a7..521c827145 100644 --- a/pcbnew/drc_stuff.h +++ b/pcbnew/drc_stuff.h @@ -114,7 +114,9 @@ public: { wxString ret; - ret.Printf( _("ErrType(%d): %s
  • %s: %s
  • %s: %s
"), + // an html fragment for the entire message in the listbox. feel free + // to add color if you want: + ret.Printf( _("ErrType(%d): %s
  • %s: %s
  • %s: %s
"), m_ErrorCode, GetErrorText().GetData(), ShowCoord( m_APos ).GetData(), m_AText.GetData(), @@ -249,6 +251,8 @@ public: }; +typedef std::vector DRC_LIST; + /** * Class DRC @@ -292,14 +296,12 @@ private: int m_xcliphi; int m_ycliphi; // coord de la surface de securite du segment a comparer - int m_unconnectedCount; - WinEDA_PcbFrame* m_mainWindow; WinEDA_DrawPanel* m_drawPanel; BOARD* m_pcb; DrcDialog* m_ui; - std::vector m_unconnected; + DRC_LIST m_unconnected; ///< list of unconnected pads, as DRC_ITEMs /** @@ -425,6 +427,7 @@ private: public: DRC( WinEDA_PcbFrame* aPcbWindow ); + ~DRC(); /** * Function Drc @@ -465,9 +468,10 @@ public: /** * Function DestroyDialog * deletes this ui dialog box and zeros out its pointer to remember - * the state of the dialog's existence. + * the state of the dialog's existence. + * @param aReason Indication of which button was clicked to cause the destruction. */ - void DestroyDialog(); + void DestroyDialog( int aReason ); /** @@ -505,13 +509,6 @@ public: */ void ListUnconnectedPads(); - - /** - * Function WriteReport - * outputs the MARKER items with commentary to an open text file. - * @param fpOut The text file to write the report to. - */ - void WriteReport( FILE* fpOut ); };