avalonia、WPF使用ScottPlot动态显示ECG心电图

文章目录

    • avalonia、WPF使用ScottPlot动态显示ECG心电图
    • 实现效果,动态效果懒得录视频了
    • 安装
    • 代码部分
    • UpdateData方法就是用来更新心电图表的方法, 根据消息队列数据去更新是视图中的ScottPlot 图表

avalonia、WPF使用ScottPlot动态显示ECG心电图

avalonia、WPF使用ScottPlot动态显示ECG心电图

实现效果,动态效果懒得录视频了

请添加图片描述

安装

1.安装ScottPlot.Avalonia NuGet包

注意:
如果开发环境是macos、linux,需要按照官网步骤配置环境
此处是官网配置链接

代码部分

view部分 注意安装包之后引入
xmlns:ScottPlot="clr-namespace:ScottPlot.Avalonia;assembly=ScottPlot.Avalonia"

<Window xmlns="https://github.com/avaloniaui"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d" d:DesignWidth="1920" d:DesignHeight="600"
        xmlns:vm="using:AvaloniaMedical.ViewModels"
        x:Class="AvaloniaMedical.Views.xx"
		 xmlns:ScottPlot="clr-namespace:ScottPlot.Avalonia;assembly=ScottPlot.Avalonia"
		x:DataType="vm:xx"
        xmlns:views="clr-namespace:AvaloniaMedical.Views"
		xmlns:i="clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity"
        xmlns:controls1="clr-namespace:Material.Styles.Controls;assembly=Material.Styles"
		Background="#31363A"
        >
        此处只显示三导心电
	
		<ScottPlot:AvaPlot Height="200"  Name="AvaPlotName1" Grid.Row="1" Grid.Column="0" >

		</ScottPlot:AvaPlot>

		<ScottPlot:AvaPlot Height="200"  Name="AvaPlotName2" Grid.Row="2" Grid.Column="0" >

		</ScottPlot:AvaPlot>
		<ScottPlot:AvaPlot Height="200" Name="AvaPlotName3" Grid.Row="3" Grid.Column="0" >

		</ScottPlot:AvaPlot>
</Window>
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Threading;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Data;
using Avalonia.Markup.Xaml;
using Avalonia.Threading;
using AvaloniaMedical.ViewModels;
using Npoi.Mapper;
using ScottPlot;
using ScottPlot.Avalonia;
using ScottPlot.Plottable;

namespace AvaloniaMedical.Views;

public partial class xx : Window
{
    private readonly double[] liveData = new double[4000];
    private readonly double[] liveData2 = new double[4000];
    private readonly double[] liveData3 = new double[4000];



    private readonly Timer _updateDataTimer;
    private readonly DispatcherTimer _renderTimer;
    private readonly VLine vline;
    private readonly VLine vline2;
    private readonly VLine vline3;
    int nextValueIndex = -1;
    int nextValueIndex2 = -1;
    int nextValueIndex3= -1;

    AvaPlot AvaPlot1;
    AvaPlot AvaPlot2;
    AvaPlot AvaPlot3;
    public xx()
    {
        InitializeComponent();
        
#if DEBUG
        this.AttachDevTools();
#endif
        AvaPlot1 = this.Find<AvaPlot>("AvaPlotName1");
        AvaPlot2 = this.Find<AvaPlot>("AvaPlotName2");
        AvaPlot3 = this.Find<AvaPlot>("AvaPlotName3");

        AvaPlot1.Plot.AddSignal(liveData, 1, color: Color.LightGreen);
        AvaPlot1.Plot.AxisAutoX(margin: 0);
        AvaPlot1.Plot.SetAxisLimits(yMin: 2, yMax:7);

        AvaPlot2.Plot.AddSignal(liveData2, 1, color: Color.LightGreen);
        AvaPlot2.Plot.AxisAutoX(margin: 0);
        AvaPlot2.Plot.SetAxisLimits(yMin: 2, yMax: 7);

        AvaPlot3.Plot.AddSignal(liveData3, 1, color: Color.LightGreen);
        AvaPlot3.Plot.AxisAutoX(margin: 0);
        AvaPlot3.Plot.SetAxisLimits(yMin: 2, yMax: 7);


        vline = AvaPlot1.Plot.AddVerticalLine(0, Color.LightGreen, 1);
        vline2 = AvaPlot2.Plot.AddVerticalLine(0, Color.LightGreen, 1);
        vline3 = AvaPlot3.Plot.AddVerticalLine(0, Color.LightGreen, 1);
        ///Binding binding = new Binding();
        binding.Source = AvaPlot1;
        binding.Path = new ropertyPath();
        AvaPlot1.SetValue(TagProperty, 0);
        AvaPlot1.Plot.Style(Style.Gray1); 
        AvaPlot2.Plot.Style(Style.Gray1); 
        AvaPlot3.Plot.Style(Style.Gray1);


         customize styling
        //AvaPlot1.Plot.Title("Electrocardiogram Strip Chart");


        AvaPlot1.Plot.Grid(true);
        AvaPlot2.Plot.Grid(true);
        AvaPlot3.Plot.Grid(true);






        // create a traditional timer to update the data
        //_updateDataTimer = new Timer(_ => UpdateData(), null, 0, 1);

         create a separate timer to update the GUI
        _renderTimer = new DispatcherTimer
        {
            Interval = TimeSpan.FromMilliseconds(1)
        };
        _renderTimer.Tick += Render;
        _renderTimer.Start();

        Closed += (sender, args) =>
        {
            _updateDataTimer?.Dispose();
            _renderTimer?.Stop();
        };
    }
    public void UpdateChart(double dto)
    {
        UpdateData(dto);
    }

