WPF编写工业相机镜头选型程序

该程序满足面阵和线阵的要求。
在这里插入图片描述

前端代码

<Window x:Class="相机镜头选型.MainWindow" Loaded="Window_Loaded"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"
        xmlns:svgc = "http://sharpvectors.codeplex.com/svgc/"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:相机镜头选型"
        mc:Ignorable="d"
        Title="相机镜头选型工具" Height="500" Width="1000"
       >

    <Window.Background>
        <RadialGradientBrush GradientOrigin="0.5,-0.8" Center="0.5,0" RadiusX="0.7" RadiusY="0.7">
            <GradientStop Color="#A02B40" Offset="0"/>
            <GradientStop Color="#08113c" Offset="1"/>
        </RadialGradientBrush>
    </Window.Background>
    <Window.Resources>
        <Style x:Key="myTextBlock" TargetType="TextBlock" >
            <Setter Property="Foreground" Value="White"></Setter>
        </Style>

    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition></RowDefinition>
                <RowDefinition></RowDefinition>
            </Grid.RowDefinitions>


        </Grid>
        <!--Canvas -->
        <Grid  Grid.Column="1" >
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <!--DataGrid -->
            <DataGrid Grid.Row="0" x:Name="dataGrid" ItemsSource="{Binding}" AutoGenerateColumns="False" Height="Auto" Margin="5">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="参数" Binding="{Binding Name}" Width="*"></DataGridTextColumn>
                    <DataGridTextColumn Header="数值" Binding="{Binding Value}" Width="*"></DataGridTextColumn>
                </DataGrid.Columns>
            </DataGrid>
            <!-- -->
            <Canvas  Grid.Row="1"  Width="Auto" Height="Auto" Margin="5">
                <svgc:SvgViewbox  IsHitTestVisible="False" Source="D:\02_Study\06_WPF\WpfApp1\相机镜头选型\Asset\Lens_Selector.svg" Height="240" Width="450" HorizontalAlignment="Center" VerticalAlignment="Top"  Canvas.ZIndex="1" Canvas.Left="10" Canvas.Top="-5"/>
                <TextBox   Text="" Width="50" Height="18"  Canvas.ZIndex="2" Canvas.Left="410" Canvas.Top="31"  Background="White" x:Name="vof_w"></TextBox>
                <TextBox   Text="{Binding Text,ElementName=vof_h,Mode=OneWay}" Width="50" Height="18"  Panel.ZIndex="2" Canvas.Left="440" Canvas.Top="141"  Background="White" HorizontalAlignment="Left" VerticalAlignment="Top" RenderTransformOrigin="0.5,0.487"/>
                <TextBox   Text="{Binding Text,ElementName=d1,Mode=OneWay}"  Width="50" Height="18"  Panel.ZIndex="2" Canvas.Left="261" Canvas.Top="186"  Background="White" RenderTransformOrigin="0.433,0.521" HorizontalAlignment="Left" VerticalAlignment="Top"/>
                <TextBox   Text=""  Width="50" Height="18"  Panel.ZIndex="2" Canvas.Left="94" Canvas.Top="212"  Background="White" RenderTransformOrigin="0.5,0.487" HorizontalAlignment="Left" VerticalAlignment="Top" x:Name="lens"/>
            </Canvas>

        </Grid>
        <!-- -->
        <!--ControlPanle -->
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <GroupBox Header="基本参数" Foreground="White" Margin="5">
                <Grid>
                    <Grid.ColumnDefinitions >
                        <ColumnDefinition Width="80"></ColumnDefinition>
                        <ColumnDefinition></ColumnDefinition>
                        <ColumnDefinition></ColumnDefinition>
                    </Grid.ColumnDefinitions>
                    <StackPanel >
                        <TextBlock Style="{StaticResource myTextBlock}" Height="17" Margin="5,5,5,5" >物距(mm):</TextBlock>
                        <TextBlock Style="{StaticResource myTextBlock}" Height="17" Margin="5,5,5,5">靶面短边(p):</TextBlock>
                        <TextBlock Style="{StaticResource myTextBlock}" Height="17" Margin="5,5,5,5">视野短边(mm):</TextBlock>

                    </StackPanel>
                    <StackPanel Grid.Column="1" VerticalAlignment="Top"   >
                        <TextBox Height="17"  Margin="5,5,5,5" x:Name="d1" TextChanged="Calc" ></TextBox>
                        <TextBox Height="17"  Margin="5,5,5,5" x:Name="res_h" TextChanged="Calc"></TextBox>
                        <TextBox Height="17"  Margin="5,5,5,5" x:Name="vof_h" TextChanged="Calc" ></TextBox>
                    </StackPanel>

                    <StackPanel Grid.Column="2">
                        <Slider Height="17" Margin="5,5,5,5"  Width="93"  Value="{Binding Text,ElementName=d1,Mode=TwoWay}" TickFrequency="1"  IsSnapToTickEnabled="True" x:Name="sld_wj"  Maximum="3000.0" ValueChanged="Slider_ValueChanged" />
                        <Slider  Height="17" Margin="5,5,5,5"  Width="93"  Value="{Binding Text,ElementName=res_h,Mode=TwoWay}"  TickFrequency="1" IsSnapToTickEnabled="True" x:Name="sld_res_h"  Maximum="{Binding Text,ElementName=res_h,Mode=OneWay}" ValueChanged="Slider_ValueChanged" />
                        <Slider Height="17" Margin="5,5,5,5" Width="93" Value="{Binding Text,ElementName=vof_h,Mode=TwoWay}"  TickFrequency="0.1" IsSnapToTickEnabled="True"   x:Name="sld_vof_h"  Maximum="1000" ValueChanged="Slider_ValueChanged" />
                    </StackPanel>
                </Grid>
            </GroupBox>

            <GroupBox Grid.Row="1" Header="其他参数" Foreground="White" Margin="5">
                <Grid >
                    <Grid.ColumnDefinitions >
                        <ColumnDefinition Width="80"></ColumnDefinition>
                        <ColumnDefinition></ColumnDefinition>
                        <ColumnDefinition></ColumnDefinition>
                    </Grid.ColumnDefinitions>
                    <StackPanel >
                        <TextBlock Style="{StaticResource myTextBlock}" Height="17" Margin="5,5,5,5" >光圈(F):</TextBlock>
                        <TextBlock Style="{StaticResource myTextBlock}" Height="17" Margin="5,5,5,5">像元(mm):</TextBlock>
                        <TextBlock Style="{StaticResource myTextBlock}" Height="17" Margin="5,5,5,5">靶面长边(p):</TextBlock>
                    </StackPanel>
                    <StackPanel Grid.Column="1" VerticalAlignment="Top"   >
                        <TextBox Height="17"  Margin="5,5,5,5" x:Name="gq" TextChanged="Calc" ></TextBox>
                        <TextBox Height="17"  Margin="5,5,5,5" x:Name="size" TextChanged="Calc"></TextBox>
                        <TextBox Height="17"  Margin="5,5,5,5" x:Name="res_w"  TextChanged="Calc"></TextBox>
                    </StackPanel>

                    <StackPanel Grid.Column="2">
                        <Slider Height="17" Margin="5,5,5,5" Width="93" Value="{Binding Text,ElementName=gq,Mode=TwoWay}" TickFrequency="0.1" IsSnapToTickEnabled="True"    x:Name="sld_gq"  Maximum="6" ValueChanged="Slider_ValueChanged"/>
                    </StackPanel>
                </Grid>
            </GroupBox>
        </Grid>

        <!-- -->

    </Grid>
