Загрузка данных


using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;

namespace Щебнев
{
    internal class FV
    {
        public class Metal
        {
            public string Metals  { get; set; }
            public string Name    { get; set; }
            public double Density { get; set; }
            public string History { get; set; }
        }

        public static List<Metal> metal = new List<Metal>
        {
            new Metal { Metals="Сталь", Name="Ст3",       Density=7.85, History="Ст3 — углеродистая конструкционная сталь обыкновенного качества. Широко применяется в строительстве и машиностроении." },
            new Metal { Metals="Сталь", Name="Ст20",      Density=7.85, History="Сталь 20 — низкоуглеродистая конструкционная сталь. Хорошо сваривается, применяется для трубопроводов." },
            new Metal { Metals="Сталь", Name="Ст45",      Density=7.85, History="Сталь 45 — среднеуглеродистая сталь повышенной прочности. Применяется для валов, шестерён." },
            new Metal { Metals="Сталь", Name="A36",       Density=7.85, History="Конструкционная сталь A36 по стандарту ASTM. Популярна в США для металлоконструкций." },
            new Metal { Metals="Сталь", Name="65Г",       Density=7.82, History="Пружинная сталь 65Г. Высокая упругость и износостойкость." },

            new Metal { Metals="Нержавеющая сталь", Name="AISI 304",   Density=7.93, History="AISI 304 — наиболее распространённая нержавеющая сталь. Пищевое и химическое оборудование." },
            new Metal { Metals="Нержавеющая сталь", Name="AISI 316",   Density=8.00, History="AISI 316 — кислотостойкая нержавейка с молибденом. Применяется в морской и химической промышленности." },
            new Metal { Metals="Нержавеющая сталь", Name="AISI 430",   Density=7.70, History="AISI 430 — ферритная нержавеющая сталь. Применяется в декоративных и бытовых изделиях." },
            new Metal { Metals="Нержавеющая сталь", Name="12Х18Н10Т", Density=7.90, History="12Х18Н10Т — аустенитная нержавеющая сталь с титаном. Высокая жаропрочность." },
            new Metal { Metals="Нержавеющая сталь", Name="20Х13",      Density=7.75, History="20Х13 — мартенситная нержавеющая сталь. Применяется для столовых приборов и турбинных лопаток." },

            new Metal { Metals="Алюминий", Name="АД0",    Density=2.70, History="АД0 — технически чистый алюминий. Высокая электро- и теплопроводность." },
            new Metal { Metals="Алюминий", Name="АМг3",   Density=2.66, History="АМг3 (AlMg3) — алюминий-магниевый сплав. Хорошая свариваемость и коррозионная стойкость." },
            new Metal { Metals="Алюминий", Name="Д16",    Density=2.78, History="Д16 — дюралюминий. Высокая прочность, применяется в авиационной промышленности." },
            new Metal { Metals="Алюминий", Name="АВ",     Density=2.72, History="Сплав АВ — авиаль. Хорошо прессуется и анодируется." },
            new Metal { Metals="Алюминий", Name="В95",    Density=2.85, History="В95 — высокопрочный алюминиевый сплав. Применяется в силовых авиационных конструкциях." },

            new Metal { Metals="Бронза", Name="БрОФ10-1",  Density=8.70, History="БрОФ10-1 — оловянно-фосфористая бронза. Высокие антифрикционные свойства." },
            new Metal { Metals="Бронза", Name="БрАЖ9-4",   Density=7.60, History="БрАЖ9-4 — алюминиево-железистая бронза. Применяется для втулок и подшипников." },
            new Metal { Metals="Бронза", Name="БрКМц3-1",  Density=8.40, History="БрКМц3-1 — кремнисто-марганцевая бронза. Упругие элементы и пружины." },
            new Metal { Metals="Бронза", Name="БрО5Ц5С5",  Density=8.80, History="БрО5Ц5С5 — оловянная бронза. Арматура, подшипники." },
            new Metal { Metals="Бронза", Name="БрАМц9-2",  Density=7.65, History="БрАМц9-2 — алюминиево-марганцевая бронза. Детали машин и приборов." },

            new Metal { Metals="Латунь", Name="Л63",       Density=8.45, History="Л63 — двойная латунь. Хорошо штампуется и тянется." },
            new Metal { Metals="Латунь", Name="Л68",       Density=8.50, History="Л68 — латунь с высоким содержанием меди. Применяется для гильз и патронов." },
            new Metal { Metals="Латунь", Name="ЛС59-1",    Density=8.45, History="ЛС59-1 — свинцовистая латунь. Хорошо обрабатывается резанием." },
            new Metal { Metals="Латунь", Name="ЛАЖ60-1-1", Density=8.20, History="ЛАЖ60-1-1 — алюминиево-железистая латунь. Морская арматура." },
            new Metal { Metals="Латунь", Name="ЛЖМц59-1-1",Density=8.50, History="ЛЖМц59-1-1 — железомарганцевая латунь. Конденсаторные трубки." },

            new Metal { Metals="Медь", Name="М1",  Density=8.96, History="М1 — медь высокой чистоты (99.9%). Электрические провода и кабели." },
            new Metal { Metals="Медь", Name="М2",  Density=8.94, History="М2 — медь электротехническая. Шины, провода." },
            new Metal { Metals="Медь", Name="М3",  Density=8.93, History="М3 — медь общего назначения. Трубки, листы, прутки." },
            new Metal { Metals="Медь", Name="М1р", Density=8.96, History="М1р — медь раскисленная фосфором. Сварные конструкции." },
            new Metal { Metals="Медь", Name="МБ",  Density=8.90, History="МБ — бескислородная медь. Электровакуумные приборы." },

            new Metal { Metals="Титан", Name="ВТ1-0", Density=4.51, History="ВТ1-0 — технически чистый титан. Химическая промышленность, медицина." },
            new Metal { Metals="Титан", Name="ВТ6",   Density=4.43, History="ВТ6 (Ti-6Al-4V) — наиболее распространённый титановый сплав. Авиация, имплантаты." },
            new Metal { Metals="Титан", Name="ВТ14",  Density=4.42, History="ВТ14 — высокопрочный α+β-сплав. Крепёжные детали авиаконструкций." },
            new Metal { Metals="Титан", Name="ОТ4",   Density=4.55, History="ОТ4 — α-сплав титана с алюминием и марганцем. Листовая штамповка." },
            new Metal { Metals="Титан", Name="ПТ-3В", Density=4.50, History="ПТ-3В — псевдо-α сплав. Лопатки компрессоров." },

            new Metal { Metals="Чугун", Name="СЧ15",   Density=7.20, History="СЧ15 — серый чугун. Корпусные детали, станины станков." },
            new Metal { Metals="Чугун", Name="СЧ20",   Density=7.25, History="СЧ20 — серый чугун повышенной прочности. Блоки цилиндров двигателей." },
            new Metal { Metals="Чугун", Name="ВЧ50",   Density=7.10, History="ВЧ50 — высокопрочный чугун с шаровидным графитом. Коленвалы, шестерни." },
            new Metal { Metals="Чугун", Name="КЧ35-10",Density=7.30, History="КЧ35-10 — ковкий чугун. Детали сельхозмашин и автомобилей." },
            new Metal { Metals="Чугун", Name="ЧХ16",   Density=7.40, History="ЧХ16 — хромистый белый чугун. Размольные детали, износостойкие изделия." },

            new Metal { Metals="Цинк", Name="Ц0А",    Density=7.13, History="Ц0А — цинк особой чистоты. Применяется в гальванике и химической промышленности." },
            new Metal { Metals="Цинк", Name="ЦА4",    Density=6.60, History="ЦА4 — цинково-алюминиевый сплав. Литьё под давлением." },
            new Metal { Metals="Цинк", Name="ЦАМ4-3", Density=6.70, History="ЦАМ4-3 — цинково-алюминиево-медный сплав. Точное литьё." },
            new Metal { Metals="Цинк", Name="ЦАМ10-5",Density=6.30, History="ЦАМ10-5 — антифрикционный цинковый сплав. Подшипники скольжения." },
            new Metal { Metals="Цинк", Name="ЦВ",     Density=7.14, History="ЦВ — цинк вторичный. Используется в производстве цинковых сплавов." },
        };
    }

