Разработка программы расчета выходного двухлинзового объектива лазера с ненулевой исходной расходимостью
Заказать уникальную дипломную работу- 82 82 страницы
- 17 + 17 источников
- Добавлена 15.01.2024
- Содержание
- Часть работы
- Список литературы
1. Основная часть 5
1.1. Теоретическая часть 5
1.1.1. Постановка задачи. Аналоги 5
1.1.2. Описание методов решения 7
Проверка реализуемости конструкции 7
Расчет путей лучей 9
Оптимизация объектива 11
1.1.3. Формулирование требований к программе 12
1.2. Практическая часть 13
1.2.1. Проектирование программы 13
Выбор языка программирования 13
Выбор СУБД 14
Модель базы данных 14
Состав модулей программы 15
Предполагаемый интерфейс 16
Основной алгоритм работы приложения 17
1.2.2. Программная реализация 19
Проекты интерфейсных окон 19
Классы основных окон 26
Блок-схемы существенных алгоритмов 30
Руководство пользователя 30
Тестирование программы 43
Анализ результатов 50
Заключение 51
Список использованных источников 52
Приложения 53
Приложение 1. Техническое задание 53
Приложение 2. Текст модуля главного окна Form1.cs 57
Приложение 3. Текст модуля окна редактора базы данных (Form2.cs) 74
Sqrt(d)) / 2.0; X0 += vx * t; Y0 += vy * t;px = X0 - XC22;py = Y0 - YC22; LL = Math.Sqrt(px * px + py * py);px /= LL;py /= LL;Beam.Add(new PointF((float)X0, (float)Y0));Beam.Add(new PointF((float)X0, (float)Y0)); cos1 = vx * px + vy * py; sin1 = Math.Sqrt(1.0 - cos1 * cos1); sin2 = sin1 * n; cos2 = Math.Sqrt(1.0 - sin2 * sin2);if (vx * py - vy * px > 0.0) {vx = px * cos2 + py * sin2;vy = -px * sin2 + py * cos2; }else {vx = px * cos2 - py * sin2;vy = px * sin2 + py * cos2; } } } // Производит трассировку луча через вогнутую линзу. // (X0, Y0) – текущая точка луча (модифицируется). // Вектор (vx, vy) – выходное направление лучаprivate void makeNonConvax(ref double X0, ref double Y0, ref double vx, ref double vy) {double L = Decimal.ToInt32(numDistLenses.Value);double D = Decimal.ToInt32(numDiameter.Value);double px = 0.0;double py = 0.0;double x1, y1;double sin1, sin2, cos1, cos2;double LL;double b, c, d;double t;double ConvaxX = cbSwap.Checked ? -0.5 * L : 0.5 * L; DataRowView current1 = (DataRowView)lensesBindingSource1.Current; DataRowView mcurrent1 = (DataRowView)materialsBindingSource1.Current;double n = (double)mcurrent1["MatN"];if (cbUse1.Checked) {if ((bool)current1["IsDoubleCurved"] == false) { t = (-ConvaxX - X0) / vx; X0 = -ConvaxX; Y0 = Y0 + vy * t;px = 1.0;py = 0.0; }else if ((bool)current1["IsDoubleCurved"] == true) {x1 = X0 - XC11; y1 = Y0 - YC11; b = 2 * x1 * vx + 2 * y1 * vy; c = x1 * x1 + y1 * y1 - R11 * R11; d = b * b - 4 * c; t = (-b + Math.Sqrt(d)) / 2.0; X0 += vx * t; Y0 += vy * t;px = X0 - XC11;py = Y0 - YC11; LL = Math.Sqrt(px * px + py * py);px /= LL;py /= LL; }Beam.Add(new PointF((float)X0, (float)Y0));Beam.Add(new PointF((float)X0, (float)Y0)); cos1 = vx * px + vy * py; sin1 = Math.Sqrt(1.0 - cos1 * cos1); sin2 = sin1 / n; cos2 = Math.Sqrt(1.0 - sin2 * sin2);if (Y0 <= 0.0) {vx = px * cos2 - py * sin2;vy = px * sin2 + py * cos2; }else {vx = px * cos2 + py * sin2;vy = -px * sin2 + py * cos2; }x1 = X0 - XC12; y1 = Y0 - YC12; b = 2 * x1 * vx + 2 * y1 * vy; c = x1 * x1 + y1 * y1 - R12 * R12; d = b * b - 4 * c; t = (-b - Math.Sqrt(d)) / 2.0; X0 += vx * t; Y0 += vy * t;px = XC12 - X0;py = YC12 - Y0; LL = Math.Sqrt(px * px + py * py);px /= LL;py /= LL;Beam.Add(new PointF((float)X0, (float)Y0));Beam.Add(new PointF((float)X0, (float)Y0)); cos1 = vx * px + vy * py; sin1 = Math.Sqrt(1.0 - cos1 * cos1); sin2 = sin1 * n; cos2 = Math.Sqrt(1.0 - sin2 * sin2);if (Y0 <= 0.0) {vx = px * cos2 + py * sin2;vy = -px * sin2 + py * cos2; }else {vx = px * cos2 - py * sin2;vy = px * sin2 + py * cos2; } } } // Производит трассировку луча через всю систему из точки (X0, Y0) // до точки с абсциссой X1 и вычисляемой ординатой Y1. // VY – вертикальная компонента вектора выходного лучаprivate void makeBeam(double X0, double Y0, double X1, double XM, ref double Y1, ref double VY) {double L = Decimal.ToInt32(numDistLenses.Value);double D = Decimal.ToInt32(numDiameter.Value);double A;try { A = Math.PI * float.Parse(tbBeamDivergence.Text) / 180.0; } catch(Exception e) { A = 0.0; }double vx = 1.0;double vy = 0.0;double LL;double t;Beam.Add(new PointF((float)X0, (float)Y0));if (Y0 >= 0.0) {vy = Math.Tan(A); } else {vy = -Math.Tan(A); } LL = Math.Sqrt(vx * vx + vy * vy);vx /= LL;vy /= LL;if (cbSwap.Checked) {makeConvax(ref X0, ref Y0, ref vx, ref vy);makeNonConvax(ref X0, ref Y0, ref vx, ref vy); }else {makeNonConvax(ref X0, ref Y0, ref vx, ref vy);makeConvax(ref X0, ref Y0, ref vx, ref vy); } t = (X1 - X0) / vx; X0 = X1; Y0 = Y0 + vy * t;Beam.Add(new PointF((float)X0, (float)Y0)); t = (XM - X0) / vx; Y1 = Y0 + vy * t; VY = vy; } // Рисует дугу в координатах объектива с центром (X0, Y0), // радиусом Rи углами A0 и A1. Вычисляет начальную (x0, y0) // и конечную (x1, y1) точки дугиprivate void drawArc(Graphics g, Pen p, double X0, double Y0, double R, double A0, double A1, out double x0, out double y0, out double x1, out double y1) {double XC = 0.5 * pb.Width;double YC = 0.5 * pb.Height;const int np = 50;double delta = (A1 - A0) / (np - 1);double xp = inf;double yp = inf;x0 = xp; y0 = yp; x1 = xp; y1 = yp;for (int i = 0; i < np; i++) {double A = A0 + i * delta;x1 = X0 + R * Math.Cos(A); y1 = Y0 + R * Math.Sin(A);double xp1 = XC + k * x1;double yp1 = YC - k * y1;if (i > 0)g.DrawLine(p, (float)xp, (float)yp, (float)xp1, (float)yp1);else {x0 = x1; y0 = y1; }xp = xp1;yp = yp1; } } // Рисует отрезок луча в координатах объектива (X0,Y0)…(X1,Y1)private void drawLine(Graphics g, Pen p, double X0, double Y0, double X1, double Y1) {double XC = 0.5 * pb.Width;double YC = 0.5 * pb.Height;double xp1 = XC + k * X0;double yp1 = YC - k * Y0;double xp2 = XC + k * X1;double yp2 = YC - k * Y1;g.DrawLine(p, (float)xp1, (float)yp1, (float)xp2, (float)yp2); } // Вызывается при перерисовке компонента pb. Рисует в данном // поле текущую конфигурацию объектива, мишень, проходящие лучиprivate void pb_Paint(object sender, PaintEventArgs e) {if (do_not_paint) return;double L = Decimal.ToInt32(numDistLenses.Value);double D = Decimal.ToInt32(numDiameter.Value);double D1 = D;double D2 = D;double x0, y0, x1, y1;double x01, y01, x02, y02; DataRowView current1 = (DataRowView)lensesBindingSource1.Current; DataRowView current2 = (DataRowView)lensesBindingSource2.Current;if (current1 == null || current2 == null)return; Graphics g = e.Graphics; Pen p = new Pen(Color.Red); Pen pb = new Pen(Color.Blue); Pen pm = new Pen(Color.LightGreen, 4);if ((R11 != inf || R12 != inf) && (R21 != inf || R22 != inf)) {double ConvaxX = cbSwap.Checked ? -0.5 * L : 0.5 * L;if (cbUse1.Checked) {if (R11 != inf) {drawArc(g, p, XC11, YC11, R11, stA11, endA11, out x0, out y0, out x1, out y1);drawArc(g, p, XC12, YC12, R12, stA12, endA12, out x01, out y01, out x02, out y02);drawLine(g, p, x0, y0, x02, y02);drawLine(g, p, x1, y1, x01, y01); }else {drawLine(g, p, -ConvaxX, -0.5 * D1, -ConvaxX, 0.5 * D1);drawArc(g, p, XC12, YC12, R12, stA12, endA12, out x0, out y0, out x1, out y1);drawLine(g, p, x0, y0, (-ConvaxX), (0.5 * D1));drawLine(g, p, x1, y1, (-ConvaxX), (-0.5 * D1)); } }if (cbUse2.Checked) {if (R21 != inf) {drawArc(g, p, XC21, YC21, R21, stA21, endA21, out x0, out y0, out x1, out y1);drawArc(g, p, XC22, YC22, R22, stA22, endA22, out x01, out y01, out x02, out y02);drawLine(g, p, x0, y0, x02, y02);drawLine(g, p, x1, y1, x01, y01); }else {drawLine(g, p, ConvaxX, -0.5 * D2, ConvaxX, 0.5 * D2);drawArc(g, p, XC22, YC22, R22, stA22, endA22, out x0, out y0, out x1, out y1);drawLine(g, p, x1, y1, (ConvaxX), (0.5 * D2));drawLine(g, p, x0, y0, (ConvaxX), (-0.5 * D2)); } }for (int i = 0; i < Beam.Count - 1; i += 2) {drawLine(g, pb, Beam[i].X, Beam[i].Y, Beam[i + 1].X, Beam[i + 1].Y); } }double XM = 0.5 * L + Decimal.ToInt32(nmDistToEnd.Value);drawLine(g, pm, XM, -0.5 * D, XM, 0.5 * D);}// Вызывается при любом изменении конфигурации объектива (линз, // их порядка, размеров и расстояний и т.п.). Производит перерасчет// лучей в текущей конфигурации объектива (предварительно проверив // допустимость параметров) и вызывает перерисовку компонента pbprivate void btCalc_Click(object sender, EventArgs e) {double L = Decimal.ToInt32(numDistLenses.Value);double D = Decimal.ToInt32(numDiameter.Value);double D1 = D;double D2 = D;double kx = 0.5 * (pb.Width - 1) / (0.5*L + Decimal.ToInt32(nmDistToEnd.Value));double ky = 1.0 * (pb.Height - 1) / (1.5 * D);double ConvaxX = cbSwap.Checked ? -0.5 * L : 0.5 * L; k = Math.Min(kx, ky); DataRowView current1 = (DataRowView)lensesBindingSource1.Current; DataRowView current2 = (DataRowView)lensesBindingSource2.Current; DataRowView mcurrent1 = (DataRowView)materialsBindingSource1.Current; DataRowView mcurrent2 = (DataRowView)materialsBindingSource2.Current;double n1 = (double)mcurrent1["MatN"];double n2 = (double)mcurrent2["MatN"]; do_not_paint = true; YY1 = 10000; YY2 = 0;if (current1 == null || current2 == null){pb.Invalidate();return; }bool Mono1 = (bool)current1["IsDoubleCurved"] == false;bool Double1 = (bool)current1["IsDoubleCurved"] == true;bool Mono2 = (bool)current2["IsDoubleCurved"] == false;bool Double2 = (bool)current2["IsDoubleCurved"] == true;double f1 = (double)current1["Focus"];double f2 = (double)current2["Focus"];double r1 = Double1 ? 2 * f1 * (n1 - 1) : f1 * (n1 - 1);double r2 = Double2 ? 2 * f2 * (n2 - 1) : f2 * (n2 - 1);if (D1 > 2*r1) {pb.Invalidate();if (sender != null)MessageBox.Show("Сферическая линза 1 физически невозможна!");return; }if (D2 > 2*r2) {pb.Invalidate();MessageBox.Show("Сферическая линза 2 физически невозможна!");return; }double m1 = r1 - Math.Sqrt(r1 * r1 - D1 * D1 / 4);double m2 = r2 - Math.Sqrt(r2 * r2 - D2 * D2 / 4);double m = w + (cbSwap.Checked ? m2 : m1);if (cbSwap.Checked) {if (Double1)m += m1; } else {if (Double2) m += m2; }if (m > L) {pb.Invalidate();if (sender != null) MessageBox.Show("Расстояние между линзами слишком мало!");return; } do_not_paint = false;if (Mono1) { R11 = inf; R12 = f1 * (n1 - 1); } else if (Double1) { R11 = 2.0 * f1 * (n1 - 1); stA11 = 3.0/2.0 * Math.PI + Math.Acos(0.5 * D1 / R11); endA11 = 2.5 * Math.PI - Math.Acos(0.5 * D1 / R11); XC11 = -ConvaxX - R11 - 0.5*w; YC11 = 0.0;R12 = 2.0 * f1 * (n1 - 1); } XC12 = -ConvaxX + R12 + 0.5*w; YC12 = 0.0; stA12 = 0.5 * Math.PI + Math.Acos(0.5 * D1 / R12); endA12 = 1.5 * Math.PI - Math.Acos(0.5 * D1 / R12);if (Mono2) { R21 = inf; R22 = f2 * (n2 - 1);}else if (Double2) { R21 = 2.0 * f2 * (n2 - 1); XC21 = ConvaxX - 0.5*w + Math.Sqrt(R21*R21 - 0.25*D2*D2);YC21 = 0.0; stA21 = 0.5 * Math.PI + Math.Acos(0.5 * D2 / R21); endA21 = 1.5 * Math.PI - Math.Acos(0.5 * D2 / R21); R22 = 2.0 * f2 * (n2 - 1); } XC22 = ConvaxX + 0.5*w - Math.Sqrt(R22*R22 - 0.25*D2*D2); YC22 = 0.0; stA22 = 3.0 / 2.0 * Math.PI + Math.Acos(0.5 * D2 / R22); endA22 = 2.5 * Math.PI - Math.Acos(0.5 * D2 / R22);Beam.Clear();double startX = -(0.5 * L + Decimal.ToInt32(numToLenses.Value));double XM = 0.5*L + Decimal.ToInt32(nmDistToEnd.Value);makeBeam(startX, 0.5*dL, 0.5 * pb.Width / k, XM, ref YY1, ref VY);makeBeam(startX, -0.5*dL, 0.5 * pb.Width / k, XM, ref YY2, ref VY);if (sender != null) { labelSize.Text = "Пятнонамишени = " + (YY1 - YY2).ToString("F3") + " мм"; labelDist.Text = "Отлазерадоконца = " + (0.001*(Decimal.ToInt32(nmDistToEnd.Value)/k)).ToString("F3") + " метра";pb.Invalidate(); } } // Автоматически вызывается при загрузке формы. // Выполняет «заливку» данных, отображаемых в полях, // из таблиц базы данныхprivate void Form1_Load(object sender, EventArgs e){ // TODO: данная строка кода позволяет загрузить данные в таблицу "lensesDataSet.Lenses". При необходимости она может быть перемещена или удалена. this.lensesTableAdapter.Fill(this.mainDataSet.Lenses); // TODO: данная строка кода позволяет загрузить данные в таблицу "lensesDataSet.Materials". При необходимости она может быть перемещена или удалена. this.materialsTableAdapter.Fill(this.mainDataSet.Materials);}// Вызывается при изменении выбора материала (обычно в поле// cbMaterials1). Устанавливает фильтр для поля cbLense1 таким // образом, чтобы там отображались только вогнутые линзы // с данным материаломprivate void materialsBindingSource1_CurrentChanged(object sender, EventArgs e) { DataRowView mcurrent1 = (DataRowView)materialsBindingSource1.Current;if (mcurrent1 == null) lensesBindingSource1.Filter = "";else lensesBindingSource1.Filter = "MatID=" + ((int)(mcurrent1["ID"])).ToString() +" And Not IsConvex";}// Вызывается при изменении выбора материала (обычно в поле// cbMaterials2). Устанавливает фильтр для поля cbLense2таким // образом, чтобы там отображались только выпуклые линзы // с данным материаломprivate void materialsBindingSource2_CurrentChanged(object sender, EventArgs e) { DataRowView mcurrent2 = (DataRowView)materialsBindingSource2.Current;if (mcurrent2 == null) lensesBindingSource2.Filter = "";else lensesBindingSource2.Filter = "MatID=" + ((int)(mcurrent2["ID"])).ToString() +" And IsConvex";} // Вызывается при нажатии кнопки btEditDB, выполняет вызов // окна редактора базы данных, после чего выполняет перезаливку // данных в контролы из таблиц базы данныхprivate void btEditDB_Click(object sender, EventArgs e) { Form2 DBeditor = new Form2(mainDataSet,materialsTableAdapter,lensesTableAdapter); materialsBindingSource1.CurrentChanged -= materialsBindingSource1_CurrentChanged; materialsBindingSource2.CurrentChanged -= materialsBindingSource2_CurrentChanged; lensesBindingSource1.CurrentChanged -= lensesBindingSource1_CurrentChanged; lensesBindingSource2.CurrentChanged -= lensesBindingSource2_CurrentChanged;DBeditor.ShowDialog(); Form1_Load(null, null);materialsBindingSource1.CurrentChanged += materialsBindingSource1_CurrentChanged; materialsBindingSource2.CurrentChanged += materialsBindingSource2_CurrentChanged; lensesBindingSource1.CurrentChanged += lensesBindingSource1_CurrentChanged; lensesBindingSource2.CurrentChanged += lensesBindingSource2_CurrentChanged; materialsBindingSource1_CurrentChanged(null, null); materialsBindingSource2_CurrentChanged(null, null); lensesBindingSource1_CurrentChanged(null, null);lensesBindingSource2_CurrentChanged(null, null);}// Вызывается при изменении выбора вогнутой линзы (обычно // из интерфейса, в поле cbLense1). Отображает в поле tbLens1Info //краткую информацию о выбранной линзе и вызывает перерисовку // всей конфигурации объективаprivate void lensesBindingSource1_CurrentChanged(object sender, EventArgs e) { DataRowView current1 = (DataRowView)lensesBindingSource1.Current;tbLens1Info.Clear();if (current1 != null) {tbLens1Info.AppendText("Фокусноерасст: " + ((double)current1["Focus"]).ToString() + " мм");tbLens1Info.AppendText(Environment.NewLine);tbLens1Info.AppendText( ((bool)current1["IsDoubleCurved"]) ? "Двояковогнутая" : "Плосковогнутая"); }btCalc_Click(sender, e); }// Вызывается при изменении выбора выпуклой линзы (обычно из // интерфейса, в поле cbLense2). Отображает в поле tbLens2Info // краткую информацию о выбранной линзе и вызывает перерисовку // всей конфигурации объективаprivate void lensesBindingSource2_CurrentChanged(object sender, EventArgs e){ DataRowView current2 = (DataRowView)lensesBindingSource2.Current;tbLens2Info.Clear();if (current2 != null) {tbLens2Info.AppendText("Фокусноерасст: " + ((double)current2["Focus"]).ToString() + " мм");tbLens2Info.AppendText(Environment.NewLine);tbLens2Info.AppendText( ((bool)current2["IsDoubleCurved"]) ? "Двояковыпуклая" : "Плосковыпуклая"); }btCalc_Click(sender, e); } // Вызывается при нажатии кнопки btSolve, производит автоматический // расчет геометрических параметров объектива по выбранному // критерию. Программа выдает предупреждение о начале подбора и, // через некоторое время, заполняет поля и сообщает детали результатаprivate void btSolve_Click(object sender, EventArgs e) {int best_dist_from_src = 20;int best_dist_between = 15;double bestQ = 1000.0; DataRowView current1 = (DataRowView)lensesBindingSource1.Current; DataRowView current2 = (DataRowView)lensesBindingSource2.Current;if (current1 == null || current2 == null)return; // numAntiZoom.Value = 20;Application.DoEvents(); numDistLenses.ValueChanged -= btCalc_Click; numToLenses.ValueChanged -= btCalc_Click;MessageBox.Show("Нажмите OK иподождите!");for (int dist_from_src = 20; dist_from_src < 150; dist_from_src++){for (int dist_between = 5; dist_between < 150; dist_between++){ numDistLenses.Value = dist_between; numToLenses.Value = dist_from_src; btCalc_Click(null, null);double Q =rbByMinSize.Checked ? YY1 - YY2 : Math.Abs(VY);if (Q > 0.0 && Q < bestQ) {bestQ = Q; best_dist_between = dist_between; best_dist_from_src = dist_from_src; } } } numDistLenses.ValueChanged += btCalc_Click; numToLenses.ValueChanged += btCalc_Click; numDistLenses.Value = best_dist_between; numToLenses.Value = best_dist_from_src;MessageBox.Show("Готово!"); } }}Приложение 3. Текст модуля окна редактора базы данных (Form2.cs)using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace laser{public partial class Form2 : Form { // Флаг нахождения окна в режиме добавления (true) или // редактирования (false) нового материалаprivate bool addMaterialMode = false; // Флаг нахождения окна в режиме добавления (true) или // редактирования (false) новой линзыprivate bool addLenseMode = false;privatelensesDataSetds; // Ссылка на источник данных из главной формы // Ссылка на адаптер данных таблицы материалов в главной формеprivate lensesDataSetTableAdapters.MaterialsTableAdapter mta; // Значение идентификатора, названия материала и его коэффициента // преломления из текущей редактируемой записи в таблице материаловprivate int mt_id;private String mt_mName;private double mt_mN; // Ссылка на адаптер данных таблицы линз в главной формеprivate lensesDataSetTableAdapters.LensesTableAdapter lta; // Значение идентификатора линзы, идентификатора материала // линзы, названия линзы, признака выпуклости, признака двойной // кривизны и фокусного расстояния из текущей редактируемой // записи в таблице линзprivate int ln_id;private int ln_MatID;private String ln_lName;private bool ln_Convex;private bool ln_Doubled;private double ln_Focus; // Конструктор окнаpublic Form2(lensesDataSet ds,lensesDataSetTableAdapters.MaterialsTableAdapter mta,lensesDataSetTableAdapters.LensesTableAdapter lta ) {InitializeComponent(); this.ds = ds; this.mta = mta; this.lta = lta;} // Обработчик события загрузки формы. Выполняет заполнение // элементов управления, связанных с базой данных, информацией // из физических таблиц этой базыprivate void Form2_Load(object sender, EventArgs e){ // TODO: данная строка кода позволяет загрузить данные в таблицу "mainDataSet.Lenses". При необходимости она может быть перемещена или удалена. this.lensesTableAdapter.Fill(this.mainDataSet.Lenses); // TODO: данная строка кода позволяет загрузить данные в таблицу "lensesDataSet.Materials". При необходимости она может быть перемещена или удалена. this.materialsTableAdapter.Fill(this.mainDataSet.Materials);} // Обработчик нажатия на кнопку сохранения материала. Проверяет // показатель преломления и, если он допустим, обновляет таблицы // в базе данных и вызывает обработчик Form2_Load, чтобы он // «перезалил» информацию из таблиц базы в элементы управления. // Деактивирует поля-элементы редактирования материалаprivate void btPostMaterial_Click(object sender, EventArgs e) { DataRowView mcurrent = (DataRowView)materialsBindingSource.Current;if (mcurrent != null) {if ((double)mcurrent["MatN"] <= 1.0) {MessageBox.Show("Показательпреломлениядолженбытьбольшеединицы!");return; }mcurrent.EndEdit(); String mName = (String)mcurrent["MatName"];double mN = (double)mcurrent["MatN"];if (addMaterialMode) {materialsTableAdapter.Update(mcurrent.Row); }else {materialsTableAdapter.Update(mcurrent.Row);mta.Update(mName, mN, mt_id, mt_mName, mt_mN); } tbMaterialN.Enabled = false; tbMaterialName.Enabled = false; btDeleteMaterial.Enabled = true; btEditMaterial.Enabled = true; btAddMaterial.Enabled = true;mainDataSet.AcceptChanges();ds.AcceptChanges(); Form2_Load(null, null);}btPostMaterial.Enabled = false; } // Обработчик нажатия на кнопку редактирования материала.// Запоминает текущие данные материала (они понадобятся при // сохранении, в параметрах метода Update) и активизирует поля- // элементы редактирования материалаprivate void btEditMaterial_Click(object sender, EventArgs e) { DataRowView mcurrent = (DataRowView)materialsBindingSource.Current;if (mcurrent != null) { mt_id = (int)mcurrent["ID"]; mt_mName = (String)mcurrent["MatName"]; mt_mN = (double)mcurrent["MatN"];mcurrent.BeginEdit(); tbMaterialN.Enabled = true; tbMaterialName.Enabled = true; btAddMaterial.Enabled = false; btEditMaterial.Enabled = false; btPostMaterial.Enabled = true; btDeleteMaterial.Enabled = false; }addMaterialMode = false; } // Обработчик нажатия на кнопку добавления материала. // Добавляет новую запись в таблицу материалов и активизирует // поля-элементы редактирования материалаprivate void btAddMaterial_Click(object sender, EventArgs e) { DataRowView mcurrent = (DataRowView) materialsBindingSource.AddNew();mcurrent.BeginEdit(); tbMaterialN.Enabled = true; tbMaterialName.Enabled = true; btAddMaterial.Enabled = false; btEditMaterial.Enabled = false; btPostMaterial.Enabled = true; btDeleteMaterial.Enabled = false;addMaterialMode = true; } // Обработчик нажатия на кнопку удаления материала. // Удаляет материал из таблицы материалов и из источников данныхprivate void btDeleteMaterial_Click(object sender, EventArgs e) { DataRowView mcurrent = (DataRowView)materialsBindingSource.Current;if (mcurrent != null) {int id = (int)mcurrent["ID"]; String mName = (String)mcurrent["MatName"];double mN = (double)mcurrent["MatN"];int idx = dgMaterials.CurrentCell.RowIndex;while (lensesBindingSource.Count > 0) {lensesBindingSource.RemoveAt(0);mainDataSet.AcceptChanges(); }materialsBindingSource.RemoveAt(idx);materialsTableAdapter.Delete(id, mName, mN);mainDataSet.AcceptChanges();mta.Delete(id, mName, mN);ds.Materials.Rows.RemoveAt(idx);ds.AcceptChanges(); } } // Обработчик нажатия на кнопку редактирования линзы.// Запоминает текущие данные линзы (они понадобятся при // сохранении, в параметрах метода Update) и активизирует // поля-элементы редактирования линзыprivate void btEditLense_Click(object sender, EventArgs e) { DataRowView mcurrent = (DataRowView)materialsBindingSource.Current; DataRowView lcurrent = (DataRowView)lensesBindingSource.Current;if (mcurrent != null && lcurrent != null) { ln_id = (int)lcurrent["ID"]; ln_MatID = (int)lcurrent["MatID"]; ln_lName = (String)lcurrent["LensName"]; ln_Convex = (bool)lcurrent["IsConvex"]; ln_Doubled = (bool)lcurrent["IsDoubleCurved"]; ln_Focus = (double)lcurrent["Focus"];lcurrent.BeginEdit(); tbLensFocus.Enabled = true; tbLensName.Enabled = true; gbTypeLense.Enabled = true; cbFlatOneSide.Enabled = true; btAddLense.Enabled = false; btEditLense.Enabled = false; btPostLense.Enabled = true; btDeleteLense.Enabled = false; }addLenseMode = false; } // Обработчик события, происходящего при выборе линзы // в таблице линз. Заполняет элементы управления на форме // актуальными данными из таблицы. Такое ручное заполнение // необходимо, поскольку соответствующие поля редактирования // не могут быть связаны с полями таблиц базы данных напрямуюprivate void lensesBindingSource_CurrentChanged(object sender, EventArgs e) { DataRowView lcurrent = (DataRowView)lensesBindingSource.Current;if (lcurrent != null) { cbFlatOneSide.Checked = !(bool)lcurrent["IsDoubleCurved"]; rbConvax.Checked = (bool)lcurrent["IsConvex"]; rbNonConvax.Checked = !(bool)lcurrent["IsConvex"];} } // Обработчик события, происходящего при выборе материала // в таблице материалов. Устанавливает фильтр на источник // данных линз таким образом, чтобы в нем всегда отображались // только те линзы, которые соответствуют выбранному материалуprivate void materialsBindingSource_CurrentChanged(object sender, EventArgs e) { DataRowView mcurrent = (DataRowView)materialsBindingSource.Current;if (mcurrent == null) lensesBindingSource.Filter = "";else lensesBindingSource.Filter = "MatID=" + ((int)(mcurrent["ID"])).ToString(); } // Обработчик нажатия на кнопку удаления линзы. Удаляет линзу // из таблицы линз и из источников данныхprivate void btDeleteLense_Click(object sender, EventArgs e) { DataRowView lcurrent = (DataRowView)lensesBindingSource.Current;if (lcurrent != null) {int id = (int)lcurrent["ID"];int MatID = (int)lcurrent["MatID"]; String lName = (String)lcurrent["LensName"];bool Convex = (bool)lcurrent["IsConvex"];bool Doubled = (bool)lcurrent["IsDoubleCurved"];double Focus = (double)lcurrent["Focus"];int idx = dgLenses.CurrentCell.RowIndex;lensesBindingSource.RemoveAt(idx);lensesTableAdapter.Delete(id, MatID, lName, Convex, Doubled, Focus);mainDataSet.AcceptChanges();lta.Delete(id, MatID, lName, Convex, Doubled, Focus);ds.AcceptChanges(); } } // Обработчик нажатия на кнопку добавления линзы. Добавляет // новую запись в таблицу линз и активизирует поля-элементы // редактирования линзыprivate void btAddLense_Click(object sender, EventArgs e) { DataRowView mcurrent = (DataRowView)materialsBindingSource.Current; DataRowView lcurrent = (DataRowView)lensesBindingSource.AddNew();if (mcurrent != null && lcurrent != null){if ((int)mcurrent["ID"] < 0) {MessageBox.Show("Этот материал еще не получил идентификатор!Пожалуйста, переоткройте окно."); return; } lcurrent.BeginEdit(); lcurrent["IsConvex"] = rbConvax.Checked;lcurrent["IsDoubleCurved"] = !cbFlatOneSide.Checked;lcurrent["MatID"] = mcurrent["ID"]; tbLensFocus.Enabled = true; tbLensName.Enabled = true; gbTypeLense.Enabled = true; cbFlatOneSide.Enabled = true; btAddLense.Enabled = false; btEditLense.Enabled = false; btPostLense.Enabled = true; btDeleteLense.Enabled = false;}addLenseMode = true; } // Обработчик нажатия на кнопку сохранения линзы. Проверяет // фокусное расстояние и, если оно допустимо, обновляет таблицы // в базе данных. Деактивирует поля-элементы редактирования линзыprivate void btPostLense_Click(object sender, EventArgs e) { DataRowView lcurrent = (DataRowView)lensesBindingSource.Current; DataRowView mcurrent = (DataRowView)materialsBindingSource.Current;if (lcurrent != null) {if ((double)lcurrent["Focus"] <= 1.0){MessageBox.Show("Фокусное расстояние должно быть больше 1 мм!");return; }lcurrent.EndEdit();int id = (int)lcurrent["ID"]; String lName = (String)lcurrent["LensName"];bool Convex = (bool)lcurrent["IsConvex"];bool Doubled = (bool)lcurrent["IsDoubleCurved"];double Focus = (double)lcurrent["Focus"];if (addLenseMode) {lensesTableAdapter.Update(lcurrent.Row); }else {lensesTableAdapter.Update(lcurrent.Row);lta.Update((int)mcurrent["ID"], lName, Convex, Doubled, Focus, ln_id, ln_MatID, ln_lName, ln_Convex, ln_Doubled, ln_Focus); } tbLensFocus.Enabled = false; tbLensName.Enabled = false; gbTypeLense.Enabled = false; cbFlatOneSide.Enabled = false; btAddLense.Enabled = true; btEditLense.Enabled = true; btPostLense.Enabled = false; btDeleteLense.Enabled = true;mainDataSet.AcceptChanges();ds.AcceptChanges(); } btPostLense.Enabled = false;} // Обрабатывает изменение пользователем состояния // элемента rbConvax, занося эти изменения в источник данныхprivate void rbConvax_CheckedChanged(object sender, EventArgs e) { DataRowView lcurrent = (DataRowView)lensesBindingSource.Current;if (lcurrent != null)lcurrent["IsConvex"] = rbConvax.Checked;} // Обрабатывает изменение пользователем состояния элемента // rbNonConvax, занося эти изменения в источник данныхprivate void rbNonConvax_CheckedChanged(object sender, EventArgs e) { DataRowView lcurrent = (DataRowView)lensesBindingSource.Current;if (lcurrent != null)lcurrent["IsConvex"] = !rbNonConvax.Checked;} // Обрабатывает изменение пользователем состояния // элемента rbFlatOneSide, занося эти изменения в источник данныхprivate void cbFlatOneSide_CheckedChanged(object sender, EventArgs e) { DataRowView lcurrent = (DataRowView)lensesBindingSource.Current;if (lcurrent != null)lcurrent["IsDoubleCurved"] = !cbFlatOneSide.Checked;} // Фильтрует нажатие клавиши со знаком минуса в поле ввода // показателя преломления, чтобы он там не мог быть введен вообщеprivate void tbMaterialN_KeyPress(object sender, KeyPressEventArgs e) {if (e.KeyChar == '-')e.Handled = true;} // Фильтрует нажатие клавиши со знаком минуса в поле ввода // фокусного расстояния, чтобы он там не мог быть введен вообщеprivate void tbLensFocus_KeyPress(object sender, KeyPressEventArgs e) {if (e.KeyChar == '-')e.Handled = true; } }}
2. Глава 14. ГЕОМЕТРИЧЕСКАЯ ОПТИКА. URL: https://internat.msu.ru/ media/uploads/2013/05/Lec-24.pdf (Дата обращения: 10.11.2023)
3. Zemax. URL: https://www.zemax.com/ (Дата обращения: 15.12.2023)
4. Программное обеспечение "Оптика". URL: https://phts.ru/optics-os (Дата обращения: 15.12.2023)
5. OSLO. URL: https://lambdares.com/oslo (Дата обращения: 15.12.2023)
6. Optical Design Software - CODE V. URL: https://www.synopsys.com/optical-solutions/codev.html (Дата обращения: 15.12.2023)
7. Программа расчёта оптических лазерных систем. URL: https://proza.ru/2015/05/28/1750 (Дата обращения: 15.12.2023)
8. Оптика. Лекция 2. URL: https://internat.msu.ru/media/uploads/ 2013/04/Optika.-Lektsiya-2.pdf (Дата обращения: 10.11.2023)
9. Родионов С.А. Основы оптики. Конспект лекций.– СПб: СПб ГИТМО (ТУ), 2000. - 167 с. URL: http://aco.ifmo.ru/el_books/basics_optics/ (Дата обращения: 10.11.2023)
10. Press, W.H. et al. Numerical recipes in C: The art of scientific computing. — Cambridge University Press, 1992.— 994 p. URL: https://www.cec.uchile.cl/cinetica/pcordero/MC_libros/NumericalRecipesinC.pdf (Дата обращения: 10.11.2023)
11. C# documentation. URL: https://learn.microsoft.com/en-us/dotnet/csharp/ (Дата обращения: 07.09.2023)
12. Албахари Б., Албахари Дж. C# 7.0. Справочник. Полное описание языка. М.: Диалектика; СПб.: Альфа-книга, 2018. – 1023 с.
13. Вагнер Б. Эффективное программирование на C# : 50 способов улучшения кода: [рассматривается C# 6.0]. – М. [и др.] : Диалектика, 2018. – 224 с.
14. Горелов, С. В. Современные технологии программирования: разработка Windows-приложений на языке С#. В 2 томах. Т.I: учебник / С.В. Горелов; под ред. П.Б. Лукьянова. – М.: Прометей, 2019. – 362 c.
15. Троелсен Э., Джепикс Ф. Язык программирования C# 7 и платформы .NET и .NET Core. СПб: ООО «Диалектика», 2018. – 1328 с.
16. Балтер Э. Microsoft Office Access 2007: профессиональное программирование. – М.: Вильямс, 2009. – 1296 с.
17. Буч Г., Якобсон А., Рамбо Д. UML.— СПб.: Питер, 2006. — 736 с.