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