    public partial class MainWindow : Window
    {
        private string _currentShape = "";

        public MainWindow()
        {
            InitializeComponent();
            rbList.IsChecked = true;
            Material.SelectedIndex = 0;
        }

        private void Shape_Checked(object sender, RoutedEventArgs e)
        {
            if (!(sender is RadioButton rb)) return;
            _currentShape = rb.Content.ToString();
            UpdateFieldLabels();
        }

        private void UpdateFieldLabels()
        {
            lblA.Content = "Размер A, мм:";
            lblB.Content = "Размер B, мм:";
            lblS.Visibility = Visibility.Collapsed;
            tbS.Visibility  = Visibility.Collapsed;

            switch (_currentShape)
            {
                case "Уголок":
                    lblA.Content = "Ширина полки, мм:";
                    lblB.Content = "Длина полки, мм:";
                    lblS.Content = "Толщина полки S, мм:";
                    lblS.Visibility = Visibility.Visible;
                    tbS.Visibility  = Visibility.Visible;
                    break;
                case "Лист":
                    lblA.Content = "Ширина A, мм:";
                    lblB.Content = "Высота (толщина) B, мм:";
                    break;
                case "Труба круглая":
                    lblA.Content = "Наружный диаметр D, мм:";
                    lblB.Content = "Внутренний диаметр d, мм:";
                    break;
                case "Круг / проволока":
                    lblA.Content = "Диаметр D, мм:";
                    lblB.Content = "(не используется)";
                    break;
                case "Квадратная труба":
                    lblA.Content = "Сторона квадрата A, мм:";
                    lblB.Content = "Толщина стенки S, мм:";
                    break;
                case "Квадрат":
                    lblA.Content = "Сторона A, мм:";
                    lblB.Content = "(не используется)";
                    break;
                case "Швеллер":
                    lblA.Content = "Ширина полки B, мм:";
                    lblB.Content = "Высота стенки H, мм:";
                    lblS.Content = "Толщина стенки S, мм:";
                    lblS.Visibility = Visibility.Visible;
                    tbS.Visibility  = Visibility.Visible;
                    break;
                case "Лента":
                    lblA.Content = "Ширина A, мм:";
                    lblB.Content = "Толщина B, мм:";
                    break;
                case "Балка":
                    lblA.Content = "Ширина полки B, мм:";
                    lblB.Content = "Высота H, мм:";
                    lblS.Content = "Толщина стенки S, мм:";
                    lblS.Visibility = Visibility.Visible;
                    tbS.Visibility  = Visibility.Visible;
                    break;
                case "Шестигранник":
                    lblA.Content = "Размер под ключ S, мм:";
                    lblB.Content = "(не используется)";
                    break;
                case "Рельсы":
                    lblA.Content = "Высота рельса H, мм:";
                    lblB.Content = "Ширина подошвы B, мм:";
                    lblS.Content = "Толщина шейки S, мм:";
                    lblS.Visibility = Visibility.Visible;
                    tbS.Visibility  = Visibility.Visible;
                    break;
            }
        }

