Гунер.рф
Назад в Матвед
задание 1 матвед
🐍 Python
112
Автор расчёта:
pivo
Исходные данные для расчёта:
Марка стали по ГОСТ (можно несколько через запятую)
Рассчитать
Результаты расчёта
Скопировать для отчёта
Результаты скопированы в буфер!
# @input grades: text = | Марка стали по ГОСТ (можно несколько через запятую) ELEMENTS_RU = { 'Х': ('Cr', 'хром'), 'Н': ('Ni', 'никель'), 'Г': ('Mn', 'марганец'), 'С': ('Si', 'кремний'), 'В': ('W', 'вольфрам'), 'М': ('Mo', 'молибден'), 'Ф': ('V', 'ванадий'), 'Т': ('Ti', 'титан'), 'Ю': ('Al', 'алюминий'), 'Д': ('Cu', 'медь'), 'К': ('Co', 'кобальт'), 'Ц': ('Zr', 'цирконий'), 'Б': ('Nb', 'ниобий'), 'Р': ('B', 'бор'), 'А': ('N', 'азот'), 'Ч': ('РЗМ', 'редкоземельные металлы'), 'П': ('P', 'фосфор') } REMELT_METHODS = { 'ВД': 'вакуумно-дуговой переплав (ВДП)', 'ВИ': 'вакуумно-индукционная выплавка (ВИП)', 'ИД': 'вакуумно-индукционная выплавка с последующим ВДП', 'ИП': 'индукционная плавка', 'ИШ': 'индукционная плавка с последующим ЭШП', 'ИЛ': 'индукционная плавка с электронно-лучевым переплавом', 'ГР': 'газокислородное рафинирование', 'Ш': 'электрошлаковый переплав (ЭШП)', 'ШЛ': 'шлако-лучевой переплав', 'ШД': 'электрошлаковый с последующим ВДП', 'ЭЛ': 'электронно-лучевой переплав' } def analyze_gost_grade(raw_grade): grade = raw_grade.strip() if not grade: return None # Числовой ввод "45" -> "Сталь 45" if grade.isdigit() and int(grade) in [5, 8, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85]: grade = "Сталь " + grade # 1. Проверяем суффикс переплава через дефис (Таблица 2) remelt = "" clean_grade = grade if '-' in grade: parts = grade.split('-', 1) clean_grade = parts[0].strip() suffix = parts[1].strip() if suffix in REMELT_METHODS: remelt = REMELT_METHODS[suffix] else: remelt = "Специальный способ выплавки: " + suffix # Литейная (Л на конце) is_cast = False if clean_grade.endswith('Л') and not clean_grade.startswith('У'): is_cast = True clean_grade = clean_grade[:-1] # Котельная (К на конце) is_boiler = False if clean_grade.endswith('К') and 'Сталь' in clean_grade: is_boiler = True clean_grade = clean_grade[:-1] # Раскисление (кп, пс, сп) deox = "спокойная (сп)" if clean_grade.endswith('кп'): deox = "кипящая (кп)" clean_grade = clean_grade[:-2] elif clean_grade.endswith('пс'): deox = "полуспокойная (пс)" clean_grade = clean_grade[:-2] elif clean_grade.endswith('сп'): deox = "спокойная (сп)" clean_grade = clean_grade[:-2] # Металлургическое качество (Таблица 1) quality = "Качественная (S ≤ 0,040 %; P ≤ 0,035...0,040 %)" if '-Ш' in grade or clean_grade.endswith('-Ш') or ('Ш' in grade.split('-')[-1] if '-' in grade else False): quality = "Особовысококачественная (S ≤ 0,015 %; P ≤ 0,012 %)" elif clean_grade.startswith('Сталь'): if clean_grade.endswith('А'): quality = "Высококачественная (S ≤ 0,025 %; P ≤ 0,025 %)" clean_grade = clean_grade[:-1] else: quality = "Качественная (S ≤ 0,040 %; P ≤ 0,035...0,040 %)" elif clean_grade.startswith('Ст'): quality = "Обыкновенного качества (S ≤ 0,050 %; P ≤ 0,040 %)" elif clean_grade.endswith('А') and not clean_grade.startswith('А'): quality = "Высококачественная (S ≤ 0,025 %; P ≤ 0,025 %)" clean_grade = clean_grade[:-1] purpose = "" carbon_str = "" elements_list = [] # А. Конструкционные качественные углеродистые ("Сталь 45"...) if clean_grade.startswith('Сталь'): num_str = clean_grade.replace('Сталь', '').strip() c_val = int(num_str) / 100.0 if num_str.isdigit() else 0.45 carbon_str = f"C = {c_val:.2f} % ({num_str} сотых %)" if is_boiler: purpose = "Конструкционная котельная качественная сталь (для паровых котлов и сосудов под давлением)" elif is_cast: purpose = "Конструкционная углеродистая сталь для фасонных отливок (литейная)" else: purpose = "Конструкционная качественная машиностроительная углеродистая сталь" # Б. Углеродистые обыкновенного качества (Ст0..Ст6) elif clean_grade.startswith('Ст'): purpose = "Конструкционная углеродистая сталь обыкновенного качества (ГОСТ 380)" num = clean_grade.replace('Ст', '').replace('Г', '').strip() if num == '0': carbon_str = "C ≤ 0,23 %" elif num == '05': carbon_str = "C ≈ 0,05...0,08 %" elif num == '2': carbon_str = "C ≈ 0,09...0,15 % (в среднем ~0,12 %)" elif num == '3': carbon_str = "C ≈ 0,14...0,22 % (в среднем ~0,18 %)" elif num == '5': carbon_str = "C ≈ 0,28...0,37 % (в среднем ~0,32 %)" else: carbon_str = f"C ≈ 0,{num} %" if 'Г' in clean_grade: elements_list.append("Mn ≈ 0,8...1,1 % (повышенное содержание марганца)") # В. Инструментальные углеродистые (У7..У13) elif clean_grade.startswith('У') and len(clean_grade) > 1 and (clean_grade[1].isdigit() or clean_grade[1:3].isdigit()): rem = clean_grade[1:] has_g = False has_f = False if 'Г' in rem: has_g = True rem = rem.replace('Г', '') if 'Ф' in rem: has_f = True rem = rem.replace('Ф', '') c_digits = "".join([ch for ch in rem if ch.isdigit()]) c_val = int(c_digits) / 10.0 if c_digits else 1.0 carbon_str = f"C = {c_val:.1f} % ({c_digits} десятых %)" purpose = "Инструментальная углеродистая сталь (для режущего, ударного и слесарного инструмента)" if has_g: elements_list.append("Mn ≈ 0,8...1,0 % (марганец)") if has_f: elements_list.append("V ≈ 0,15...0,30 % (ванадий для измельчения зерна)") # Г. Автоматные стали (А12, А20, А30, А40Г) elif clean_grade.startswith('А') and any(char.isdigit() for char in clean_grade): purpose = "Конструкционная автоматная сталь (повышенной обрабатываемости резанием на станках-автоматах)" quality = "Специальная качественная (автоматная: сера S ≈ 0,08...0,30 %, фосфор P ≤ 0,06 %)" rem = clean_grade[1:] has_g = False if 'Г' in rem: has_g = True rem = rem.replace('Г', '') c_digits = "".join([ch for ch in rem if ch.isdigit()]) c_val = int(c_digits) / 100.0 if c_digits else 0.30 carbon_str = f"C = {c_val:.2f} % ({c_digits} сотых %)" if has_g: elements_list.append("Mn ≈ 1,2...1,6 % (марганец)") # Д. Шарикоподшипниковые (ШХ15, ШХ6, ШХ15СГ, ШХ9) elif clean_grade.startswith('ШХ'): purpose = "Шарикоподшипниковая сталь высокой твердости и контактной выносливости" carbon_str = "C ≈ 0,95...1,05 % (около 1,0 %)" rem = clean_grade[2:] i = 0 cr_digits = "" while i < len(rem) and rem[i].isdigit(): cr_digits += rem[i] i += 1 if cr_digits: cr_val = int(cr_digits) / 10.0 elements_list.append(f"Cr ≈ {cr_val:.1f} % (хром)") other_elem = rem[i:] for ch in other_elem: if ch in ELEMENTS_RU: elements_list.append(f"{ELEMENTS_RU[ch][0]} ≈ 1 % ({ELEMENTS_RU[ch][1]})") # Е. Быстрорежущие стали (Р9, Р6М5, Р6М5К5, Р18) elif clean_grade.startswith('Р') and len(clean_grade) > 1 and clean_grade[1].isdigit(): purpose = "Быстрорежущая инструментальная сталь (рапид) повышенной теплостойкости (до 600...650 °C)" carbon_str = "C ≈ 0,7...1,0 %" rem = clean_grade[1:] w_digits = "" i = 0 while i < len(rem) and rem[i].isdigit(): w_digits += rem[i] i += 1 elements_list.append(f"W ≈ {w_digits} % (вольфрам)") curr_str = rem[i:] idx = 0 while idx < len(curr_str): ch = curr_str[idx] if ch in ELEMENTS_RU: idx += 1 num_d = "" while idx < len(curr_str) and curr_str[idx].isdigit(): num_d += curr_str[idx] idx += 1 val_d = num_d if num_d else "1" elements_list.append(f"{ELEMENTS_RU[ch][0]} ≈ {val_d} % ({ELEMENTS_RU[ch][1]})") else: idx += 1 # Ж. Высокомарганцовистая сталь Гадфильда (110Г13Л, 120Г13Л) elif clean_grade.startswith('110Г13') or clean_grade.startswith('120Г13'): purpose = "Высокомарганцовистая аустенитная износостойкая сталь (сталь Гадфильда)" c_val = int(clean_grade[:3]) / 100.0 carbon_str = f"C ≈ {c_val:.2f} %" elements_list.append("Mn ≈ 11...14 % (марганец)") # З. Легированные стали общего вида else: i = 0 c_digits = "" while i < len(clean_grade) and clean_grade[i].isdigit(): c_digits += clean_grade[i] i += 1 rem = clean_grade[i:] idx = 0 while idx < len(rem): ch = rem[idx] if ch in ELEMENTS_RU: idx += 1 num_d = "" while idx < len(rem) and rem[idx].isdigit(): num_d += rem[idx] idx += 1 val_d = num_d if num_d else "1" elements_list.append(f"{ELEMENTS_RU[ch][0]} ≈ {val_d} % ({ELEMENTS_RU[ch][1]})") else: idx += 1 if len(c_digits) == 0: purpose = "Инструментальная легированная сталь (штамповая или режущая)" if clean_grade.startswith('Х12'): carbon_str = "C ≈ 1,2...1,4 %" else: carbon_str = "C ≈ 1,0 % (около 1 % углерода)" elif len(c_digits) == 1: c_val = int(c_digits) / 10.0 carbon_str = f"C = {c_val:.1f} % ({c_digits} десятых %)" purpose = "Инструментальная легированная штамповая сталь" else: c_val = int(c_digits) / 100.0 carbon_str = f"C = {c_val:.2f} % ({c_digits} сотых %)" is_stainless = False for e in elements_list: if 'Cr ≈' in e: cr_num = e.split('Cr ≈')[1].split('%')[0].strip() try: if float(cr_num) >= 10.0: is_stainless = True except: pass if is_stainless: purpose = "Коррозионностойкая (нержавеющая) высоколегированная сталь" elif c_val >= 0.50 and ('Si' in str(elements_list) or 'С' in clean_grade): purpose = "Конструкционная легированная рессорно-пружинная сталь" else: purpose = "Конструкционная легированная машиностроительная сталь" if is_cast: purpose += " [литейная, для изготовления фасонных отливок]" chem_parts = [carbon_str] + elements_list chem_str = "; ".join(chem_parts) return { "Марка": grade, "Химический состав": chem_str, "Качество (S и P, Табл. 1)": quality, "Назначение и класс": purpose, "Способ выплавки (Табл. 2)": remelt if remelt else "стандартная плавка", "Раскисление": deox } def calculate(inputs): raw_grades = inputs.get('grades', '') if not raw_grades: raw_grades = "30ХГСА, 12Х18Н10Т, У10А, ШХ15, Р6М5К5, Сталь 45, Ст3сп" grade_list = [g.strip() for g in raw_grades.replace(';', ',').split(',') if g.strip()] table_rows = [] for g in grade_list: row = analyze_gost_grade(g) if row: table_rows.append(row) return { "Количество марок": len(table_rows), "Расшифровка сталей по ГОСТ": table_rows }