You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在VTK中为非结构化网格(.vtu)着色?代码执行异常

VTK中VTU模型着色失败排查

完整源代码及测试用block.vtu文件已准备好,以下是关键函数说明:

1. 获取Actor所有列名

public static List<string> getColumns(int actorIndex)
{
    List<string> colums = new List<string>();
    vtkActor actor = actors[actorIndex];
    var output = actor.GetMapper().GetInputAsDataSet();
    var cell = output.GetCellData();
    for (int i = 0; i < cell.GetNumberOfArrays(); i++)
    {
        var colm = cell.GetArrayName(i);
        if (colm != null) colums.Add(colm);
    }
    return colums; // 返回列名列表,如['CU_OK','D1','Domain','IJK','IX','IY'...]
}

2. 为指定列给模型着色

public static void setColors(int actorIndex, string column)
{
    List<string> colums = new List<string>();
    vtkActor actor = actors[actorIndex];
    var output = actor.GetMapper().GetInputAsDataSet();
    var colors = vtkUnsignedCharArray.New();
    colors.SetNumberOfComponents(3);
    colors.SetName("Colors");

    var cell = output.GetCellData();
    for (int i = 0; i < cell.GetNumberOfArrays(); i++)
    {
        var cells = cell.GetArray(i);
        if (cells == null) continue;
        if (column != cell.GetArrayName(i)) continue;
        for (int j = 0; j < cells.GetNumberOfTuples(); j++)
        {
            var c = color_range((cells.GetComponent(i, j) / cell.GetArray(i).GetRange()[1]) * 100);
            var R = c.R;
            var G = c.G;
            var B = c.B;
            colors.InsertNextTuple3((double)R, (double)G, (double)B);
            colors.InsertNextTuple3((double)R, (double)G, (double)B);  // 试过加/不加这一行,都没用
        }

    }
    output.GetPointData().SetScalars(colors); // 试过换成GetCellData(),依然无效
}

3. 获取指定列的数值范围(min, max)

public static double[] getRange(int actorIndex, string column)
{
    List<string> colums = new List<string>();
    vtkActor actor = actors[actorIndex];
    var output = actor.GetMapper().GetInputAsDataSet();
    var cell = output.GetCellData();
    for (int i = 0; i < cell.GetNumberOfArrays(); i++)
    {
        var colm = cell.GetArrayName(i);
        var arr = cell.GetArray(i);
        if (column == colm)
        {
            if (arr == null) return null;
            return arr.GetRange(); // 返回{min, max}数组
        }
    }
    return null;
}

问题现象

  • .vtp与.vtk文件着色效果正常(示例:彩色钻孔模型)
  • .vtu文件无法正常着色:预期效果为ParaView中显示的彩色块模型,但实际仅显示无彩色的模型
  • 所有.vtp文件着色正常,所有.vtu文件均失败,且.vtu文件在ParaView中可正常显示彩色

已尝试的解决方法

参考相关问题、切换Cell Data/Point Data、使用查找表等,均未解决问题。

内容的提问来源于stack exchange,提问作者softycode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 09:54:16