From 1b39dfc7c9869fb1da78de3971b83cd161d2a7f8 Mon Sep 17 00:00:00 2001 From: dickelbeck Date: Tue, 19 Feb 2008 16:54:57 +0000 Subject: [PATCH] highlight zone containers --- change_log.txt | 7 ++ pcbnew/class_pad.cpp | 2 +- pcbnew/collectors.cpp | 11 +-- pcbnew/collectors.h | 178 +++++++++++++++++++++--------------------- pcbnew/surbrill.cpp | 50 +++++++----- 5 files changed, 135 insertions(+), 113 deletions(-) diff --git a/change_log.txt b/change_log.txt index 38ae1a3980..46fe7d05b6 100644 --- a/change_log.txt +++ b/change_log.txt @@ -5,6 +5,13 @@ Started 2007-June-11 Please add newer entries at the top, list the date and your name with email address. +2008-Feb-19 UPDATE Dick Hollenbeck +================================================================================ ++pcbnew + Add ZONE_CONTAINER support to the ID_PCB_HIGHLIGHT_BUTT tool and + WinEDA_PcbFrame::DrawHightLight() + + 2008-Feb-18 UPDATE Dick Hollenbeck ================================================================================ +pcbnew diff --git a/pcbnew/class_pad.cpp b/pcbnew/class_pad.cpp index 3532f3ce51..2348a89254 100644 --- a/pcbnew/class_pad.cpp +++ b/pcbnew/class_pad.cpp @@ -331,7 +331,7 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int // if PAD_SMD pad and high contrast mode - if( m_Attribut==PAD_SMD && DisplayOpt.ContrastModeDisplay ) + if( (m_Attribut==PAD_SMD || m_Attribut==PAD_CONN) && DisplayOpt.ContrastModeDisplay ) { // when routing tracks if( frame && frame->m_ID_current_state == ID_TRACK_BUTT ) diff --git a/pcbnew/collectors.cpp b/pcbnew/collectors.cpp index c9a2383950..60fff00d39 100644 --- a/pcbnew/collectors.cpp +++ b/pcbnew/collectors.cpp @@ -93,11 +93,12 @@ const KICAD_T GENERAL_COLLECTOR::PadsOrModules[] = { }; -const KICAD_T GENERAL_COLLECTOR::PadsOrTracks[] = { +const KICAD_T GENERAL_COLLECTOR::PadsTracksOrZones[] = { TYPEPAD, TYPEVIA, TYPETRACK, TYPEZONE, + TYPEZONE_CONTAINER, EOT }; @@ -368,20 +369,20 @@ void GENERAL_COLLECTOR::Collect( BOARD_ITEM* aItem, const KICAD_T aScanList[], // see collectors.h SEARCH_RESULT TYPE_COLLECTOR::Inspect( EDA_BaseStruct* testItem, const void* testData ) { - // The Vist() function only visits the testItem if its type was in the + // The Vist() function only visits the testItem if its type was in the // the scanList, so therefore we can collect anything given to us here. Append( testItem ); - + return SEARCH_CONTINUE; // always when collecting } void TYPE_COLLECTOR::Collect( BOARD_ITEM* aBoard, const KICAD_T aScanList[] ) { Empty(); // empty any existing collection - + // visit the board with the INSPECTOR (me). aBoard->Visit( this, // INSPECTOR* inspector - NULL, // const void* testData, + NULL, // const void* testData, aScanList ); } diff --git a/pcbnew/collectors.h b/pcbnew/collectors.h index f3e10d0ec8..adc9b547f4 100644 --- a/pcbnew/collectors.h +++ b/pcbnew/collectors.h @@ -3,22 +3,22 @@ * * Copyright (C) 2007-2008 SoftPLC Corporation, Dick Hollenbeck * Copyright (C) 2004-2007 Kicad Developers, see change_log.txt for contributors. - * + * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program; if not, you may find one here: - * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html - * or you may search the http://www.gnu.org website for the version 2 license, - * or you may write to the Free Software Foundation, Inc., + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ @@ -37,26 +37,26 @@ /** * Class COLLECTORS_GUIDE - * is an abstract base class whose derivatives may be passed to a GENERAL_COLLECTOR, - * telling GENERAL_COLLECTOR what should be collected (aside from HitTest()ing - * and KICAD_T scanTypes[], information which are provided to the GENERAL_COLLECTOR - * through attributes or arguments separately). + * is an abstract base class whose derivatives may be passed to a GENERAL_COLLECTOR, + * telling GENERAL_COLLECTOR what should be collected (aside from HitTest()ing + * and KICAD_T scanTypes[], information which are provided to the GENERAL_COLLECTOR + * through attributes or arguments separately). *

