Horizon
Loading...
Searching...
No Matches
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
34namespace horizon {
35using json = nlohmann::json;
36
37class BoardColors {
38public:
39 BoardColors();
40 Color solder_mask;
41 Color silkscreen;
42 Color substrate;
43};
44
45using plane_update_status_cb_t = std::function<void(const Plane &plane, const std::string &)>;
46
47class Board : public ObjectProvider, public LayerProvider {
48private:
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
56public:
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
143 class UserLayer {
144 public:
145 UserLayer(int l, const json &j);
146 UserLayer(int l);
147 json serialize() const;
148
149 int id;
150 int id_color;
151 std::string name;
152 double position;
153 enum class Type {
154 DOCUMENTATION,
155 STIFFENER,
156 COVERLAY,
157 COVERCOAT,
158 BEND_AREA,
159 FLEX_AREA,
160 RIGID_AREA,
161 PSA,
162 SILVER_MASK,
163 CARBON_MASK
164 };
165 Type type;
166 };
167 const std::map<int, UserLayer> &get_user_layers() const;
168
169 enum class UserLayerOrder : int { ABOVE = 1, BELOW = -1 };
170 int add_user_layer(int other_layer, UserLayerOrder pos);
171 void delete_user_layer(int user_layer);
172 unsigned int count_available_user_layers() const;
173 void move_user_layer(int user_layer, int other_layer, UserLayerOrder pos);
174 void set_user_layer_name(int user_layer, const std::string &name);
175 void set_user_layer_type(int user_layer, UserLayer::Type type);
176 void set_user_layer_color(int user_layer, int layer_color);
177
178 BoardColors colors;
179 PDFExportSettings pdf_export_settings;
180 STEPExportSettings step_export_settings;
181 PnPExportSettings pnp_export_settings;
182
183 FileVersion version;
184
185 enum ExpandFlags {
186 EXPAND_NONE = 0,
187 EXPAND_ALL = 0xff,
188 EXPAND_PROPAGATE_NETS = (1 << 0),
189 EXPAND_AIRWIRES = (1 << 1),
190 EXPAND_PACKAGES = (1 << 2),
191 EXPAND_VIAS = (1 << 3),
192 EXPAND_ALL_AIRWIRES = (1 << 4),
193 };
194
195 ExpandFlags expand_flags = EXPAND_ALL;
196 std::set<UUID> airwires_expand;
197
198 json serialize() const;
199 json serialize_planes() const;
200 void load_planes(const json &j);
201 void load_planes_from_file(const std::string &filename);
202 void save_planes(const std::string &filename);
203
204 void save_pictures(const std::string &dir) const;
205 void load_pictures(const std::string &dir);
206
207 ItemSet get_pool_items_used() const;
208
209 void flip_package_layer(int &layer) const;
210 int get_package_layer(bool flip, int layer) const;
211 ParameterSet get_parameters() const;
212
213 struct Outline {
214 Polygon outline; // clockwise
215 std::vector<Polygon> holes; // counter-clockwise
216
217 RulesCheckResult errors;
218 };
219
220 Outline get_outline() const;
221 Outline get_outline_and_errors() const;
222
223 std::set<LayerRange> get_drill_spans() const;
224
225 std::string board_directory; // for resolving relative paths in included boards
226
227private:
228 unsigned int n_inner_layers = 0;
229 ClipperLib::Paths get_thermals(class Plane *plane, const class CanvasPads *ca) const;
230 void update_all_airwires();
231 void update_airwire(bool fast, const UUID &net);
232
233 Board(const Board &brd, CopyMode copy_mode);
234 void expand_packages();
235 Outline get_outline(bool with_errors) const;
236
237 std::map<int, UserLayer> user_layers;
238 void update_layers();
239 void assign_user_layer_positions();
240};
241
242inline Board::ExpandFlags operator|(Board::ExpandFlags a, Board::ExpandFlags b)
243{
244 return static_cast<Board::ExpandFlags>(static_cast<int>(a) | static_cast<int>(b));
245}
246
247inline Board::ExpandFlags operator|=(Board::ExpandFlags &a, Board::ExpandFlags b)
248{
249 return a = (a | b);
250}
251
252
253} // 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:28
Definition canvas_pads.hpp:7
Definition canvas_patch.hpp:7
Definition common.hpp:278
Definition file_version.hpp:9
Definition gerber_output_settings.hpp:11
Definition grid_settings.hpp:9
Definition ipool.hpp:15
A Junction is a point in 2D-Space.
Definition junction.hpp:20
Definition layer_provider.hpp:8
Definition lut.hpp:18
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:28
Definition rules.hpp:38
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
basic_json<> json
default JSON class
Definition json_fwd.hpp:62
Definition board.hpp:213
Definition common.hpp:328