1 #pragma once 2 #include "canvas/selectables.hpp" 3 #include "canvas/object_ref.hpp" 4 #include "router/pns_router.h" 5 #include "util/uuid.hpp" 6 7 namespace horizon { 8 class Board; 9 class BoardPackage; 10 class BoardHole; 11 class Padstack; 12 class Placement; 13 class Pad; 14 class Track; 15 class Via; 16 class CanvasGL; 17 class BoardJunction; 18 class Junction; 19 class Net; 20 class BoardRules; 21 class Polygon; 22 class IPool; 23 class Keepout; 24 class KeepoutContour; 25 template <typename T> class Coord; 26 } // namespace horizon 27 28 namespace PNS { 29 class PNS_HORIZON_PARENT_ITEM { 30 public: PNS_HORIZON_PARENT_ITEM()31 PNS_HORIZON_PARENT_ITEM() 32 { 33 } PNS_HORIZON_PARENT_ITEM(const horizon::Track * tr)34 PNS_HORIZON_PARENT_ITEM(const horizon::Track *tr) : track(tr) 35 { 36 } PNS_HORIZON_PARENT_ITEM(const horizon::Via * v)37 PNS_HORIZON_PARENT_ITEM(const horizon::Via *v) : via(v) 38 { 39 } PNS_HORIZON_PARENT_ITEM(const horizon::BoardHole * h)40 PNS_HORIZON_PARENT_ITEM(const horizon::BoardHole *h) : hole(h) 41 { 42 } PNS_HORIZON_PARENT_ITEM(const horizon::BoardPackage * pkg,const horizon::Pad * p)43 PNS_HORIZON_PARENT_ITEM(const horizon::BoardPackage *pkg, const horizon::Pad *p) : package(pkg), pad(p) 44 { 45 } PNS_HORIZON_PARENT_ITEM(const horizon::Keepout * k)46 PNS_HORIZON_PARENT_ITEM(const horizon::Keepout *k) : keepout(k) 47 { 48 } PNS_HORIZON_PARENT_ITEM(const horizon::Keepout * k,const horizon::BoardPackage * pkg)49 PNS_HORIZON_PARENT_ITEM(const horizon::Keepout *k, const horizon::BoardPackage *pkg) : package(pkg), keepout(k) 50 { 51 } operator ==(const PNS_HORIZON_PARENT_ITEM & other) const52 bool operator==(const PNS_HORIZON_PARENT_ITEM &other) const 53 { 54 return track == other.track && via == other.via && package == other.package && pad == other.pad 55 && hole == other.hole && keepout == other.keepout; 56 } 57 58 const horizon::Track *track = nullptr; 59 const horizon::Via *via = nullptr; 60 const horizon::BoardPackage *package = nullptr; 61 const horizon::Pad *pad = nullptr; 62 const horizon::BoardHole *hole = nullptr; 63 const horizon::Keepout *keepout = nullptr; 64 }; 65 66 class PNS_HORIZON_IFACE : public PNS::ROUTER_IFACE { 67 public: 68 PNS_HORIZON_IFACE(); 69 ~PNS_HORIZON_IFACE(); 70 71 void SetRouter(PNS::ROUTER *aRouter) override; 72 void SetBoard(horizon::Board *brd); 73 void SetCanvas(class horizon::CanvasGL *ca); 74 void SetRules(const horizon::BoardRules *rules); 75 void SetPool(horizon::IPool *pool); 76 77 void SyncWorld(PNS::NODE *aWorld) override; 78 void EraseView() override; 79 void HideItem(PNS::ITEM *aItem) override; 80 void DisplayItem(const PNS::ITEM *aItem, int aColor = 0, int aClearance = 0, bool aEdit = false) override; 81 void AddItem(PNS::ITEM *aItem) override; 82 void RemoveItem(PNS::ITEM *aItem) override; 83 void Commit() override; 84 85 bool IsAnyLayerVisible(const LAYER_RANGE &aLayer) override; 86 bool IsItemVisible(const PNS::ITEM *aItem) override; 87 88 void UpdateNet(int aNetCode) override; 89 90 PNS::RULE_RESOLVER *GetRuleResolver() override; 91 PNS::DEBUG_DECORATOR *GetDebugDecorator() override; 92 93 void create_debug_decorator(horizon::CanvasGL *ca); 94 95 static int layer_to_router(int l); 96 static int layer_from_router(int l); 97 horizon::Net *get_net_for_code(int code); 98 int get_net_code(const horizon::UUID &uu); 99 100 const PNS_HORIZON_PARENT_ITEM *get_parent(const horizon::Track *track); 101 const PNS_HORIZON_PARENT_ITEM *get_parent(const horizon::Via *via); 102 const PNS_HORIZON_PARENT_ITEM *get_parent(const horizon::BoardHole *hole); 103 const PNS_HORIZON_PARENT_ITEM *get_parent(const horizon::BoardPackage *pkg, const horizon::Pad *pad); 104 const PNS_HORIZON_PARENT_ITEM *get_parent(const horizon::Keepout *keepout, 105 const horizon::BoardPackage *pkg = nullptr); 106 get_override_routing_offset() const107 int64_t get_override_routing_offset() const 108 { 109 return override_routing_offset; 110 } 111 set_override_routing_offset(int64_t o)112 void set_override_routing_offset(int64_t o) 113 { 114 override_routing_offset = o; 115 } 116 117 private: 118 const PNS_HORIZON_PARENT_ITEM *get_or_create_parent(const PNS_HORIZON_PARENT_ITEM &it); 119 120 class PNS_HORIZON_RULE_RESOLVER *m_ruleResolver = nullptr; 121 class PNS_HORIZON_DEBUG_DECORATOR *m_debugDecorator = nullptr; 122 std::set<horizon::ObjectRef> m_preview_items; 123 124 horizon::Board *board = nullptr; 125 class horizon::CanvasGL *canvas = nullptr; 126 const class horizon::BoardRules *rules = nullptr; 127 class horizon::IPool *pool = nullptr; 128 PNS::ROUTER *m_router; 129 130 std::unique_ptr<PNS::SOLID> syncPad(const horizon::BoardPackage *pkg, const horizon::Pad *pad); 131 std::unique_ptr<PNS::SOLID> syncPadstack(const horizon::Padstack *padstack, const horizon::Placement &tr); 132 std::unique_ptr<PNS::SOLID> syncHole(const horizon::BoardHole *hole); 133 std::unique_ptr<PNS::SEGMENT> syncTrack(const horizon::Track *track); 134 std::unique_ptr<PNS::VIA> syncVia(const horizon::Via *via); 135 void syncOutline(const horizon::Polygon *poly, PNS::NODE *aWorld); 136 void syncKeepout(const horizon::KeepoutContour *keepout_contour, PNS::NODE *aWorld); 137 std::map<horizon::UUID, int> net_code_map; 138 std::vector<horizon::Net *> net_code_map_r; 139 140 int64_t override_routing_offset = -1; 141 142 std::list<PNS_HORIZON_PARENT_ITEM> parents; 143 144 std::pair<horizon::BoardPackage *, horizon::Pad *> find_pad(int layer, const horizon::Coord<int64_t> &c); 145 horizon::BoardJunction *find_junction(int layer, const horizon::Coord<int64_t> &c); 146 std::set<horizon::BoardJunction *> junctions_maybe_erased; 147 }; 148 } // namespace PNS 149