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