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

news2025/1/11 0:28:44

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

前端代码

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

    }
}

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

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

相关文章

springai结合ollama

目录 ollama 介绍 使用 下载&#xff1a; 安装&#xff1a; 点击这个玩意next就行了。 运行 spring ai使用ollama调用本地部署的大模型 加依赖 配置yml 写代码 ollama 介绍 官网&#xff1a;Ollama Ollama是一个用于部署和运行各种开源大模型的工具&#xff1b; …

Linux 统信UOS 设置程序“桌面快捷方式”与“开机自启动”

最近在统信uos系统 arm64架构上进行QT程序的开发&#xff0c;基本开发完毕后&#xff0c;开始着手准备程序的开机自启动模块&#xff0c;因为一般来说&#xff0c;程序在客户现场使用都是需要开机自启的。 然后在百度海淘&#xff0c;很少有这类相关的博客介绍&#xff0c;有一…

WiFi受限不再愁,电脑无网络快速修复指南

有时在试图连接WiFi时&#xff0c;会发现网络连接受限&#xff0c;或无法正常访问互联网。这种情况不仅影响了工作效率&#xff0c;还可能错过重要的信息。那么&#xff0c;究竟是什么原因导致了电脑WiFi连接受限呢&#xff1f;又该如何解决这一问题呢&#xff1f;小A今天就来教…

java注解(一):什么是注解?什么是元注解?如何自定义注解?注解的原理是什么?

目录 1、什么是注解&#xff1f; 2、什么是元注解 1、Target() 2、Retention() 3、Documented 4、Inherited 3、如何自定义注解以解使用 4、注解的原理 本篇文章主要是介绍注解的概念、原理&#xff0c;以及通过代码演示4种元注解、如何自定义注解。通过反编译的形式进…

【Docker】Linux与Windows系统安装Docker+Docker上简单安装MySQL

一、Windows安装Docker 由于我在许多平台搜索Windows下安装Docker的方法&#xff0c;都提到了Win10家庭版无法直接安装Docker。个人电脑就是Win10家庭版&#xff0c;本着实践出真知的想法&#xff0c;个人在本机Win10家庭版实验结果为需要采用下述传统手动安装的办法&#xff…

阿里云整理(二)

阿里云整理 1. 访问网站2. 专业名词2.1 域名2.2 域名备案2.3 云解析DNS2.4 CDN2.5 WAF 1. 访问网站 用户使用浏览器访问网站大体分为几个过程&#xff1a; 用户在浏览器输入域名URL&#xff0c;例如www.baidu.com。 不过&#xff0c;浏览器并不知道为该域名提供服务的服务器具…

Robust Depth Enhancement via Polarization Prompt Fusion Tuning

paper&#xff1a;论文地址 code&#xff1a;github项目地址 今天给大家分享一篇2024CVPR上的文章&#xff0c;文章是用偏振做提示学习&#xff0c;做深度估计的。模型架构图如下 这篇博客不是讲这篇论文的内容&#xff0c;感兴趣的自己去看paper&#xff0c;主要是分享环境&…

Oceanbase离线集群部署

准备工作 两台服务器 服务器的配置参照官网要求来 服务器名配置服务器IPoceanbase116g8h192.168.10.239oceanbase216g8h192.168.10.239 这里选oceanbase1作为 obd机器 oceanbase安装包 选择社区版本的时候自己系统的安装包 ntp时间同步rpm包 联网机器下载所需的软件包 …

Ajax:回忆与节点

一点回忆 面对我的Ajax学习&#xff0c;实现前后端交互&#xff0c;最开始我采用的使用网络寻找intellij IDEA Ultimate破解方法&#xff0c;然后最终成功&#xff0c;然后按照相关教程配置java ee项目&#xff0c;然后中间又去配置了Tomcat服务器&#xff0c;然后又去学习了一…

《鸣潮》运行时电脑提示“d3dx9_41.dll丢失”是什么原因?“缺失d3dx9_41.dll文件”的解决方法和预防方案

游戏运行时文件丢失与报错解决方案&#xff1a;《鸣潮》提示“d3dx9_41.dll丢失”怎么办&#xff1f; 大家好&#xff0c;我是一名在软件开发领域有着丰富经验的从业者。在游戏爱好者的世界里&#xff0c;遇到游戏运行时提示文件丢失或损坏的情况并不少见。今天&#xff0c;我…

