1 #include "footprint_generator_base.hpp"
2 #include "widgets/pool_browser_button.hpp"
3 #include "widgets/pool_browser_padstack.hpp"
4 #include "document/idocument_package.hpp"
5 #include "pool/package.hpp"
6 
7 namespace horizon {
FootprintGeneratorBase(const char * resource,IDocumentPackage & c)8 FootprintGeneratorBase::FootprintGeneratorBase(const char *resource, IDocumentPackage &c)
9     : Glib::ObjectBase(typeid(FootprintGeneratorBase)), Gtk::Box(Gtk::ORIENTATION_VERTICAL, 4),
10       p_property_can_generate(*this, "can-generate"), core(c), package(core.get_package())
11 {
12     box_top = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL, 8));
13     pack_start(*box_top, false, false, 0);
14     {
15         auto tbox = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL, 4));
16         auto la = Gtk::manage(new Gtk::Label("Padstack:"));
17         tbox->pack_start(*la, false, false, 0);
18 
19         browser_button = Gtk::manage(new PoolBrowserButton(ObjectType::PADSTACK, core.get_pool()));
20         auto &br = dynamic_cast<PoolBrowserPadstack &>(browser_button->get_browser());
21         br.set_package_uuid(package.uuid);
22         browser_button->property_selected_uuid().signal_changed().connect(
23                 [this] { p_property_can_generate = browser_button->property_selected_uuid() != UUID(); });
24         tbox->pack_start(*browser_button, false, false, 0);
25 
26         box_top->pack_start(*tbox, false, false, 0);
27     }
28 
29     box_top->show_all();
30     box_top->set_margin_top(4);
31     box_top->set_margin_start(4);
32     box_top->set_margin_end(4);
33 
34     overlay = Gtk::manage(new SVGOverlay(resource));
35     pack_start(*overlay, true, true, 0);
36     overlay->show();
37 }
38 
update_pad_parameters(const Padstack & padstack,Pad & pad,const int64_t pad_width,const int64_t pad_height)39 void FootprintGeneratorBase::update_pad_parameters(const Padstack &padstack, Pad &pad, const int64_t pad_width,
40                                                    const int64_t pad_height)
41 {
42     if (padstack.parameter_set.count(ParameterID::PAD_DIAMETER)) {
43         pad.parameter_set[ParameterID::PAD_DIAMETER] = std::min(pad_width, pad_height);
44     }
45     else {
46         pad.parameter_set[ParameterID::PAD_HEIGHT] = pad_height;
47         pad.parameter_set[ParameterID::PAD_WIDTH] = pad_width;
48         if (padstack.parameter_set.count(ParameterID::CORNER_RADIUS)) {
49             const auto r = std::min(0.25_mm, std::min(pad_width, pad_height) / 4);
50             pad.parameter_set[ParameterID::CORNER_RADIUS] = r;
51         }
52     }
53 }
54 
55 } // namespace horizon
56