21 个版本

0.7.0-rc12024 年 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解析器实现

Download history 446/week @ 2024-04-25 597/week @ 2024-05-02 625/week @ 2024-05-09 719/week @ 2024-05-16 733/week @ 2024-05-23 859/week @ 2024-05-30 657/week @ 2024-06-06 495/week @ 2024-06-13 639/week @ 2024-06-20 472/week @ 2024-06-27 345/week @ 2024-07-04 226/week @ 2024-07-11 345/week @ 2024-07-18 315/week @ 2024-07-25 363/week @ 2024-08-01 388/week @ 2024-08-08

1,450 每月下载量
用于 7 个 crate (5 直接)

MIT/Apache

445KB
7.5K SLoC

vtkio

Vtkio 是 Visualization Toolkit (VTK) 文件格式 的解析器和写入器。

On crates.io On docs.rs Build Status

这是一个用于解析传统和 XML VTK 文件格式的功能完整的解析器。支持串行和并行 XML 文件格式。

传统格式解析器使用 nom 编写。XML VTK 文件使用 quick-xmlserde 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 文件所需的额外依赖项(serdequick-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 许可证的定义,均应按上述方式双重许可,不附加任何额外条款或条件。

依赖项

~1.6–4.5MB
~83K SLoC