</Window>

参数预加载

Loaded="Window_Loaded" 

数据绑定

 <Slider  Height="17" Margin="5,5,5,5"  Width="93"  Value="{Binding Text,ElementName=res_h,Mode=TwoWay}"  TickFrequency="1" IsSnapToTickEnabled="True" x:Name="sld_res_h"  Maximum="{Binding Text,ElementName=res_h,Mode=OneWay}" ValueChanged="Slider_ValueChanged" />

2.C#代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
using LiveCharts;
using LiveCharts.Wpf;

namespace 相机镜头选型
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            dataGrid.DataContext = this;

            //BindSliderToTextBox(sld_wj, d1);
            //BindSliderToTextBox(sld_res_h, res_h);
            //BindSliderToTextBox(sld_vof_h, vof_h);

            SeriesCollection = new SeriesCollection
            {
                new LineSeries
                {
                    Title = "Series 1",
                    Values = new ChartValues<double> { 4, 6, 5, 2 ,4 }
                },
                new LineSeries
                {
                    Title = "Series 2",
                    Values = new ChartValues<double> { 6, 7, 3, 4 ,6 },
                },
                new LineSeries
                {
                    Title = "Series 3",
                    Values = new ChartValues<double> { 4,2,7,2,7 },
                }

            };
            Labels = new[] { "Jan", "Feb", "Mar", "Apr", "May" };
            //YFormatter = value => value.ToString("C");

            //modifying the series collection will animate and update the chart
            //SeriesCollection.Add(new LineSeries
            //{
            //    Title = "Series 4",
            //    Values = new ChartValues<double> { 5, 3, 2, 4 },
            //    LineSmoothness = 0, //0: straight lines, 1: really smooth lines
            //    PointGeometry = Geometry.Parse("m 25 70.36218 20 -28 -20 22 -8 -6 z"),
            //    PointGeometrySize = 50,
            //    PointForeground = Brushes.Gray
            //});

            //modifying any series values will also animate and update the chart
            //SeriesCollection[3].Values.Add(5d);

            DataContext = this;
        }

        public SeriesCollection SeriesCollection { get; set; }
        public string[] Labels { get; set; }
        //public Func<double, string> YFormatter { get; set; }

        private List<double> getData()
        {
            List<double> res = new List<double>();
            if (d1.Text != "" && size.Text != "" && vof_h.Text != "" && res_h.Text != "" && res_w.Text != "" && gq.Text != "")
            {
                double d_wj = double.Parse(d1.Text);
                double pixel_size = double.Parse(size.Text);
                double vof_height = double.Parse(vof_h.Text);
                double res_height = double.Parse(res_h.Text);
                double res_width = double.Parse(res_w.Text);
                double guangquan = double.Parse(gq.Text);
                res.Add(d_wj);
                res.Add(pixel_size);
                res.Add(vof_height);
                res.Add(res_height);
                res.Add(res_width);
                res.Add(guangquan);
            }
            else
            {
                res.Add(0.0);
                res.Add(0.0);
                res.Add(0.0);
                res.Add(0.0);
                res.Add(0.0);
                res.Add(0.0);
            }
            return res;

        }
        //double d_wj, double pixel_size, double vof_height,double res_height,double res_width,double guangquan
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            d1.Text = "2700";
            res_h.Text = "4096";
            vof_h.Text = "1000";
            res_w.Text = "1392";
            gq.Text = "2";
            size.Text = "0.00465";
        }
        private void Calc(object sender, RoutedEventArgs e)
        {
            List<double> data =  getData();
            List<double> res = calcpara(data[0],data[1],data[2],data[3],data[4],data[5]);
            printres(res, data[2]);
        }


            //List<int> xaxisList = Enumerable.Range(1, 10).ToList();
            //d_jsj_list = new ChartValues<double> {  };
            //foreach (var x in xaxisList  )
            //{
            //    d_jsj_list.add(calc_d_jsj);
            //}

           private void printres(List<double> res, double vof_height)
        {
            if (vof_w != null && lens != null && res != null)
            {
                vof_w.Text = res[4].ToString();
                lens.Text = res[1].ToString();
            }
            else
            {
                // 处理 vof_w、lens 或 res 为 null 或索引越界的情况
            }
            ObservableCollection<Member> memberData = new ObservableCollection<Member>();

 
            memberData.Add(new Member()
            {
                Name = "放大倍率",
                Value = res[0].ToString(),

            });
            memberData.Add(new Member()
            {
                Name = "焦距",
                Value = Math.Round(res[1],2).ToString(),

            });
            memberData.Add(new Member()
            {
                Name = "景深近",
                Value = res[2].ToString(),

            });
            memberData.Add(new Member()
            {
                Name = "景深远",
                Value = res[3].ToString(),

            });
            memberData.Add(new Member()
            {
                Name = "视野大小",
                Value =Math.Round(res[4],1).ToString() + " X " + vof_height.ToString(),

            });
            memberData.Add(new Member()
            {
                Name = "mm/pixel",
                Value = res[5].ToString(),

            });


            dataGrid.DataContext = memberData;

        }


        //private void BindSliderToTextBox(Slider slider, TextBox textBox)
        //{
        //    slider.ValueChanged += (s, e) =>
        //    {
        //        textBox.Text = (slider.Value).ToString("0.00");
        //    };
        //}
        static List<double> calcpara(double d_wj, double pixel_size, double vof_height,double res_height,double res_width,double guangquan)
        {
            double res_scale = Math.Round(vof_height / (res_height * pixel_size), 2);

            double res_diag = Math.Sqrt(res_width * res_width + res_height * res_height);
            double misanyuan = res_diag / 1730 * pixel_size;
            double d_lens = d_wj / res_scale;
            double d_xj = 1 / (1 / d_lens - 1 / d_wj);
            double d_djjl = d_xj + d_wj;
            double d_jsj = Math.Round(d_wj - guangquan * misanyuan * d_djjl * d_djjl / (d_lens * d_lens + guangquan * misanyuan * d_djjl), 2);
            double d_jsy = Math.Round(d_wj + guangquan * misanyuan * d_djjl * d_djjl / (d_lens * d_lens + guangquan * misanyuan * d_djjl), 2);
            double js = d_jsy - d_jsj;
            double vof_width = Math.Round(res_width * pixel_size * res_scale, 2);
            double resolution = Math.Round(vof_width / res_width, 2);
            List<double> res = new List<double> { res_scale, d_lens, d_jsj, d_jsy,vof_width,resolution };
   
            return res;
           
        }

        public class Member
        {
            public string Name { get; set; }
            public string Value { get; set; }

        }

        private void Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            List<double> data = getData();
            List<double> res = calcpara(data[0], data[1], data[2], data[3], data[4], data[5]);
            printres(res, data[2]);


        }

        private void TextChanged(object sender, TextChangedEventArgs e)
        {

            List<double> data = getData();
            List<double> res = calcpara(data[0], data[1], data[2], data[3], data[4], data[5]);
            printres(res, data[2]);
        }

    }
}

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

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

