Horizon
board.hpp
1 #pragma once
2 #include "block/block.hpp"
3 #include "board_hole.hpp"
4 #include "board_package.hpp"
5 #include "board_rules.hpp"
6 #include "clipper/clipper.hpp"
7 #include "common/dimension.hpp"
8 #include "common/hole.hpp"
9 #include "board_junction.hpp"
10 #include "common/layer_provider.hpp"
11 #include "common/polygon.hpp"
12 #include "common/keepout.hpp"
13 #include "common/pdf_export_settings.hpp"
14 #include "gerber_output_settings.hpp"
15 #include "odb_output_settings.hpp"
16 #include "nlohmann/json_fwd.hpp"
17 #include "plane.hpp"
18 #include "track.hpp"
19 #include "util/uuid.hpp"
20 #include "util/warning.hpp"
21 #include "via.hpp"
22 #include "connection_line.hpp"
23 #include "step_export_settings.hpp"
24 #include "pnp_export_settings.hpp"
25 #include "airwire.hpp"
26 #include "included_board.hpp"
27 #include "board_panel.hpp"
28 #include "common/picture.hpp"
29 #include "board_decal.hpp"
30 #include "util/file_version.hpp"
31 #include "common/grid_settings.hpp"
32 #include "board_net_tie.hpp"
33 
34 namespace horizon {
35 using json = nlohmann::json;
36 
37 class BoardColors {
38 public:
39  BoardColors();
40  Color solder_mask;
41  Color silkscreen;
42  Color substrate;
43 };
44 
45 using plane_update_status_cb_t = std::function<void(const Plane &plane, const std::string &)>;
46 
47 class Board : public ObjectProvider, public LayerProvider {
48 private:
49  // unsigned int update_nets();
50  void propagate_nets();
51  std::map<int, Layer> layers;
52 
53  void delete_dependants();
54  void vacuum_junctions();
55 
56 public:
57  Board(const UUID &uu, const json &, Block &block, IPool &pool, const std::string &board_directory);
58  static Board new_from_file(const std::string &filename, Block &block, IPool &pool);
59  Board(const UUID &uu, Block &block);
60  static unsigned int get_app_version();
61 
62  void expand();
63  void expand_some();
64 
65  Board(const Board &brd);
66  Board(shallow_copy_t sh, const Board &brd);
67  void operator=(const Board &brd) = delete;
68  void update_refs();
69  void update_junction_connections();
70  void update_airwires(bool fast, const std::set<UUID> &nets);
71  void disconnect_package(BoardPackage *pkg);
72 
73  void smash_package(BoardPackage *pkg);
74  void unsmash_package(BoardPackage *pkg);
75  void smash_package_silkscreen_graphics(BoardPackage *pkg);
76  void smash_package_outline(BoardPackage &pkg);
77  void smash_panel_outline(BoardPanel &panel);
78 
79  Junction *get_junction(const UUID &uu) override;
80  Polygon *get_polygon(const UUID &uu) override;
81  const std::map<int, Layer> &get_layers() const override;
82  void set_n_inner_layers(unsigned int n);
83  unsigned int get_n_inner_layers() const;
84  void update_plane(
85  Plane *plane, const class CanvasPatch *ca = nullptr, const class CanvasPads *ca_pads = nullptr,
86  plane_update_status_cb_t status_cb = nullptr,
87  const std::atomic_bool &cancel = std::atomic_bool(false)); // when ca is given, patches will be read from it
88  void update_planes(plane_update_status_cb_t status_cb = nullptr,
89  const std::atomic_bool &cancel = std::atomic_bool(false));
90  std::vector<KeepoutContour> get_keepout_contours() const;
91  std::pair<Coordi, Coordi> get_bbox() const;
92  void update_pdf_export_settings(PDFExportSettings &settings);
93  std::map<const BoardPackage *, PnPRow> get_PnP(const PnPExportSettings &settings) const;
94 
95 
96  UUID uuid;
97  Block *block;
98  std::string name;
99  std::map<UUID, Polygon> polygons;
100  std::map<UUID, BoardHole> holes;
101  std::map<UUID, BoardPackage> packages;
102  std::map<UUID, BoardJunction> junctions;
103  std::map<UUID, Track> tracks;
104  std::map<UUID, Via> vias;
105  std::map<UUID, Text> texts;
106  std::map<UUID, Line> lines;
107  std::map<UUID, Arc> arcs;
108  std::map<UUID, Plane> planes;
109  std::map<UUID, Keepout> keepouts;
110  std::map<UUID, Dimension> dimensions;
111  std::map<UUID, ConnectionLine> connection_lines;
112  std::map<UUID, IncludedBoard> included_boards;
113  std::map<UUID, BoardPanel> board_panels;
114  std::map<UUID, Picture> pictures;
115  std::map<UUID, BoardDecal> decals;
116  std::map<UUID, BoardNetTie> net_ties;
117 
118  std::vector<Warning> warnings;
119 
120  enum class OutputFormat { GERBER, ODB };
121  OutputFormat output_format = OutputFormat::GERBER;
122  static const LutEnumStr<OutputFormat> output_format_lut;
123 
124  BoardRules rules;
125  GerberOutputSettings gerber_output_settings;
126  ODBOutputSettings odb_output_settings;
127  GridSettings grid_settings;
128 
129  std::map<UUID, std::list<Airwire>> airwires;
130 
131  class StackupLayer {
132  public:
133  StackupLayer(int l, const json &j);
134  StackupLayer(int l);
135  json serialize() const;
136  int layer;
137  uint64_t thickness = 0.035_mm;
138  uint64_t substrate_thickness = .1_mm;
139  };
140  std::map<int, StackupLayer> stackup;
141 
142  BoardColors colors;
143  PDFExportSettings pdf_export_settings;
144  STEPExportSettings step_export_settings;
145  PnPExportSettings pnp_export_settings;
146 
147  FileVersion version;
148 
149  enum ExpandFlags {
150  EXPAND_NONE = 0,
151  EXPAND_ALL = 0xff,
152  EXPAND_PROPAGATE_NETS = (1 << 0),
153  EXPAND_AIRWIRES = (1 << 1),
154  EXPAND_PACKAGES = (1 << 2),
155  EXPAND_VIAS = (1 << 3),
156  EXPAND_ALL_AIRWIRES = (1 << 4),
157  };
158 
159  ExpandFlags expand_flags = EXPAND_ALL;
160  std::set<UUID> airwires_expand;
161 
162  json serialize() const;
163  json serialize_planes() const;
164  void load_planes(const json &j);
165  void load_planes_from_file(const std::string &filename);
166  void save_planes(const std::string &filename);
167 
168  void save_pictures(const std::string &dir) const;
169  void load_pictures(const std::string &dir);
170 
171  ItemSet get_pool_items_used() const;
172 
173  void flip_package_layer(int &layer) const;
174  int get_package_layer(bool flip, int layer) const;
175  ParameterSet get_parameters() const;
176 
177  struct Outline {
178  Polygon outline; // clockwise
179  std::vector<Polygon> holes; // counter-clockwise
180 
181  RulesCheckResult errors;
182  };
183 
184  Outline get_outline() const;
185  Outline get_outline_and_errors() const;
186 
187  std::string board_directory; // for resolving relative paths in included boards
188 
189 private:
190  unsigned int n_inner_layers = 0;
191  ClipperLib::Paths get_thermals(class Plane *plane, const class CanvasPads *ca) const;
192  void update_all_airwires();
193  void update_airwire(bool fast, const UUID &net);
194 
195  Board(const Board &brd, CopyMode copy_mode);
196  void expand_packages();
197  Outline get_outline(bool with_errors) const;
198 };
199 
200 inline Board::ExpandFlags operator|(Board::ExpandFlags a, Board::ExpandFlags b)
201 {
202  return static_cast<Board::ExpandFlags>(static_cast<int>(a) | static_cast<int>(b));
203 }
204 
205 inline Board::ExpandFlags operator|=(Board::ExpandFlags &a, Board::ExpandFlags b)
206 {
207  return a = (a | b);
208 }
209 
210 
211 } // namespace horizon
A block is one level of hierarchy in the netlist.
Definition: block.hpp:29
Definition: board.hpp:37
Definition: board_package.hpp:13
Definition: board_panel.hpp:7
Definition: board_rules.hpp:27
Definition: board.hpp:131
Definition: board.hpp:47
Definition: canvas_pads.hpp:7
Definition: canvas_patch.hpp:6
Definition: common.hpp:278
Definition: file_version.hpp:9
Definition: gerber_output_settings.hpp:10
Definition: grid_settings.hpp:9
Definition: ipool.hpp:14
A Junction is a point in 2D-Space.
Definition: junction.hpp:20
Definition: layer_provider.hpp:7
Definition: odb_output_settings.hpp:10
Interface for classes that store objects identified by UUID (e.g. Line or Junction)
Definition: object_provider.hpp:10
Definition: pdf_export_settings.hpp:9
Definition: plane.hpp:54
Definition: pnp_export_settings.hpp:11
Polygon used in Padstack, Package and Board for specifying filled Regions.
Definition: polygon.hpp:25
Definition: rules.hpp:37
Definition: step_export_settings.hpp:10
This class encapsulates a UUID and allows it to be uses as a value type.
Definition: uuid.hpp:16
a class to store JSON values
Definition: json.hpp:177
defer< flip, Fn > flip
Definition: meta.hpp:1089
basic_json<> json
default JSON class
Definition: json_fwd.hpp:62
Definition: board.hpp:177
Definition: common.hpp:328