4. 材料库自动匹配与赋值
任务拆解:从零件标识到材料本构
本案例要解决的核心问题是:当装配体或零件清单中存在大量零件时,如何依据零件命名规则或外部属性表,自动从材料库中检索并赋予正确的材料本构。关键输入有三类:零件命名规则(如 MAT_AL6061_...)、外部属性表(CSV/Excel,含零件名与材料牌号映射)、材料库文件(含材料名、弹性模量、泊松比、密度、屈服强度等本构参数)。输出是每个零件被赋予的材料名称及其本构参数,并生成匹配日志供核查。
命名规则与属性表的匹配逻辑
自动匹配通常采用“优先级链”策略:先尝试从零件名中提取材料标识(正则或分隔符解析),若失败则查询外部属性表,若仍失败则标记为“未匹配”并进入人工确认队列。匹配成功后,从材料库中按材料名检索本构参数并写入模型。为避免误匹配,需设置大小写归一化、别名映射和冲突检测(同一零件被赋予多个材料时报警)。
关键实现:Python 脚本示例
以下脚本读取零件清单与材料库,按优先级链自动匹配并输出赋值结果与日志。示例数据为教学假设,非实测结果。
import csv
import re
# 材料库:材料名 → 本构参数
material_lib = {
"AL6061": {"E": 68900, "nu": 0.33, "rho": 2.70e-9, "sy": 276},
"Q235": {"E": 206000, "nu": 0.30, "rho": 7.85e-9, "sy": 235},
"45Steel":{"E": 209000, "nu": 0.29, "rho": 7.85e-9, "sy": 355},
}
# 别名映射:归一化材料标识
alias_map = {
"AL6061": "AL6061", "6061": "AL6061", "AL-6061": "AL6061",
"Q235": "Q235", "Q235B": "Q235",
"45": "45Steel", "45STEEL": "45Steel",
}
# 外部属性表:零件名 → 材料标识
attr_table = {
"bracket_002": "Q235",
"shaft_005": "45",
}
# 零件清单
parts = ["MAT_AL6061_001", "bracket_002", "shaft_005", "unknown_003", "conflict_004"]
# 冲突模拟:conflict_004 在命名和属性表中给出不同材料
attr_table["conflict_004"] = "Q235"
# 命名规则会提取出 AL6061,与属性表 Q235 冲突
def extract_from_name(name):
"""从命名中提取材料标识,如 MAT_AL6061_001 → AL6061"""
m = re.search(r'MAT_([A-Za-z0-9\-]+)_', name)
return m.group(1) if m else None
def normalize(mat_id):
"""归一化材料标识"""
if mat_id is None:
return None
key = mat_id.upper().replace("-", "")
return alias_map.get(key, alias_map.get(mat_id.upper(), None))
def match_material(part_name):
"""优先级链匹配:命名规则 > 属性表"""
from_name = normalize(extract_from_name(part_name))
from_attr = normalize(attr_table.get(part_name))
if from_name and from_attr and from_name != from_attr:
return None, f"冲突:{from_name} vs {from_attr}"
if from_name:
return from_name, "命名规则"
if from_attr:
return from_attr, "属性表"
return None, "未匹配"
# 执行匹配
log = []
for p in parts:
mat, source = match_material(p)
if mat and mat in material_lib:
params = material_lib[mat]
log.append(f"{p} → {mat} → {source} ✓ E={params['E']}, ν={params['nu']}")
elif mat is None and "冲突" in source:
log.append(f"{p} → {source} ✗")
else:
log.append(f"{p} → 未匹配 ⚠")
for line in log:
print(line)
运行结果与判读
运行上述脚本,预期输出如下(示例结果,非实测):
MAT_AL6061_001 → AL6061 → 命名规则 ✓ E=68900, ν=0.33
bracket_002 → Q235 → 属性表 ✓ E=206000, ν=0.30
shaft_005 → 45Steel → 属性表 ✓ E=209000, ν=0.29
unknown_003 → 未匹配 ⚠
conflict_004 → 冲突:AL6061 vs Q235 ✗
判读要点:成功匹配的零件可直接写入材料本构;未匹配零件需检查命名规则或补充属性表;冲突零件需人工确认以哪个来源为准。日志中的统计信息(成功/未匹配/冲突数量)可作为批量处理的质量指标。
建议在正式批量赋值前,先用小样本(5~10 个零件)验证命名规则与属性表的覆盖度,确认无误后再全量执行。材料库中的本构参数应统一单位制(如 mm-ton-s 或 m-kg-s),避免因单位不一致导致求解异常。
若零件命名规则中存在多种分隔符或大小写混用,务必在归一化步骤中统一处理;否则会出现“AL6061”与“al-6061”被判定为不同材料的情况,导致匹配失败或重复材料条目。