相关文章

若依 ruoyi VUE el-select 直接获取 选择option 的 label和value

1、最新在研究若依这个项目&#xff0c;我使用的是前后端分离的方案&#xff0c;RuoYi-Vue-fast(后端) RuoYi-Vue-->ruoyi-ui(前端)。RuoYi-Vue-fast是单应用版本没有区分那么多的modules 自己开发起来很方便&#xff0c;这个项目运行起来很方便&#xff0c;但是需要自定义的…

【深入探索 C++ STL 双端队列 】deque —— 数据时空的双端虫洞,扭曲常规操作的效率边界

STL系列专栏&#xff1a; C STL系列__Zwy的博客-CSDN博客https://blog.csdn.net/bite_zwy/category_12838593.html?spm1001.2014.3001.5482学习C STL的三个境界&#xff0c;会用&#xff0c;明理&#xff0c;能扩展&#xff0c;STL中的所有容器都遵循这个规律&#xff0c;下面…

DevOps系统设计和技术选型

命名是一件痛苦的事情&#xff0c;除非你不想要一个好名字。 我正在做的这个管理系统叫什么合适&#xff0c;或者是什么类型的系统&#xff0c;想去想来不知所措&#xff0c;后来想想这么小的东西纠结什么&#xff0c;先从小的细节一点点来&#xff0c;能用就行&#xff0c;就用…

