【WPF C#】PorphyStruct类卟啉和类咕啉的结构分析

这篇具有很好参考价值的文章主要介绍了【WPF C#】PorphyStruct类卟啉和类咕啉的结构分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

    首先,热烈祝贺家姐申请到了国家自然科学基金(8月底),找一些化学领域的程序和软件,助我姐一臂之力,顺便自己研究一下源码。

卟啉类化合物的结构分析

PorphyStruct,一种用于分析不同卟啉类非平面畸变模式的新型数字工具 - 该程序利用法向坐标结构分解技术 (NSD),并采用与为卟啉建立的等效的法向模式组来描述定量地计算来自corroles、norcorroles、porphycenes 和其他卟啉类化合物的周边原子的面外位错模式,并与已建立的术语进行类比。

【WPF C#】PorphyStruct类卟啉和类咕啉的结构分析,wpf,c#,开发语言

【WPF C#】PorphyStruct类卟啉和类咕啉的结构分析,wpf,c#,开发语言

【WPF C#】PorphyStruct类卟啉和类咕啉的结构分析,wpf,c#,开发语言

【WPF C#】PorphyStruct类卟啉和类咕啉的结构分析,wpf,c#,开发语言

结语

      业余时间对于机器学习及其在化学领域的应用研究也该提上日程了。对机器学习的研究也为将来将其应用到工业领域各个方面做好准备。

【WPF C#】PorphyStruct类卟啉和类咕啉的结构分析,wpf,c#,开发语言

【WPF C#】PorphyStruct类卟啉和类咕啉的结构分析,wpf,c#,开发语言

【WPF C#】PorphyStruct类卟啉和类咕啉的结构分析,wpf,c#,开发语言

附-程序主界面交互逻辑:

using System.Diagnostics;
using System.Reflection;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Navigation;
using ChemSharp.Mathematics;
using ChemSharp.Molecules.HelixToolkit;
using HelixToolkit.Wpf;
using Microsoft.Win32;
using PorphyStruct.Core;
using PorphyStruct.ViewModel;
using PorphyStruct.ViewModel.IO;
using ThemeCommons.Controls;
using MacrocycleViewModel = PorphyStruct.ViewModel.Windows.MacrocycleViewModel;


namespace PorphyStruct.WPF;