ARINC 标准全解析:航空电子领域多系列标准的核心内容、应用与重要意义

ARINC标准概述 ARINC标准是航空电子领域一系列重要的标准规范&#xff0c;由航空电子工程委员会&#xff08;AEEC&#xff09;编制&#xff0c;众多航空公司等参与支持。这些标准涵盖了从飞机设备安装、数据传输到航空电子设备功能等众多方面&#xff0c;确保航空电子系统的兼…

vue中pdf.js的使用,包括pdf显示,跳转指定页面,高亮关键词

目录 一、下载pdf.js 二、引入到本地的项目中 三、实现预览pdf 四、跳转到指定页面 五、利用pdf里面的find查找关键词 六、修改页面大小为实际大小 一、下载pdf.js https://github.com/mozilla/pdf.js 里面有很多的版本&#xff0c; 高版本的可能浏览器不兼容或者还要考…

【不稳定的BUG】__scrt_is_managed_app()中断

【不稳定的BUG】__scrt_is_managed_app函数中断 参考问题详细的情况临时解决方案 参考 发现出现同样问题的文章: 代码运行完所有功能&#xff0c;仍然会中断 问题详细的情况 if (!__scrt_is_managed_app())exit(main_result);这里触发了一个断点很奇怪,这中断就发生了一次,代…

Chrome控制台 网站性能优化指标一览

打开chrome-》f12/右键查看元素-》NetWrok/网络 ctrlF5 刷新网页&#xff0c;可以看到从输入url到页面资源请求并加载网页&#xff0c;用于查看资源加载&#xff0c;接口请求&#xff0c;评估网页、网站性能等&#xff0c;如下图&#xff1a; request、stransferred、resour…

第六节、S曲线加减速转动【51单片机-TB6600驱动器-步进电机教程】

摘要&#xff1a;本节介绍步进电机S曲线加减速方法&#xff0c;包含了一般形式S曲线方程的推导&#xff0c;以其适配51单片机TB6600驱动器S曲线运动数据的生成。本节所述S曲线均为标准Sigmod曲线的简称&#xff0c;与其他算法所述的7段式S曲线或者5段式S曲线相比&#xff0c;二…

【青牛科技】拥有两个独立的、高增益、内部相位补偿的双运算放大器,可适用于单电源或双电源工作——D4558

概述&#xff1a; D4558内部包括有两个独立的、高增益、内部相位补偿的双运算放大器&#xff0c;可适用于单电源或双电源工作。该电路具有电压增益高、噪声低等特点。主要应用于音频信号放大&#xff0c;有源滤波器等场合。 D4558采用DIP8、SOP8的封装形式 主要特点&#xff…

chrome使用问题记录

1. http自动跳转https问题 step1. 地址栏输入&#xff1a; chrome://net-internals/#hsts step2. 找到底部Delete domain security policies一栏&#xff0c;输入想处理的域名&#xff0c;点击delete。 注意&#xff1a;输入域名时去掉前缀http step3. 搞定了&#xff0c;再…

【深度学习】手机SIM卡托缺陷检测【附链接】

一、手机SIM卡托用途 SIM卡托是用于固定和保护SIM卡的部件&#xff0c;通过连接SIM卡与手机主板的方式&#xff0c;允许设备访问移动网络&#xff0c;用户可以通过SIM卡进行通话、发送短信和使用数据服务。 二、手机SIM卡托不良影响 SIM卡接触不良&#xff0c;造成信号中断&…

从Web3到智能合约:探索新一代数据交互模式

随着互联网技术的不断演进&#xff0c;Web3的到来标志着互联网的一个新纪元。与传统的Web2相比&#xff0c;Web3倡导去中心化、更加开放和透明的网络架构&#xff0c;而智能合约则是其中的核心技术之一。本文将介绍Web3与智能合约的概念、应用以及它们如何改变数据交互模式&…

嵌入式Linux,标准I/O探究,I/O缓冲,以及函数讲解

出于速度和效率的考虑&#xff0c;系统 I/O 调用&#xff08;即文件 I/O &#xff0c; open 、 read 、 write 等&#xff09;和标准 C 语言库 I/O 函数&#xff08;即标准 I/O 函数&#xff09;在操作磁盘文件时会对数据进行缓冲。 1. 文件 I/O 的内核缓冲 read() 和…