You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							173 lines
						
					
					
						
							4.9 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							173 lines
						
					
					
						
							4.9 KiB
						
					
					
				
								/*
							 | 
						|
								 * This program source code file is part of KICAD, a free EDA CAD application.
							 | 
						|
								 *
							 | 
						|
								 * Copyright (C) 2013-2015 CERN
							 | 
						|
								 * Copyright (C) 2019-2020 KiCad Developers, see AUTHORS.txt for contributors.
							 | 
						|
								 * @author Maciej Suminski <maciej.suminski@cern.ch>
							 | 
						|
								 *
							 | 
						|
								 * 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 ratsnest_data.h
							 | 
						|
								 * @brief Class that computes missing connections on a PCB.
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								#ifndef RATSNEST_DATA_H
							 | 
						|
								#define RATSNEST_DATA_H
							 | 
						|
								
							 | 
						|
								#include <core/typeinfo.h>
							 | 
						|
								#include <math/box2.h>
							 | 
						|
								
							 | 
						|
								#include <set>
							 | 
						|
								#include <vector>
							 | 
						|
								
							 | 
						|
								#include <connectivity/connectivity_algo.h>
							 | 
						|
								
							 | 
						|
								class BOARD_ITEM;
							 | 
						|
								class BOARD_CONNECTED_ITEM;
							 | 
						|
								class CN_CLUSTER;
							 | 
						|
								
							 | 
						|
								struct CN_PTR_CMP
							 | 
						|
								{
							 | 
						|
								    bool operator()( const CN_ANCHOR_PTR& aItem, const CN_ANCHOR_PTR& bItem ) const
							 | 
						|
								    {
							 | 
						|
								        if( aItem->Pos().x == bItem->Pos().x )
							 | 
						|
								            return aItem->Pos().y < bItem->Pos().y;
							 | 
						|
								        else
							 | 
						|
								            return aItem->Pos().x < bItem->Pos().x;
							 | 
						|
								    }
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								/**
							 | 
						|
								 * RN_NET
							 | 
						|
								 * Describes ratsnest for a single net.
							 | 
						|
								 */
							 | 
						|
								class RN_NET
							 | 
						|
								{
							 | 
						|
								public:
							 | 
						|
								    ///> Default constructor.
							 | 
						|
								    RN_NET();
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * Function SetVisible()
							 | 
						|
								     * Sets state of the visibility flag.
							 | 
						|
								     * @param aEnabled is new state. True if ratsnest for a given net is meant to be displayed,
							 | 
						|
								     * false otherwise.
							 | 
						|
								     */
							 | 
						|
								    void SetVisible( bool aEnabled );
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * Function MarkDirty()
							 | 
						|
								     * Marks ratsnest for given net as 'dirty', i.e. requiring recomputation.
							 | 
						|
								     */
							 | 
						|
								    void MarkDirty()
							 | 
						|
								    {
							 | 
						|
								        m_dirty = true;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * Function IsDirty()
							 | 
						|
								     * Returns state of the 'dirty' flag, indicating that ratsnest for a given net is invalid
							 | 
						|
								     * and requires an update.
							 | 
						|
								     * @return True if ratsnest requires recomputation, false otherwise.
							 | 
						|
								     */
							 | 
						|
								    bool IsDirty() const
							 | 
						|
								    {
							 | 
						|
								        return m_dirty;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * Function GetUnconnected()
							 | 
						|
								     * Returns pointer to a vector of edges that makes ratsnest for a given net.
							 | 
						|
								     * @return Pointer to a vector of edges that makes ratsnest for a given net.
							 | 
						|
								     */
							 | 
						|
								    const std::vector<CN_EDGE> GetUnconnected() const
							 | 
						|
								    {
							 | 
						|
								        return m_rnEdges;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * Function Update()
							 | 
						|
								     * Recomputes ratsnest for a net.
							 | 
						|
								     */
							 | 
						|
								    void Update();
							 | 
						|
								    void Clear();
							 | 
						|
								
							 | 
						|
								    void AddCluster( std::shared_ptr<CN_CLUSTER> aCluster );
							 | 
						|
								
							 | 
						|
								    unsigned int GetNodeCount() const
							 | 
						|
								    {
							 | 
						|
								        return m_nodes.size();
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * Function GetNodes()
							 | 
						|
								     * Returns list of nodes that are associated with a given item.
							 | 
						|
								     * @param aItem is an item for which the list is generated.
							 | 
						|
								     * @return List of associated nodes.
							 | 
						|
								     */
							 | 
						|
								    std::list<CN_ANCHOR_PTR> GetNodes( const BOARD_CONNECTED_ITEM* aItem ) const;
							 | 
						|
								
							 | 
						|
								    const std::vector<CN_EDGE>& GetEdges() const
							 | 
						|
								    {
							 | 
						|
								        return m_rnEdges;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * Function GetAllItems()
							 | 
						|
								     * Adds all stored items to a list.
							 | 
						|
								     * @param aOutput is the list that will have items added.
							 | 
						|
								     * @param aTypes determines the type of added items.
							 | 
						|
								     */
							 | 
						|
								    void GetAllItems( std::list<BOARD_CONNECTED_ITEM*>& aOutput, const KICAD_T aTypes[] ) const;
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * Function GetClosestNode()
							 | 
						|
								     * Returns a single node that lies in the shortest distance from a specific node.
							 | 
						|
								     * @param aNode is the node for which the closest node is searched.
							 | 
						|
								     */
							 | 
						|
								    const CN_ANCHOR_PTR GetClosestNode( const CN_ANCHOR_PTR& aNode ) const;
							 | 
						|
								
							 | 
						|
								    bool NearestBicoloredPair( const RN_NET& aOtherNet, CN_ANCHOR_PTR& aNode1, CN_ANCHOR_PTR& aNode2 ) const;
							 | 
						|
								
							 | 
						|
								protected:
							 | 
						|
								    ///> Recomputes ratsnest from scratch.
							 | 
						|
								    void compute();
							 | 
						|
								
							 | 
						|
								    ///> Compute the minimum spanning tree using Kruskal's algorithm
							 | 
						|
								    void kruskalMST( const std::vector<CN_EDGE> &aEdges );
							 | 
						|
								
							 | 
						|
								    ///> Vector of nodes
							 | 
						|
								    std::multiset<CN_ANCHOR_PTR, CN_PTR_CMP> m_nodes;
							 | 
						|
								
							 | 
						|
								    ///> Vector of edges that make pre-defined connections
							 | 
						|
								    std::vector<CN_EDGE> m_boardEdges;
							 | 
						|
								
							 | 
						|
								    ///> Vector of edges that makes ratsnest for a given net.
							 | 
						|
								    std::vector<CN_EDGE> m_rnEdges;
							 | 
						|
								
							 | 
						|
								    ///> Flag indicating necessity of recalculation of ratsnest for a net.
							 | 
						|
								    bool m_dirty;
							 | 
						|
								
							 | 
						|
								    class TRIANGULATOR_STATE;
							 | 
						|
								
							 | 
						|
								    std::shared_ptr<TRIANGULATOR_STATE> m_triangulator;
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								#endif /* RATSNEST_DATA_H */
							 |