diff --git a/pcbnew/bitmaps/general_ratsnet.xpm b/bitmaps/general_ratsnet.xpm similarity index 85% rename from pcbnew/bitmaps/general_ratsnet.xpm rename to bitmaps/general_ratsnet.xpm index 249cf1b96d..e8334b7eb2 100644 --- a/pcbnew/bitmaps/general_ratsnet.xpm +++ b/bitmaps/general_ratsnet.xpm @@ -1,60 +1,66 @@ -/* XPM */ -static char * general_ratsnet_xpm[] = { -"16 16 41 1", -" c None", -". c #FFFFFF", -"+ c #2F2F2F", -"@ c #444342", -"# c #AEAEAE", -"$ c #1D1D1D", -"% c #F2D7C1", -"& c #F2BD8E", -"* c #3C3631", -"= c #403D3B", -"- c #F2B279", -"; c #F29747", -"> c #443B33", -", c #B1B1B1", -"' c #444444", -") c #333231", -"! c #C3C3C3", -"~ c #372E28", -"{ c #3C3129", -"] c #413B36", -"^ c #423F3D", -"/ c #382F29", -"( c #1C1006", -"_ c #323232", -": c #161514", -"< c #181818", -"[ c #3B3A39", -"} c #3F3F3F", -"| c #171009", -"1 c #F2D7C0", -"2 c #F2BC8E", -"3 c #3D3731", -"4 c #1D1917", -"5 c #2A1F16", -"6 c #413E3C", -"7 c #F29647", -"8 c #1B1007", -"9 c #261D16", -"0 c #443A32", -"a c #BBBBBB", -"b c #1A1109", -" ... ... ", -" .. .. ", -" +@# ... ", -" $%&* .. ", -" =-;>.....,') ", -"..!~{!.....'%&].", -".. ... ^-;>.", -". ... .!/( ", -" ..... ", -" ... ", -" ..... ", -" ... .!_: ", -" <[!. }%&| ", -"...'123 4-;5 ", -"...6-78 90a ", -" b( .. "}; +/* XPM */ +#ifndef XPMMAIN +extern char *general_ratsnet_xpm[]; + +#else +char * general_ratsnet_xpm[] = { +"16 16 41 1", +" c None", +". c #FFFFFF", +"+ c #2F2F2F", +"@ c #444342", +"# c #AEAEAE", +"$ c #1D1D1D", +"% c #F2D7C1", +"& c #F2BD8E", +"* c #3C3631", +"= c #403D3B", +"- c #F2B279", +"; c #F29747", +"> c #443B33", +", c #B1B1B1", +"' c #444444", +") c #333231", +"! c #C3C3C3", +"~ c #372E28", +"{ c #3C3129", +"] c #413B36", +"^ c #423F3D", +"/ c #382F29", +"( c #1C1006", +"_ c #323232", +": c #161514", +"< c #181818", +"[ c #3B3A39", +"} c #3F3F3F", +"| c #171009", +"1 c #F2D7C0", +"2 c #F2BC8E", +"3 c #3D3731", +"4 c #1D1917", +"5 c #2A1F16", +"6 c #413E3C", +"7 c #F29647", +"8 c #1B1007", +"9 c #261D16", +"0 c #443A32", +"a c #BBBBBB", +"b c #1A1109", +" ... ... ", +" .. .. ", +" +@# ... ", +" $%&* .. ", +" =-;>.....,') ", +"..!~{!.....'%&].", +".. ... ^-;>.", +". ... .!/( ", +" ..... ", +" ... ", +" ..... ", +" ... .!_: ", +" <[!. }%&| ", +"...'123 4-;5 ", +"...6-78 90a ", +" b( .. "}; + +#endif diff --git a/change_log.txt b/change_log.txt index 64c741c3ba..400de62394 100644 --- a/change_log.txt +++ b/change_log.txt @@ -4,6 +4,14 @@ Started 2007-June-11 Please add newer entries at the top, list the date and your name with email address. +2007-sept-25 UPDATE Jean-Pierre Charras +================================================================================ ++ pcbnew: + * add class_board_item.cpp file and move BOARD_ITEM::MenuText() and BOARD_ITEM::MenuIcon() in it + * Add zone detection, forgotten in PcbGeneralLocateAndDisplay() ++ class_collector.h: + add void COLLECTOR::Remove( unsigned int item_position ), needed by zone detection, see PcbGeneralLocateAndDisplay + 2007-Sep-25 UPDATE Geoff Harland ================================================================================ diff --git a/include/bitmaps.h b/include/bitmaps.h index 02cb98e2bd..a507f3cb0c 100644 --- a/include/bitmaps.h +++ b/include/bitmaps.h @@ -181,6 +181,7 @@ #include "../bitmaps/library_update.xpm" #include "../bitmaps/transistor.xpm" #include "../bitmaps/kicad_icon_small.xpm" + #include "../bitmaps/general_ratsnet.xpm" // Largeur du toolbar vertical #define VTOOLBAR_WIDTH 26 diff --git a/include/class_collector.h b/include/class_collector.h index 5acbadbcca..6ec9f46fb3 100644 --- a/include/class_collector.h +++ b/include/class_collector.h @@ -109,6 +109,15 @@ public: m_List.push_back( item ); } + /** + * Function Remove + * removes the item at item_position (first position is 0); + * @param item_position index. + */ + void Remove( unsigned int item_position ) + { + m_List.erase( m_List.begin() + item_position ); + } /** * Function operator[int] @@ -219,33 +228,7 @@ public: SetTimeNow(); // when it was taken } */ - - - /** - * Function Collect - * scans an EDA_BaseStruct using this class's Inspector method, which does - * the collection. - * @param container An EDA_BaseStruct to scan, including those items it contains. - * @param aRefBox An EDA_Rect to use in bounds-testing. - * - * example implementation, in derived class: - * - virtual void Collect( EDA_BaseStruct* container, const EDA_Rect& aRefBox ) - { - example implementation: - - SetBoundingBox( aRefBox ); // pass box to Inspect() - - Empty(); // empty the collection - - // visit the board with the INSPECTOR (me). - container->Visit( this, // INSPECTOR* inspector - NULL, // const void* testData, - m_ScanTypes); - SetTimeNow(); // when it was taken - } - */ - + }; #endif // COLLECTOR_H diff --git a/pcbnew/class_board_item.cpp b/pcbnew/class_board_item.cpp new file mode 100644 index 0000000000..3db7395808 --- /dev/null +++ b/pcbnew/class_board_item.cpp @@ -0,0 +1,249 @@ +/*****************************************/ +/* class BOARD_ITEM: som basic functions */ +/*****************************************/ + +#include "fctsys.h" +#include "gr_basic.h" + +#include "common.h" +#include "pcbnew.h" + +#include "id.h" +#include "collectors.h" + +#include "bitmaps.h" +#include "add_cotation.xpm" +#include "Add_Mires.xpm" +#include "Add_Zone.xpm" + + +/********************************************************/ +wxString BOARD_ITEM::MenuText( const BOARD* aPcb ) const +/********************************************************/ + +/** return a specific comment for "this". Used in pop up menus + * @param aPcb = the parent board + */ +{ + wxString text; + const BOARD_ITEM* item = this; + EQUIPOT* net; + + switch( item->Type() ) + { + case PCB_EQUIPOT_STRUCT_TYPE: + text << _( "Net" ) << ( (EQUIPOT*) item )->m_Netname << wxT( " " ) << + ( (EQUIPOT*) item )->m_NetCode; + break; + + case TYPEMODULE: + text << _( "Footprint" ) << wxT( " " ) << ( (MODULE*) item )->GetReference(); + text << wxT( " (" ) << ReturnPcbLayerName( item->m_Layer ) << wxT( ")" ); + break; + + case TYPEPAD: + text << _( "Pad" ) << wxT( " " ) << ( (D_PAD*) item )->ReturnStringPadName() << _( " of " ) + << ( (MODULE*) GetParent() )->GetReference(); + break; + + case TYPEDRAWSEGMENT: + text << _( "Pcb Graphic" ) << _( " on " ) << ReturnPcbLayerName( item->GetLayer() ); // @todo: extend text + break; + + case TYPETEXTE: + text << _( "Pcb Text" ) << wxT( " " );; + if( ( (TEXTE_PCB*) item )->m_Text.Len() < 12 ) + text << ( (TEXTE_PCB*) item )->m_Text; + else + text += ( (TEXTE_PCB*) item )->m_Text.Left( 10 ) + wxT( ".." ); + text << _( " on " ) << ReturnPcbLayerName( item->GetLayer() ); + break; + + case TYPETEXTEMODULE: + + switch( ( (TEXTE_MODULE*) item )->m_Type ) + { + case TEXT_is_REFERENCE: + text << _( "Reference" ) << wxT( " " ) << ( (TEXTE_MODULE*) item )->m_Text; + break; + + case TEXT_is_VALUE: + text << _( "Value" ) << wxT( " " ) << ( (TEXTE_MODULE*) item )->m_Text << _( " of " ) + << ( (MODULE*) GetParent() )->GetReference(); + break; + + default: // wrap this one in quotes: + text << _( "Text" ) << wxT( " \"" ) << ( (TEXTE_MODULE*) item )->m_Text << + wxT( "\"" ) << _( " of " ) + << ( (MODULE*) GetParent() )->GetReference(); + break; + } + + break; + + case TYPEEDGEMODULE: + text << _( "Graphic" ) << wxT( " " ); + const wxChar* cp; + + switch( ( (EDGE_MODULE*) item )->m_Shape ) + { + case S_SEGMENT: + cp = _( "Line" ); break; + + case S_RECT: + cp = _( "Rect" ); break; + + case S_ARC: + cp = _( "Arc" ); break; + + case S_CIRCLE: + cp = _( "Circle" ); break; + + /* used in Gerbview: */ + case S_ARC_RECT: + cp = wxT( "arc_rect" ); break; + + case S_SPOT_OVALE: + cp = wxT( "spot_oval" ); break; + + case S_SPOT_CIRCLE: + cp = wxT( "spot_circle" ); break; + + case S_SPOT_RECT: + cp = wxT( "spot_rect" ); break; + + case S_POLYGON: + cp = wxT( "polygon" ); break; + + default: + cp = wxT( "??EDGE??" ); break; + } + + text << *cp << _( " of " ) + << ( (MODULE*) GetParent() )->GetReference(); + break; + + case TYPETRACK: + text << _( "Track" ) << wxT( " " ) << ( (TRACK*) item )->m_NetCode; + net = aPcb->FindNet( ( (TRACK*) item )->m_NetCode ); + if( net ) + { + text << wxT( " [" ) << net->m_Netname << wxT( "]" ); + } + text << _( " on " ) << ReturnPcbLayerName( item->GetLayer() ); + break; + + case TYPEZONE: + text << _( "Zone" ) << _( " on " ) << ReturnPcbLayerName( item->GetLayer() ); + break; + + case TYPEVIA: + text << _( "Via" ) << wxT( " " ) << ( (SEGVIA*) item )->m_NetCode; + net = aPcb->FindNet( ( (TRACK*) item )->m_NetCode ); + if( net ) + { + text << wxT( " [" ) << net->m_Netname << wxT( "]" ); + } + break; + + case TYPEMARQUEUR: + text << _( "Marker" ); + break; + + case TYPECOTATION: + text << _( "Dimension" ) << wxT(" \"") << ((COTATION*) item)->GetText() << wxT("\""); + break; + + case TYPEMIRE: + text << _( "Mire" ); // @todo: extend text, Mire is not an english word! + break; + + case TYPEEDGEZONE: + text << _( "Edge Zone" ) << _( " on " ) << ReturnPcbLayerName( item->GetLayer() ); // @todo: extend text + break; + + default: + text << item->GetClass() << wxT( " Unexpected item type: BUG!!" ); + break; + } + + return text; +} + + +/*****************************************/ +const char** BOARD_ITEM::MenuIcon() const +/*****************************************/ + +/** return a specific icon pointer (an xpm icon) for "this". Used in pop up menus + * @return an icon pointer (can be NULL) + */ +{ + char** xpm; + const BOARD_ITEM* item = this; + + switch( item->Type() ) + { + case PCB_EQUIPOT_STRUCT_TYPE: + xpm = general_ratsnet_xpm; + break; + + case TYPEMODULE: + xpm = module_xpm; + break; + + case TYPEPAD: + xpm = pad_xpm; + break; + + case TYPEDRAWSEGMENT: + xpm = add_dashed_line_xpm; + break; + + case TYPETEXTE: + xpm = add_text_xpm; + break; + + case TYPETEXTEMODULE: + xpm = footprint_text_xpm; + break; + + case TYPEEDGEMODULE: + xpm = show_mod_edge_xpm; + break; + + case TYPETRACK: + xpm = showtrack_xpm; + break; + + case TYPEZONE: + xpm = add_zone_xpm; + break; + + case TYPEVIA: + xpm = pad_sketch_xpm; + break; + + case TYPEMARQUEUR: + xpm = pad_xpm; // @todo: create and use marker xpm + break; + + case TYPECOTATION: + xpm = add_cotation_xpm; + break; + + case TYPEMIRE: + xpm = add_mires_xpm; + break; + + case TYPEEDGEZONE: + xpm = show_mod_edge_xpm; // @todo: pcb edge xpm + break; + + default: + xpm = 0; + break; + } + + return (const char**) xpm; +} diff --git a/pcbnew/class_cotation.cpp b/pcbnew/class_cotation.cpp index 46ddaad33d..5134da292a 100644 --- a/pcbnew/class_cotation.cpp +++ b/pcbnew/class_cotation.cpp @@ -56,13 +56,23 @@ void COTATION::UnLink() } -/* Changement du texte de la cotation */ +/* Setup the dimension text */ void COTATION:: SetText( const wxString& NewText ) { m_Text->m_Text = NewText; } +/**********************************/ +wxString COTATION:: GetText( void ) +/**********************************/ +/* Reutun the dimension text +*/ +{ + return m_Text->m_Text; +} + + /*************************************/ void COTATION::Copy( COTATION* source ) /*************************************/ diff --git a/pcbnew/class_cotation.h b/pcbnew/class_cotation.h index 8934aac3c5..75d5c9264b 100644 --- a/pcbnew/class_cotation.h +++ b/pcbnew/class_cotation.h @@ -36,6 +36,7 @@ public: /* Modification du texte de la cotation */ void SetText( const wxString& NewText ); + wxString GetText( void ); void Copy( COTATION* source ); diff --git a/pcbnew/collectors.cpp b/pcbnew/collectors.cpp index 16715f433a..8c153d5db3 100644 --- a/pcbnew/collectors.cpp +++ b/pcbnew/collectors.cpp @@ -38,6 +38,7 @@ const KICAD_T GENERAL_COLLECTOR::AllBoardItems[] = { TYPECOTATION, TYPEVIA, TYPETRACK, + TYPEZONE, TYPEPAD, TYPETEXTEMODULE, TYPEMODULE, @@ -94,6 +95,7 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_BaseStruct* testItem, const void* { BOARD_ITEM* item = (BOARD_ITEM*) testItem; MODULE* module = NULL; + bool skip_item = false; #if 0 // debugging static int breakhere = 0; @@ -114,6 +116,9 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_BaseStruct* testItem, const void* case TYPETRACK: breakhere++; break; + case TYPEZONE: + breakhere++; + break; case TYPETEXTE: breakhere++; break; @@ -167,6 +172,9 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_BaseStruct* testItem, const void* break; case TYPETRACK: break; + case TYPEZONE: + if( ! DisplayOpt.DisplayZones ) skip_item = true; + break; case TYPETEXTE: break; case TYPEDRAWSEGMENT: @@ -226,7 +234,7 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_BaseStruct* testItem, const void* { if( item->HitTest( m_RefPos ) ) { - Append( item ); + if ( ! skip_item ) Append( item ); goto exit; } } @@ -253,7 +261,7 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_BaseStruct* testItem, const void* { if( item->HitTest( m_RefPos ) ) { - Append2nd( item ); + if ( ! skip_item ) Append2nd( item ); goto exit; } } diff --git a/pcbnew/controle.cpp b/pcbnew/controle.cpp index b0ed4cdcdc..574c3025b4 100644 --- a/pcbnew/controle.cpp +++ b/pcbnew/controle.cpp @@ -9,21 +9,14 @@ #include "common.h" #include "pcbnew.h" +#include "protos.h" #include "id.h" -#include "protos.h" #include "collectors.h" #include "bitmaps.h" -#include "add_cotation.xpm" -#include "Add_Mires.xpm" -#include "Add_Zone.xpm" -/* Routines Locales : */ - -/* Variables Locales */ - /****************************************/ void RemoteCommand( const char* cmdline ) /****************************************/ @@ -36,7 +29,7 @@ void RemoteCommand( const char* cmdline ) wxString msg; char* idcmd; char* text; - WinEDA_PcbFrame* frame = EDA_Appl->m_PcbFrame; + WinEDA_PcbFrame* frame = EDA_Appl->m_PcbFrame; MODULE* module = 0; strncpy( line, cmdline, sizeof(line) - 1 ); @@ -49,13 +42,13 @@ void RemoteCommand( const char* cmdline ) if( strcmp( idcmd, "$PART:" ) == 0 ) { - msg = CONV_FROM_UTF8( text ); - + msg = CONV_FROM_UTF8( text ); + module = ReturnModule( frame->m_Pcb, msg ); - + msg.Printf( _( "Locate module %s %s" ), msg.GetData(), module ? wxT( "Ok" ) : wxT( "not found" ) ); - + frame->Affiche_Message( msg ); if( module ) { @@ -71,11 +64,11 @@ void RemoteCommand( const char* cmdline ) if( idcmd && strcmp( idcmd, "$PIN:" ) == 0 ) { wxString pinName, modName; - D_PAD* pad = NULL; + D_PAD* pad = NULL; int netcode = -1; - + pinName = CONV_FROM_UTF8( text ); - + text = strtok( NULL, " \n\r" ); if( text && strcmp( text, "$PART:" ) == 0 ) text = strtok( NULL, "\n\r" ); @@ -88,18 +81,18 @@ void RemoteCommand( const char* cmdline ) module = ReturnModule( frame->m_Pcb, modName ); if( module ) pad = ReturnPad( module, pinName ); - + if( pad ) netcode = pad->m_NetCode; - - if( netcode > 0 ) /* hightlighted the net selected net*/ + + if( netcode > 0 ) /* hightlighted the net selected net*/ { - if( g_HightLigt_Status ) /* erase the old hightlighted net */ + if( g_HightLigt_Status ) /* erase the old hightlighted net */ frame->Hight_Light( &dc ); - + g_HightLigth_NetCode = netcode; frame->Hight_Light( &dc ); /* hightlighted the new one */ - + frame->DrawPanel->CursorOff( &dc ); frame->GetScreen()->m_Curseur = pad->m_Pos; frame->DrawPanel->CursorOn( &dc ); @@ -113,268 +106,66 @@ void RemoteCommand( const char* cmdline ) msg.Printf( _( "Locate Pin %s (module %s)" ), pinName.GetData(), modName.GetData() ); frame->Affiche_Message( msg ); } - - if( module ) // if found, center the module on screen. + + if( module ) // if found, center the module on screen. frame->Recadre_Trace( false ); } -// @todo: move this to proper source file. -wxString BOARD_ITEM::MenuText( const BOARD* aPcb ) const -{ - wxString text; - const BOARD_ITEM* item = this; - EQUIPOT* net; - - switch( item->Type() ) - { - case PCB_EQUIPOT_STRUCT_TYPE: - text << _("Net") << ((EQUIPOT*)item)->m_Netname << wxT(" ") << ((EQUIPOT*)item)->m_NetCode; - break; - - case TYPEMODULE: - text << _("Footprint") << wxT(" ") << ((MODULE*)item)->GetReference(); - text << wxT(" (") << ReturnPcbLayerName( item->m_Layer ) << wxT(")"); - break; - - case TYPEPAD: - text << _("Pad") << wxT(" ") << ((D_PAD*)item)->ReturnStringPadName() << _(" of ") -// << GetParent()->MenuText( aPcb ); - << ((MODULE*)GetParent())->GetReference(); - break; - - case TYPEDRAWSEGMENT: - text << _("Pcb Graphic") << _(" on ") << ReturnPcbLayerName( item->GetLayer() ); // @todo: extend text - break; - - case TYPETEXTE: - text << _("Pcb Text") << wxT(" ");; - if( ((TEXTE_PCB*)item)->m_Text.Len() < 12 ) - text << ((TEXTE_PCB*)item)->m_Text; - else - text += ((TEXTE_PCB*)item)->m_Text.Left( 10 ) + wxT( ".." ); - break; - - case TYPETEXTEMODULE: - switch( ((TEXTE_MODULE*)item)->m_Type ) - { - case TEXT_is_REFERENCE: - text << _( "Reference" ) << wxT( " " ) << ((TEXTE_MODULE*)item)->m_Text; - break; - - case TEXT_is_VALUE: - text << _( "Value" ) << wxT( " " ) << ((TEXTE_MODULE*)item)->m_Text << _(" of ") -// << GetParent()->MenuText( aPcb ); - << ((MODULE*)GetParent())->GetReference(); - break; - - default: // wrap this one in quotes: - text << _( "Text" ) << wxT( " \"" ) << ((TEXTE_MODULE*)item)->m_Text << wxT("\"") << _(" of ") -// << GetParent()->MenuText( aPcb ); - << ((MODULE*)GetParent())->GetReference(); - break; - } - break; - - case TYPEEDGEMODULE: - text << _("Graphic") << wxT( " " ); - const wxChar* cp; - switch( ((EDGE_MODULE*)item)->m_Shape ) - { - case S_SEGMENT: cp = _("Line"); break; - case S_RECT: cp = _("Rect"); break; - case S_ARC: cp = _("Arc"); break; - case S_CIRCLE: cp = _("Circle"); break; - /* used in Gerbview: */ - case S_ARC_RECT: cp = wxT("arc_rect"); break; - case S_SPOT_OVALE: cp = wxT("spot_oval"); break; - case S_SPOT_CIRCLE: cp = wxT("spot_circle"); break; - case S_SPOT_RECT: cp = wxT("spot_rect"); break; - case S_POLYGON: cp = wxT("polygon"); break; - - default: cp = wxT("??EDGE??"); break; - } - text << *cp << _(" of ") -// << GetParent()->MenuText( aPcb ); - << ((MODULE*)GetParent())->GetReference(); - break; - - case TYPETRACK: - text << _("Track") << wxT(" ") << ((TRACK*)item)->m_NetCode; - net = aPcb->FindNet( ((TRACK*)item)->m_NetCode ); - if( net ) - { - text << wxT( " [" ) << net->m_Netname << wxT("]"); - } - text << _(" on ") << ReturnPcbLayerName( item->GetLayer() ); - break; - - case TYPEZONE: - text << _("Zone") << _(" on ") << ReturnPcbLayerName( item->GetLayer() ); - break; - - case TYPEVIA: - text << _("Via") << wxT(" ") << ((SEGVIA*)item)->m_NetCode; - net = aPcb->FindNet( ((TRACK*)item)->m_NetCode ); - if( net ) - { - text << wxT( " [" ) << net->m_Netname << wxT("]"); - } - break; - - case TYPEMARQUEUR: - text << _("Marker"); - break; - - case TYPECOTATION: - text << _("Dimension"); // @todo: extend text - break; - - case TYPEMIRE: - text << _("Mire"); // @todo: extend text, Mire is not an english word! - break; - - case TYPEEDGEZONE: - text << _("Edge Zone") << _(" on ") << ReturnPcbLayerName( item->GetLayer() ); // @todo: extend text - break; - - default: - text << item->GetClass() << wxT(" Unexpected item type: BUG!!"); - break; - } - - return text; -} - - -// @todo: move this to proper source file. -const char** BOARD_ITEM::MenuIcon() const -{ - char** xpm; - const BOARD_ITEM* item = this; - - switch( item->Type() ) - { - case PCB_EQUIPOT_STRUCT_TYPE: - xpm = module_xpm; // @todo: use net icon - break; - - case TYPEMODULE: - xpm = module_xpm; - break; - - case TYPEPAD: - xpm = pad_xpm; - break; - - case TYPEDRAWSEGMENT: - xpm = module_xpm; // @todo: use draw segment icon & expand on text - break; - - case TYPETEXTE: - xpm = add_text_xpm; - break; - - case TYPETEXTEMODULE: - xpm = footprint_text_xpm; - break; - - case TYPEEDGEMODULE: - xpm = show_mod_edge_xpm; - break; - - case TYPETRACK: - xpm = showtrack_xpm; - break; - - case TYPEZONE: - xpm = add_zone_xpm; - break; - - case TYPEVIA: - xpm = showtrack_xpm; // @todo: use via specific xpm - break; - - case TYPEMARQUEUR: - xpm = pad_xpm; // @todo: create and use marker xpm - break; - - case TYPECOTATION: - xpm = add_cotation_xpm; - break; - - case TYPEMIRE: - xpm = add_mires_xpm; - break; - - case TYPEEDGEZONE: - xpm = show_mod_edge_xpm; // @todo: pcb edge xpm - break; - - default: - xpm = 0; - break; - } - - return (const char**) xpm; -} - - /** * Function AllAreModulesAndReturnSmallestIfSo * tests that all items in the collection are MODULEs and if so, returns the * smallest MODULE. * @return BOARD_ITEM* - The smallest or NULL. - */ + */ static BOARD_ITEM* AllAreModulesAndReturnSmallestIfSo( GENERAL_COLLECTOR* aCollector ) { int count = aCollector->GetCount(); - - for( int i=0; iType() != TYPEMODULE ) + if( (*aCollector)[i]->Type() != TYPEMODULE ) return NULL; } - + // all are modules, now find smallest MODULE int minDim = 0x7FFFFFFF; int minNdx = 0; - - for( int i=0; im_BoundaryBox.GetWidth(); - int ly = module->m_BoundaryBox.GetHeight(); - - int lmin = MIN( lx, ly ); - + + int lx = module->m_BoundaryBox.GetWidth(); + int ly = module->m_BoundaryBox.GetHeight(); + + int lmin = MIN( lx, ly ); + if( lmin <= minDim ) { minDim = lmin; minNdx = i; } } - + return (*aCollector)[minNdx]; } - -/***********************************************************************/ +/*************************************************************/ BOARD_ITEM* WinEDA_BasePcbFrame::PcbGeneralLocateAndDisplay() -/***********************************************************************/ +/*************************************************************/ { - BOARD_ITEM* item; - - GENERAL_COLLECTORS_GUIDE guide = GetCollectorsGuide(); + BOARD_ITEM* item; + + GENERAL_COLLECTORS_GUIDE guide = GetCollectorsGuide(); // Assign to scanList the proper item types desired based on tool type. // May need to pass a hot key code to this function to support hot keys too. - - const KICAD_T* scanList; - + + const KICAD_T* scanList; + if( m_ID_current_state == 0 ) { switch( m_HTOOL_current_state ) @@ -382,7 +173,7 @@ BOARD_ITEM* WinEDA_BasePcbFrame::PcbGeneralLocateAndDisplay() case ID_TOOLBARH_PCB_AUTOPLACE: scanList = GENERAL_COLLECTOR::ModuleItems; break; - + default: scanList = GENERAL_COLLECTOR::AllBoardItems; break; @@ -394,93 +185,111 @@ BOARD_ITEM* WinEDA_BasePcbFrame::PcbGeneralLocateAndDisplay() { case ID_PCB_SHOW_1_RATSNEST_BUTT: scanList = GENERAL_COLLECTOR::PadsOrModules; - break; + break; case ID_TRACK_BUTT: scanList = GENERAL_COLLECTOR::Tracks; - break; + break; case ID_COMPONENT_BUTT: scanList = GENERAL_COLLECTOR::ModuleItems; break; - + default: scanList = GENERAL_COLLECTOR::AllBoardItems; } } - m_Collector->Collect( m_Pcb, scanList, GetScreen()->RefPos(true), guide ); + m_Collector->Collect( m_Pcb, scanList, GetScreen()->RefPos( true ), guide ); /* debugging: print out the collected items, showing their priority order too. - for( unsigned i=0; iGetCount(); ++i ) - (*m_Collector)[i]->Show( 0, std::cout ); - */ + * for( unsigned i=0; iGetCount(); ++i ) + * (*m_Collector)[i]->Show( 0, std::cout ); + */ - if( m_Collector->GetCount() <= 1 ) + /* Remove redundancies: most of time, zones are found twice, + * because zones are filled twice ( once by by horizontal and once by vertical segments ) + */ + unsigned long timestampzone = 0; + for( unsigned int ii = 0; ii < m_Collector->GetCount(); ii++ ) + { + item = (*m_Collector)[ii]; + if( item->Type() != TYPEZONE ) + continue; + /* Found a TYPE ZONE */ + if( item->m_TimeStamp == timestampzone ) // Remove it, redundant, zone already found + { + m_Collector->Remove( ii ); + ii--; + } + else + timestampzone = item->m_TimeStamp; + } + + if( m_Collector->GetCount() <= 1 ) { item = (*m_Collector)[0]; - SetCurItem( item ); + SetCurItem( item ); } - // If the count is 2, and first item is a pad or moduletext, and the 2nd item is its parent module: - else if( m_Collector->GetCount() == 2 && - ( (*m_Collector)[0]->Type() == TYPEPAD || (*m_Collector)[0]->Type() == TYPETEXTEMODULE) && - (*m_Collector)[1]->Type() == TYPEMODULE && (*m_Collector)[0]->GetParent()==(*m_Collector)[1] ) + else if( m_Collector->GetCount() == 2 + && ( (*m_Collector)[0]->Type() == TYPEPAD || (*m_Collector)[0]->Type() == + TYPETEXTEMODULE ) + && (*m_Collector)[1]->Type() == TYPEMODULE && (*m_Collector)[0]->GetParent()== + (*m_Collector)[1] ) { item = (*m_Collector)[0]; - SetCurItem( item ); + SetCurItem( item ); } - // if all are modules, find the smallest one amoung the primary choices - else if( (item = AllAreModulesAndReturnSmallestIfSo(m_Collector) ) != NULL ) + else if( ( item = AllAreModulesAndReturnSmallestIfSo( m_Collector ) ) != NULL ) { - SetCurItem( item ); + SetCurItem( item ); } - else // show a popup menu { - wxMenu itemMenu; + wxMenu itemMenu; + + itemMenu.SetTitle( _( "Selection Clarification" ) ); // does this work? not under Linux! - itemMenu.SetTitle( _("Selection Clarification") ); // does this work? not under Linux! - int limit = MIN( MAX_ITEMS_IN_PICKER, m_Collector->GetCount() ); - for( int i=0; iMenuText( m_Pcb ); xpm = item->MenuIcon(); - - ADD_MENUITEM( &itemMenu, ID_POPUP_PCB_ITEM_SELECTION_START+i, text, xpm ); + + ADD_MENUITEM( &itemMenu, ID_POPUP_PCB_ITEM_SELECTION_START + i, text, xpm ); } - + DrawPanel->m_IgnoreMouseEvents = TRUE; // this menu's handler is void WinEDA_BasePcbFrame::ProcessItemSelection() // and it calls SetCurItem() which in turn calls Display_Infos() on the item. PopupMenu( &itemMenu ); - + DrawPanel->MouseToCursorSchema(); - + DrawPanel->m_IgnoreMouseEvents = FALSE; - + // The function ProcessItemSelection() has set the current item, return it. item = GetCurItem(); } - + return item; - + /* old way: - - item = Locate( CURSEUR_OFF_GRILLE, GetScreen()->m_Active_Layer ); - if( item == NULL ) - item = Locate( CURSEUR_OFF_GRILLE, -1 ); - return item; -*/ + * + * item = Locate( CURSEUR_OFF_GRILLE, GetScreen()->m_Active_Layer ); + * if( item == NULL ) + * item = Locate( CURSEUR_OFF_GRILLE, -1 ); + * return item; + */ } @@ -498,7 +307,7 @@ void WinEDA_BasePcbFrame::GeneralControle( wxDC* DC, wxPoint Mouse ) // Save the board after the time out : int CurrentTime = time( NULL ); if( !GetScreen()->IsModify() || GetScreen()->IsSave() ) - { + { /* If no change, reset the time out */ g_SaveTime = CurrentTime; } @@ -552,17 +361,17 @@ void WinEDA_BasePcbFrame::GeneralControle( wxDC* DC, wxPoint Mouse ) curpos = m_CurrentScreen->m_Curseur; break; - case EDA_ZOOM_IN_FROM_MOUSE: + case EDA_ZOOM_IN_FROM_MOUSE: OnZoom( ID_ZOOM_PLUS_KEY ); oldpos = curpos = GetScreen()->m_Curseur; break; - case EDA_ZOOM_OUT_FROM_MOUSE: + case EDA_ZOOM_OUT_FROM_MOUSE: OnZoom( ID_ZOOM_MOINS_KEY ); oldpos = curpos = GetScreen()->m_Curseur; break; - case EDA_ZOOM_CENTER_FROM_MOUSE: + case EDA_ZOOM_CENTER_FROM_MOUSE: OnZoom( ID_ZOOM_CENTER_KEY ); oldpos = curpos = GetScreen()->m_Curseur; break; @@ -607,11 +416,11 @@ void WinEDA_BasePcbFrame::GeneralControle( wxDC* DC, wxPoint Mouse ) bool keep_on_grid = TRUE; if( m_ID_current_state == ID_PCB_DELETE_ITEM_BUTT ) keep_on_grid = FALSE; - + /* Cursor is left off grid if no block in progress and no moving object */ if( GetScreen()->BlockLocate.m_State != STATE_NO_BLOCK ) keep_on_grid = TRUE; - + EDA_BaseStruct* DrawStruct = GetScreen()->GetCurItem(); if( DrawStruct && DrawStruct->m_Flags ) keep_on_grid = TRUE; @@ -626,7 +435,7 @@ void WinEDA_BasePcbFrame::GeneralControle( wxDC* DC, wxPoint Mouse ) pad = NULL; if( keep_on_grid ) { - if( pad ) // Put cursor on the pad + if( pad ) // Put cursor on the pad GetScreen()->m_Curseur = curpos = pad->m_Pos; else // Put cursor on grid diff --git a/pcbnew/makefile.include b/pcbnew/makefile.include index 20145d66a9..a2829f46d5 100644 --- a/pcbnew/makefile.include +++ b/pcbnew/makefile.include @@ -31,6 +31,7 @@ OBJECTS= $(TARGET).o classpcb.o\ class_edge_mod.o \ class_text_mod.o\ class_pcb_text.o\ + class_board_item.o\ class_board.o\ drawframe.o\ drawpanel.o\ diff --git a/pcbnew/tool_pcb.cpp b/pcbnew/tool_pcb.cpp index 484e55d1e4..2cc654a7a4 100644 --- a/pcbnew/tool_pcb.cpp +++ b/pcbnew/tool_pcb.cpp @@ -45,7 +45,6 @@ #include "Mode_Track.xpm" #include "tool_ratsnet.xpm" #include "local_ratsnet.xpm" -#include "general_ratsnet.xpm" #include "add_cotation.xpm" #define SEL_LAYER_HELP _( \ diff --git a/pcbnew/trpiste.cpp b/pcbnew/trpiste.cpp index 59a9d2e501..7187a2fb25 100644 --- a/pcbnew/trpiste.cpp +++ b/pcbnew/trpiste.cpp @@ -20,18 +20,16 @@ void Trace_Pistes( WinEDA_DrawPanel* panel, BOARD* Pcb, wxDC* DC, int drawmode ) /* Draw all tracks and zones. */ { - TRACK* track; - - track = Pcb->m_Track; + TRACK * track = Pcb->m_Track; for( ; track != NULL; track = track->Next() ) { track->Draw( panel, DC, drawmode ); } - track = Pcb->m_Zone; - for( ; track != NULL; track = track->Next() ) + SEGZONE * zone = Pcb->m_Zone; + for( ; zone != NULL; zone = zone->Next() ) { - track->Draw( panel, DC, drawmode ); + zone->Draw( panel, DC, drawmode ); } }