1use std::{fs, io};
2
3pub struct Text {
4 header: Header,
5 entities: Vec<Entities>,
6}
7
8impl Text {
9 pub fn load_file(path: &str) -> Result<(), String> {
10 let t = match fs::read(path) {
11 Ok(e) => e,
12 Err(e) => {
13 return Err(e.to_string());
14 }
15 };
16 let mut text = unsafe { String::from_utf8_unchecked(t) };
17
18 let mut dxf = Self {
19 header: Header::default(),
20 entities: vec![],
21 };
22
23 match text.find("SECTION\r\n") {
24 None => {}
25 Some(start) => {
26 match text.find("ENDSEC\r\n") {
27 None => {}
28 Some(end) => {
29 let removed_chars: String = text.drain(start..end + 8).collect();
30 let _ = dxf.header.set(removed_chars);
31 }
32 }
33 }
34 }
35
36
37 match text.find("SECTION\r\n") {
38 None => {}
39 Some(start) => {
40 match text.find("ENDSEC\r\n") {
41 None => {}
42 Some(end) => {
43 let _: String = text.drain(start..end + 8).collect();
44 }
46 }
47 }
48 }
49
50
51 match text.find("SECTION\r\n") {
52 None => {}
53 Some(start) => {
54 match text.find("ENDSEC\r\n") {
55 None => {}
56 Some(end) => {
57 let _removed_chars: String = text.drain(start..end + 8).collect();
58 }
60 }
61 }
62 }
63
64 match text.find("SECTION\r\n") {
65 None => {}
66 Some(start) => {
67 match text.find("ENDSEC\r\n") {
68 None => {}
69 Some(end) => {
70 let _removed_chars: String = text.drain(start..end + 8).collect();
71 }
73 }
74 }
75 }
76
77 match text.find("SECTION\r\n") {
78 None => {}
79 Some(start) => {
80 match text.find("ENDSEC\r\n") {
81 None => {}
82 Some(end) => {
83 let removed_chars: String = text.drain(start..end + 8).collect();
84 dxf.entities = Entities::new(removed_chars);
85 }
86 }
87 }
88 }
89
90
91 Ok(())
126 }
127}
128
129#[derive(Debug)]
130pub struct Header {
131 version: String,
133 unit: String,
135 min: (f64, f64, f64),
137 max: (f64, f64, f64),
138}
139
140impl Header {
141 pub fn set(&mut self, data: String) -> io::Result<()> {
142 let list = data.lines().collect::<Vec<&str>>();
143 for (index, line) in data.lines().enumerate() {
144 match line {
145 "$ACADVER" => {
146 self.version = list[index + 2].to_string().trim().parse().unwrap();
147 }
148 "$INSUNITS" => {
149 self.unit = match list[index + 2].to_string().trim().parse().unwrap() {
150 1 => "英寸",
151 2 => "英尺",
152 3 => "英寸分数",
153 4 => "英尺分数",
154 5 => "米",
155 6 => "毫米",
156 7 => "厘米",
157 8 => "微米",
158 9 => "希腊文的米",
159 _ => "无"
160 }.to_string();
161 }
162 "$EXTMIN" => {
163 self.min.0 = list[index + 2].trim().parse::<f64>().unwrap();
164 self.min.1 = list[index + 4].trim().parse::<f64>().unwrap();
165 self.min.2 = list[index + 6].trim().parse::<f64>().unwrap();
166 }
167 "$EXTMAX" => {
168 self.max.0 = list[index + 2].trim().parse::<f64>().unwrap();
169 self.max.1 = list[index + 4].trim().parse::<f64>().unwrap();
170 self.max.2 = list[index + 6].trim().parse::<f64>().unwrap();
171 }
172 _ => {}
173 }
174 }
175 Ok(())
176 }
177}
178
179impl Default for Header {
180 fn default() -> Self {
181 Self {
182 version: "".to_string(),
183 unit: "".to_string(),
184 min: (0.0, 0.0, 0.0),
185 max: (0.0, 0.0, 0.0),
186 }
187 }
188}
189
190#[derive(Debug)]
192pub enum Entities {
193 LWPOLYLINE(usize, usize, Vec<(f64, f64)>),
195 LINE(usize, usize, (f64, f64, f64), (f64, f64, f64)),
197
198 MTEXT(usize, usize, (f64, f64, f64), String),
199
200 CaxaDraftFormatedTxt(usize, usize, String),
201}
202
203impl Entities {
204 pub fn new(data: String) -> Vec<Self> {
205 let mut list = vec![];
206 let data_list = data.lines().collect::<Vec<&str>>();
207 for (index, text) in data.lines().enumerate() {
208 match text {
209 "LWPOLYLINE" => {
210 let id = data_list[index + 1].trim().parse::<usize>().unwrap();
211 let layer = data_list[index + 7].trim().parse::<usize>().unwrap();
212
213 let ac_db_polyline_index = data_list.iter().skip(index).position(|s| s.contains("AcDbPolyline")).unwrap();
214 let number = data_list[index + ac_db_polyline_index + 2].trim().parse::<usize>().unwrap();
215
216 let mut xy = vec![];
217 for i in (0..number * 4).step_by(4) {
218 let x = data_list[index + ac_db_polyline_index + 7 + i + 1].trim().parse::<f64>().unwrap();
219 let y = data_list[index + ac_db_polyline_index + 7 + i + 3].trim().parse::<f64>().unwrap();
220 xy.push((x, y));
221 }
222 list.push(Self::LWPOLYLINE(id, layer, xy));
223 }
224 "LINE" => {
225 let id = data_list[index + 1].trim().parse::<usize>().unwrap();
226 let layer = data_list[index + 7].trim().parse::<usize>().unwrap();
227
228 let ac_db_polyline_index = data_list.iter().skip(index).position(|s| s.contains("AcDbLine")).unwrap();
229
230 let mut xy = vec![];
231 for i in (0..2 * 6).step_by(6) {
232 let x = data_list[index + ac_db_polyline_index + 1 + i + 1].trim().parse::<f64>().unwrap();
233 let y = data_list[index + ac_db_polyline_index + 1 + i + 3].trim().parse::<f64>().unwrap();
234 let z = data_list[index + ac_db_polyline_index + 1 + i + 5].trim().parse::<f64>().unwrap();
235 xy.push((x, y, z));
236 }
237 list.push(Self::LINE(id, layer, xy[0], xy[1]));
238 }
239 "MTEXT" => {
240 let id = data_list[index + 1].trim().parse::<usize>().unwrap();
241 let layer = data_list[index + 7].trim().parse::<usize>().unwrap();
242
243 let ac_db_polyline_index = data_list.iter().skip(index).position(|s| s.contains("AcDbMText")).unwrap();
244
245 let x = data_list[index + ac_db_polyline_index + 2].trim().parse::<f64>().unwrap();
246 let y = data_list[index + ac_db_polyline_index + 4].trim().parse::<f64>().unwrap();
247 let z = data_list[index + ac_db_polyline_index + 6].trim().parse::<f64>().unwrap();
248
249 let text = data_list[index + ac_db_polyline_index + 18].trim().parse::<String>().unwrap();
250
251 list.push(Self::MTEXT(id, layer, (x, y, z), text.clone()));
252 }
253 "CaxaDraftFormatedTxt" => {
254 let id = data_list[index + 1].trim().parse::<usize>().unwrap();
255 let layer = data_list[index + 7].trim().parse::<usize>().unwrap();
256 let value = data_list[index + 4].trim().parse::<String>().unwrap();
257
258 list.push(Self::CaxaDraftFormatedTxt(id, layer, value.clone()));
259 println!("{:#?}", Self::CaxaDraftFormatedTxt(id, layer, value));
260 }
261 _ => {
262 println!("{}", text);
263 }
265 }
266 }
267 list
268 }
269}