首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在vtk中对非结构化网格(.vtu)进行着色?

如何在vtk中对非结构化网格(.vtu)进行着色?
EN

Stack Overflow用户
提问于 2022-08-05 09:20:24
回答 1查看 122关注 0票数 2

为了测试目的,我的全部源代码都是这里,包括block.vtu文件。我将在这里讨论重要的功能。

此代码可着色*.vtp,*.vtk。但是相同的代码不能为*.vtu着色。

我有vtkactors的列表。并指定要从哪个参与者设置属性。

  1. 从一个参与者中获取所有列名的代码
代码语言:javascript
复制
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'...]
}
  1. 此代码为特定列的模型着色。
代码语言:javascript
复制
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);  //even tried with and without inserting second tuple
        }

    }
    output.GetPointData().SetScalars(colors); //even tried with GetCellData(), but no luck
}
  1. 此代码从特定的列获取值的范围(min,最大值)。
代码语言:javascript
复制
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(); // new double[] { min, max }
        }
    }
    return null;
}

VTP和VTK的实际产出(良好):

结果很好。这就是我的代码显示钻孔的方式。

VTU的预期产出(好):

看看它的颜色。这就是PARAVIEW软件所能展示的:

VTU的实际产出(坏):

我的代码就是这样显示模型的:

我也试过:

我试着跟踪问题,但是vtu的颜色没有影响。我也尝试过单元数据而不是点数据。我还试过查找表,它用颜色标尺显示,但对模型颜色没有影响。

奇怪的是:

  • 所有vtp文件都工作(到颜色),所有vtu文件都失败。
  • vtu文件在截屏上显示彩色精细,但在我的代码中没有显示。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-16 07:50:37

我不确定这是否是一个合适的解决方案,但是如果您在setColors函数的末尾创建一个新的映射器,它可能会工作。

代码语言:javascript
复制
            output.GetPointData().SetScalars(colors);

+           vtkDataSetMapper mapper = vtkDataSetMapper.New();
+           mapper.SetInput(output);
+           actor.SetMapper(mapper);
        }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73247453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档