* A justification for this class is to keep the structural storage details of - * the program's "global preferences" or "configuration options" out of + * the program's "global preferences" or "configuration options" out of * GENERAL_COLLECTOR::Inspect(). This class carries all the necessary details * in with it to the Inspect() call. The constructors or other functions of * this class's derivatives are then the only place where knowledge of the - * specific structure of the global preference storage is needed. Thus, - * GENERAL_COLLECTOR::Inspect() can be kept as simple as possible, and insulated - * from changes in global preference storage (and even then it is + * specific structure of the global preference storage is needed. Thus, + * GENERAL_COLLECTOR::Inspect() can be kept as simple as possible, and insulated + * from changes in global preference storage (and even then it is * not simple enough). *

* This class introduces the notion of layer locking. */ -class COLLECTORS_GUIDE +class COLLECTORS_GUIDE { - + public: virtual ~COLLECTORS_GUIDE() {} @@ -65,25 +65,25 @@ public: * @return bool - true if the given layer is locked, else false. */ virtual bool IsLayerLocked( int layer ) const = 0; - + /** * Function IsLayerVisible * @return bool - true if the given layer is visible, else false. */ virtual bool IsLayerVisible( int layer ) const = 0; - + /** * Function IgnoreLockedLayers * @return bool - true if should ignore locked layers, else false. */ virtual bool IgnoreLockedLayers() const = 0; - + /** * Function IgnoredNonVisibleLayers * @return bool - true if should ignore non-visible layers, else false. */ virtual bool IgnoreNonVisibleLayers() const = 0; - + /** * Function GetPreferredLayer * @return int - the preferred layer for HitTest()ing. @@ -116,7 +116,7 @@ public: * @return bool - true if MTexts marked as "no show" should be ignored. */ virtual bool IgnoreMTextsMarkedNoShow() const = 0; - + /** * Function IgnoreZones * @return bool - true if should ignore zones. @@ -134,7 +134,7 @@ public: * @return bool - true if should ignore MTexts on component layer. */ virtual bool IgnoreMTextsOnCmp() const = 0; - + /** * Function IgnoreModulesOnCu * @return bool - true if should ignore MODULEs on copper layer. @@ -147,7 +147,7 @@ public: */ virtual bool IgnoreModulesOnCmp() const = 0; - + /** * Function UseHitTesting * @return bool - true if Inspect() should use BOARD_ITEM::HitTest() @@ -160,40 +160,40 @@ public: /** * Class GENERAL_COLLECTOR - * is intended for use when the right click button is pressed, or when the + * is intended for use when the right click button is pressed, or when the * plain "arrow" tool is in effect. This class can be used by window classes * such as WinEDA_PcbFrame. * * Philosophy: this class knows nothing of the context in which a BOARD is used - * and that means it knows nothing about which layers are visible or current, + * and that means it knows nothing about which layers are visible or current, * but can handle those concerns by the SetPreferredLayer() function and the * SetLayerMask() fuction. */ class GENERAL_COLLECTOR : public COLLECTOR { -protected: +protected: /** - * A place to hold collected objects which don't match precisely the search - * criteria, but would be acceptable if nothing else is found. - * "2nd" choice, which will be appended to the end of COLLECTOR's prime + * A place to hold collected objects which don't match precisely the search + * criteria, but would be acceptable if nothing else is found. + * "2nd" choice, which will be appended to the end of COLLECTOR's prime * "list" at the end of the search. */ std::vector m_List2nd; - - + + /** * Determines which items are to be collected by Inspect() */ const COLLECTORS_GUIDE* m_Guide; - - + + /** - * The number of items that were originally in the primary list before the + * The number of items that were originally in the primary list before the * m_List2nd was concatonated onto the end of it. */ int m_PrimaryLength; - + public: /** @@ -206,9 +206,9 @@ public: * A scan list for all editable board items, except zones */ static const KICAD_T AllButZones[]; - - - /** + + + /** * A scan list for all primary board items, omitting items which are subordinate to * a MODULE, such as D_PAD and TEXTEMODULE. static const KICAD_T PrimaryItems[]; @@ -229,9 +229,9 @@ public: /** * A scan list for PADs, TRACKs, VIAs, or ZONEs */ - static const KICAD_T PadsOrTracks[]; + static const KICAD_T PadsTracksOrZones[]; + - /** * A scan list for MODULEs and their items (for Modedit) */ @@ -242,11 +242,11 @@ public: * A scan list for only TRACKS */ static const KICAD_T Tracks[]; - - + + /** * Constructor GENERALCOLLECTOR - */ + */ GENERAL_COLLECTOR() { SetScanTypes( AllBoardItems ); @@ -269,8 +269,8 @@ public: * @param aGuide Which guide to use in the collection. */ void SetGuide( const COLLECTORS_GUIDE* aGuide ) { m_Guide = aGuide; } - - + + /** * Function operator[int] * overloads COLLECTOR::operator[](int) to return a BOARD_ITEM* instead of @@ -285,39 +285,39 @@ public: return NULL; } - + /** * Function GetPrimaryCount * @return int - The number if items which met the primary search criteria */ int GetPrimaryCount() { return m_PrimaryLength; } - - + + /** * Function Inspect - * is the examining function within the INSPECTOR which is passed to the + * is the examining function within the INSPECTOR which is passed to the * Iterate function. * * @param testItem An EDA_BaseStruct to examine. * @param testData is not used in this class. * @return SEARCH_RESULT - SEARCH_QUIT if the Iterator is to stop the scan, * else SCAN_CONTINUE; - */ + */ SEARCH_RESULT Inspect( EDA_BaseStruct* testItem, const void* testData ); - - + + /** * Function Collect * scans a BOARD_ITEM using this class's Inspector method, which does the collection. * @param aItem A BOARD_ITEM to scan, may be a BOARD or MODULE, or whatever. - * @param aScanList A list of KICAD_Ts with a terminating EOT, that specs - * what is to be collected and the priority order of the resultant + * @param aScanList A list of KICAD_Ts with a terminating EOT, that specs + * what is to be collected and the priority order of the resultant * collection in "m_List". * @param aRefPos A wxPoint to use in hit-testing. * @param aGuide The COLLECTORS_GUIDE to use in collecting items. */ - void Collect( BOARD_ITEM* aItem, const KICAD_T aScanList[], - const wxPoint& aRefPos, const COLLECTORS_GUIDE& aGuide ); + void Collect( BOARD_ITEM* aItem, const KICAD_T aScanList[], + const wxPoint& aRefPos, const COLLECTORS_GUIDE& aGuide ); }; @@ -325,31 +325,31 @@ public: * Class GENERAL_COLLECTORS_GUIDE * is a general implementation of a COLLECTORS_GUIDE. One of its constructors is * entitled to grab information from the program's global preferences. - */ + */ class GENERAL_COLLECTORS_GUIDE : public COLLECTORS_GUIDE { private: - // the storage architecture here is not important, since this is only + // the storage architecture here is not important, since this is only // a carrier object and its functions are what is used, and data only indirectly. - + int m_PreferredLayer; bool m_IgnorePreferredLayer; - + int m_LayerLocked; ///< bit-mapped layer locked bits bool m_IgnoreLockedLayers; - int m_LayerVisible; ///< bit-mapped layer visible bits + int m_LayerVisible; ///< bit-mapped layer visible bits bool m_IgnoreNonVisibleLayers; - - bool m_IgnoreLockedItems; + + bool m_IgnoreLockedItems; bool m_IncludeSecondary; - + bool m_IgnoreMTextsMarkedNoShow; bool m_IgnoreMTextsOnCopper; bool m_IgnoreMTextsOnCmp; bool m_IgnoreModulesOnCu; bool m_IgnoreModulesOnCmp; - + public: /** @@ -363,16 +363,16 @@ public: m_PreferredLayer = LAYER_CMP_N; m_IgnorePreferredLayer = false; m_LayerLocked = 0; - m_LayerVisible = aVisibleLayerMask; + m_LayerVisible = aVisibleLayerMask; m_IgnoreLockedLayers = true; m_IgnoreNonVisibleLayers = true; m_IgnoreLockedItems = false; - + #if defined(USE_MATCH_LAYER) m_IncludeSecondary = false; -#else +#else m_IncludeSecondary = true; -#endif +#endif m_PreferredLayer = aPreferredLayer; @@ -382,14 +382,14 @@ public: m_IgnoreModulesOnCu = true; // !Show_Modules_Cmp; m_IgnoreModulesOnCmp = false; } - - + + /** * Function IsLayerLocked * @return bool - true if the given layer is locked, else false. */ bool IsLayerLocked( int aLayer ) const { return (1<Collect( m_Pcb, GENERAL_COLLECTOR::PadsOrTracks, + + + m_Collector->Collect( m_Pcb, GENERAL_COLLECTOR::PadsTracksOrZones, GetScreen()->RefPos( true ), guide ); BOARD_ITEM* item = (*m_Collector)[0]; - + if( item ) { switch( item->Type() ) @@ -117,7 +117,7 @@ int WinEDA_PcbFrame::Select_High_Light( wxDC* DC ) Hight_Light( DC ); SendMessageToEESCHEMA( item ); return g_HightLigth_NetCode; - + case TYPETRACK: case TYPEVIA: case TYPEZONE: @@ -126,13 +126,18 @@ int WinEDA_PcbFrame::Select_High_Light( wxDC* DC ) g_HightLigth_NetCode = ((TRACK*)item)->GetNet(); Hight_Light( DC ); return g_HightLigth_NetCode; - + + case TYPEZONE_CONTAINER: + g_HightLigth_NetCode = ((ZONE_CONTAINER*)item)->GetNet(); + Hight_Light( DC ); + return g_HightLigth_NetCode; + default: ; // until somebody changes GENERAL_COLLECTOR::PadsOrTracks, // this should not happen. } } - + return -1; // HitTest() failed. } @@ -158,30 +163,37 @@ void WinEDA_PcbFrame::DrawHightLight( wxDC* DC, int NetCode ) /* Turn On or OFF the HightLight for trcak and pads with the netcode "NetCode' */ { - TRACK* pts; - MODULE* Module; - if( g_HightLigt_Status ) draw_mode = GR_SURBRILL | GR_OR; else draw_mode = GR_AND | GR_SURBRILL; - Module = m_Pcb->m_Modules; - /* Redraw pads */ - for( ; Module != NULL; Module = (MODULE*) Module->Pnext ) + for( MODULE* module = m_Pcb->m_Modules; module; module = module->Next() ) { - Pad_Surbrillance( DrawPanel, DC, Module, NetCode ); + Pad_Surbrillance( DrawPanel, DC, module, NetCode ); } /* Redraw track and vias: */ - for( pts = m_Pcb->m_Track; pts != NULL; pts = (TRACK*) pts->Pnext ) + for( TRACK* pts = m_Pcb->m_Track; pts; pts = pts->Next() ) { if( pts->GetNet() == NetCode ) { pts->Draw( DrawPanel, DC, draw_mode ); } } + + wxPoint zero(0,0); // construct outside loop for speed + + // Redraw ZONE_CONTAINERS + BOARD::ZONE_CONTAINERS& zones = m_Pcb->m_ZoneDescriptorList; + for( BOARD::ZONE_CONTAINERS::iterator zc = zones.begin(); zc!=zones.end(); ++zc ) + { + if( (*zc)->GetNet() == NetCode ) + { + (*zc)->Draw( DrawPanel, DC, zero, draw_mode ); + } + } } @@ -193,12 +205,14 @@ static void Pad_Surbrillance( WinEDA_DrawPanel* panel, { D_PAD* pt_pad; + wxPoint zero(0,0); // construct outside loop for speed + /* trace des pastilles */ for( pt_pad = Module->m_Pads; pt_pad != NULL; pt_pad = (D_PAD*) pt_pad->Pnext ) { if( pt_pad->GetNet() == NetCode ) { - pt_pad->Draw( panel, DC, wxPoint( 0, 0 ), draw_mode ); + pt_pad->Draw( panel, DC, zero, draw_mode ); } } }