    public void UpdateChart2(double dto)
    {
        UpdateData2(dto);
    }

    public void UpdateChart3(double dto)
    {
        UpdateData3(dto);
    }
    void UpdateData(double dto)
   {
        // "scroll" the whole chart to the left
        // Array.Copy(liveData, 1, liveData, 0, liveData.Length - 1);

        // place the newest data point at the end

            double nextValue = dto;
            nextValueIndex = (nextValueIndex < liveData.Length - 1) ? nextValueIndex + 1 : 0;
            liveData[nextValueIndex] = nextValue;
            vline.IsVisible = true;
            vline.X = nextValueIndex;
       
    }

    void UpdateData2(double dto)
    {
        // "scroll" the whole chart to the left
        // Array.Copy(liveData, 1, liveData, 0, liveData.Length - 1);

        // place the newest data point at the end

        double nextValue = dto;
        nextValueIndex2 = (nextValueIndex2 < liveData2.Length - 1) ? nextValueIndex2 + 1 : 0;
        liveData2[nextValueIndex2] = nextValue;
        vline2.IsVisible = true;
        vline2.X = nextValueIndex2;

    }

    void UpdateData3(double dto)
    {
        // "scroll" the whole chart to the left
        // Array.Copy(liveData, 1, liveData, 0, liveData.Length - 1);

        // place the newest data point at the end

        double nextValue = dto;
        nextValueIndex3 = (nextValueIndex3 < liveData3.Length - 1) ? nextValueIndex3 + 1 : 0;
        liveData3[nextValueIndex3] = nextValue;
        vline3.IsVisible = true;
        vline3.X = nextValueIndex3;

    }


    void Render(object sender, EventArgs e)
    {
        AvaPlot1.Refresh();
        AvaPlot2.Refresh();
        AvaPlot3.Refresh();
    }

    private void InitializeComponent()
    {
        AvaloniaXamlLoader.Load(this);
    }

    protected override void OnClosing(CancelEventArgs e)
    {
        this.Hide();
        base.OnClosing(e);
    }

    

}

UpdateData方法就是用来更新心电图表的方法, 根据消息队列数据去更新是视图中的ScottPlot 图表

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/95879.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【随笔】如何使用阿里云的OSS保存基础的服务器环境

使用阿里云OSS创建一个存储仓库&#xff1a;bucket 在Linux上下载并安装阿里云的ossutil工具 // 命令行&#xff0c;是linux环境 3. 安装ossutil。sudo -v ; curl https://gosspublic.alicdn.com/ossutil/install.sh | sudo bash 说明:安装过程中&#xff0c;需要使用解压工具…

Next.js基础语法

Next.js 目录结构 入口App组件&#xff08;_app.tsx&#xff09; _app.tsx是项目的入口组件&#xff0c;主要作用&#xff1a; 可以扩展自定义的布局&#xff08;Layout&#xff09;引入全局的样式文件引入Redux状态管理引入主题组件等等全局监听客户端路由的切换 ts.config…

什么是光流传感器

传感器 文章目录 传感器前言一、光流传感器二、px4FLOW 前言 光流利用的是图像的变化处理&#xff0c;用于检测地面的状态&#xff0c;从而监测飞机的移动&#xff1b;主要用于保持飞机的水平位置&#xff0c;以及在室内实现定高和定点飞行。 其实光流是数字图像处理理论的一部…

【MySQL】MySQL里的用户账户和角色是什么?如何管理?

用户&#xff08;user&#xff09;验证和授权创建用户账户连接服务器查看用户账户设置 角色&#xff08;role&#xff09;创建角色 操作用户帐户和角色重命名删除 感谢 &#x1f496; 用户&#xff08;user&#xff09; 在MySQL中&#xff0c;用户是数据库访问的主要实体。每个…

vscode vue3自定义自动补全

敲代码多了&#xff0c;发现重发动作很多&#xff0c;于是还是定义自动补全代码吧——懒是第一生产力&#xff01; 1&#xff0c;Ctrl Shift P打开快捷命令行&#xff1a;找到下面这个 2&#xff0c;然后找到ts&#xff1a; 里面给了demo照着写就行 // "Print to conso…

可拖动表格

支持行拖动&#xff0c;列拖动 插件&#xff1a;sortablejs UI: elementUI <template><div><hr style"margin: 30px 0;"><div><!-- 数据里面要有主键id&#xff0c; 否则拖拽异常 --><h2 style"margin-bottom: 30px&qu…

uniapp 项目实践总结(二)从零开始搭建一个项目