/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : DefaultWindow//MainWindow` 类包含了主窗口的各种操作和事件处理方法,用于管理应用程序的主要功能,包括打开文件、分析数据、保存结果、查看统计信息等
{
    public MacrocycleViewModel ViewModel { get; private set; }


    /// <summary>
    /// Should not be null!
    /// </summary>
    public static string Version => Assembly.GetEntryAssembly()!.GetCustomAttribute<AssemblyInformationalVersionAttribute>()!
        .InformationalVersion!;


    public MainWindow()
    {
        Settings.Instance.Load();// 加载应用程序设置
        Atom3D.SelectionColor = Brushes.Fuchsia;// 设置选中的原子颜色
        InitializeComponent();// 初始化主窗口
        CheckUpdate(); // 检查更新
    }


    /// <summary>
    /// Checks for new Versions on Startup在启动时检查新版本
    /// </summary>
    private async void CheckUpdate(bool force = false)
    {
        if (!Settings.Instance.AutoUpdate && !force) return;// 如果禁用自动更新或不强制更新,直接返回
        (Updater u, bool current) = await Updater.CreateAsync(); // 创建 Updater 实例来检查更新
        if (!current) UpdateMsg.Visibility = Visibility.Visible;// 如果不是最新版本,显示更新消息
        else if (force) MessageBox.Show($"You already have the latest Version of PorphyStruct ({u.Latest})");// 如果是强制更新,显示已经是最新版本的消息
        if (!current && force)
        {// 如果不是最新版本且需要强制更新,打开浏览器到最新版本的下载页面
            Process.Start(new ProcessStartInfo("http://github.com/jenskrumsieck/porphystruct/releases/latest") { UseShellExecute = true });
            UpdateMsg.Visibility = Visibility.Collapsed;
        }
    }


    /// <summary>
    /// Handles Atom selection// 处理鼠标左键点击 3D 视图中的原子选择
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Viewport3D_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        var hits = Viewport3D.Viewport.FindHits(e.GetPosition(Viewport3D));
        foreach (var hit in hits.OrderBy(s => s.Distance))
        {
            if (hit.Visual.GetType() != typeof(Atom3D)) continue;
            var av3d = hit.Visual as Atom3D;
            if (av3d != null) ViewModel.SelectedAtom = av3d.Atom;
        }
    }


    /// <summary>
    /// Drag and Drop Handler// 处理拖放文件到窗口的操作
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    /// <exception cref="InvalidOperationException"></exception>
    private void OnFileDrop(object sender, DragEventArgs e)
    {
        if (!e.Data.GetDataPresent(DataFormats.FileDrop)) return;
        var files = (string[])e.Data.GetData(DataFormats.FileDrop, false);
        OpenFile((files ?? throw new InvalidOperationException()).First());
    }


    /// <summary>
    /// Handles open File Dialog/ 处理打开文件对话框的操作
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Open_OnClick(object sender, RoutedEventArgs e)
    {
        var path = string.IsNullOrEmpty(Settings.Instance.DefaultImportPath)
            ? Environment.GetFolderPath(Environment.SpecialFolder.Desktop)//Environment.SpecialFolder.Desktop
            : Settings.Instance.DefaultImportPath;
        var ofd = new OpenFileDialog
        {
            InitialDirectory = "V:\\learn\\chem\\tests-data-master\\data",//path
            Filter = Constants.OpenFileFilter,
            Multiselect = false
        };
        if (ofd.ShowDialog(this) != true) return;
        OpenFile(ofd.FileName);
    }


    /// <summary>
    /// Handles actual file opening// 处理实际的文件打开操作
    /// </summary>
    /// <param name="path"></param>
    internal void OpenFile(string path)
    {
        DataContext = ViewModel = new MacrocycleViewModel(path);
        ViewModel.SelectedIndexChanged += ViewModelOnSelectedIndexChanged;
        Viewport3D.CameraController.CameraTarget =
            MathV.Centroid(ViewModel.Macrocycle.Atoms.Select(s => s.Location).ToList()).ToPoint3D();
        Activate();
    }
    // 处理选中索引更改事件
    private void ViewModelOnSelectedIndexChanged(object? sender, EventArgs e)
    {
        if (ViewModel?.SelectedItem != null)
            Viewport3D.CameraController.CameraTarget =
                MathV.Centroid(ViewModel.SelectedItem.Analysis.Atoms.Select(s => s.Location)).ToPoint3D();// 设置相机目标到选中的分析对象
        MainTabMenu.Focus();// 焦点切换到主选项卡菜单
    }
    // 准备分析操作
    private async Task PrepareAnalysis()
    {
        //Block UI interaction during this// 阻止在此期间的用户界面交互
        MainGrid.IsEnabled = false;
        TitleGrid.IsEnabled = false;
        AnalyzePopup.IsOpen = false;
        await ViewModel.Analyze();// 调用分析操作
        MainGrid.IsEnabled = true;
        TitleGrid.IsEnabled = true;
    }
    // 处理分析按钮的点击事件
    private async void Analyze_OnClick(object sender, RoutedEventArgs e)
    {
        Settings.Instance.UseExtendedBasis = false;
        await PrepareAnalysis();
    }
    // 处理扩展分析按钮的点击事件
    private async void AnalyzeExt_OnClick(object sender, RoutedEventArgs e)
    {
        Settings.Instance.UseExtendedBasis = true;
        await PrepareAnalysis();
    }
    // 处理旋转按钮的点击事件   对当前选定的项目或数据执行旋转操作。具体的旋转操作可能包括旋转、缩放或平移等,这取决于项目或数据的类型和应用的功能
    private void Rotate_OnClick(object sender, RoutedEventArgs e) => ViewModel.SelectedItem.Rotate();
    // 处理保存按钮的点击事件   在用户点击保存按钮时,打开一个保存窗口,允许用户选择保存选定的项目或数据的位置和文件名
    private void Save_OnClick(object sender, RoutedEventArgs e)
    {
        var sw = new SaveWindow(ViewModel.SelectedItem);
        sw.ShowDialog();
    }
    // 处理 URL 链接点击事件   允许用户点击一个URL链接后,在默认的Web浏览器中打开该链接,以便用户可以访问相关的在线资源或链接
    private void URL_OnClicked(object sender, RequestNavigateEventArgs e) =>
        Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri) { UseShellExecute = true });
    // 处理信息按钮的点击事件  在用户点击信息按钮时,显示或隐藏一个信息弹出窗口,以便用户可以查看额外的信息或说明
    private void Info_OnClick(object sender, RoutedEventArgs e) => TogglePopup(InfoPopup);
    // 处理追加按钮的点击事件
    /*这段代码的作用是允许用户添加新的比较数据。它首先从 `AppendedData` 中获取用户选择的数据,
     * 然后将不再需要的比较数据从列表中移除,接着将用户选择的本地数据添加到比较数据中,
     * 最后准备新的比较数据并切换比较弹出窗口的可见性,以便用户查看比较结果*/
    private void Append_OnClick(object sender, RoutedEventArgs e)
    {
        var path = string.IsNullOrEmpty(Settings.Instance.DefaultImportPath)
            ? Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
            : Settings.Instance.DefaultImportPath;
        var ofd = new OpenFileDialog
        {
            InitialDirectory = path,
            Filter = Constants.CompareFileFilter,
            Multiselect = false
        };
        if (ofd.ShowDialog(this) != true) return;
        var data = new CompareData(ofd.FileName);
        ViewModel.SelectedItem.CompareData.Add(data);
        AppendedData.SelectedItems.Add(data);
    }
    // 处理比较追加按钮的点击事件
    private void CompareAdd_OnClick(object sender, RoutedEventArgs e)
    {
        var appendedData = AppendedData.SelectedItems.Cast<CompareData>().ToList();
        var remove = ViewModel.SelectedItem.CompareData.Except(appendedData);
        foreach (var item in remove) ViewModel.SelectedItem.CompareData.Remove(item);//将不包含在 `appendedData` 中的项添加到 `remove` 列表中。
        var localData = LocalData.SelectedItems.Cast<AnalysisViewModel>();//一个 `AnalysisViewModel` 类型的列表,它表示用户从本地数据中选择的项。
        foreach (var item in localData)// 对于每个 `localData` 中的项,创建一个新的 `CompareData`,并将其添加到 `ViewModel.SelectedItem.CompareData` 中
            ViewModel.SelectedItem.CompareData.Add(new CompareData(item.Title, item.Analysis.DataPoints.ToList()));
        ViewModel.SelectedItem.PrepareCompare();//准备比较数据,可能会重新计算一些比较数据。
        TogglePopup(ComparePopUp);//切换比较弹出窗口的可见性
    }
    // 处理比较按钮的点击事件  在用户点击比较按钮时,清除之前的比较数据并重新准备新的比较数据,然后切换比较弹出窗口的可见性,以便用户查看比较结果。
    private void Compare_OnClick(object sender, RoutedEventArgs e)
    {
        ViewModel.SelectedItem.CompareData.Clear();//清除已存储的比较数据
        ViewModel.SelectedItem.PrepareCompare();//准备比较数据,可能会重新计算一些比较数据。
        TogglePopup(ComparePopUp);//切换比较弹出窗口的可见性,如果当前是可见的,则隐藏它;如果当前是隐藏的,则显示它。
    }
    // 切换弹出窗口的可见性
    private static void TogglePopup(UIElement sender) => sender.Visibility =
        sender.Visibility == Visibility.Collapsed ? Visibility.Visible : Visibility.Collapsed;
    // 处理设置按钮的点击事件
    private void Settings_OnClick(object sender, RoutedEventArgs e) => new SettingsWindow().ShowDialog();
    // 处理统计信息按钮的点击事件
    private void Stats_OnClick(object sender, RoutedEventArgs e) => new StatisticsWindow().Show();
    // 处理批处理按钮的点击事件
    private void Batch_OnClick(object sender, RoutedEventArgs e) => new BatchWindow().Show();
    // 处理隔离按钮的点击事件
    private void Isolation_OnClick(object sender, RoutedEventArgs e) => new IsolationWindow(this).ShowDialog();


    /// <summary>
    /// Shows Analyze Popup显示分析弹出窗口
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void AnalyzeBtn_Click(object sender, RoutedEventArgs e) => AnalyzePopup.IsOpen = true;
    // 处理更新按钮的点击事件
    private void Update_Click(object sender, RoutedEventArgs e) => CheckUpdate(true);
}

