1 #include "tool_import_dxf.hpp"
2 #include "document/idocument.hpp"
3 #include "imp/imp_interface.hpp"
4 #include "import_dxf/dxf_importer.hpp"
5 #include "common/junction.hpp"
6 #include "common/line.hpp"
7 #include "common/arc.hpp"
8 #include <iostream>
9
10 namespace horizon {
11
can_begin()12 bool ToolImportDXF::can_begin()
13 {
14 return doc.r->has_object_type(ObjectType::ARC) && doc.r->has_object_type(ObjectType::LINE);
15 }
16
begin(const ToolArgs & args)17 ToolResponse ToolImportDXF::begin(const ToolArgs &args)
18 {
19 if (auto r = imp->dialogs.ask_dxf_filename()) {
20 DXFImporter importer(doc.r);
21 importer.set_layer(args.work_layer);
22 importer.set_scale(1);
23 importer.set_shift(args.coords);
24 importer.set_width(0);
25 if (importer.import(*r)) {
26 auto unsupported = importer.get_items_unsupported();
27 selection.clear();
28 for (const auto it : importer.junctions) {
29 selection.emplace(it->uuid, ObjectType::JUNCTION);
30 }
31 lines = importer.lines;
32 arcs = importer.arcs;
33 move_init(args.coords);
34
35 imp->tool_bar_set_actions({
36 {InToolActionID::LMB},
37 {InToolActionID::RMB},
38 {InToolActionID::ROTATE},
39 {InToolActionID::MIRROR},
40 {InToolActionID::ENTER_WIDTH, "line width"},
41 });
42
43 if (unsupported.size()) {
44 std::string s = "<span color='red' weight='bold'> Unsupported items: ";
45 for (const auto &it : unsupported) {
46 s += std::to_string(it.second) + " ";
47 switch (it.first) {
48 case DXFImporter::UnsupportedType::ELLIPSE:
49 s += "Ellipse";
50 break;
51 case DXFImporter::UnsupportedType::SPLINE:
52 s += "Spline";
53 break;
54 }
55 if (it.second > 1)
56 s += "s";
57 s += ", ";
58 }
59 s.pop_back();
60 s.pop_back();
61 s += "</span>";
62 imp->tool_bar_set_tip(s);
63 }
64
65 return ToolResponse();
66 }
67 else {
68 return ToolResponse::revert();
69 }
70 }
71 return ToolResponse::end();
72 }
73
update(const ToolArgs & args)74 ToolResponse ToolImportDXF::update(const ToolArgs &args)
75 {
76 if (args.type == ToolEventType::MOVE) {
77 move_do_cursor(args.coords);
78 }
79 else if (args.type == ToolEventType::ACTION) {
80 switch (args.action) {
81 case InToolActionID::LMB:
82 return ToolResponse::commit();
83
84 case InToolActionID::RMB:
85 case InToolActionID::CANCEL:
86 return ToolResponse::revert();
87
88 case InToolActionID::MIRROR:
89 case InToolActionID::ROTATE:
90 move_mirror_or_rotate(args.coords, args.action == InToolActionID::ROTATE);
91 break;
92
93 case InToolActionID::ENTER_WIDTH:
94 if (auto r = imp->dialogs.ask_datum("Enter width", width)) {
95 width = *r;
96 for (auto it : lines) {
97 it->width = width;
98 }
99 for (auto it : arcs) {
100 it->width = width;
101 }
102 }
103 break;
104
105 default:;
106 }
107 }
108 else if (args.type == ToolEventType::LAYER_CHANGE) {
109 for (auto it : lines) {
110 it->layer = args.work_layer;
111 }
112 for (auto it : arcs) {
113 it->layer = args.work_layer;
114 }
115 }
116 return ToolResponse();
117 }
118 } // namespace horizon
119