diff options
Diffstat (limited to 'pcbnew/collectors.h')
-rw-r--r-- | pcbnew/collectors.h | 639 |
1 files changed, 639 insertions, 0 deletions
diff --git a/pcbnew/collectors.h b/pcbnew/collectors.h new file mode 100644 index 0000000..b2d5c9d --- /dev/null +++ b/pcbnew/collectors.h @@ -0,0 +1,639 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2007-2008 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com> + * 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/** + * @file collectors.h + */ + +#ifndef COLLECTORS_H +#define COLLECTORS_H + + +/* This module contains a number of COLLECTOR implementations which are used + to augment the functionality of class PCB_EDIT_FRAME. +*/ + + +#include <class_collector.h> +#include <layers_id_colors_and_visibility.h> // LAYER_COUNT, layer defs + + +class BOARD_ITEM; + + +/** + * 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). + * <p> + * A justification for this class is to keep the structural storage details 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 + * not simple enough). + * <p> + * This class introduces the notion of layer locking. + */ +class COLLECTORS_GUIDE +{ + +public: + virtual ~COLLECTORS_GUIDE() {} + + /** + * Function IsLayerLocked + * @return bool - true if the given layer is locked, else false. + */ + virtual bool IsLayerLocked( LAYER_ID layer ) const = 0; + + /** + * Function IsLayerVisible + * @return bool - true if the given layer is visible, else false. + */ + virtual bool IsLayerVisible( LAYER_ID 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. + */ + virtual LAYER_ID GetPreferredLayer() const = 0; + + /** + * Function IgnorePreferredLayer + * provides wildcard behavior regarding the preferred layer. + * @return bool - true if should ignore preferred layer, else false. + */ + virtual bool IgnorePreferredLayer() const = 0; + + /** + * Function IgnoreLockedItems + * @return bool - true if should ignore locked items, else false. + */ + virtual bool IgnoreLockedItems() const = 0; + + /** + * Function IncludeSecondary + * determines if the secondary criteria, or 2nd choice items should be + * included. + * @return bool - true if should include, else false. + */ + virtual bool IncludeSecondary() const = 0; + + /** + * Function IgnoreMTextsMarkedNoShow + * @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. + virtual bool IgnoreZones() const = 0; + can simply omit from scanTypes[] PCB_ZONE_T */ + + /** + * Function IgnoreMTextsOnBack + * @return bool - true if should ignore MTexts on back layers + */ + virtual bool IgnoreMTextsOnBack() const = 0; + + /** + * Function IgnoreMTextsOnFront + * @return bool - true if should ignore MTexts on front layers. + */ + virtual bool IgnoreMTextsOnFront() const = 0; + + /** + * Function IgnoreModulesOnBack + * @return bool - true if should ignore MODULEs on Back Side. + */ + virtual bool IgnoreModulesOnBack() const = 0; + + /** + * Function IgnoreModulesOnFront + * @return bool - ture if should ignore MODULEs on Front Side. + */ + virtual bool IgnoreModulesOnFront() const = 0; + + /** + * Function IgnorePadsOnBack + * @return bool - true if should ignore Pads on Back Side. + */ + virtual bool IgnorePadsOnBack() const = 0; + + /** + * Function IgnorePadsOnFront + * @return bool - ture if should ignore PADSs on Front Side. + */ + virtual bool IgnorePadsOnFront() const = 0; + + /** + * Function IgnorePads + * @return bool - true if should ignore PADSs on Front side and Back side. + */ + virtual bool IgnorePads() const + { + return IgnorePadsOnFront() && IgnorePadsOnBack(); + } + + /** + * Function IgnoreModulesVals + * @return bool - true if should ignore modules values. + */ + virtual bool IgnoreModulesVals() const = 0; + + /** + * Function IgnoreModulesRefs + * @return bool - true if should ignore module references. + */ + virtual bool IgnoreModulesRefs() const = 0; + + /** + * Function UseHitTesting + * @return bool - true if Inspect() should use BOARD_ITEM::HitTest() + * or false if Inspect() should use BOARD_ITEM::BoundsTest(). + virtual bool UseHitTesting() const = 0; + */ +}; + + + +/** + * Class GENERAL_COLLECTOR + * 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 PCB_EDIT_FRAME. + * + * 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, + * but can handle those concerns by the SetPreferredLayer() function and the + * SetLayerSet() function. + */ +class GENERAL_COLLECTOR : public COLLECTOR +{ +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 + * "list" at the end of the search. + */ + std::vector<BOARD_ITEM*> 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 + * m_List2nd was concatenated onto the end of it. + */ + int m_PrimaryLength; + + +public: + + /** + * A scan list for all editable board items, like PcbGeneralLocateAndDisplay() + */ + static const KICAD_T AllBoardItems[]; + + + /** + * A scan list for all editable board items, except zones + */ + static const KICAD_T AllButZones[]; + + /** + * A scan list for zones outlines only + */ + static const KICAD_T Zones[]; + + + /** + * 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[]; + */ + + + /** + * A scan list for only MODULEs + */ + static const KICAD_T Modules[]; + + + /** + * A scan list for PADs or MODULEs + */ + static const KICAD_T PadsOrModules[]; + + /** + * A scan list for PADs, TRACKs, VIAs, or ZONEs + */ + static const KICAD_T PadsTracksOrZones[]; + + + /** + * A scan list for MODULEs and their items (for Modedit) + */ + static const KICAD_T ModulesAndTheirItems[]; + + + /** + * A scan list for primary module items. + */ + static const KICAD_T ModuleItems[]; + + + /** + * A scan list for only TRACKS + */ + static const KICAD_T Tracks[]; + + + /** + * Constructor GENERALCOLLECTOR + */ + GENERAL_COLLECTOR() + { + m_Guide = NULL; + m_PrimaryLength = 0; + SetScanTypes( AllBoardItems ); + } + + void Empty2nd() + { + m_List2nd.clear(); + } + + void Append2nd( BOARD_ITEM* item ) + { + m_List2nd.push_back( item ); + } + + + /** + * Function SetGuide + * records which COLLECTORS_GUIDE to use. + * @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 + * an EDA_ITEM* type. + * @param ndx The index into the list. + * @return BOARD_ITEM* - or something derived from it, or NULL. + */ + BOARD_ITEM* operator[]( int ndx ) const + { + if( (unsigned)ndx < (unsigned)GetCount() ) + return (BOARD_ITEM*) m_List[ ndx ]; + 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 + * Iterate function. + * + * @param testItem An EDA_ITEM 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_ITEM* 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 + * 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 ); +}; + + +/** + * 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 + // a carrier object and its functions are what is used, and data only indirectly. + + LAYER_ID m_PreferredLayer; + bool m_IgnorePreferredLayer; + + LSET m_LayerLocked; ///< bit-mapped layer locked bits + bool m_IgnoreLockedLayers; + + LSET m_LayerVisible; ///< bit-mapped layer visible bits + bool m_IgnoreNonVisibleLayers; + + bool m_IgnoreLockedItems; + bool m_IncludeSecondary; + + bool m_IgnoreMTextsMarkedNoShow; + bool m_IgnoreMTextsOnBack; + bool m_IgnoreMTextsOnFront; + bool m_IgnoreModulesOnBack; + bool m_IgnoreModulesOnFront; + bool m_IgnorePadsOnFront; + bool m_IgnorePadsOnBack; + bool m_IgnoreModulesVals; + bool m_IgnoreModulesRefs; + +public: + + /** + * Constructor GENERAL_COLLECTORS_GUIDE + * grabs stuff from global preferences and uses reasonable defaults. + * Add more constructors as needed. + * @param aVisibleLayerMask = current visible layers (bit mask) + * @param aPreferredLayer = the layer to search first + */ + GENERAL_COLLECTORS_GUIDE( LSET aVisibleLayerMask, LAYER_ID aPreferredLayer ) + { + m_PreferredLayer = aPreferredLayer; + m_IgnorePreferredLayer = false; + m_LayerVisible = aVisibleLayerMask; + m_IgnoreLockedLayers = true; + m_IgnoreNonVisibleLayers = true; + m_IgnoreLockedItems = false; + +#if defined(USE_MATCH_LAYER) + m_IncludeSecondary = false; +#else + m_IncludeSecondary = true; +#endif + + m_IgnoreMTextsMarkedNoShow = true; // g_ModuleTextNOVColor; + m_IgnoreMTextsOnBack = true; + m_IgnoreMTextsOnFront = false; + m_IgnoreModulesOnBack = true; // !Show_Modules_Cmp; + m_IgnoreModulesOnFront = false; + + m_IgnorePadsOnFront = false; + m_IgnorePadsOnBack = false; + + m_IgnoreModulesVals = false; + m_IgnoreModulesRefs = false; + } + + + /** + * Function IsLayerLocked + * @return bool - true if the given layer is locked, else false. + */ + bool IsLayerLocked( LAYER_ID aLayerId ) const + { + return m_LayerLocked[aLayerId]; + } + + void SetLayerLocked( LAYER_ID aLayerId, bool isLocked ) + { + m_LayerLocked.set( aLayerId, isLocked ); + } + + /** + * Function IsLayerVisible + * @return bool - true if the given layer is visible, else false. + */ + bool IsLayerVisible( LAYER_ID aLayerId ) const + { + return m_LayerVisible[aLayerId]; + } + void SetLayerVisible( LAYER_ID aLayerId, bool isVisible ) + { + m_LayerVisible.set( aLayerId, isVisible ); + } + void SetLayerVisibleBits( LSET aLayerBits ) { m_LayerVisible = aLayerBits; } + + /** + * Function IgnoreLockedLayers + * @return bool - true if should ignore locked layers, else false. + */ + bool IgnoreLockedLayers() const { return m_IgnoreLockedLayers; } + void SetIgnoreLockedLayers( bool ignore ) { m_IgnoreLockedLayers = ignore; } + + + /** + * Function IgnoredNonVisibleLayers + * @return bool - true if should ignore non-visible layers, else false. + */ + bool IgnoreNonVisibleLayers() const { return m_IgnoreNonVisibleLayers; } + void SetIgnoreNonVisibleLayers( bool ignore ) { m_IgnoreLockedLayers = ignore; } + + + /** + * Function GetPreferredLayer + * @return int - the preferred layer for HitTest()ing. + */ + LAYER_ID GetPreferredLayer() const { return m_PreferredLayer; } + void SetPreferredLayer( LAYER_ID aLayer ) { m_PreferredLayer = aLayer; } + + + /** + * Function IgnorePreferredLayer + * provides wildcard behavior regarding the preferred layer. + * @return bool - true if should ignore preferred layer, else false. + */ + bool IgnorePreferredLayer() const { return m_IgnorePreferredLayer; } + void SetIgnorePreferredLayer( bool ignore ) { m_IgnorePreferredLayer = ignore; } + + + /** + * Function IgnoreLockedItems + * @return bool - true if should ignore locked items, else false. + */ + bool IgnoreLockedItems() const { return m_IgnoreLockedItems; } + void SetIgnoreLockedItems( bool ignore ) { m_IgnoreLockedItems = ignore; } + + + /** + * Function IncludeSecondary + * determines if the secondary criteria, or 2nd choice items should be + * included. + * @return bool - true if should include, else false. + */ + bool IncludeSecondary() const { return m_IncludeSecondary; } + void SetIncludeSecondary( bool include ) { m_IncludeSecondary = include; } + + + /** + * Function IgnoreMTextsMarkedNoShow + * @return bool - true if MTexts marked as "no show" should be ignored. + */ + bool IgnoreMTextsMarkedNoShow() const { return m_IgnoreMTextsMarkedNoShow; } + void SetIgnoreMTextsMarkedNoShow( bool ignore ) { m_IgnoreMTextsMarkedNoShow = ignore; } + + /** + * Function IgnoreMTextsOnCu + * @return bool - true if should ignore MTexts on back layers + */ + bool IgnoreMTextsOnBack() const { return m_IgnoreMTextsOnBack; } + void SetIgnoreMTextsOnBack( bool ignore ) { m_IgnoreMTextsOnBack = ignore; } + + /** + * Function IgnoreMTextsOnFront + * @return bool - true if should ignore MTexts on front layers + */ + bool IgnoreMTextsOnFront() const { return m_IgnoreMTextsOnFront; } + void SetIgnoreMTextsOnFront( bool ignore ) { m_IgnoreMTextsOnFront = ignore; } + + /** + * Function IgnoreModulesOnBack + * @return bool - true if should ignore MODULEs on the back side + */ + bool IgnoreModulesOnBack() const { return m_IgnoreModulesOnBack; } + void SetIgnoreModulesOnBack( bool ignore ) { m_IgnoreModulesOnBack = ignore; } + + /** + * Function IgnoreModulesOnFront + * @return bool - true if should ignore MODULEs on component layer. + */ + bool IgnoreModulesOnFront() const { return m_IgnoreModulesOnFront; } + void SetIgnoreModulesOnFront( bool ignore ) { m_IgnoreModulesOnFront = ignore; } + + /** + * Function IgnorePadsOnBack + * @return bool - true if should ignore Pads on Back Side. + */ + bool IgnorePadsOnBack() const { return m_IgnorePadsOnBack; } + void SetIgnorePadsOnBack(bool ignore) { m_IgnorePadsOnBack = ignore; } + + /** + * Function IgnorePadsOnFront + * @return bool - true if should ignore PADSs on Front Side. + */ + bool IgnorePadsOnFront() const { return m_IgnorePadsOnFront; } + void SetIgnorePadsOnFront(bool ignore) { m_IgnorePadsOnFront = ignore; } + + /** + * Function IgnoreModulesVals + * @return bool - true if should ignore modules values. + */ + bool IgnoreModulesVals() const { return m_IgnoreModulesVals; } + void SetIgnoreModulesVals(bool ignore) { m_IgnoreModulesVals = ignore; } + + /** + * Function IgnoreModulesRefs + * @return bool - true if should ignore modules references. + */ + bool IgnoreModulesRefs() const { return m_IgnoreModulesRefs; } + void SetIgnoreModulesRefs(bool ignore) { m_IgnoreModulesRefs = ignore; } +}; + + +/** + * Class PCB_TYPE_COLLECTOR + * merely gathers up all BOARD_ITEMs of a given set of KICAD_T type(s). + * @see class COLLECTOR + */ +class PCB_TYPE_COLLECTOR : public COLLECTOR +{ + +public: + + /** + * Function operator[int] + * overloads COLLECTOR::operator[](int) to return a BOARD_ITEM* instead of + * an EDA_ITEM* type. + * @param ndx The index into the list. + * @return BOARD_ITEM* - or something derived from it, or NULL. + */ + BOARD_ITEM* operator[]( int ndx ) const + { + if( (unsigned)ndx < (unsigned)GetCount() ) + return (BOARD_ITEM*) m_List[ ndx ]; + return NULL; + } + + + /** + * Function Inspect + * is the examining function within the INSPECTOR which is passed to the + * Iterate function. + * + * @param testItem An EDA_ITEM 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_ITEM* testItem, const void* testData ); + + + /** + * Function Collect + * scans a BOARD_ITEM using this class's Inspector method, which does + * the collection. + * @param aBoard The BOARD_ITEM to scan. + * @param aScanList The KICAD_Ts to gather up. + */ + void Collect( BOARD_ITEM* aBoard, const KICAD_T aScanList[] ); +}; + +#endif // COLLECTORS_H |