首页 > 编程语言 >C#-Blazor-在线读取测序ABI文件并绘制峰图

C#-Blazor-在线读取测序ABI文件并绘制峰图

时间:2024-12-17 11:28:38浏览次数:10  
标签:Task string C# ABI await 测序 private ab1 public

本地环境:win10, visual studio 2022 community, net6.0


之前已经写过C#的实现:

C#-读取测序数据的ABI文件并绘制svg格式峰图_dna abi文件 规范-CSDN博客
https://blog.csdn.net/pxy7896/article/details/140798619

本文是将C#实现与Blazor做一个结合。

实现效果

(选择文件的时候没录上,见谅)
在这里插入图片描述

代码实现

前端(razor)

放在项目根目录下的Pages文件夹中。

@page "/ab1"

@using BlazorApp1.Data
@inject Ab1Service aService

@inject IJSRuntime JsRuntime
@inject IWebHostEnvironment Environ

@using System.Text.RegularExpressions;


<PageTitle>Ab1</PageTitle>

<div class="container-fluid p-5">
    <div class="row" style="margin-top:1%;">
        <div>
            <label>
                提示信息:@Message
            </label>
        </div>
        <br/>
        <div>
            输入中心点:<input class="input-group-text" type="text" @bind-value="@targetPos" />
        </div>
        <br />
        <div>

            <label>

                选择上传文件:<InputFile OnChange="@LoadFiles" multiple />

            </label>

            @if (isLoading)
            {
                <p>文件上传中......</p>
            }
            else
            {
                <ul>
                    @foreach (var file in loadedFiles)
                    {
                        <li>
                            <ul>
                                <li class="full-width">文件名:@file.Name</li>
                                <li>最后修改时间:@file.LastModified.ToString()</li>
                                <li>文件大小(byte):@file.Size</li>
                                <li>文件类型:@file.ContentType</li>
                            </ul>
                        </li>

                    }

                </ul>
            }


        </div>

    </div>



    <div id="exportBtnDiv" style="display:none">
        <button value="" class="btn btn-primary" id="ExportSvgBtn" @onclick="ExportSvg" data-toggle="tooltip" title="导出图像">
            导出图像
        </button>
    </div>

    <div class="row" style="display:flex; justify-content:center; align-items:center; width:100%; height:100%;">
        @if (ab1 != null)
        {
            <svg id="mySvg" height="160" width="@ab1.max_width" xmlns="http://www.w3.org/2000/svg" style="display:none;padding:0;margin:0">
                <rect id="myRect" width="@ab1.max_width" height="160" fill="white" style="margin:0" />
                @if (ab1.ya != null && ab1.ya.Length > 0)
                {
                    <path d="@ab1.ya" stroke="green" fill="none" stroke-width="@ab1.line_width" />
                    <path d="@ab1.yc" stroke="blue" fill="none" stroke-width="@ab1.line_width" />
                    <path d="@ab1.yg" stroke="black" fill="none" stroke-width="@ab1.line_width" />
                    <path d="@ab1.yt" stroke="red" fill="none" stroke-width="@ab1.line_width" />
                }
                @if (ab1.Ab1Chars.Count > 0)
                {
                    @foreach (Ab1Char a in ab1.Ab1Chars)
                    {
                        @if (a.ch == "A")
                        {
                            color = "green";
                        }

                        else if (a.ch == "C")
                        {
                            color = "blue";
                        }
                        else if (a.ch == "G")
                        {
                            color = "black";
                        }
                        else
                        {
                            color = "red";
                        }
                        <g>
                            <!-- y是底端 -->
                            <text x="@a.x" y="30" fill="@color" font-family="Courier New" font-size="20" font-weight="bold">@a.ch</text>
                        </g>
                    }
                }
                <path d="@ab1.ArrowPathData" stroke="red" fill="red" stroke-width="0.5"></path>
            </svg>
        }
        
    </div>


    

</div>

<style>
    .full-width {
        white-space: nowrap; /* 禁止换行 */
        overflow: hidden; /* 隐藏溢出部分 */
        text-overflow: clip; /* 显示完整内容,不显示省略号 */
    }
</style>


<script>
    window.interop = {

    }

    function showSvg() {
        document.getElementById('mySvg').style.display = 'block';
    }

    function hideSvg() {
        document.getElementById('mySvg').style.display = 'none';
    }

    function showExportBtn() {
        document.getElementById('exportBtnDiv').style.display = 'block';
    }

    


</script>

