/* * 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_ITEM_H #define __PNS_ITEM_H #include #include #include #include "pns_layerset.h" class BOARD_ITEM; class PNS_NODE; /** * Class PNS_ITEM * * Base class for PNS router board items. Implements the shared properties of all PCB items - * net, spanned layers, geometric shape & refererence to owning model. */ class PNS_ITEM { public: static const int UnusedNet = INT_MAX; ///> Supported item types enum PnsKind { SOLID = 1, LINE = 2, JOINT = 4, SEGMENT = 8, VIA = 16, ANY = 0xff }; PNS_ITEM(PnsKind aKind) { m_net = UnusedNet; m_movable = true; m_kind = aKind; m_parent = NULL; m_world = NULL; m_owner = NULL; } PNS_ITEM( const PNS_ITEM& aOther ) { m_layers = aOther.m_layers; m_net = aOther.m_net; m_movable = aOther.m_movable; m_kind = aOther.m_kind; m_world = aOther.m_world; m_parent = aOther.m_parent; m_owner = NULL; } virtual ~PNS_ITEM(); virtual PNS_ITEM *Clone() const = 0; ///> Returns a convex polygon "hull" of a the item, that is used as the walkaround /// path. /// aClearance defines how far from the body of the item the hull should be, /// aWalkaroundThickness is the width of the line that walks around this hull. virtual const SHAPE_LINE_CHAIN Hull(int aClearance = 0, int aWalkaroundThickness = 0) const { return SHAPE_LINE_CHAIN(); }; PnsKind GetKind() const { return m_kind; } bool OfKind( int aKind ) const { return (aKind & m_kind) != 0; } const std::string GetKindStr() const; ///> Gets/Sets the corresponding parent object in the host application's model (pcbnew) void SetParent(BOARD_ITEM *aParent) { m_parent = aParent; } BOARD_ITEM *GetParent() const { return m_parent; } ///> Net accessors int GetNet() const { return m_net; } void SetNet(int aNet) { m_net = aNet; } ///> Layers accessors const PNS_LAYERSET& GetLayers() const { return m_layers; } void SetLayers ( const PNS_LAYERSET& aLayers ) { m_layers = aLayers; } void SetLayer ( int aLayer ) { m_layers = PNS_LAYERSET (aLayer, aLayer); } ///> Ownership management. An item can belong to a single PNS_NODE or stay unowned. void SetOwner (PNS_NODE *aOwner) { m_owner = aOwner; } bool BelongsTo (PNS_NODE *aNode) const { return m_owner == aNode; } PNS_NODE *GetOwner() const { return m_owner; } ///> Sets the world that is used for collision resolution. void SetWorld (PNS_NODE *aWorld) { m_world = aWorld; } PNS_NODE *GetWorld() const { return m_world; } ///> Collision function. Checks if the item aOther is closer to us than /// aClearance and returns true if so. It can also calculate a minimum translation vector that resolves the /// collision if needed. virtual bool Collide( const PNS_ITEM *aOther, int aClearance, bool aNeedMTV, VECTOR2I& aMTV ) const; ///> A shortcut without MTV calculation bool Collide( const PNS_ITEM *aOther, int aClearance ) const { VECTOR2I dummy; return Collide(aOther, aClearance, false, dummy); } ///> Returns the geometric shape of the item virtual const SHAPE* GetShape() const { return NULL; } private: bool collideSimple ( const PNS_ITEM *aOther, int aClearance, bool aNeedMTV, VECTOR2I& aMTV ) const; protected: PnsKind m_kind; BOARD_ITEM *m_parent; PNS_NODE *m_world; PNS_NODE *m_owner; PNS_LAYERSET m_layers; bool m_movable; int m_net; }; #endif // __PNS_ITEM_H