1 #include "tool_generate_courtyard.hpp"
2 #include "document/idocument_package.hpp"
3 #include "pool/package.hpp"
4 #include "board/board_layers.hpp"
5 #include "imp/imp_interface.hpp"
6 #include <iostream>
7 
8 namespace horizon {
9 
can_begin()10 bool ToolGenerateCourtyard::can_begin()
11 {
12     return doc.k;
13 }
14 
begin(const ToolArgs & args)15 ToolResponse ToolGenerateCourtyard::begin(const ToolArgs &args)
16 {
17     Coordi a, b;
18     auto &pkg = doc.k->get_package();
19     for (const auto &it : pkg.pads) {
20         auto bb_pad = it.second.placement.transform_bb(it.second.padstack.get_bbox(true));
21         a = Coordi::min(a, bb_pad.first);
22         b = Coordi::max(b, bb_pad.second);
23     }
24     for (const auto &it_poly : pkg.polygons) {
25         if (it_poly.second.layer == BoardLayers::TOP_PACKAGE) {
26             auto poly = it_poly.second.remove_arcs();
27             for (const auto &it : poly.vertices) {
28                 a = Coordi::min(a, it.position);
29                 b = Coordi::max(b, it.position);
30             }
31         }
32     }
33 
34     if (a.mag_sq() == 0 || b.mag_sq() == 0) {
35         imp->tool_bar_flash("zero courtyard, aborting");
36         return ToolResponse::end();
37     }
38 
39     Polygon *courtyard_poly = nullptr;
40     for (auto &it : pkg.polygons) {
41         if (it.second.layer == BoardLayers::TOP_COURTYARD) {
42             courtyard_poly = &it.second;
43             imp->tool_bar_flash("modified existing courtyard polygon");
44             break;
45         }
46     }
47     if (!courtyard_poly) {
48         courtyard_poly = doc.k->insert_polygon(UUID::random());
49         courtyard_poly->layer = BoardLayers::TOP_COURTYARD;
50         imp->tool_bar_flash("created new courtyard polygon");
51     }
52     courtyard_poly->parameter_class = "courtyard";
53     courtyard_poly->vertices.clear();
54     courtyard_poly->vertices.emplace_back(a);
55     courtyard_poly->vertices.emplace_back(Coordi(a.x, b.y));
56     courtyard_poly->vertices.emplace_back(b);
57     courtyard_poly->vertices.emplace_back(Coordi(b.x, a.y));
58 
59     return ToolResponse::commit();
60 }
61 
update(const ToolArgs & args)62 ToolResponse ToolGenerateCourtyard::update(const ToolArgs &args)
63 {
64     return ToolResponse();
65 }
66 } // namespace horizon
67