@code {
    private Data.Ab1? ab1;
    private string targetPos = "";

    private IJSObjectReference module;

    private List<IBrowserFile> loadedFiles = new();
    private int maxFileSize = 5 * 1024 * 1024;
    private int maxAllowedFiles = 1;
    private bool isLoading;
    private string Message = string.Empty;

    private string color = "black";

    private async Task LoadFiles(InputFileChangeEventArgs e)
    {
        await JsRuntime.InvokeAsync<object>("hideSvg");
        isLoading = true;
        loadedFiles.Clear();
        foreach (var file in e.GetMultipleFiles(maxAllowedFiles))
        {
            try
            {
                //ModelStateDictionary modelState = new ModelStateDictionary();
                loadedFiles.Add(file);
                //string result = await FileHelpers.ProcessFormFile(file, modelState, Environ, maxFileSize);
                // 存储到本地
                Ab1Obj ab1Obj = await Ab1Service.ProcessFormFile(file, Environ, maxFileSize, int.Parse(targetPos));
                if (ab1Obj != null)
                {
                    Message = "成功";
                    // 更新svg
                    ab1 = await aService.GetAb1Async(ab1Obj);
                    await JsRuntime.InvokeAsync<object>("showSvg");
                    await JsRuntime.InvokeAsync<object>("showExportBtn");
                }
                else
                {
                    Message = "失败";
                }

            }
            catch (Exception ex)
            {
                Message = ex.Message;

            }
        }
        isLoading = false;

       
    }

    protected override async Task OnInitializedAsync()
    {
        ab1 = await aService.GetAb1Async();
        
    }

    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (firstRender)
        {
            //await UpdateRadius();
            module = await JsRuntime.InvokeAsync<IJSObjectReference>("import", "./exportSvg.js");
        }

    }

    private async Task ExportSvg()
    {
        var svgElement = await JsRuntime.InvokeAsync<IJSObjectReference>("document.getElementById", "mySvg");
        await module.InvokeVoidAsync("exportSvgToImage2", svgElement, "png", ab1.max_width);
    }

}

Ab1Service

放在项目根目录下的Data文件夹中。

using Microsoft.AspNetCore.Components.Forms;

namespace BlazorApp1.Data
{
    public class Ab1Service
    {
        public Task<Ab1> GetAb1Async()
        {
            Ab1 ab1 = new Ab1();
            return Task.FromResult(ab1);
        }

        public Task<Ab1> GetAb1Async(Ab1Obj ab1Obj) {
            Ab1 ab1 = new Ab1();
            double max_width = 0.0;
            List<string> ans = ab1Obj.GetPathData(out max_width);
            ab1.ya = ans[0];
            ab1.yc = ans[1];
            ab1.yg = ans[2];
            ab1.yt = ans[3];
            ab1.max_width = max_width;
            List<Ab1Char> ab1Chars = ab1Obj.GetXPosData();
            ab1.Ab1Chars.AddRange(ab1Chars);
            // 固定值
            ab1.ArrowPathData = ab1Obj.GetArrowData(20);
            
            return Task.FromResult(ab1);
        }

        /// <summary>
        /// 上传的文件存储到:C:\项目根目录\Development\unsafeUploads
        /// </summary>
        /// <param name="formFile"></param>
        /// <param name="envir"></param>
        /// <param name="maxFileSize">前端的文件大小限制,目前是5MB</param>
        /// <returns></returns>
        public static async Task<Ab1Obj> ProcessFormFile(IBrowserFile formFile, IWebHostEnvironment envir, int maxFileSize, int target)
        {
            var path = Path.Combine(envir.ContentRootPath, envir.EnvironmentName, "unsafeUploads", formFile.Name);
            using (
                var reader =
                    new FileStream(
                        path,
                        FileMode.Create))
            {
                await formFile.OpenReadStream(maxFileSize).CopyToAsync(reader);
            }
            // 读取        
            Ab1Obj ab1Obj = new Ab1Obj(path, target);
            return ab1Obj;
        }
    }
}

Ab1Obj和Ab1类

Ab1Obj是解析ab1文件的类,里面包含一些变量和解析相关的函数。这部分受版权保护,恕不公开。

Ab1类的实现是:

namespace BlazorApp1.Data
{
    public class Ab1Char {
        public string ch = "";
        public double x = 0.0;
        public Ab1Char() { }

        public Ab1Char(string ch, double x) {
            this.ch = ch;
            this.x = x;
        }
    }
    
