br_dxf/
text.rs

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                        // println!("{}",removed_chars);
45                    }
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                        // println!("{}",removed_chars);
59                    }
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                        // println!("{}",removed_chars);
72                    }
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        // let mut index = 0;
92        // let mut open = false;
93        // let mut tag = "";
94        // for line in tt.lines() {
95        //     match open {
96        //         true => {
97        //             match line {
98        //                 "SECTION" => {
99        //                     tag = "SECTION";
100        //                 }
101        //                 _ => {}
102        //             }
103        //             match tag {
104        //                 "SECTION" => {
105        //                     match dxf.header.set(line) {
106        //                         Ok(_) => {}
107        //                         Err(_) => {
108        //                             open = false;
109        //                             tag = "";
110        //                             return Err("".to_string());
111        //                         }
112        //                     };
113        //                 }
114        //                 _ => {}
115        //             }
116        //         }
117        //         false => {
118        //             index = line.trim().parse::<usize>().unwrap();
119        //             open = true;
120        //         }
121        //     }
122        // }
123
124
125        Ok(())
126    }
127}
128
129#[derive(Debug)]
130pub struct Header {
131    /// 版本信息
132    version: String,
133    /// 单位信息
134    unit: String,
135    /// 图形的最小和最大坐标值 x,y,z
136    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/// 实体
191#[derive(Debug)]
192pub enum Entities {
193    /// 二维几何图形 1:标识 2:图层 3:线段组
194    LWPOLYLINE(usize, usize, Vec<(f64, f64)>),
195    /// 线 1:标识 2:图层 3:开始坐标 4:结束坐标
196    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                    // println!("{}", text);
264                }
265            }
266        }
267        list
268    }
269}