VIPRA Documentation
Loading...
Searching...
No Matches
drw_reader.hpp
1#pragma once
2
3#include <initializer_list>
4#include "drw_base.h"
5#include "drw_entities.h"
6#include "drw_interface.h"
7
8#include "vipra/geometry/f3d.hpp"
9#include "vipra/geometry/polygon.hpp"
10#include "vipra/logging/logging.hpp"
11
12namespace VIPRA {
13struct DrwReader : public DRW_Interface {
14 static constexpr int NUM_SUBDIVISIONS = 126;
15 std::vector<VIPRA::Geometry::Polygon> obstacles;
16 std::map<std::string, std::vector<VIPRA::Geometry::Polygon>> objectives;
17 std::vector<VIPRA::Geometry::Polygon> spawns;
18 std::map<std::string, VIPRA::Geometry::Polygon> areas;
19
20 void addLWPolyline(const DRW_LWPolyline& data) override
21 {
22 bool isClosed = (data.flags & 0x01U) != 0U;
23
24 if ( isClosed ) {
25 VIPRA::f3dVec points;
26 for ( auto const& vertex : data.vertlist ) {
27 points.emplace_back(vertex->x, vertex->y);
28 }
29
30 add_obstacle(points, data.layer);
31
32 return;
33 }
34
35 add_polyline_path(data);
36 }
37
38 void addLine(const DRW_Line& data) override
39 {
40 add_obstacle({VIPRA::f3d{data.basePoint.x, data.basePoint.y},
41 VIPRA::f3d{data.secPoint.x, data.secPoint.y}},
42 data.layer);
43 }
44
45 void addPoint(const DRW_Point& data) override
46 {
47 add_obstacle({VIPRA::f3d{data.basePoint.x, data.basePoint.y}}, data.layer);
48 }
49
50 void add_polyline_path(const DRW_LWPolyline& data)
51 {
52 // We add these as individidual lines to prevent the arc from closing at both ends.
53 for ( int i = 0; i < data.vertexnum - 1; i++ ) {
54 std::shared_ptr<DRW_Vertex2D> const& vertex = data.vertlist[i];
55 std::shared_ptr<DRW_Vertex2D> const& nextVertex = data.vertlist[i];
56 std::vector<VIPRA::f3d> line = {VIPRA::f3d{vertex->x, vertex->y},
57 VIPRA::f3d{nextVertex->x, nextVertex->y}};
58
59 add_obstacle(line, data.layer);
60 }
61 }
62
63 void add_obstacle(std::initializer_list<VIPRA::f3d> const& points,
64 std::string object_type)
65 {
66 std::string objectTypeCaseless = object_type;
67 transform(object_type.begin(), object_type.end(), object_type.begin(), ::toupper);
68
69 if ( object_type == "OBSTACLES" ) {
70 obstacles.emplace_back(points);
71 }
72 else if ( object_type == "SPAWNS" ) {
73 spawns.emplace_back(points);
74 }
75 else if ( object_type.find("AREAS") != std::string::npos ) {
76 areas[object_type] = Geometry::Polygon(points);
77 }
78 else {
79 if ( objectives[objectTypeCaseless].empty() ) {
80 objectives[objectTypeCaseless] = {Geometry::Polygon{points}};
81 }
82 else {
83 objectives[objectTypeCaseless].emplace_back(points);
84 }
85 }
86 }
87
88 void add_obstacle(std::vector<VIPRA::f3d> const& points, std::string object_type)
89 {
90 std::string objectTypeCaseless = object_type;
91 transform(object_type.begin(), object_type.end(), object_type.begin(), ::toupper);
92
93 if ( object_type == "OBSTACLES" ) {
94 obstacles.emplace_back(points);
95 }
96 else if ( object_type == "SPAWNS" ) {
97 spawns.emplace_back(points);
98 }
99 else if ( object_type.find("AREAS") != std::string::npos ) {
100 areas[object_type] = Geometry::Polygon(points);
101 }
102 else {
103 if ( objectives[objectTypeCaseless].empty() ) {
104 objectives[objectTypeCaseless] = {Geometry::Polygon{points}};
105 }
106 else {
107 objectives[objectTypeCaseless].emplace_back(points);
108 }
109 }
110 }
111
112 void addRay(const DRW_Ray& /*data*/) override
113 {
114 VIPRA::Log::warn("DXF Loading for Ray not impelmented");
115 }
116 void addXline(const DRW_Xline& /*data*/) override
117 {
118 VIPRA::Log::warn("DXF Loading for Xline not impelmented");
119 }
120 void addArc(const DRW_Arc& /*data*/) override
121 {
122 VIPRA::Log::warn("DXF Loading for Arc not impelmented");
123 }
124 void addCircle(const DRW_Circle& /*data*/) override
125 {
126 VIPRA::Log::warn("DXF Loading for Circle not impelmented");
127 }
128 void addEllipse(const DRW_Ellipse& /*data*/) override
129 {
130 VIPRA::Log::warn("DXF Loading for Ellipse not impelmented");
131 }
132 void addPolyline(const DRW_Polyline& /*data*/) override
133 {
134 VIPRA::Log::warn("DXF Loading for Polyline not impelmented");
135 }
136 void addSpline(const DRW_Spline* /*data*/) override
137 {
138 VIPRA::Log::warn("DXF Loading for Spline not impelmented");
139 }
140 void addKnot(const DRW_Entity& /*data*/) override
141 {
142 VIPRA::Log::warn("DXF Loading for Knot not impelmented");
143 }
144 void addInsert(const DRW_Insert& /*data*/) override
145 {
146 VIPRA::Log::warn("DXF Loading for Insert not impelmented");
147 }
148 void addTrace(const DRW_Trace& /*data*/) override
149 {
150 VIPRA::Log::warn("DXF Loading for Trace not impelmented");
151 }
152 void add3dFace(const DRW_3Dface& /*data*/) override
153 {
154 VIPRA::Log::warn("DXF Loading for 3dFace not impelmented");
155 }
156 void addSolid(const DRW_Solid& /*data*/) override
157 {
158 VIPRA::Log::warn("DXF Loading for Solid not impelmented");
159 }
160 void addHeader(const DRW_Header* data) override {}
161 void addLType(const DRW_LType& data) override {}
162 void addLayer(const DRW_Layer& data) override {}
163 void addDimStyle(const DRW_Dimstyle& data) override {}
164 void addVport(const DRW_Vport& data) override {}
165 void addTextStyle(const DRW_Textstyle& data) override {}
166 void addAppId(const DRW_AppId& data) override {}
167 void addBlock(const DRW_Block& data) override {}
168 void setBlock(const int handle) override {}
169 void endBlock() override {}
170 void addMText(const DRW_MText& data) override {}
171 void addText(const DRW_Text& data) override {}
172 void addDimAlign(const DRW_DimAligned* data) override {}
173 void addDimLinear(const DRW_DimLinear* data) override {}
174 void addDimRadial(const DRW_DimRadial* data) override {}
175 void addDimDiametric(const DRW_DimDiametric* data) override {}
176 void addDimAngular(const DRW_DimAngular* data) override {}
177 void addDimAngular3P(const DRW_DimAngular3p* data) override {}
178 void addDimOrdinate(const DRW_DimOrdinate* data) override {}
179 void addLeader(const DRW_Leader* data) override {}
180 void addHatch(const DRW_Hatch* data) override {}
181 void addViewport(const DRW_Viewport& data) override {}
182 void addImage(const DRW_Image* data) override {}
183 void linkImage(const DRW_ImageDef* data) override {}
184 void addComment(const char* comment) override {}
185 void addPlotSettings(const DRW_PlotSettings* data) override {}
186 void writeHeader(DRW_Header& data) override {}
187 void writeBlocks() override {}
188 void writeBlockRecords() override {}
189 void writeEntities() override {}
190 void writeLTypes() override {}
191 void writeLayers() override {}
192 void writeTextstyles() override {}
193 void writeVports() override {}
194 void writeDimstyles() override {}
195 void writeObjects() override {}
196 void writeAppId() override {}
197};
198
199} // namespace VIPRA
Definition polygon.hpp:18
static VIPRA_INLINE void warn(fmt::format_string< param_ts... > message, param_ts &&... params)
Calls the provided Logger with Level WARN.
Definition logging.hpp:51
Definition drw_reader.hpp:13
Definition f3d.hpp:27