如何告诉 VTK 管道使用通过 TimerEvent 更新的新 vtkPolyData?

2024-01-25

意图

我编写了一个 VTK 应用程序,它使用 vtkPoints > vtkPolyLine > vtkPolyData > vtkPolyDataMapper 生成螺旋并显示它。如果在程序初始化时静态完成,则效果很好。 现在,我想动态添加新的数据点。目的是实时可视化测量结果,因此将按一定的时间间隔添加新数据。

Issues

目前,我刚刚实现了一个 TimerEvent 来更新 vtkPoints 和 vtkPolyLine。但是,该程序仅显示 vtkRenderWindowInteractor 启动之前生成的静态数据。我还尝试对几乎所有对象使用“Modified()”和“Update()”调用,尝试删除、重新生成并向渲染器添加新演员 - 但没有成功!我在下面添加了我的 C++ 代码...

相关问题

以下邮件列表问题是关于此问题的,但给出的解决方案对我不起作用:http://public.kitware.com/pipermail/vtkusers/2006-November/038377.html http://public.kitware.com/pipermail/vtkusers/2006-November/038377.html

以下问题似乎相关,但没有有用的答案:VTK:在每个模拟时间步更新渲染窗口中的数据点 https://stackoverflow.com/questions/33504846/vtk-update-data-points-in-renderwindow-at-every-simulation-timestep

问题

  1. 如何告诉VTK vtkPolyData对象已经改变?
  2. 我应该仔细查看哪一个 VTK 用户指南?

详细信息/源代码

我使用的是 Visual Studio Community 2017 和 VTK 8.0.0,两者都编译为 Win32 目标。

#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkRenderingContextOpenGL2);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);

#include <vtkSmartPointer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkConeSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkProperty.h>

#include <vtkPoints.h>
#include <vtkPolyLine.h>


vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
vtkSmartPointer<vtkPolyLine> polyLine = vtkSmartPointer<vtkPolyLine>::New();

int numOfPoints = 0;
double t = 0;

void NextPoint() {
    double x = t * cos(t);
    double y = t * sin(t);
    points->InsertNextPoint(x, y, t);
    polyLine->GetPointIds()->InsertNextId(numOfPoints);

    numOfPoints++;
    t += 0.1;
}

vtkSmartPointer<vtkPolyData> generateEllipse() {
    // Add some points so we actually see something at all...
    for (int i = 0; i < 100; ++i) {
        NextPoint();
    }

    vtkSmartPointer<vtkCellArray> cells = vtkSmartPointer<vtkCellArray>::New();
    cells->InsertNextCell(polyLine);

    vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();
    polyData->SetPoints(points);
    polyData->SetLines(cells);
    
    return polyData;
}


class vtkTimerCallback : public vtkCommand
{
public:
    static vtkTimerCallback *New()
    {
        vtkTimerCallback *cb = new vtkTimerCallback;
        cb->TimerCount = 0;
        return cb;
    }

    virtual void Execute(vtkObject *vtkNotUsed(caller), unsigned long eventId,
        void *vtkNotUsed(callData))
    {
        if (vtkCommand::TimerEvent == eventId)
        {
            NextPoint(); // Add another point to polyData

            ++this->TimerCount;
            cout << this->TimerCount << endl;
        }
        
    }

private:
    int TimerCount;

};



int main(int argc, char** argv) {
    vtkSmartPointer<vtkRenderWindow> renderWindow =
        vtkSmartPointer<vtkRenderWindow>::New();

    vtkSmartPointer<vtkRenderWindowInteractor> rwi = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    rwi->SetRenderWindow(renderWindow);

    vtkSmartPointer<vtkPolyData> data = generateEllipse();

    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputData(data);

    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);
    actor->GetProperty()->SetDiffuseColor(255, 255, 0);

    vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
    renderWindow->AddRenderer(renderer);
    renderer->AddActor(actor);
    renderer->ResetCamera();

    renderWindow->Render();
    
    // Add Timer Event...
    rwi->Initialize();
    vtkSmartPointer<vtkTimerCallback> cb = vtkSmartPointer<vtkTimerCallback>::New();
    rwi->AddObserver(vtkCommand::TimerEvent, cb);
    int timerId = rwi->CreateRepeatingTimer(100); // every 100ms
    std::cout << "timerId: " << timerId << std::endl;

    // Start Displaying...
    rwi->Start();

    return 0;
}

