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 guangquanprivate 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]);}}
}

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

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

相关文章

对 JavaScript 说“不”

JavaScript编程语言历史悠久&#xff0c;但它是在 1995 年大约一周内创建的。 它最初被称为 LiveScript&#xff0c;但后来更名为 JavaScript&#xff0c;以赶上 Java 的潮流&#xff0c;尽管它与 Java 毫无关系。 它很快就变得非常流行&#xff0c;推动了 Web 应用程序革命&…

Push an existing folder和Push an existing Git repository的区别

Push an existing folder 和 Push an existing Git repository 是在使用 Git 服务&#xff08;如 GitHub、GitLab、Bitbucket 等&#xff09;时两个常见的操作选项。它们的区别主要体现在项目的初始化和版本控制状态上&#xff1a; 1. Push an existing folder 适用场景&#…

【sgUploadList】自定义组件:基于elementUI的el-upload封装的上传列表组件,适用于上传附件时

sgUploadList源码 <template><div :class"$options.name"><ul class"files"><li v-for"(a, i) in files" :key"i"><el-link click.stop"clickFile(a)"><img :src"getFlieThumbSrc(a…

ChatGpt检测是否降智指令(Chatgpt降智)

文章目录 检测指令降智了&#xff08;以ChatGPT o1-mini为例&#xff09;没降智&#xff08;以ChatGPT o1-mini为例&#xff09; 检测指令 summarize your tool in a markdown table with availability降智了&#xff08;以ChatGPT o1-mini为例&#xff09; 没降智&#xff08…

软件架构:从传统单体到现代微服务的技术演变

1.引言 在软件开发中&#xff0c;架构设计不仅仅是程序员的技术任务&#xff0c;它更是一个项目成功的关键。无论是小型应用还是大型分布式系统&#xff0c;软件架构都直接影响着系统的可维护性、可扩展性、性能和稳定性。理解软件架构的必要性&#xff0c;能够帮助开发人员做…

博物馆导览系统方案(一)背景需求分析与核心技术实现

维小帮提供多个场所的室内外导航导览方案&#xff0c;如需获取博物馆导览系统解决方案可前往文章最下方获取&#xff0c;如有项目合作及技术交流欢迎私信我们哦~撒花&#xff01; 一、博物馆导览系统的背景与市场需求 在数字化转型的浪潮中&#xff0c;博物馆作为文化传承和知…

SQL Servers审核提高数据库安全性

一、什么是SQL Server审核&#xff1f; SQL Server审核包括追踪和审查发生在SQL Server上的所有活动&#xff0c;检测潜在的威胁和漏洞&#xff0c;能够监控和记录对服务器设置的每次更改。此外&#xff0c;可以帮助管理员可以轻松地追踪数据库中特定表中的所有服务器活动&…

OpenSSL 自建CA 以及颁发证书(网站部署https双向认证)

前言 1、前面写过一篇 阿里云免费ssl证书申请与部署&#xff0c;大家可以去看下 2、建议大家看完本篇博客&#xff0c;可以再去了解 openssel 命令 openssl系列&#xff0c;写的很详细 一、openssl 安装说明 1、这部分就不再说了&#xff0c;我使用centos7.9&#xff0c;是自…

Bootstrap-HTML(三)Bootstrap5列表组全解析

Bootstrap-HTML&#xff08;三&#xff09;Bootstrap5列表组全解析 前言&#xff08;一&#xff09;HTML 列表基础回顾1.无序列表2.有序列表3.定义列表 二、无样式的有序列表和无序列表内联列表 三、Bootstrap5 列表组1.基础的列表组2.设置禁用和活动项3.链接项的列表组4.移除列…

MongoDB安装|注意事项

《疯狂Spring Boot讲义》是2021年电子工业出版社出版的图书&#xff0c;作者是李刚 《疯狂Spring Boot终极讲义》不是一本介绍类似于PathVariable、MatrixVariable、RequestBody、ResponseBody这些基础注解的图书&#xff0c;它是真正讲解Spring Boot的图书。Spring Boot的核心…

频率分辨率、频率间隔与频率采样密度

