当前位置: 首页 > news >正文

ExtractSelection 选择和提取数据集中的特定点,以及如何反转该选择

一:主要的知识点

1、说明

本文只是教程内容的一小段,因博客字数限制,故进行拆分。主教程链接:vtk教程——逐行解析官网所有Python示例-CSDN博客

2、知识点纪要

本段代码主要涉及的有①vtkSelectionNode的作用及使用方法


二:代码及注释

import vtkmodules.vtkRenderingOpenGL2 from vtkmodules.vtkCommonColor import vtkNamedColors from vtkmodules.vtkFiltersSources import vtkPointSource from vtkmodules.vtkCommonCore import vtkIdTypeArray from vtkmodules.vtkCommonDataModel import vtkSelectionNode, vtkSelection from vtkmodules.vtkFiltersExtraction import vtkExtractSelection from vtkmodules.vtkCommonDataModel import vtkUnstructuredGrid from vtkmodules.vtkRenderingCore import ( vtkActor, vtkCamera, vtkDataSetMapper, vtkRenderWindow, vtkRenderWindowInteractor, vtkRenderer ) def main(): colors = vtkNamedColors() # 创建一个包含 50 个点的随机点云数据 point_source = vtkPointSource() point_source.SetNumberOfPoints(50) point_source.Update() print("point_source有", point_source.GetOutput().GetNumberOfPoints(), '个input points') """ vtkIdTypeArray 专门用来存放 点 ID 或 cell ID(索引),它的数据类型就是 vtkIdType 在vtk中, 数组(例如 vtkIdTypeArray, vtkDoubleArray)不仅是一个一维向量,它实际上是一个 二维表 tuple(元组) = 一行数据 component(分量) = 每行里面的列数 所以 如果 SetNumberOfComponents(1),每个 tuple 就是一个 标量(一列) 如果 SetNumberOfComponents(3),每个 tuple 就是一个 三维向量(比如点的 (x, y, z)) SetNumberOfTuples(n) 定义数组有多少个 tuple(行数) SetNumberOfComponents(n) 定义每个 tuple 有多少个分量(component)(行数) SetNumberOfValues(n) 直接指定总的存储单元个数(底层一维存储大小)SetNumberOfValues(9) 等价于 (NumberOfTuples × NumberOfComponents) = 9 如果前面 SetNumberOfComponents(3),那就意味着有 3 个 tuple(每行 3 个数) """ ids = vtkIdTypeArray() ids.SetNumberOfComponents(1) # ids.SetNumberOfTuples(1) # ids.SetNumberOfValues(1) for i in range(10, 20): ids.InsertNextValue(i) """ vtkSelectionNode 是一个 VTK 类,它的主要作用是定义和存储一个数据选择的特定条件。 可以把它看作是构建一个复杂选择查询的最小单元 vtkSelectionNode 本身并不能单独完成数据选择,它必须作为 vtkSelection 对象的组成部分才能生效。 每个 vtkSelectionNode 实例都包含了数据筛选的三个关键信息: 字段类型 (FieldType): 告诉 VTK 你要选择什么类型的数据。常见的类型有: vtkSelectionNode.POINT:选择点数据。 vtkSelectionNode.CELL:选择单元(面、线、体)数据。 vtkSelectionNode.FIELD:选择字段数据。 内容类型 (ContentType): 决定了你将如何指定选择标准。常见的类型有: vtkSelectionNode.INDICES:通过索引 ID 列表来选择数据(就像你代码中那样)。 vtkSelectionNode.THRESHOLDS:通过数据阈值来选择数据(例如,选择所有温度高于 50 度的点)。 vtkSelectionNode.FRUSTUM:通过摄像机视锥体来选择数据(例如,选择视线范围内的所有对象)。 选择列表 (SelectionList): 这是一个 vtkIdList 或其他数据数组,包含了实际的筛选值。例如,如果你选择了 INDICES 类型,这个列表就会包含你想要选中的所有点的 ID。 """ selection_node = vtkSelectionNode() selection_node.SetFieldType(vtkSelectionNode.POINT) selection_node.SetContentType(vtkSelectionNode.INDICES) selection_node.SetSelectionList(ids) """ vtkSelection 将一个或多个 vtkSelectionNode 对象组合在一起,形成一个完整的、可供过滤器使用的选择规则 AddNode添加的多个Node,查询的关系或的关系,例如NodeA选择所有 ID 在 1 到 10 的点 NodeB选择所有 ID 在 21 到 30 的点 那么 vtkExtractSelection 最终会返回 ID 在 1 到 10 以及 21 到 30 的所有点。这相当于一个逻辑或(OR)操作 如果想要实现and的操作,则需要建立管道链接 """ selection = vtkSelection() selection.AddNode(selection_node) """ vtkExtractSelection 它的作用是根据一个或多个选择条件,从数据集中提取出一个子集 当 vtkExtractSelection 运行时,它会遍历原始数据集中的所有元素(点或单元),检查每个元素是否满足 vtkSelection 中定义的任何一个条件。 所有满足条件的元素都会被提取出来,形成一个新的、更小的数据集作为输出 """ extract_selection = vtkExtractSelection() extract_selection.SetInputConnection(0, point_source.GetOutputPort()) extract_selection.SetInputData(1, selection) extract_selection.Update() selected = vtkUnstructuredGrid() selected.ShallowCopy(extract_selection.GetOutput()) # 选中的反转 selection_node.GetProperties().Set(vtkSelectionNode().INVERSE(), 1) # invert the selection. extract_selection.Update() not_selected = vtkUnstructuredGrid() not_selected.ShallowCopy(extract_selection.GetOutput()) input_mapper = vtkDataSetMapper() input_mapper.SetInputConnection(point_source.GetOutputPort()) input_actor = vtkActor() input_actor.SetMapper(input_mapper) input_actor.GetProperty().SetColor(colors.GetColor3d("MidnightBlue")) input_actor.GetProperty().SetPointSize(5) selected_mapper = vtkDataSetMapper() selected_mapper.SetInputData(selected) selected_actor = vtkActor() selected_actor.SetMapper(selected_mapper) selected_actor.GetProperty().SetColor(colors.GetColor3d("MidnightBlue")) selected_actor.GetProperty().SetPointSize(5) not_selected_mapper = vtkDataSetMapper() not_selected_mapper.SetInputData(not_selected) not_selected_actor = vtkActor() not_selected_actor.SetMapper(not_selected_mapper) not_selected_actor.GetProperty().SetColor(colors.GetColor3d("MidnightBlue")) not_selected_actor.GetProperty().SetPointSize(5) # There will be one render window. render_window = vtkRenderWindow() render_window.SetSize(900, 300) render_window.SetWindowName("ExtractSelectedIds") # And one interactor. interactor = vtkRenderWindowInteractor() interactor.SetRenderWindow(render_window) # Define viewport ranges. # (xmin, ymin, xmax, ymax) left_viewport = [0.0, 0.0, 0.33, 1.0] center_viewport = [0.33, 0.0, 0.66, 1.0] right_viewport = [0.66, 0.0, 1.0, 1.0] # Create a camera for all renderers. camera = vtkCamera() # Setup the renderers left_renderer = vtkRenderer() render_window.AddRenderer(left_renderer) left_renderer.SetViewport(left_viewport) left_renderer.SetBackground(colors.GetColor3d("BurlyWood")) left_renderer.SetActiveCamera(camera) center_renderer = vtkRenderer() render_window.AddRenderer(center_renderer) center_renderer.SetViewport(center_viewport) center_renderer.SetBackground(colors.GetColor3d("orchid_dark")) center_renderer.SetActiveCamera(camera) right_renderer = vtkRenderer() render_window.AddRenderer(right_renderer) right_renderer.SetViewport(right_viewport) right_renderer.SetBackground(colors.GetColor3d("CornflowerBlue")) right_renderer.SetActiveCamera(camera) left_renderer.AddActor(input_actor) center_renderer.AddActor(selected_actor) right_renderer.AddActor(not_selected_actor) left_renderer.ResetCamera() render_window.Render() interactor.Start() if __name__ == '__main__': main()
http://www.cnnetsun.cn/news/119668.html