        private void Material_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (Material.SelectedItem == null) return;
            string v = ((ComboBoxItem)Material.SelectedItem).Content.ToString();

            MarkaMetall.ItemsSource = FV.metal
                .Where(m => m.Metals == v)
                .Select(p => p.Name)
                .ToList();

            if (MarkaMetall.Items.Count > 0)
                MarkaMetall.SelectedIndex = 0;
        }

        private void MarkaMetall_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (MarkaMetall.SelectedItem == null) return;
            string p = MarkaMetall.SelectedItem as string;
            if (p == null) return;

            var metal = FV.metal.FirstOrDefault(m => m.Name == p);
            if (metal == null) return;

            Density.Text = metal.Density.ToString("F2");
            History.Text = metal.History;
        }

        private void cbHistory_Checked(object sender, RoutedEventArgs e)
            => History.Visibility = Visibility.Visible;

        private void cbHistory_Unchecked(object sender, RoutedEventArgs e)
            => History.Visibility = Visibility.Collapsed;

        private void Calculate_Click(object sender, RoutedEventArgs e)
        {
            if (!double.TryParse(Density.Text.Replace(',', '.'),
                    System.Globalization.NumberStyles.Any,
                    System.Globalization.CultureInfo.InvariantCulture,
                    out double rho))
            {
                MessageBox.Show("Выберите материал и марку металла.", "Ошибка");
                return;
            }

            double A = ParseMM(tbA.Text);
            double B = ParseMM(tbB.Text);
            double S = ParseMM(tbS.Text);
            double L = ParseM (tbL.Text);

            if (L <= 0)
            {
                MessageBox.Show("Введите длину L (м) > 0.", "Ошибка");
                return;
            }

            double area = 0;

            switch (_currentShape)
            {
                case "Уголок":
                    if (A <= 0 || B <= 0 || S <= 0) { ShowInputError(); return; }
                    area = A * S + (B - S) * S;
                    break;
                case "Лист":
                case "Лента":
                    if (A <= 0 || B <= 0) { ShowInputError(); return; }
                    area = A * B;
                    break;
                case "Труба круглая":
                    if (A <= 0 || B <= 0 || B >= A) { ShowInputError(); return; }
                    area = Math.PI / 4.0 * (A * A - B * B);
                    break;
                case "Круг / проволока":
                    if (A <= 0) { ShowInputError(); return; }
                    area = Math.PI / 4.0 * A * A;
                    break;
                case "Квадратная труба":
                    if (A <= 0 || B <= 0) { ShowInputError(); return; }
                    double inner = A - 2 * B;
                    if (inner <= 0) { ShowInputError(); return; }
                    area = A * A - inner * inner;
                    break;
                case "Квадрат":
                    if (A <= 0) { ShowInputError(); return; }
                    area = A * A;
                    break;
                case "Швеллер":
                    if (A <= 0 || B <= 0 || S <= 0) { ShowInputError(); return; }
                    area = B * S * 2 + (A - 2 * S) * S;
                    break;
                case "Балка":
                    if (A <= 0 || B <= 0 || S <= 0) { ShowInputError(); return; }
                    area = 2 * A * S + (B - 2 * S) * S;
                    break;
                case "Шестигранник":
                    if (A <= 0) { ShowInputError(); return; }
                    area = (3.0 * Math.Sqrt(3.0) / 2.0) * (A / 2.0) * (A / 2.0);
                    break;
                case "Рельсы":
                    if (A <= 0 || B <= 0 || S <= 0) { ShowInputError(); return; }
                    double headH = A * 0.3;
                    double webH  = A * 0.5;
                    double footH = A - headH - webH;
                    double headW = B * 0.55;
                    area = B * footH + S * webH + headW * headH;
                    break;
                default:
                    MessageBox.Show("Выберите тип проката.", "Ошибка");
                    return;
            }

            double volume_mm3 = area * (L * 1000.0);
            double volume_cm3 = volume_mm3 / 1000.0;
            double mass_g     = rho * volume_cm3;
            double mass_kg    = mass_g / 1000.0;

            tbResult.Text = mass_kg.ToString("F3") + " кг";
        }

        private static double ParseMM(string s)
        {
            if (string.IsNullOrWhiteSpace(s)) return 0;
            double.TryParse(s.Replace(',', '.'),
                System.Globalization.NumberStyles.Any,
                System.Globalization.CultureInfo.InvariantCulture,
                out double v);
            return v;
        }

        private static double ParseM(string s) => ParseMM(s);

        private static void ShowInputError()
            => MessageBox.Show("Проверьте введённые размеры.", "Ошибка ввода");
    }
}