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

news2025/4/28 4:38:53

文章目录

    • 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 图表

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux系统离线安装python以及python包

效果 1、下载python 从华为镜像网站下载 https://mirrors.huaweicloud.com/python/ 我下载的是python3.7.12版本的 2、安装python 按一系列的命令安装 mkdir /usr/local/python3 cd /usr/local/python3 tar -xvf Python-3.7.12.tar

LeetCode第16~20题解

CONTENTS LeetCode 16. 最接近的三数之和&#xff08;中等&#xff09;LeetCode 17. 电话号码的字母组合&#xff08;中等&#xff09;LeetCode 18. 四数之和&#xff08;中等&#xff09; LeetCode 16. 最接近的三数之和&#xff08;中等&#xff09; 【题目描述】 给你一个…

request+python操作文件导入

业务场景&#xff1a; 通常我们需要上传文件或者导入文件如何操作呢&#xff1f; 首先通过f12或者通过抓包查到请求接口的参数&#xff0c;例如&#xff1a; 图中标注的就是我们需要的参数&#xff0c;其中 name是参数名&#xff0c;filename是文件名&#xff0c;Content-Type是…

服务器数据恢复-重组RAID导致RAID6数据丢失的数据恢复案例

服务器数据恢复环境&#xff1a; 一台存储设备中有一组由12块硬盘组建的RAID6磁盘阵列&#xff0c;上层采用EXT3文件系统&#xff0c;共划分3个LUN。 服务器故障&分析&#xff1a; 存储设备在运行过程中RAID6阵列突然不可用&#xff0c;管理员对故障存储进行了重新分配RAI…

算法设计 || 第7题:TSP问题的成本矩阵

&#xff08;一&#xff09;TSP问题学习 看不懂可以观看这个老师视频学习&#xff1a;分支限界法(TSP问题,多段图的最短路径问题,任务分配问题,批处理作业调度问题)(算法设计第十周二节)_哔哩哔哩_bilibili &#xff08;二&#xff09; 考试例题 画出计算求解最优解的分支界限过…

CentOS7关闭防火墙的操作方法

使用命令&#xff1a;systemctl status firewalld.service 查看防火墙状态 执行后能看到绿色字样标注的“active(running)”&#xff0c;说明防火墙是开启状态 使用命令&#xff1a;systemctl stop firewalld.service 关闭运行的防火墙 关闭后&#xff0c;使用命令systemctl st…

恒运资本:重磅利好预期升温!央行大动作,成长股关键变量生变

尽管上周末利好齐发&#xff0c;但应该还有利好在路上&#xff01; 从银行间商场拆借利率来看&#xff0c;最近银行的资金好像在收紧。而据财政部音讯&#xff0c;本年新增专项债券力求在9月底前根本发行结束&#xff0c;用于项目建造的专项债券资金力求在10月底前使用结束。这…

jvm的内存区域

JVM 内存分为线程私有区和线程共享区&#xff0c;其中方法区和堆是线程共享区&#xff0c;虚拟机栈、本地方法栈和程序计数器是线程隔离的数据区。 1&#xff09;程序计数器 程序计数器&#xff08;Program Counter Register&#xff09;也被称为 PC 寄存器&#xff0c;是一块…

Vue3+TS+Vite中 vConsole 插件的使用

平时在web应用开发过程中&#xff0c;我们可以console.log去输出一些信息&#xff0c;但是在移动端&#xff0c;也就是在手机上&#xff0c;console.log的信息我们是看不到的&#xff0c;这时候就需要移动端调试工具vConsole 1. 依赖安装 npm install vconsole 或者 yarn ad…

亚马逊反馈和评论的区别

在亚马逊上&#xff0c;"反馈"&#xff08;Feedback&#xff09;和"评论"&#xff08;Review&#xff09;是两个不同的概念&#xff0c;它们分别用于描述购买者与商品或卖家之间的不同方面。 1、反馈&#xff08;Feedback&#xff09;&#xff1a; 亚马逊的…

【Python开发环境搭建】【Pycharm设置】 新建python文件默认添加编码格式、时间、作者、文件名等信息

1、设置路径 打开pycharm&#xff0c;选择File->Settings&#xff08;Ctrl Alt S&#xff09;&#xff0c;Editor->File and Templates->Python Script 文件- 设置-编辑器-文件和代码模板-Python Script 2、设置内容 # -*- coding: utf-8 -*- # Time : ${DATE} …

pom.xml配置文件失效,显示已忽略的pom.xml --- 解决方案

现象&#xff1a; 在 Maven 创建模块Moudle时,由于开始没有正确创建好&#xff0c;所以把它删掉了&#xff0c;然后接着又创建了与一个与之前被删除的Moudle同名的Moudle时&#xff0c;出现了 Ignore pom.xml&#xff0c;并且新创建的 Module 的 pom.xml配置文件失效&#xf…

zookeeper启动失败(Error contacting service. It is probably not running.)

问题描述 启动zk时报如下错误&#xff1a; 解决办法 先查日志找找报错原因&#xff1a; 找到zk安装目录下的logs文件夹下的日志文件&#xff0c;查看连接失败原因&#xff1a; 如果是端口问题&#xff0c;修改conf文件&#xff0c;指定端口重新启动即可&#xff1a; 注&a…

springboot1.5.12升级至2.6.15

首先&#xff0c;加入springboot升级大版本依赖&#xff0c;会在升级过程中打印出错日志提示&#xff08;升级完毕可去除&#xff09; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-properties-migrator</art…

DP读书:鲲鹏处理器 架构与编程(十一)鲲鹏生态软硬件构成

鲲鹏生态软硬件构成 鲲鹏软件构成硬件特定软件1. Boot Loader2. SBSA 与 SBBR3. UEFI4. ACPI 鲲鹏软件构成 鲲鹏处理器的软件生态是一个不断发展的软件生态&#xff0c;服务器本身也具有复杂度多样性&#xff0c;经过很长时间的发展服务器硬件有不同的操作系统方案&#xff0c…

为什么 Higress 是 Knative 入口网关的最佳实践?

作者&#xff1a;赵伟基&#xff08;兆维&#xff09; 在传统的应用开发中&#xff0c;通常需要管理底层的基础设施、服务器与网络配置等方面的工作。然而在云原生 Serverless 化的浪潮下&#xff0c;这些基础设施的细节被抽象和自动化&#xff0c;开发者无需关注服务器等配置…

如何通过内网穿透实现外部网络对Spring Boot服务端接口的HTTP监听和调试?

文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…

【附安装包】谷歌浏览器安装教程

软件下载 软件&#xff1a;谷歌浏览器版本&#xff1a;110.0.5181语言&#xff1a;简体中文大小&#xff1a;1.3M安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.59GHz 内存2G(或更高&#xff09;下载通道①百度网盘丨64位下载链接&#xff1a;https://p…

学乐多光屏P90:智能引领儿童学习新时代

随着科技的迅猛发展&#xff0c;儿童教育正逐渐迈入数字化时代。在这个变革的浪潮中&#xff0c;学乐多光屏P90以其卓越的功能和深刻的教育理念&#xff0c;成为了智能儿童学习领域的引领者&#xff0c;为孩子们开启了全新的学习体验。 融合创新技术&#xff0c;引领学习变革 …