参考源码:

https://github.com/JensKrumsieck/PorphyStruct 文章来源地址https://www.toymoban.com/news/detail-697302.html

到了这里,关于【WPF C#】PorphyStruct类卟啉和类咕啉的结构分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C# WPF 数据绑定

    后台变量发生改变,前端对应的相关属性值也发生改变 接口 INotifyPropertyChanged 用于通知客户端(通常绑定客户端)属性值已更改。 官方示例代码如下 示例演示 before after 本示例提供了多种绑定方式,使用接口进行绑定,不使用接口进行绑定 1.在MainWindow中进行属性更改 2.在

    2024年02月02日
    浏览(45)
  • C# WPF编程-布局

    WPF窗口只能包含单个元素。为在WPF窗口中放置多个元素并创建更贴近实用的用户界面,需要在窗口上放置一个容器,然后在这个容器中添加其他元素。 造成这一限制的原因是Window类继承自ContentControl类。 在WPF窗口布局需要遵循以下几条重要原则: 不应显示设定元素的尺寸 :

    2024年03月25日
    浏览(39)
  • C# wpf程序

    --App.xaml namespace WpfMyproject {     /// summary     /// App.xaml 的交互逻辑     /// /summary     public partial class App : PrismApplication     {         protected override Window CreateShell()         {             return Container.ResolveMainView();         }         protected override void RegisterTypes(IContainer

    2024年02月14日
    浏览(45)
  • c# wpf Template ContentTemplate

    1.概要 1.1 定义内容的外观 2.2 要点分析 2.代码 3.运行结果

    2024年04月09日
    浏览(41)
  • c# wpf XmlDataProvider 简单试验

    1.概要 2.代码 3.试验结果

    2024年04月10日
    浏览(37)
  • c# wpf MultiTrigger 简单试验

    1.概要 2.代码 3.试验结果

    2024年04月10日
    浏览(32)
  • C# wpf 获取控件刷新的时机

    做wpf开发不像mfc控件的刷新相对同步,wpf的控件改变宽高或者可见性后在下一行代码不会立刻看到效果,而且也没有一种事件可以获取确切的界面刷新后的时机。如果只是进行延迟等待,在不同机器效果是不同的,而且也并没有具体标识说明已刷新界面,这就导致某些场景的

    2024年01月17日
    浏览(56)
  • C# WPF ListBox 动态显示图片

            最近在和其他软件联合做一个本地图片选择传输功能,为此希望图片能够有序的呈现在客户端,简单的实现了一下功能,通过Mvvm模式进行呈现,过程简单通俗,话不多说直接上图。  前台代码 你只需要粘贴到你的前台xml中就可以,位置记得调整下Margin,我这是按照我

    2024年02月12日
    浏览(39)
  • C#学习(十)——WPF重构与美化

    特点:【跨平台】,【建模】,【查询、更改、保存】,【并发】,【事务】,【缓存】,【数据迁移】 EF的组件 项目延续C#学习(九)的 项目代码,以此基础进行进一步重构 所需的NuGet包如下: 逆向数据库获得数据模型(Model) 首先在根目录下创建Models文件夹,然后使用Tools-

    2024年01月25日
    浏览(39)
  • C# WPF 实现高频量化,自动运行。

    基于交易所编写的量化交易程序。由WPF和C#实现。改进版。再也不用时时刻刻盯盘了。   并非上图的思路所编写,仅供参考,思路由个人的想法异同。仅仅个人用途。不做商业用途。 如下图所示,会在任务栏实时刷新价格,也可以mini窗口显示。由于存储限制,用了灰色的g

    2024年02月05日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包