20241206-Windows 10下使用IDEA 2024.2.3(JDK 18.0.2.1)搭建Hadoop 3.3.6开发环境

Windows 10下使用IDEA 2024.2.3(JDK 18.0.2.1)搭建Hadoop 3.3.6开发环境 1. 配置好本地hadoop之后 2. idea 新建或导入 Maven 项目 3. 编写 pom.xml 文件: 有些版本和项目信息需要根据自己的项目进行调整 JDK 18.0.2.1 Hadoop 3.3.6 <?xml version"1.0" encod…

C#Treeview

创建一个Windows应用程序&#xff0c;在默认窗体中添加一个TreeView控件、一个ImageList控件和一个ContextMenuStrip控件&#xff0c;其中&#xff0c;TreeView控件用来显示部门结构&#xff0c;ImageList控件用来存储TreeView控件中用到的图片文件&#xff0c;ContextMenuStri…

pytorch多GPU训练教程

pytorch多GPU训练教程 文章目录 pytorch多GPU训练教程1. Torch 的两种并行化模型封装1.1 DataParallel1.2 DistributedDataParallel 2. 多GPU训练的三种架构组织方式2.2 数据不拆分&#xff0c;模型拆分&#xff08;Model Parallelism&#xff09;2.3 数据拆分&#xff0c;模型…

使用el-row和el-col混合table设计栅格化,实现表头自适应宽度,表格高度占位

演示效果&#xff1a; 如上图,由于地址信息很长,需要占多个格子,所以需要错开,若想实现这种混合效果,可以这样搭建: 页面效果&#xff1a; 代码分析: 上面使用el-row和el-col搭建表单显示 第一排三个8,第二排8和16 下面混合table实现&#xff0c;并使用border来自适应宽度…

WPS解决Word文件引入excel对象文件无法打开提示“不能启动此对象...”的问题

一、问题现象 接收到了一份 Word文件&#xff0c;里面引入了一个Excel对象文件&#xff0c;双击时候&#xff0c;wps出现卡顿&#xff0c;过一会之后弹出错误提示&#xff1a;不能启动此对象... 二、解决方法 1.点击WPS左上角图标&#xff0c;并打开右上角设置&#xff0c;萱蕚…

JAVA (Springboot) i18n国际化语言配置

