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