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 适用场景&#…

Docker 安装系列

Centos8 安装Docker Docker安装mysql8.0 Docker安装稳定版本nginx-1.26.2 Docker 安装最新版本 Jenkins Docker Redis Docker 安装 eclipse-mosquitto Docker mongo:5.0 Docker 安装 Redis的完全体版本RedisMod docker pull elasticsearch:8.0.0 docker 安装nacos v2.…

力扣100题--移动零

给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums [0] 输出: […

【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…

QTextBrowser按照段落来显示html的文字

在 PyQt5 中&#xff0c;QTextBrowser 是一个用来显示富文本&#xff08;如 HTML&#xff09;内容的小部件。要让 QTextBrowser 按照段落来显示 HTML 内容&#xff0c;可以确保 HTML 中的每个段落被正确地封装在 <p> 标签中或其他合适的 HTML 标签中。 基本思路 HTML 格…

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

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

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

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

tauri下的两个常用rust web框架:Leptos和Trunk

tauri下有两个常用rust web框架&#xff0c;就是Leptos和Trunk Leptos Leptos 是一个基于 Rust 的 Web 框架。您可以在他们的官方网站上了解更多关于 Leptos 的信息。本指南适用于 Leptos 的 0.6 版本。 Leptos Leptos 是一个用 Rust 编写的现代、高效且安全的 Web 框架。它…

安装Docker并使用WSL

引言 Windows Subsystem for Linux (WSL) 是一个在Windows上运行Linux二进制可执行文件&#xff08;ELF格式&#xff09;的兼容层。它允许开发者直接在Windows上运行Linux环境&#xff0c;而无需使用虚拟机。Docker是一个开源的应用容器引擎&#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;是自…

RAG给回复加上引用

我们希望RAG的幻觉减少&#xff0c;最有力的证明就是关键句子参考的某篇文献或报告。然而&#xff0c;大模型的随机性导致提供的引文可能都不存在&#xff0c;所以直接让大模型输出的方式目前是不可靠的。下面总结下添加引文的常见方法。 个人博客&#xff1a;有效果图片展示 …

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] 频…

DDR4与DDR3服务器内存的关键区别有哪些?

内存作为服务器性能的关键组件之一&#xff0c;已经经历了从DDR3到DDR4的过渡。DDR4内存相较于DDR3在多个方面有所提升&#xff0c;包括速度、带宽、功耗以及数据传输效率等。然而&#xff0c;尽管DDR4内存在性能上占有优势&#xff0c;DDR3内存依然在一些特定场景中得到了广泛…

Java基础--网络编程

在Java开发中&#xff0c;常见的通信协议有多种&#xff0c;这些协议在不同的应用场景中发挥着各自的优势。 通信协议 1. HTTP/HTTPS HTTP&#xff08;HyperText Transfer Protocol&#xff09;&#xff1a;是最常用的网络协议之一&#xff0c;用于分布式、协作式、超媒体信…

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

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