/* * KiRouter - a push-and-(sometimes-)shove PCB router * * Copyright (C) 2013 CERN * Author: Tomasz Wlostowski * * 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 3 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, see . */ #ifndef __PNS_SHOVE_H #define __PNS_SHOVE_H #include #include #include "pns_optimizer.h" class PNS_LINE; class PNS_NODE; class PNS_ROUTER; class PNS_SHOVE { public: PNS_SHOVE( PNS_NODE* aWorld ); ~PNS_SHOVE(); enum ShoveStatus { SH_OK = 0, SH_NULL, SH_INCOMPLETE }; ShoveStatus ShoveLines( PNS_LINE* aCurrentHead ); PNS_NODE* GetCurrentNode() { return m_nodeStack.empty() ? m_root : m_nodeStack.back().node; } const PNS_COST_ESTIMATOR TotalCost() const; void Reset(); void KillChildNodes(); private: static const int ShoveTimeLimit = 3000; bool tryShove( PNS_NODE* aWorld, PNS_LINE* aTrack, PNS_LINE* aObstacle, PNS_SEGMENT& aObstacleSeg, PNS_LINE* aResult, bool aInvertWinding ); ShoveStatus shoveSingleLine( PNS_NODE* aNode, PNS_LINE* aCurrent, PNS_LINE* aObstacle, PNS_SEGMENT& aObstacleSeg, PNS_LINE* aResult ); bool reduceSpringback( PNS_LINE* aHead ); bool pushSpringback( PNS_NODE* aNode, PNS_LINE* aHead, const PNS_COST_ESTIMATOR& aCost ); struct SpringbackTag { int64_t length; int segments; VECTOR2I p; PNS_NODE* node; PNS_COST_ESTIMATOR cost; }; std::vector m_nodeStack; PNS_NODE* m_root; PNS_NODE* m_currentNode; int m_iterLimit; }; #endif