Horizon
Loading...
Searching...
No Matches
canvas_mesh.hpp
1#pragma once
2#include "canvas/canvas_patch.hpp"
3#include "common/common.hpp"
4#include "clipper/clipper.hpp"
5#include <atomic>
6
7namespace horizon {
8class CanvasMesh {
9public:
10 void update(const class Board &brd);
11 void update_only(const class Board &brd);
12 void prepare_only(std::function<void()> cb = nullptr);
13
14 class Layer3D {
15 public:
16 class Vertex {
17 public:
18 Vertex(float ix, float iy) : x(ix), y(iy)
19 {
20 }
21
22 float x, y;
23 };
24 std::vector<Vertex> tris;
25 std::vector<Vertex> walls;
26 void move_from(Layer3D &&other);
27 void copy_sizes_from(const Layer3D &other);
28
29 float offset = 0;
30 float thickness = 0.035;
31 float alpha = 1;
32 float explode_mul = 0;
33 LayerRange span;
34
35 std::atomic_bool done = false;
36 };
37
38 static bool layer_is_pth_barrel(int layer)
39 {
40 return (layer >= 20'000) && (layer < 21'000);
41 }
42
43 static bool layer_is_substrate(int layer);
44
45 std::map<int, Layer3D> &get_layers()
46 {
47 return layers;
48 }
49 const std::map<int, Layer3D> &get_layers() const
50 {
51 return layers;
52 }
53 std::pair<Coordi, Coordi> get_bbox() const;
54 CanvasMesh();
55 void cancel_prepare()
56 {
57 cancel = true;
58 }
59
60private:
61 CanvasPatch ca;
62 std::map<int, Layer3D> layers;
63 std::atomic_bool cancel = false;
64
65 void prepare(const class Board &brd);
66 void prepare_work(std::function<void()> cb);
67 void polynode_to_tris(const ClipperLib::PolyNode *node, int layer);
68 std::vector<int> layers_to_prepare;
69
70 void prepare_worker(std::atomic_size_t &layer_counter, std::function<void()> cb);
71 void prepare_layer(int layer);
72 void prepare_soldermask(int layer);
73 void prepare_silkscreen(int layer);
74 void add_path(int layer, const ClipperLib::Path &path);
75};
76} // namespace horizon
Definition clipper.hpp:137
Definition board.hpp:47
Definition canvas_mesh.hpp:16
Definition canvas_mesh.hpp:14
Definition canvas_mesh.hpp:8
Definition layer_range.hpp:11