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