pns_placement_algo.h 4.64 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
/*
 * 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_PLACEMENT_ALGO_H
#define __PNS_PLACEMENT_ALGO_H

#include <math/vector2d.h>

#include "pns_algo_base.h"
#include "pns_sizes_settings.h"
#include "pns_itemset.h"

class PNS_ROUTER;
class PNS_ITEM;
class PNS_NODE;

/**
 * Class PNS_PLACEMENT_ALGO
 *
Maciej Suminski's avatar
Maciej Suminski committed
37
 * Abstract class for a P&S placement/dragging algorithm.
38 39 40 41 42 43 44 45 46
 * All subtools (drag, single/diff pair routing and meandering)
 * are derived from it.
 */

class PNS_PLACEMENT_ALGO : public PNS_ALGO_BASE
{
public:
    PNS_PLACEMENT_ALGO( PNS_ROUTER* aRouter ) :
        PNS_ALGO_BASE( aRouter ) {};
Maciej Suminski's avatar
Maciej Suminski committed
47

48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
    virtual ~PNS_PLACEMENT_ALGO () {};

    /**
     * Function Start()
     *
     * Starts placement/drag operation at point aP, taking item aStartItem as anchor
     * (unless NULL).
     */
    virtual bool Start( const VECTOR2I& aP, PNS_ITEM* aStartItem ) = 0;

    /**
     * Function Move()
     *
     * Moves the end of the currently routed primtive(s) to the point aP, taking
     * aEndItem as the anchor (if not NULL).
     * (unless NULL).
     */
    virtual bool Move( const VECTOR2I& aP, PNS_ITEM* aEndItem ) = 0;

    /**
     * Function FixRoute()
     *
     * Commits the currently routed items to the parent node, taking
     * aP as the final end point and aEndItem as the final anchor (if provided).
     * @return true, if route has been commited. May return false if the routing
     * result is violating design rules - in such case, the track is only committed
     * if Settings.CanViolateDRC() is on.
     */
    virtual bool FixRoute( const VECTOR2I& aP, PNS_ITEM* aEndItem ) = 0;

    /**
     * Function ToggleVia()
     *
     * Enables/disables a via at the end of currently routed trace.
     */
    virtual bool ToggleVia( bool aEnabled )
    {
        return false;
    }

    /**
     * Function IsPlacingVia()
     *
     * Returns true if the placer is placing a via (or more vias).
     */
Maciej Suminski's avatar
Maciej Suminski committed
93 94
    virtual bool IsPlacingVia() const
    {
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
        return false;
    }

    /**
     * Function SetLayer()
     *
     * Sets the current routing layer.
     */
    virtual bool SetLayer( int aLayer )
    {
        return false;
    }

    /**
     * Function Traces()
     *
     * Returns all routed/tuned traces.
     */
    virtual const PNS_ITEMSET Traces() = 0;

    /**
     * Function CurrentEnd()
     *
     * Returns the current end of the line being placed/tuned. It may not be equal
     * to the cursor position due to collisions.
     */
    virtual const VECTOR2I& CurrentEnd() const = 0;
Maciej Suminski's avatar
Maciej Suminski committed
122

123 124 125 126 127 128
    /**
     * Function CurrentNet()
     *
     * Returns the net code of currently routed track.
     */
    virtual int CurrentNet() const = 0;
Maciej Suminski's avatar
Maciej Suminski committed
129

130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
    /**
     * Function CurrentLayer()
     *
     * Returns the layer of currently routed track.
     */
    virtual int CurrentLayer() const = 0;

    /**
     * Function CurrentNode()
     *
     * Returns the most recent board state.
     */
    virtual PNS_NODE* CurrentNode( bool aLoopsRemoved = false ) const = 0;

    /**
     * Function FlipPosture()
     *
     * Toggles the current posture (straight/diagonal) of the trace head.
     */
Maciej Suminski's avatar
Maciej Suminski committed
149
    virtual void FlipPosture()
150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
    {
    }

    /**
     * Function UpdateSizes()
     *
     * Performs on-the-fly update of the width, via diameter & drill size from
     * a settings class. Used to dynamically change these parameters as
     * the track is routed.
     */
    virtual void UpdateSizes( const PNS_SIZES_SETTINGS& aSizes )
    {
    }

    /**
     * Function SetOrthoMode()
Maciej Suminski's avatar
Maciej Suminski committed
166
     *
167 168 169 170 171 172 173 174 175 176 177 178 179
     * Forces the router to place a straight 90/45 degree trace (with the end
     * as near to the cursor as possible) instead of a standard 135 degree
     * two-segment bend.
     */
    virtual void SetOrthoMode ( bool aOrthoMode )
    {
    }

    /**
     * Function GetModifiedNets
     *
     * Returns the net codes of all currently routed trace(s)
     */
Maciej Suminski's avatar
Maciej Suminski committed
180
    virtual void GetModifiedNets( std::vector<int> &aNets ) const
181 182 183 184 185
    {
    }
};

#endif