JAVA i18n国际化语言配置 一、简介二、功能三、Java配置国际化步骤四、Java国际化配置工具类五、Spring Boot配置六、测试 一、简介 在Java中&#xff0c;国际化&#xff08;Internationalization&#xff0c;通常简称为i18n&#xff09;是一个过程&#xff0c;它允许应用程…

Jenkins 中自定义Build History中显示构建信息

有时候会遇到一个代码仓库下面会有多个不同的分支&#xff0c;而这写分支表示着不同的开发者在开发新的需求&#xff0c;但是这样就会出现一个问题&#xff0c;在Jenkins上进行多分支构建的时候&#xff0c;很难找到哪一个是属于自己分支构建的&#xff0c;这样的问题大家应该都…

springboot安康旅游网站的设计与实现(代码+数据库+LW)

目 录 目 录 摘 要 Abstract 第一章 绪论 1.1 研究现状 1.2 设计原则 1.3 研究内容 第二章 相关技术简介 2.1 JSP技术 2.2 Java技术 2.3 MYSQL数据库 2.4 B/S结构 2.5 Spring Boot框架 第三章 系统分析 3.1可行性分析 3.1.1技术可行性 …

asp.net core过滤器应用

筛选器类型 授权筛选器 授权过滤器是过滤器管道的第一个被执行的过滤器&#xff0c;用于系统授权。一般不会编写自定义的授权过滤器&#xff0c;而是配置授权策略或编写自定义授权策略。简单举个例子。 using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCo…

深入体验c语言中const的多种多样的用法

const是一个C语言&#xff08;ANSI C&#xff09;的关键字&#xff0c;它限定一个变量不允许被改变&#xff0c;一定程序上提高程序的安全性和可靠性。虽然这个关键字看起来简单&#xff0c;但是实际上随着它限定位置不一样&#xff0c;产生的效果也各异。 一、const作用 cons…

齐护机器人ModbusRTU RS485转TTL通信模块与ESP32 Arduino通信可Mixly的图形化编程Scratch图形化编程

齐护机器人ModbusRTU RS485-TTL通信模块 一、概念理解 Modbus协议是一种由Modicon公司&#xff08;现为施耐德电气Schneider Electric&#xff09;于1979年发表的网络通信协议&#xff0c;旨在实现可编辑逻辑控制器&#xff08;PLC&#xff09;之间的通信。 1.1 什么是Mod…

【动手学运动规划】 4.5 A*算法

我宁愿永远做我自己&#xff0c;也不愿成为别人&#xff0c;即使那个人比你更快乐。 —《成为简奥斯汀》 &#x1f3f0;代码及环境配置&#xff1a;请参考 环境配置和代码运行! 4.5.1 概述 Dijkstra算法是基于广度优先搜索策略来遍历空间内的所有节点&#xff0c;最终计算出…

一些引入依赖,提示引入方式报错的问题

背景 当我们使用gulp自动化处理文件的时候&#xff0c;难免会遇到需要按照一定条件过滤的需求&#xff0c;这里博主所遇到问题是&#xff0c;通过文件内容中是否包含 某一串字符串 决定过滤当前的文件 比如&#xff1a; 碰到文件中包含注释 * replace-note 此文件未被引用 ,那…

十二月第二周

作业题&#xff1a; 嵌套循环穷举&#xff0c;先看一道题也是今天作业题&#xff1a; 重点掌握题&#xff1a; 接下来&#xff0c;我们看一下未来要学习的内容&#xff1a;数组 数组基本用法如下&#xff1a; 扩展题&#xff1a;

PyTorch环境迁移指南

在进行深度学习研究和开发时,我们经常需要在不同计算机之间迁移PyTorch环境。无论是更换新设备还是在多台机器间协同工作,都需要确保环境配置的一致性。本文将详细介绍PyTorch环境迁移的完整流程和注意事项。 环境迁移看似简单,实则暗藏玄机。直接复制文件可能会遇到系统差异带…

QGroundControl之4-QGCCorePlugin.cc

介绍 核心控件接口 Core Plugin Interface for QGroundControl 。主要看settingsPages、analyzePages、instrumentPages 等&#xff0c;这里明显看出配置了不同类型toolbar按钮对应的页面 1.MainRootWindow.qml MainRootWindow.qml页面中使用 AppSettings.qml 2.AppSettings.…

tomcat 运行加载机制解析

tomcat 运行加载机制 从tomcat jar包的加载顺序&#xff1a; tomcat的具体运行加载 可以从 start、setclasspath、catalina文件中看出来&#xff1a; start.bat执行 去找bin目录下的catalina.bat,catalina 或去找 bin\setenv.bat以获取标准环境变量&#xff0c;然后去找bin\…