    public class Ab1
    {
        // 记录y值
        public string ya { set; get; } = "";
        public string yc { set; get; } = "";
        public string yg { set; get; } = "";
        public string yt { set; get; } = "";
        public double max_width { set; get; } = 0.0;
        public int line_width { set; get; } = 3;
        public int target { set; get; } = 0;
        // 记录字母的位置
        public List<Ab1Char> Ab1Chars = new List<Ab1Char>();
        // 记录箭头的path数据
        public string ArrowPathData = "";
    }
}

标签:Task,string,C#,ABI,await,测序,private,ab1,public
From: https://blog.csdn.net/pxy7896/article/details/144529576

相关文章

  • Halcon缺陷检测之准备变化模型(二)
    在Halcon中,prepare_direct_variation_model算子是一个用于准备直接变异模型的重要工具,它主要用于图像比较中的变异检测。以下是对该算子的原理及应用的详细解释:算子原型:prepare_direct_variation_model(ModelImage,EdgeAmplitude,VariationModelID,30,1.5)一、原理p......
  • 电脑开机或打开程序提示缺少Microsoft.Windows.Storage.Core.dll文件问题
    在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包文件不完整造成,原因可能是某些系统防护软件将重要的DLL文件识别为可疑,阻止并放入了隔离单里,还有一些常见的DLL文件缺少是因为系统没有安装齐全的微软运行库,还有部分情况是因为......
  • Docker安装本地测试开发环境
    Docker安装Redisdockerrun--nameredis-p6379:6379-dredisDocker安装RabbitMQdockerrun-d--namerabbitmq-p15672:15672-p5672:5672rabbitmq通过dockerps-a查看部署的mq容器id,在通过dockerexec-it容器id/bin/bash进入容器内部在运行:rabbitmq-plug......
  • POI解析excel的sheet名称和表头
    前提:需要引入POI的jar包。 publicclassTemplateFileSheetParseVO{/***表名称*/privateStringtableName;/***列名称*/privateList<String>columnNames;}privateTemplateFileSheetParseVOextractContent(Filefile,Integer......
  • PCIe扫盲——PCIe总线怎样做到在软件上兼容PCI总线
    前面的文章中多次说道,PCIe总线在软件上是向前兼容PCI总线的。因此,PCIe总线完整的继承了PCI总线中的配置空间(ConfigurationHeader)的概念。在PCIe总线中也有两种Header,Header0和Header1,分别代表非桥和桥设备,这与PCI总线是完全一致的。在PCIe总线中,非桥设备也就是Endpoint。如下图所......
  • shell function函数自动补全技巧
    背景当我们需要写一个自己的脚本,用来开启或者关闭某个功能的时候,不想要手动输入命令,就可以使用这个方法去在环境变量里面组测函数,然后自动补全,验证过很多办法,包括complete的自动补全的多级命令,实例在自定义proxy.sh脚本里面添加#!/bin/bashfunctionproxy_on(){exportA......
  • Springboot 单元测试报错:javax.websocket.server.ServerContainer not available
    错误描述 解决方案@SpringBootTest(webEnvironment=SpringBootTest.WebEnvironment.RANDOM_PORT)  importlombok.extern.slf4j.Slf4j;importorg.junit.Test;importorg.junit.runner.RunWith;importorg.springframework.beans.factory.annotation.Autowired;im......
  • Android Systrace的部分Tag含义
    systrace的一些tag标签的含义和作用。1.CPU*(0-7)Kernel内核模块,可以查看各个CPU执行了什么进程任务。cpu信息的目录是/sys/devices/system/cpu,例如我的一加六老设备:OnePlus6:/sys/devices/system/cpu$lscore_ctl_isolatedcpu4cpuidleisolatedposs......
  • SVN 报错 | Cannot load supported formats: Cannot run program "svn": CreateProces
    问题描述IDEA拉取SVN服务器上的项目时,出现错误。报错信息为“Cannotloadsupportedformats:Cannotrunprogram"svn":CreateProcesserror=2,系统找不到指定的文件。”解决方案报错原因是拉取SVN服务器上的项目时SVN使用了命令行工具,如果在安装TortoiseSVN时没......
  • 代码随想录算法训练营第三十二天|动态规划理论基础|LC509.肥波那些数|LC70.爬楼梯|LC7
    动态规划理论基础    解释:动态规划,英文:DynamicProgramming,简称DP;如果某一问题有很多重叠子问题,使用动态规划是最有效的。动态规划五部曲:    1、确定dp数组(dptable)以及下标的含义;    2、确定递推公式;    3、dp数组如何初始化;   ......