KiCad PCB EDA Suite
Loading...
Searching...
No Matches
tracks_cleaner.h
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <https://www.gnu.org/licenses/>.
18 */
19
20#ifndef KICAD_TRACKS_CLEANER_H
21#define KICAD_TRACKS_CLEANER_H
22
23#include <mutex>
24#include <board.h>
25
26class BOARD_COMMIT;
27class CLEANUP_ITEM;
28class REPORTER;
29class PCB_TRACK;
30
31
32// Helper class used to clean tracks and vias
34{
35public:
36 TRACKS_CLEANER( BOARD* aPcb, BOARD_COMMIT& aCommit );
37
51 void CleanupBoard( bool aDryRun, std::vector<std::shared_ptr<CLEANUP_ITEM> >* aItemsList,
52 bool aCleanVias, bool aRemoveMisConnected, bool aMergeSegments,
53 bool aDeleteUnconnected, bool aDeleteTracksinPad, bool aDeleteDanglingVias,
54 REPORTER* aReporter = nullptr );
55
56 void SetFilter( const std::function<bool( BOARD_CONNECTED_ITEM* aItem )>& aFilter )
57 {
58 m_filter = aFilter;
59 }
60
61private:
62 bool filterItem( BOARD_CONNECTED_ITEM* aItem );
63
64 /*
65 * Removes track segments which are connected to more than one net (short circuits).
66 */
68
75 bool deleteDanglingTracks( bool aTrack, bool aVia );
76
77 void deleteTracksInPads();
78
82 void cleanup( bool aDeleteDuplicateVias, bool aDeleteNullSegments,
83 bool aDeleteDuplicateSegments, bool aMergeSegments );
84
93 bool mergeCollinearSegments( PCB_TRACK* aSeg1, PCB_TRACK* aSeg2 );
94
102 bool testMergeCollinearSegments( PCB_TRACK* aSeg1, PCB_TRACK* aSeg2, PCB_TRACK* aDummySeg = nullptr );
103
110 bool testTrackEndpointIsNode( PCB_TRACK* aTrack, bool aTstStart, bool aTstEnd );
111
112 void removeItems( std::set<BOARD_ITEM*>& aItems );
113
114 const std::vector<BOARD_CONNECTED_ITEM*>& getConnectedItems( PCB_TRACK* aTrack );
115
116private:
118 BOARD_COMMIT& m_commit; // caller owns
120 std::vector<std::shared_ptr<CLEANUP_ITEM>>* m_itemsList; // caller owns
122
123 // Cache connections. O(n^2) is awful, but it beats O(2n^3).
124 std::map<PCB_TRACK*, std::vector<BOARD_CONNECTED_ITEM*>> m_connectedItemsCache;
125
126 std::function<bool( BOARD_CONNECTED_ITEM* aItem )> m_filter;
127 std::mutex m_mutex;
128};
129
130
131#endif //KICAD_TRACKS_CLEANER_H
A base class derived from BOARD_ITEM for items that can be connected and have a net,...
Information pertinent to a Pcbnew printed circuit board.
Definition board.h:372
A pure virtual class used to derive REPORTER objects from.
Definition reporter.h:71
const std::vector< BOARD_CONNECTED_ITEM * > & getConnectedItems(PCB_TRACK *aTrack)
bool testMergeCollinearSegments(PCB_TRACK *aSeg1, PCB_TRACK *aSeg2, PCB_TRACK *aDummySeg=nullptr)
helper function test if 2 segments are colinear.
bool filterItem(BOARD_CONNECTED_ITEM *aItem)
void removeItems(std::set< BOARD_ITEM * > &aItems)
void cleanup(bool aDeleteDuplicateVias, bool aDeleteNullSegments, bool aDeleteDuplicateSegments, bool aMergeSegments)
Geometry-based cleanup: duplicate items, null items, colinear items.
void CleanupBoard(bool aDryRun, std::vector< std::shared_ptr< CLEANUP_ITEM > > *aItemsList, bool aCleanVias, bool aRemoveMisConnected, bool aMergeSegments, bool aDeleteUnconnected, bool aDeleteTracksinPad, bool aDeleteDanglingVias, REPORTER *aReporter=nullptr)
the cleanup function.
std::mutex m_mutex
REPORTER * m_reporter
bool mergeCollinearSegments(PCB_TRACK *aSeg1, PCB_TRACK *aSeg2)
helper function merge aTrackRef and aCandidate, when possible, i.e.
bool deleteDanglingTracks(bool aTrack, bool aVia)
Removes tracks or vias only connected on one end.
bool testTrackEndpointIsNode(PCB_TRACK *aTrack, bool aTstStart, bool aTstEnd)
std::map< PCB_TRACK *, std::vector< BOARD_CONNECTED_ITEM * > > m_connectedItemsCache
std::function< bool(BOARD_CONNECTED_ITEM *aItem)> m_filter
std::vector< std::shared_ptr< CLEANUP_ITEM > > * m_itemsList
TRACKS_CLEANER(BOARD *aPcb, BOARD_COMMIT &aCommit)
void removeShortingTrackSegments()
BOARD_COMMIT & m_commit
void SetFilter(const std::function< bool(BOARD_CONNECTED_ITEM *aItem)> &aFilter)