导语:本篇文章主要是项目方面的技术开发总结,新建一个项目可以选择使用可视化界面,也可以使用命令行搭建。 目录 可视化界面命令行搭建安卓开发环境苹果开发环境可视化界面 安装软件 使用官方推荐的 HbuilderX 软件,开发方式比较简单,内置相关环境以及终端,无需配置 no…

CSS按钮-跑马灯边框

思路很简单&#xff0c;实现方法有很多很多。但是大体思路与实现方法都类似&#xff1a;渐变色 动画&#xff0c;主要区别在动画的具体实现 0、HTML 结构 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><titl…

【uniapp 配置启动页面隐私弹窗】

为什么需要配置 原因 根据工业和信息化部关于开展APP侵害用户权益专项整治要求&#xff0c;App提交到应用市场必须满足以下条件&#xff1a; 1.应用启动运行时需弹出隐私政策协议&#xff0c;说明应用采集用户数据 2.应用不能强制要求用户授予权限&#xff0c;即不能“不给权…

[C/C++]天天酷跑游戏超详细教程-上篇

个人主页&#xff1a;北海 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏✨收录专栏&#xff1a;C/C&#x1f91d;希望作者的文章能对你有所帮助&#xff0c;有不足的地方请在评论区留言指正&#xff0c;大家一起学习交流&#xff01;&#x1f9…

WebGL模型矩阵

前言&#xff1a;依赖矩阵库 WebGL矩阵变换库_山楂树の的博客-CSDN博客 先平移&#xff0c;后旋转的模型变换&#xff1a; 1.将三角形沿着X轴平移一段距离。 2.在此基础上&#xff0c;旋转三角形。 先写下第1条&#xff08;平移操作&#xff09;中的坐标方程式。 等式1&am…

2023年DAMA-CDGA/CDGP数据治理认证线上班到这里

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

Fooocus:一个简单且功能强大的Stable Diffusion webUI

Stable Diffusion是一个强大的图像生成AI模型&#xff0c;但它通常需要大量调整和提示工程。Fooocus的目标是改变这种状况。 Fooocus的创始人Lvmin Zhang&#xff08;也是 ControlNet论文的作者&#xff09;将这个项目描述为对“Stable Diffusion”和“ Midjourney”设计的重新…

超简单演示Android地图开发应用实例

概述 手机地图开发应用广泛&#xff0c;本实例演示了在手机上显示各种地图的方法。比如3D矢量地图、卫星地图、交通地图、夜景地图等在手机上的显示。可以根据手势自由做地图缩放&#xff0c;地图旋转等操作。代码简洁、实用&#xff0c;可以帮助你快速上手地图开发。 详细 …

【附安装包】Vm虚拟机安装Linux系统教程

软件下载 软件&#xff1a;Linux版本&#xff1a;18.0.4语言&#xff1a;简体中文大小&#xff1a;1.82G安装环境&#xff1a;VMware硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xff09;下载通道①丨百度网盘&#xff1a;1.Vm虚拟机15.5下载链接&#xff1a;https://pan…

视频智能分析平台EasyCVR安防视频汇聚平台助力森林公园防火安全的应用方案

一、研发背景 随着经济的发展和人们生活水平的提高&#xff0c;越来越多的人喜欢在周末去周边的森林公园旅游&#xff0c;享受大自然的美景&#xff0c;并进行野炊和烧烤等娱乐活动。然而&#xff0c;近年来由于烟蒂和烧烤碳渣等人为因素&#xff0c;森林公园火灾频繁发生。森…

【核磁共振成像】并行采集MRI

目录 一、并行成像二、SENSE重建三、SMASH重建四、灵敏度校准五、AUTO-SMASH和VD-AUTO-SMASH六、GRAPPA重建七、SPACE RIP重建算法八、PILS重建算法九、PRUNO重建算法十、UNFOLD算法 一、并行成像 并行MR成像(pMRI):相位阵列接受线圈不但各有自己专用的接受通道&#xff0c;而且…

Oracle 本地客户端连接远程 Oracle 服务端并使用 c# 连接测试

这里写自定义目录标题 前言Oracle 客户端安装先决条件下载 Oracle 客户端Oracle 客户端环境变量配置 PL/SQLPL/SQL 下载PL/SQL 配置 配置远程连接tnsnames.ora 文件配置 使用 PL/SQL 连接远程数据库使用 C# 远程访问 Oracle 数据库结语 前言 最近有一个需要使用本地的 Oracle …

Linux知识点 -- 网络基础(一)

Linux知识点 – 网络基础&#xff08;一&#xff09; 文章目录 Linux知识点 -- 网络基础&#xff08;一&#xff09;一、网络发展二、协议1.OSI七层模型2.TCP/IP五层&#xff08;或四层&#xff09;模型 三、网络传输基本流程1.局域网中的两台主机通信流程2.跨网段的两台主机间…

element侧边栏子路由点击不高亮问题

最近自己封装侧边栏 又碰到了点击子路由不高亮的问题 <template><div class"aside"><el-scrollbar :vertical"true" class"scrollbar_left_nav"><el-menu :default-active"defaultActive" :collapse"$stor…