summaryrefslogtreecommitdiff
path: root/pcbnew/router/pns_dragger.h
diff options
context:
space:
mode:
Diffstat (limited to 'pcbnew/router/pns_dragger.h')
-rw-r--r--pcbnew/router/pns_dragger.h126
1 files changed, 126 insertions, 0 deletions
diff --git a/pcbnew/router/pns_dragger.h b/pcbnew/router/pns_dragger.h
new file mode 100644
index 0000000..ed6a59b
--- /dev/null
+++ b/pcbnew/router/pns_dragger.h
@@ -0,0 +1,126 @@
+/*
+ * KiRouter - a push-and-(sometimes-)shove PCB router
+ *
+ * Copyright (C) 2013-2014 CERN
+ * Author: Tomasz Wlostowski <tomasz.wlostowski@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 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 <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __PNS_DRAGGER_H
+#define __PNS_DRAGGER_H
+
+#include <math/vector2d.h>
+
+#include "pns_node.h"
+#include "pns_via.h"
+#include "pns_line.h"
+#include "pns_algo_base.h"
+#include "pns_itemset.h"
+
+class PNS_ROUTER;
+class PNS_SHOVE;
+class PNS_OPTIMIZER;
+class PNS_ROUTER_BASE;
+
+/**
+ * Class PNS_DRAGGER
+ *
+ * Via, segment and corner dragging algorithm.
+ */
+class PNS_DRAGGER : public PNS_ALGO_BASE
+{
+public:
+ PNS_DRAGGER( PNS_ROUTER* aRouter );
+ ~PNS_DRAGGER();
+
+ /**
+ * Function SetWorld()
+ *
+ * Sets the board to work on.
+ */
+ void SetWorld( PNS_NODE* aWorld );
+
+ /**
+ * Function Start()
+ *
+ * Starts routing a single track at point aP, taking item aStartItem as anchor
+ * (unless NULL). Returns true if a dragging operation has started.
+ */
+ bool Start( const VECTOR2I& aP, PNS_ITEM* aStartItem );
+
+ /**
+ * Function Drag()
+ *
+ * Drags the current segment/corner/via to the point aP.
+ * @return true, if dragging finished with success.
+ */
+ bool Drag( const VECTOR2I& aP );
+
+ /**
+ * Function FixRoute()
+ *
+ * Checks if the result of current dragging operation is correct
+ * and eventually commits it to the world.
+ * @return true, if dragging finished with success.
+ */
+ bool FixRoute();
+
+ /**
+ * Function CurrentNode()
+ *
+ * Returns the most recent world state, including all
+ * items changed due to dragging operation.
+ */
+ PNS_NODE* CurrentNode() const;
+
+ /**
+ * Function Traces()
+ *
+ * Returns the set of dragged items.
+ */
+ const PNS_ITEMSET Traces();
+
+ /// @copydoc PNS_ALGO_BASE::Logger()
+ virtual PNS_LOGGER* Logger();
+
+private:
+ enum DragMode {
+ CORNER = 0,
+ SEGMENT,
+ VIA
+ };
+
+ bool dragMarkObstacles( const VECTOR2I& aP );
+ bool dragShove(const VECTOR2I& aP );
+ bool startDragSegment( const VECTOR2D& aP, PNS_SEGMENT* aSeg );
+ bool startDragVia( const VECTOR2D& aP, PNS_VIA* aVia );
+ void dumbDragVia( PNS_VIA* aVia, PNS_NODE* aNode, const VECTOR2I& aP );
+
+ PNS_NODE* m_world;
+ PNS_NODE* m_lastNode;
+ DragMode m_mode;
+ PNS_LINE m_draggedLine;
+ PNS_VIA* m_draggedVia;
+ PNS_LINE m_lastValidDraggedLine;
+ PNS_SHOVE* m_shove;
+ int m_draggedSegmentIndex;
+ bool m_dragStatus;
+ PNS_MODE m_currentMode;
+ PNS_ITEMSET m_origViaConnections;
+ PNS_VIA* m_initialVia;
+ PNS_ITEMSET m_draggedItems;
+};
+
+#endif