相关文章:

  • AI 编程的“90% 陷阱”:为什么你生成代码 1 分钟,修 Bug 却要 1 小时?
  • 终极免费抽奖神器:Magpie-LuckyDraw全平台部署指南
  • 技术人才职业发展:从工具思维到价值创造的成长阶梯
  • 百度贴吧用户脚本终极指南:告别繁琐操作,体验贴吧新境界
  • 等待节点-–-behaviac
  • Nginx性能优化实战:从基础配置到高级调优的完整指南
  • ThingsGateway:开源智能设备管理平台的终极指南
  • KolodaView开源项目贡献指南
  • 5‘-Thiol Modifier C6 S-S Amidite,5‘-硫醇修饰剂 C6 双硫键核苷酸酰胺化试剂
  • Python:SOLID 面向对象设计原则
  • 专业级鼠标性能测试工具:从数据采集到精准分析的全链路解析
  • Magpie-LuckyDraw:5分钟上手的多平台炫酷抽奖系统终极指南
  • 魔兽争霸III现代化修复工具:全面解决兼容性问题的终极指南
  • 数字内容获取革命:智能绕过付费墙的完整解决方案
  • 256台H100服务器算力中心的带外管理网络建设方案
  • 深入理解指针(7)
  • 从卷 Java 到冲网安!计算机人 2025 自救路线:附 40-150 万安全岗 + 技能衔接清单
  • python大数据的基于k-means算法的校园美食推荐系统_j4eg7g7z--论文
  • MouseTester专业指南:3步完成鼠标性能精准诊断
  • [鸿蒙2025领航者闯关]图标资源统一管理
  • 区分__proto__和prototype
  • 西门子PLC地址知识点
  • EmotiVoice开源项目依赖项管理最佳实践
  • 如何彻底解决腾讯游戏卡顿问题:sguard_limit资源限制器完整指南
  • MiniGPT-4终极优化指南:5个简单技巧实现3倍推理加速
  • 鼠标性能测试终极指南:从新手到专家的完整解决方案
  • 终极指南:如何用pbxproj轻松玩转Xcode项目文件
  • 移动端AI部署革命:Paddle-Lite如何让深度学习模型在手机上流畅运行
  • 类型安全强化学习实战:从Gymnasium类型提示到项目稳健性提升
  • OBS直播教程:OBS多路推流插件如何下载?如何安装?怎么用?