21 个版本
0.7.0-rc1 | 2024 年 7 月 22 日 |
---|---|
0.6.3 | 2021 年 3 月 14 日 |
0.6.2 | 2021 年 2 月 8 日 |
0.5.0 | 2020 年 12 月 3 日 |
0.1.6 | 2018 年 11 月 10 日 |
#81 在 解析器实现
1,450 每月下载量
用于 7 个 crate (5 直接)
445KB
7.5K SLoC
vtkio
Vtkio 是 Visualization Toolkit (VTK) 文件格式 的解析器和写入器。
这是一个用于解析传统和 XML VTK 文件格式的功能完整的解析器。支持串行和并行 XML 文件格式。
传统格式解析器使用 nom 编写。XML VTK 文件使用 quick-xml
和 serde
crate 进行导入和导出。
用法
要使用此库,只需将 crate 名称添加到您的 Cargo.toml
文件中
[dependencies]
vtkio = "0.7"
示例
许多示例文件可以在 assets
目录中找到。以下是使用此库的一些示例。
导入/导出
以下代码加载名为 tet.vtk
的 VTK 文件,修改它,并以传统 ASCII 格式将其写回。
use vtkio::model::*; // import model definition of a VTK file
fn main() {
use std::path::PathBuf;
let file_path = PathBuf::from("assets/tet.vtk");
let mut vtk_file = Vtk::import(&file_path)
.expect(&format!("Failed to load file: {:?}", file_path));
vtk_file.version = Version::new((4,2)); // arbitrary change
vtk_file.export_ascii(&file_path)
.expect(&format!("Failed to save file: {:?}", file_path));
}
以下两个示例展示了如何手动创建新的 Vtk
实例。
简单三角形单元
在这里,我们创建了一个包含单个三角形(表示为无结构网格的单元)的 Vtk 实例。
fn make_triangle() -> Vtk {
Vtk {
version: Version { major: 4, minor: 2 },
title: String::new(),
byte_order: ByteOrder::BigEndian,
file_path: None,
data: DataSet::inline(UnstructuredGridPiece {
points: IOBuffer::F64(vec![
// coordinates of node 0
-1.0, -1.0, 0.0,
// coordinates of node 1
1.0, -1.0, 0.0,
// coordinates of node 2
1.0, 1.0, 0.0,
]),
cells: Cells {
cell_verts: VertexNumbers::XML {
// connect node 0, 1, 2 (in this order)
connectivity: vec![0, 1, 2],
// only one group of size 3
offsets: vec![3],
},
// only one cell of type triangle
types: vec![CellType::Triangle; 1],
},
data: Attributes {
..Default::default()
},
}),
}
}
混合单元类型
以下示例创建了一个包含三角形和四边形的网格。
fn make_mixed_flat_elements() -> Vtk {
Vtk {
version: Version { major: 4, minor: 2 },
title: String::new(),
byte_order: ByteOrder::BigEndian,
file_path: None,
data: DataSet::inline(UnstructuredGridPiece {
points: IOBuffer::F64(vec![
-1.0, -1.0, 0.0,
1.0, -1.0, 0.0,
1.0, 1.0, 0.0,
-1.0, 1.0, 0.0,
2.0, -1.0, 0.2,
2.0, 1.0, 0.2,
]),
cells: Cells {
cell_verts: VertexNumbers::XML {
connectivity: vec![
// nodes of triangle
0, 1, 2,
// nodes of quadrilateral
1, 4, 5, 2,
],
offsets: vec![
// number of nodes cell 1
3,
// number of nodes cell 1 + number of nodes of cell 2
// 3 + 4 = 7
7
],
},
types: vec![
CellType::Triangle,
CellType::Quad
],
},
data: Attributes {
..Default::default()
},
}),
}
}
提取字段数据
一旦读取或从文件加载了 Vtk 文件,从其中提取有用的数据就很有用。在以下代码片段中,从 Vtk 结构中提取了附加到顶点的 "id" 字段。
fn extract_id_field(vtk: Vtk) -> Vec<i32> {
let pieces = if let DataSet::UnstructuredGrid { pieces, .. } = vtk.data {
pieces
} else {
panic!("Wrong vtk data type");
};
// If piece is already inline, this just returns a piece data clone.
let piece = pieces[0].load_piece_data(None).expect("Failed to load piece data");
let attribute = &piece.data.point[0];
if let Attribute::Field { data_array, .. } = attribute {
data_array
.iter()
.find(|&DataArrayBase { name, .. }| name == "id")
.expect("Failed to find id field")
.data
.cast_into::<i32>()
.expect("Failed cast")
} else {
panic!("No field attribute found");
}
}
特性
有两个主要特性可供使用
- 通过
xml
特性标志支持 XML 文件(默认启用)。这允许导入和导出现代 XML 格式的 VTK 文件。如果禁用,则仅支持传统文件格式,但是构建速度更快,因为它不包含解析和写入 XML 文件所需的额外依赖项(serde
和quick-xml
)和代码。 - 通过
compression
特性标志进行压缩(默认启用)。此标志公开了额外的 API,用于导出和导入压缩的 VTK 文件(仅限于 XML 格式)。当xml
特性被禁用时,此功能没有优势。
要禁用上述功能,只需将 default-features
设置为 false
。要启用特定功能,请将其添加到 features
列表下。例如,要禁用 compression
特性,请将 vtkio
依赖项添加如下:
[dependencies]
vtkio = { version = "0.7", default-features = false, features = ["xml"] }
要禁用所有附加功能,使用
[dependencies]
vtkio = { version = "0.7", default-features = false }
变更
crate 的 0.3 版本仅支持旧版 VTK 格式。有关 vtkio
(v0.4+)新版本引入的变更列表,请参阅 CHANGELOG。
许可证
此存储库受以下任一许可证的许可:
- Apache 许可证 2.0 版(LICENSE-APACHE 或 https://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证(《LICENSE-MIT》或 https://opensource.org/licenses/MIT)
由您选择。
除非您明确声明,否则任何有意提交以包含在作品中的贡献,根据 Apache-2.0 许可证的定义,均应按上述方式双重许可,不附加任何额外条款或条件。
依赖项
~1.6–4.5MB
~83K SLoC