3个版本
| 0.4.2 | 2020年6月25日 |
|---|---|
| 0.4.1 | 2020年6月22日 |
| 0.4.0 | 2020年6月22日 |
#1388 in 解析器实现
134 每月下载量
用于 6 个crate(直接使用3个)
105KB
2K SLoC
mshio
用于解析Gmsh MSH文件格式(版本4.1)的解析器库
该库支持解析符合Gmsh文档中指定的MSH文件格式版本4.1的ASCII和二进制编码的MSH文件。
use std::error::Error;
use std::fs;
fn main() -> Result<(), Box<dyn Error>> {
// Try to read and parse a MSH file
let msh_bytes = fs::read("tests/data/sphere_coarse.msh")?;
let parser_result = mshio::parse_msh_bytes(msh_bytes.as_slice());
// Note that the a parser error cannot be propagated directly using the ?-operator, as it
// contains a reference into the u8 slice where the error occurred.
let msh = parser_result.map_err(|e| format!("Error while parsing:\n{}", e))?;
assert_eq!(msh.total_element_count(), 891);
Ok(())
}
如果解析成功,函数 parse_msh_bytes 返回一个 MshFile 实例。结构体 MshFile 的结构紧密遵循MSH格式规范。例如,与 MshFile 相关的 MeshData 可能包含一个可选的 Elements 部分。此 Elements 部分可以包含任意数量的 ElementBlock 实例,其中每个 ElementBlock 只包含相同类型和维度的元素。
目前,仅解析MSH文件的以下部分: Entities、Nodes、Elements。所有其他部分如果按照MSH格式规范由 $SectionName 和 $EndSectionName 定界,则会被静默忽略。
请注意,实际的值不会在MSH格式规范定义的范围之外进行一致性检查。这意味着,解析的元素可能引用节点部分中不存在的节点索引(如果MSH文件已经包含这种不一致)。将来可能会添加检查此的实用函数。
尽管《MshFile》结构体及其所有相关结构体都是泛型类型,但parse_msh_bytes函数强制使用u64、i32和f64作为输出值类型,分别对应于MSH输入值类型size_t、int和double(当然,size_t值将仍然按照文件头中指定的尺寸解析)。我们没有遇到过使用不同类型(例如64位整数或32位浮点数)的MSH文件,因此无法进行测试。此外,MSH格式规范没有指定浮点数和整数类型的大小。如果用户希望进行类型缩小转换,则应在解析文件后手动进行。
注意,当加载元素/节点和其他实体集合时,解析器会检查这些对象的数目是否可以用系统的usize类型表示。如果不能,则返回错误,因为在这种情况下它们不能存储在Vec中。
什么已经工作?
- 解析ASCII和二进制(大端/小端)MSH文件。
- 解析
Entities、Nodes、Elements部分。 - 支持Gmsh目前支持的所有具有固定节点数的元素类型。
问题
- 库中包含一些剩余的不再必要的
unimplemented!/.expect调用,应该用错误代替。但这些很少,并且几乎所有错误原因都导致实际的Err返回值。 - 不支持的部分被静默忽略。将来,
MshData应该存储一个包含忽略部分名称的列表,以便方便/调试。 - MSH格式规范允许存在多个相同类型的部分。目前,解析此类MSH文件会导致错误。将它们连接起来需要在解析器中添加更多逻辑,但也可以将相同类型的所有部分存储在
Vec中。我们已经决定了一个解决方案,因为我们没有实际世界的示例文件来测试这一点。 - 库的某些部分需要更多的内部代码文档,解析器可能也需要简化。
- 需要更多针对特定错误情况的测试用例。
未来工作
- 目前不支持写入MSH文件,并且在我们优先级列表中非常低,因为我们没有用例。请随时贡献!
- 解析其他MSH部分。同样,我们目前没有这个用例。
- 实用函数,用于检查不一致性或帮助将数据转换为更常见的网格表示形式。
依赖项
~3MB
~63K SLoC