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()10bool ToolGenerateCourtyard::can_begin() 11 { 12 return doc.k; 13 } 14 begin(const ToolArgs & args)15ToolResponse 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)62ToolResponse ToolGenerateCourtyard::update(const ToolArgs &args) 63 { 64 return ToolResponse(); 65 } 66 } // namespace horizon 67