news 2026/7/11 19:24:54

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/10 18:44:53

TLS网络安全协议巩固知识基础题(5)

1. TLS 1.3中的KeyUpdate消息如何实现密钥更新? 触发方式:任一方主动发送KeyUpdate消息 更新类型: update_not_requested:单向密钥更新 update_requested:请求对方也更新密钥 密钥派生:使用HKDF基于当前traffic secret生成新密钥 2. 解释TLS中的Padding扩展及其安全意义?…

作者头像 李华
网站建设 2026/7/11 10:48:33

基于Beego的轻量级功能权限管理系统设计与实现

基于Beego的轻量级功能权限管理系统设计与实现 基于Beego的轻量级功能权限管理系统:毕业设计源码与论文全解析 在当今数字化时代,权限管理系统已成为Web应用开发中不可或缺的核心组件。无论是企业后台管理系统、内部办公平台,还是SaaS服务&…

作者头像 李华
网站建设 2026/7/11 18:17:27

基于Golang与Vue3的全栈博客系统设计与实现

基于Golang与Vue3的全栈博客系统设计与实现 基于Golang与Vue3的全栈博客系统:毕业设计与学习实践的完美解决方案 在当今数字化时代,博客系统不仅是个人表达和知识分享的平台,更是全栈开发技术学习的绝佳案例。对于计算机科学和软件工程专业…

作者头像 李华
网站建设 2026/7/10 16:48:03

紧急缺人!年薪96万的新兴领域,强烈建议冲一冲

大家好,我是程序员小灰。不得不承认,最近一段时间大环境并不好。在互联网全面进入存量竞争、企业纷纷“降本增效”的大背景下,传统开发岗位的HC正在快速收缩……然而,传统程序员降薪、裁员的同时,AI相关技术岗位却在疯…

作者头像 李华
网站建设 2026/7/11 10:24:01

MOS 管栅极的 “充放电控制 + 可靠性

要分析这个UCC27244D 驱动 MOS 管 Q1电路中 R1、R3、D1、R2 的作用,需要结合 “栅极驱动的充放电、振荡抑制、可靠性” 这几个核心需求来看: 1. R1(100Ω):栅极串联电阻(核心作用是抑制振荡 + 限流) R1 串联在驱动器OUTA与 MOS 管 Q1 的栅极(G)之间,是栅极电阻,作…

作者头像 李华
网站建设 2026/7/11 5:25:13

ViGEmBus虚拟手柄驱动:从内核到应用的完整技术解析

ViGEmBus虚拟手柄驱动:从内核到应用的完整技术解析 【免费下载链接】ViGEmBus 项目地址: https://gitcode.com/gh_mirrors/vig/ViGEmBus 在游戏外设兼容性领域,一个看似简单的问题困扰着无数玩家和开发者:如何让非标准手柄在Windows系…

作者头像 李华