Гунер.рф
Назад в Матвед
задание 2 матвед
🐍 Python
71
Автор расчёта:
pivo
Исходные данные для расчёта:
Марка стали по EN 10027 (можно несколько через запятую)
Рассчитать
Результаты расчёта
Скопировать для отчёта
Результаты скопированы в буфер!
# @input grades: text = | Марка стали по EN 10027 (можно несколько через запятую) FACTORS = { 'Cr': 4, 'Co': 4, 'Mn': 4, 'Ni': 4, 'Si': 4, 'W': 4, 'Al': 10, 'Be': 10, 'Cu': 10, 'Mo': 10, 'Nb': 10, 'Pb': 10, 'Ta': 10, 'Ti': 10, 'V': 10, 'Zr': 10, 'Ce': 100, 'N': 100, 'P': 100, 'S': 100, 'B': 1000 } EN_TO_RU_SYMBOLS = { 'Cr': 'Х', 'Ni': 'Н', 'Mn': 'Г', 'Si': 'С', 'Mo': 'М', 'W': 'В', 'V': 'Ф', 'Ti': 'Т', 'Al': 'Ю', 'Cu': 'Д', 'Co': 'К', 'Nb': 'Б', 'B': 'Р', 'N': 'А', 'P': 'П', 'S': '' } def analyze_en_chem_grade(raw_grade): grade = raw_grade.strip() if not grade: return None # 1. Подгруппа 4: Быстрорежущие стали (HS) if grade.startswith('HS'): nums_part = grade[2:].strip('-') nums = [float(x) for x in nums_part.split('-') if x] w = nums[0] if len(nums) > 0 else 0 mo = nums[1] if len(nums) > 1 else 0 v = nums[2] if len(nums) > 2 else 0 co = nums[3] if len(nums) > 3 else 0 c_str = "C ≈ 0,9...1,0 %" elems = [f"W = {w:g} %", f"Mo = {mo:g} %", f"V = {v:g} %"] if co > 0: elems.append(f"Co = {co:g} %") ru_mark = f"Р{int(w)}М{int(mo)}Ф" if int(v) > 1: ru_mark += f"{int(v)}" if co > 0: ru_mark += f"К{int(co)}" return { "Марка EN 10027": grade, "Подгруппа стандарта": "Подгруппа 4: Быстрорежущие стали (HS)", "Химический состав": c_str + "; " + ", ".join(elems), "Аналог по ГОСТ": ru_mark, "Пояснение и множители (Табл. 5)": "Числа через дефис обозначают среднее содержание элементов строго в порядке W - Mo - V - Co" } # 2. Подгруппа 1: Нелегированные углеродистые (C...) if grade.startswith('C') and len(grade) > 1 and grade[1].isdigit(): rem = grade[1:] i = 0 digits = "" while i < len(rem) and rem[i].isdigit(): digits += rem[i] i += 1 c_val = int(digits) / 100.0 if digits else 0.40 suffix = rem[i:] c_str = f"C = {c_val:g} % ({digits}/100 %)" elems = "Легирующие элементы отсутствуют (углеродистая сталь)" if suffix: elems += f", спецтребование: {suffix}" if 'E' in suffix: elems += " (ограниченное содержание S)" if c_val < 0.70: ru_mark = f"Сталь {int(round(c_val * 100))}" expl = f"Качественная углеродистая машиностроительная сталь (ГОСТ 1050). Множитель углерода 100." else: u_val = int(round(c_val * 10)) ru_mark = f"У{u_val}" expl = f"Инструментальная качественная углеродистая сталь (ГОСТ 1435)." return { "Марка EN 10027": grade, "Подгруппа стандарта": "Подгруппа 1: Нелегированные стали (C)", "Химический состав": c_str + "; " + elems, "Аналог по ГОСТ": ru_mark, "Пояснение и множители (Табл. 5)": expl } # 3. Подгруппа 3: Высоколегированные стали (буква X) if grade.startswith('X'): rem = grade[1:] i = 0 c_digits = "" while i < len(rem) and rem[i].isdigit(): c_digits += rem[i] i += 1 c_val = int(c_digits) / 100.0 if c_digits else 0.0 c_str = f"C = {c_val:g} % ({c_digits}/100 %)" if c_digits else "C ≤ 0,08 %" body = rem[i:] letters_part = "" j = 0 while j < len(body) and not body[j].isdigit(): letters_part += body[j] j += 1 numbers_part = body[j:] nums = [float(x) for x in numbers_part.split('-') if x] found_elements = [] pos = 0 all_syms = ['Cr', 'Ni', 'Mo', 'Nb', 'Ti', 'Al', 'Mn', 'Si', 'Cu', 'Co', 'W', 'V'] while pos < len(letters_part): matched = False for sym in all_syms: if letters_part.startswith(sym, pos): found_elements.append(sym) pos += len(sym) matched = True break if not matched: pos += 1 elem_strs = [] ru_elements_part = "" for idx, el in enumerate(found_elements): ru_sym = EN_TO_RU_SYMBOLS.get(el, el) if idx < len(nums): val = nums[idx] elem_strs.append(f"{el} = {val:g} %") val_int = int(round(val)) if val_int > 1: ru_elements_part += f"{ru_sym}{val_int}" else: ru_elements_part += f"{ru_sym}" else: elem_strs.append(f"{el} < 1 % (около 1 %)") ru_elements_part += f"{ru_sym}" c_int = int(round(c_val * 100)) c_ru = f"{c_int:02d}" if c_int < 10 else f"{c_int}" ru_mark = f"{c_ru}{ru_elements_part}" return { "Марка EN 10027": grade, "Подгруппа стандарта": "Подгруппа 3: Высоколегированные стали (буква X)", "Химический состав": c_str + "; " + ", ".join(elem_strs), "Аналог по ГОСТ": ru_mark, "Пояснение и множители (Табл. 5)": "Префикс X означает содержание легирующих элементов ≥ 5%. Числа за буквами указывают реальный процент элементов (без множителей)." } # 4. Подгруппа 2: Легированные стали (< 5% каждого элемента) i = 0 c_digits = "" while i < len(grade) and grade[i].isdigit(): c_digits += grade[i] i += 1 c_val = int(c_digits) / 100.0 if c_digits else 0.0 c_str = f"C = {c_val:g} % ({c_digits}/100 %)" if c_digits else "C < 0,10 %" body = grade[i:] letters_part = "" j = 0 while j < len(body) and not body[j].isdigit(): letters_part += body[j] j += 1 numbers_part = body[j:] nums = [float(x) for x in numbers_part.split('-') if x] all_syms = ['Cr', 'Ni', 'Mo', 'Nb', 'Ti', 'Al', 'Mn', 'Si', 'Cu', 'Co', 'W', 'V', 'S', 'B', 'P', 'N', 'K'] found_elements = [] pos = 0 while pos < len(letters_part): matched = False for sym in all_syms: if letters_part.startswith(sym, pos): found_elements.append(sym) pos += len(sym) matched = True break if not matched: pos += 1 elem_strs = [] ru_elem_dict = {} for idx, el in enumerate(found_elements): factor = FACTORS.get(el, 1) if idx < len(nums): num_val = nums[idx] actual_val = num_val / factor elem_strs.append(f"{el} = {actual_val:g} % ({num_val}/{factor})") ru_elem_dict[el] = actual_val else: elem_strs.append(f"{el} ≈ 1 % (около 1 %)") ru_elem_dict[el] = 1.0 ru_elem_str = "" for el in found_elements: ru_sym = EN_TO_RU_SYMBOLS.get(el, '') if not ru_sym: continue v = ru_elem_dict.get(el, 1.0) v_int = int(round(v)) if v_int > 1: ru_elem_str += f"{ru_sym}{v_int}" else: ru_elem_str += f"{ru_sym}" c_int = int(round(c_val * 100)) if 'S' in found_elements and not ('Cr' in found_elements or 'Ni' in found_elements): ru_mark = f"А{c_int}" if 'Mn' in found_elements: ru_mark += "Г" elif ru_elem_str: ru_mark = f"{c_int}{ru_elem_str}" else: ru_mark = f"Сталь {c_int}" return { "Марка EN 10027": grade, "Подгруппа стандарта": "Подгруппа 2: Легированные стали (< 5% элементов)", "Химический состав": c_str + "; " + ", ".join(elem_strs), "Аналог по ГОСТ": ru_mark, "Пояснение и множители (Табл. 5)": "Множители: 4 (Cr, Mn, Ni, Si, W, Co); 10 (Al, Cu, Mo, Nb, Ti, V); 100 (S, P, N); 1000 (B)." } def calculate(inputs): raw_grades = inputs.get('grades', '') if not raw_grades: raw_grades = "40S20, 60Si8, 13CrMo4-5, X8CrNi12-12, HS2-9-1-8, C40" grade_list = [g.strip() for g in raw_grades.replace(';', ',').split(',') if g.strip()] table_rows = [] for g in grade_list: row = analyze_en_chem_grade(g) if row: table_rows.append(row) return { "Количество марок": len(table_rows), "Расшифровка сталей по EN 10027 (химсостав)": table_rows }