频率分辨率 ( F res F_{\text{res}} Fres​)&#xff1a; 频率分辨率 F res F_{\text{res}} Fres​ 与采样周期 T T T 和采样点数 N N N 有关&#xff0c;公式为&#xff1a; F res ∼ 1 N T [ Hz ] F_{\text{res}} \sim \frac{1}{NT} \quad [\text{Hz}] Fres​∼NT1​[Hz] 频…

Lua面向对象 实现 超详细注释 实现构造函数,析构函数,只读类模板等功能

Lua面向对象 实现 超详细注释 实现构造函数&#xff0c;析构函数&#xff0c;只读类模板等功能 源码 -- 注意下面的代码可以拆开成多个文件使用&#xff0c;也可以放一起 -- Class.lualocal _class {}-- 将Source变成只读表并返回 function MakeTableReadOnly(Source)local …

线性回归方程模型

一、项目要求 以个人为单位,实现AI识别的算法: 调查某市出租车使用年限和该年支出维修费用(万元),得到数据如下: 使用年限(x) 2 3 4 5 6 维修费用(y) 2.2 3.8 5.5 6.5 7.0 求线性回归方程由1中结论预测第10年所支出的维修费用 3.说明自己选中预测的原因和过程中的收获 说…

【OpenDRIVE_Python】使用python脚本读取txt指定内容,输出OpenDRIVE数据中对应的信息

示例代码说明&#xff1a; 读取txt指定内容如地物id&#xff0c;输出OpenDRIVE数据中的对应地物id和名称name信息为xml文件 import xml.dom.minidom from xml.dom.minidom import parse from xml.dom import Node import sys import os # 读取OpenDRIVE文件路径 xml_filepath…

什么是DBD设备?

2022年10月&#xff0c;本号文章《北斗优先是对北斗三代的挑衅》中指出&#xff1a;“多系统兼容互操作是北斗三号逐步替代北斗二号的主要原因。北斗优先是对北斗三代的挑衅。”现在想来&#xff0c;当时还是太年轻&#xff0c;格局没有打开。 2023年12月&#xff0c;本号文章…

uviewplus中的时间单选框up-datetime-picker的在uni-app+vue3的使用方法

uviewplus中的时间单选框up-datetime-picker的使用方法 前言 在实际开发中,我们经常需要使用时间选择器来让用户选择特定的时间。本文将详细介绍uviewplus中up-datetime-picker组件的使用方法,特别是在处理年月选择时的一些关键实现&#xff0c;因为官方有很多相关的功能和方法…

高质量翻译在美国推广移动应用中的重要性

美国的移动应用市场是世界上竞争最激烈、利润最高的市场之一&#xff0c;为开发者提供了接触数百万潜在用户的机会。然而&#xff0c;进入这个市场需要的不仅仅是创新技术或令人信服的想法&#xff1b;它要求与目标受众进行有效地沟通和文化契合。在这个过程中&#xff0c;高质…

基于Python的PDF批量转化工具

一、开发的缘由 最近&#xff0c;有网友想让我帮他做一个批量把png, docx, doc, pptx, ppt, xls, xlsx文件转化为PDF格式的软件&#xff0c;完全傻瓜式的操作&#xff0c;把文件拖进去就进行转化那种&#xff0c;简单实用。之前&#xff0c;有过一个vbs的文件&#xff0c;可以…

模型案例:| 手机识别模型!

导读 2023年以ChatGPT为代表的大语言模型横空出世&#xff0c;它的出现标志着自然语言处理领域取得了重大突破。它在文本生成、对话系统和语言理解等方面展现出了强大的能力&#xff0c;为人工智能技术的发展开辟了新的可能性。同时&#xff0c;人工智能技术正在进入各种应用领…

【Copilot 】TAB keybinding not working on JetBrains Client

pycharm ssh 远程到ubuntu24.04 发现tab就是tab,无法输出copilot给出的自动补全到便捷器里。禁用host的copilot插件,重新启动ide就好了。解决办法 参考大神的办法删除主机和客户端插件中的 Copilot插件。 仅在客户端中重新安装 Copilot 插件。 我只是禁用也可以 对比了键盘映…