问题是单元格不是由指针存储的 - 当您调用时cells->InsertNextCell(polyLine);数据被复制,而不是被指向,以便在数组中创建单元格的有效存储(整个实现实际上位于 vtkCellArray 的标头中,因此您可以查看它)。因此,当您更新polyLine时,它对polydata没有影响,因为polydata有自己的副本,您没有更新。以下代码对我有用(您必须公开多数据和 cellArray):

virtual void Execute(vtkObject *vtkNotUsed(caller), unsigned long eventId,
    void *vtkNotUsed(callData))
{
    if (vtkCommand::TimerEvent == eventId)
    {
        NextPoint(); // Add another point to polyData

        cells->Initialize(); // reset the cells to remove the old spiral
        cells->InsertNextCell(polyLine); // re-insert the updated spiral
        cells->Modified(); // required to update
        data->Modified(); // required to update
        ++this->TimerCount;
        cout << polyLine->GetNumberOfPoints() << endl;
        renderWindow->Render(); // refresh the render window after each update
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何告诉 VTK 管道使用通过 TimerEvent 更新的新 vtkPolyData? 的相关文章

  • MEX 文件中的断言导致 Matlab 崩溃

    我正在使用mxAssert 宏定义为matrix h在我的 C 代码中 mex 可以完美编译 当我调用的 mex 代码中违反断言时 该断言不会导致我的程序崩溃 而是导致 Matlab 本身崩溃 我错过了什么吗 这是有意的行为吗 当我查看 M
  • 添加对共享类的多个 WCF 服务的服务引用

    我正在尝试将我的 WCF Web 服务拆分为几个服务 而不是一个巨大的服务 但是 Visual Studio Silverlight 客户端 复制了两个服务共享的公共类 这是一个简单的例子来说明我的问题 在此示例中 有两个服务 两者都返回类
  • 当我单击 C# 中的“取消”按钮时重定向到新页面(Web 部分)

    Cancel button tc new TableCell btnCancel new Button btnCancel Text Cancel btnCancel Click new EventHandler btnCanel Clic
  • Blazor 与 Razor

    随着 Blazor 的发明 我想知道这两种语言之间是否存在显着的效率 无论是在代码创建方面还是在代码的实际编译 执行方面 https github com SteveSanderson Blazor https github com Ste
  • 使用实体框架从集合中删除项目

    我正在使用DDD 我有一个 Product 类 它是一个聚合根 public class Product IAggregateRoot public virtual ICollection
  • ASP .NET MVC,创建类似路由配置的永久链接

    我需要帮助在 MVC 网站中创建类似 URL 路由的永久链接 Slug 已设置为 www xyz com profile slug 代码为 routes MapRoute name Profile url profile slug defa
  • Guid 应包含 32 位数字和 4 个破折号

    我有一个包含 createuserwizard 控件的网站 创建帐户后 验证电子邮件及其验证 URL 将发送到用户的电子邮件地址 但是 当我进行测试运行时 单击电子邮件中的 URL 时 会出现以下错误 Guid should contain
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • 如何在 VS 中键入时显示方法的完整文档?

    标题非常具有描述性 是否有任何扩展可以让我看到我正在输入的方法的完整文档 我想查看文档 因为我可以在对象浏览器中看到它 其中包含参数的描述和所有内容 而不仅仅是一些 摘要 当然可以选择查看所有覆盖 它可能是智能感知的一部分 或者我不知道它并
  • VS30063:您无权访问 https://dev.azure.com

    我正在尝试在 asp net core 2 1 mvc 应用程序中使用以下代码连接 Azure DevOps Uri orgUrl new Uri https dev azure com xxxxx String personalAcces
  • 范围和临时初始化列表

    我试图将我认为是纯右值的内容传递到范围适配器闭包对象中 除非我将名称绑定到初始值设定项列表并使其成为左值 否则它不会编译 这里发生了什么 include
  • 事件日志写入错误

    很简单 我想向事件日志写入一些内容 protected override void OnStop TODO Add code here to perform any tear down necessary to stop your serv
  • std::bind 重载解析

    下面的代码工作正常 include
  • C# using 语句、SQL 和 SqlConnection

    使用 using 语句 C SQL 可以吗 private static void CreateCommand string queryString string connectionString using SqlConnection c
  • 如何排列表格中的项目 - MVC3 视图 (Index.cshtml)

    我想使用 ASP NET MVC3 显示特定类型食品样本中存在的不同类型维生素的含量 如何在我的视图 Index cshtml 中显示它 an example 这些是我的代码 table tr th th foreach var m in
  • UWP 无法在两个应用程序之间创建本地主机连接

    我正在尝试在两个 UWP 应用程序之间设置 TCP 连接 当服务器和客户端在同一个应用程序中运行时 它可以正常工作 但是 当我将服务器部分移动到一个应用程序并将客户端部分移动到另一个应用程序时 ConnectAsync 会引发异常 服务器未
  • 从匿名类型获取值

    我有一个方法如下 public void MyMethod object obj implement 我这样称呼它 MyMethod new myparam waoww 那么我该如何实施MyMethod 获取 myparam 值 Edit
  • 如何在 GCC 5 中处理双 ABI?

    我尝试了解如何克服 GCC 5 中引入的双重 ABI 的问题 但是 我没能做到 这是一个重现错误的非常简单的示例 我使用的GCC版本是5 2 如您所见 我的主要函数 在 main cpp 文件中 非常简单 main cpp include
  • Azure函数版本2.0-应用程序blobTrigger不工作

    我有一个工作功能应用程序 它有一个 blob 输入和一个事件中心输出 在测试版中工作 随着最新的更改 我的功能不再起作用 我尝试根据发行说明更新 host json 文件 但它没有引用 blob 触发器 version 2 0 extens
  • 如何使用 std::array 模拟 C 数组初始化“int arr[] = { e1, e2, e3, ... }”行为?

    注意 这个问题是关于不必指定元素数量并且仍然允许直接初始化嵌套类型 这个问题 https stackoverflow com questions 6111565 now that we have stdarray what uses are

随机推荐

  • Sql Server 更改数据捕获:添加列时保留历史记录?

    将新列添加到配置为更改数据捕获 cdc 的表时 捕获实例表不会有新列 直到为源表禁用并重新启用 cdc 在此过程中 现有的捕获实例将被删除 我想我可以将现有数据复制到临时表中 然后使用以下 SQL 复制回来 但是 其他 CDC 元信息 例如
  • 添加 GROUP BY 子句产生的列

    我遇到了这样的情况 使用 GROUP BY 后需要从两行添加列 我的查询如下 select AcctId DC sum TrnAmt from TableId group by AcctId DC order by AcctId DC Re
  • Android动画暂停和播放问题

    我使用以下代码创建了一个动画 private AnimationSet rootSet new AnimationSet true private int xstart 258 private int ystart 146 for k
  • 按名称获取班级

    我可以通过名称获取一个类吗 例如 class Foo class Bar let x Foo classByString x need to return Foo 我想使用元编程来减少代码维护 您可以使用NSClassFromString
  • WPF 控件中的本机 Win32 窗口

    我正在开发一个需要主机本机 Win32 窗口的应用程序 但不知何故我不知道如何做到这一点 我需要创建一个可以在其上显示本机 Win32 控件的 WPF 对话框窗口 该对话框窗口上也将具有 WPF 控件 因此我正在寻找某种可以获取 HWND
  • 使用 Vaadin 登录的 Spring Boot 安全性

    我尝试构建一个基于 Spring Boot 1 2 7 RELEASE 和 Vaadin 7 6 3 的应用程序 我的问题是我无法将 Spring Security 与 Vaadin 集成 我想要一个自定义 Vaadin 构建的 Login
  • ASP.NET Web App 使用错误的 (2.0) CLR 版本(而不是 4.0)

    我刚刚将我一直在开发的 ASP NET Web 应用程序部署到新的开发机器上 这是一个从3 5转换而来的4 0项目 由于某种原因 当我尝试通过默认网站下的 IIS 网站访问该网站时 出现以下错误 无法识别的属性 targetFramewor
  • Python requests & urllib3 Retry - 如何从内部重试循环内部模拟 ConnectionError?

    给出以下示例用法 adapter HTTPAdapter max retries Retry total 5 backoff factor 0 1 status forcelist 429 500 502 503 504 method wh
  • 为什么这个 jQuery .change 事件在 .click 事件之后停止工作

    我有一个脚本 它显示数组中的问题 并使用以下命令从一个问题切换到下一个问题 click两个按钮上的事件 上一个和下一个 当我加载页面时 radio change选择器工作正常 但是当我单击上一个或下一个时 它停止工作 我尝试改变 previ
  • 正则表达式匹配双引号内的每个字符串并包含转义引号

    已经有很多类似的问题了 但没有一个适合我的情况 我有一个字符串 其中包含双引号内的多个子字符串 并且这些子字符串可以包含转义的双引号 例如对于字符串 然后 这是一些带有引号和 转义引号 的示例文本 并不是说我们需要更多 而是 这是 另一个
  • 如何让 Push() 键生成我的 Firebase?

    正如你从照片中看到的 我有一个孩子FreezerItems 在该子项下我还有另外两个子项 它们是 Firebase 使用创建的随机键push 我的问题是 我具体如何获得密钥L8i2M4wNUF5wOojaFE 另外我如何将该密钥放入我的Re
  • 如何在 f# 中执行多行 lambda 表达式?

    我该如何在 F 中执行此操作 C public class MyClass void Render TextWriter textWriter Tag gt textWriter WriteLine line 1 textWriter Wr
  • 无法使用 Visual Studio 2013 运行 Cordova 应用程序

    我已成功安装 多设备混合应用程序 所需的所有第三方设置 但是当我使用 Visual Studio 2013 运行我的应用程序时 出现以下两个错误 Error 1 cmd Command failed with exit code 255 E
  • 基于公共id连接两个js对象数组的函数式方法

    我正在尝试实现类似于 SQL 表连接的功能 以最优雅 功能 的方式 最好使用 underscore js 所以请不要使用 for 循环 我需要合并两个不同数组中的对象 并与一个公共标识符进行匹配 例如 给定 var basic id 1 n
  • php - 按自定义标准对数组进行排序

    我有一个对象数组 object1 gt name Name1 key key1 object2 gt name Name2 key key2 object3 gt name Name3 key key3 和一组优先级键 keys key3
  • 如何将由空格参数分隔的字符串传递给 Jenkins 构建触发器?

    到目前为止 这有效 http JENKINS SERVER job YOUR JOB NAME buildWithParameters myparam Hello 但当value of myparam包含空格 例如Hello word它不起
  • CSS height 属性的“auto”值到底意味着什么?

    w3schools 说height auto 浏览器计算高度 这是默认值 但是 浏览器计算高度 是什么意思呢 这是否意味着它只是简单地总结了所包含元素的高度 对于所有浏览器来说 这总是用相同的方法计算吗 这是什么意思浏览器计算高度 这意味着
  • 一起使用 Guice 和 JMock 的最佳方式是什么?

    我已经开始使用 Guice 对项目进行一些依赖注入 主要是因为我需要在远离单元测试的一层注入模拟 当前使用 JMock 这使得手动注入非常尴尬 我的问题是引入模拟的最佳方法是什么 我目前所拥有的是在单元测试中创建一个满足依赖关系的新模块 并
  • 将数字部分从字母数字中分离出来

    我有一个字母数字值 其中可能包含空格或下划线 我想从中拆分数字并将值加一 并且需要将数字部分连接回 Alpha 部分 例如 字母数字可能是 1 BA 123 或 2 BA 123 我使用正则表达式 如果字符串不包含任何空格或下划线 它就可以
  • 如何告诉 VTK 管道使用通过 TimerEvent 更新的新 vtkPolyData?

    意图 我编写了一个 VTK 应用程序 它使用 vtkPoints gt vtkPolyLine gt vtkPolyData gt vtkPolyDataMapper 生成螺旋并显示它 如果在程序初始化时静态完成 则效果很好 现在 我想动态