1 #include "tool_renumber_pads.hpp"
2 #include "document/idocument_package.hpp"
3 #include "pool/package.hpp"
4 #include "imp/imp_interface.hpp"
5 #include "dialogs/renumber_pads_window.hpp"
6 #include "canvas/canvas_gl.hpp"
7 #include <iostream>
8 
9 namespace horizon {
10 
can_begin()11 bool ToolRenumberPads::can_begin()
12 {
13     return get_pads().size() > 1;
14 }
15 
get_pads()16 std::set<UUID> ToolRenumberPads::get_pads()
17 {
18     std::set<UUID> pads;
19     for (const auto &it : selection) {
20         if (it.type == ObjectType::PAD) {
21             pads.emplace(it.uuid);
22         }
23     }
24     return pads;
25 }
26 
begin(const ToolArgs & args)27 ToolResponse ToolRenumberPads::begin(const ToolArgs &args)
28 {
29     auto pads = get_pads();
30     selection.clear();
31     auto &hl = imp->get_highlights();
32     hl.clear();
33     for (const auto &it : pads) {
34         hl.emplace(ObjectType::PAD, it);
35     }
36     imp->update_highlights();
37 
38     annotation = imp->get_canvas()->create_annotation();
39     annotation->set_visible(true);
40     annotation->set_display(LayerDisplay(true, LayerDisplay::Mode::OUTLINE));
41 
42     win = imp->dialogs.show_renumber_pads_window(doc.k->get_package(), pads);
43     win->renumber();
44 
45     return ToolResponse();
46 }
update(const ToolArgs & args)47 ToolResponse ToolRenumberPads::update(const ToolArgs &args)
48 {
49     if (args.type == ToolEventType::DATA) {
50         if (auto data = dynamic_cast<const ToolDataWindow *>(args.data.get())) {
51             if (data->event == ToolDataWindow::Event::CLOSE) {
52                 for (auto &it : win->get_pads_sorted()) {
53                     selection.emplace(it->uuid, ObjectType::PAD);
54                 }
55                 return ToolResponse::revert();
56             }
57             else if (data->event == ToolDataWindow::Event::OK) {
58                 for (auto &it : win->get_pads_sorted()) {
59                     selection.emplace(it->uuid, ObjectType::PAD);
60                 }
61                 return ToolResponse::commit();
62             }
63             else if (data->event == ToolDataWindow::Event::UPDATE) {
64                 annotation->clear();
65                 if (win) {
66                     auto pads = win->get_pads_sorted();
67                     auto bb = pads.front()->padstack.get_bbox();
68                     auto bbd = bb.second - bb.first;
69                     auto pad_size = std::max(bbd.x, bbd.y);
70                     auto head_size = pad_size / 5;
71                     auto line_width = 0;
72                     for (size_t i = 1; i < pads.size(); i++) {
73                         const Coordf v = pads.at(i)->placement.shift - pads.at(i - 1)->placement.shift;
74                         const auto vn = v.normalize();
75 
76                         Coordf ortho(-vn.y, vn.x);
77 
78                         auto ph = Coordf(pads.at(i)->placement.shift);
79                         auto p0 = ph - vn * head_size;
80                         auto p1 = p0 - ortho * head_size / 2;
81                         auto p2 = p0 + ortho * head_size / 2;
82                         annotation->draw_line(ph, p1, ColorP::FROM_LAYER, line_width);
83                         annotation->draw_line(p1, p2, ColorP::FROM_LAYER, line_width);
84                         annotation->draw_line(ph, p2, ColorP::FROM_LAYER, line_width);
85 
86                         annotation->draw_line(pads.at(i - 1)->placement.shift, p0, ColorP::FROM_LAYER, line_width);
87                     }
88                 }
89             }
90         }
91     }
92     return ToolResponse();
93 }
94 
95 
~ToolRenumberPads()96 ToolRenumberPads::~ToolRenumberPads()
97 {
98     if (annotation) {
99         imp->get_canvas()->remove_annotation(annotation);
100         annotation = nullptr;
101     }
102 }
103 
104 } // namespace horizon
105