This commit is contained in:
2026-03-14 01:29:40 +08:00
parent 4f083e23dd
commit 4f58de86fb
8 changed files with 3241 additions and 9 deletions
+35 -6
View File
@@ -15,6 +15,8 @@ from database.database import get_db_session
from utils.logger import get_logger
from sqlalchemy.ext.asyncio import AsyncSession
from core.mold_generator import MoldCavityGenerator
from core.aluminum_foam_mold import AluminumFoamMoldGenerator
from core.mold_quality_inspector import AluminumFoamMoldQualityInspector
from core.mesh_generator import MeshGenerator
logger = get_logger(__name__)
@@ -26,6 +28,10 @@ geometry_analyzer = GeometryAnalyzer()
file_handler = FileHandler()
html_generator = HTMLGenerator()
mold_generator = MoldCavityGenerator(shrinkage_rate=0.005)
# 铝泡沫模具生成器
aluminum_foam_generator = AluminumFoamMoldGenerator(shrinkage_rate=0.015, draft_angle=3.0)
# 铝泡沫模具质量检测器
mold_quality_inspector = AluminumFoamMoldQualityInspector()
mesh_generator = MeshGenerator(quality="medium")
tasks = {}
@@ -45,6 +51,7 @@ async def health():
async def upload_stp(
background_tasks: BackgroundTasks,
file: UploadFile = File(...),
material: Optional[str] = "ABS",
db_session: AsyncSession = Depends(get_db_session)
):
"""上传STP文件并存储到数据库"""
@@ -82,7 +89,7 @@ async def upload_stp(
)
# 后台处理(包含数据库存储)
background_tasks.add_task(process_file_with_storage, task_id, file_path, stp_file.id, db_session)
background_tasks.add_task(process_file_with_storage, task_id, file_path, stp_file.id, db_session, material)
return {
"task_id": task_id,
@@ -300,7 +307,8 @@ async def process_file_with_storage(
task_id: str,
file_path: str,
stp_file_id: int,
db_session: AsyncSession
db_session: AsyncSession,
material: str = "ABS"
):
"""处理文件的后台任务"""
@@ -319,7 +327,7 @@ async def process_file_with_storage(
# 使用超时保护
try:
await asyncio.wait_for(process_file_core(storage_service, task_id, file_path, stp_file_id, db_session), timeout_seconds)
await asyncio.wait_for(process_file_core(storage_service, task_id, file_path, stp_file_id, db_session, material), timeout_seconds)
except asyncio.TimeoutError:
logger.error(f"处理超时: {task_id}")
raise Exception(f"处理超时,超过{timeout_seconds}秒未完成")
@@ -403,7 +411,8 @@ async def process_file_core(
task_id: str,
file_path: str,
stp_file_id: int,
db_session: AsyncSession
db_session: AsyncSession,
material: str = "ABS"
):
"""核心处理逻辑"""
@@ -496,9 +505,19 @@ async def process_file_core(
if shape:
# 生成型腔和型芯
cavity_result = mold_generator.generate_mold_cavities(shape)
if is_foam_material:
# 使用铝泡沫模具生成器
aluminum_foam_generator.set_material(selected_material["name"])
cavity_result = aluminum_foam_generator.generate_mold_cavities(shape)
cavity_mesh_data = aluminum_foam_generator.generate_detailed_cavity_json(cavity_result)
logger.info(f"使用铝泡沫模具生成器: {selected_material['name']}")
else:
# 使用普通塑料模具生成器
cavity_result = mold_generator.generate_mold_cavities(shape)
cavity_mesh_data = mold_generator.generate_detailed_cavity_json(cavity_result)
# 生成详细的型腔JSON数据(包含网格)
cavity_mesh_data = mold_generator.generate_detailed_cavity_json(cavity_result)
if cavity_mesh_data:
logger.info(f"型腔网格数据生成完成: {cavity_mesh_data.get('mold_cavities', {}).get('cavity', {}).get('vertex_count', 0)} 顶点")
except Exception as cavity_err:
logger.warning(f"型腔生成失败,使用简化数据: {cavity_err}")
@@ -525,10 +544,20 @@ async def process_file_core(
"POM": {"density": 1.41, "shrinkage": 0.020, "name": "POM"},
"PMMA": {"density": 1.18, "shrinkage": 0.005, "name": "PMMA"},
"PBT": {"density": 1.31, "shrinkage": 0.015, "name": "PBT"},
# 铝泡沫材料
"AlSi10Mg": {"density": 0.45, "shrinkage": 0.015, "name": "AlSi10Mg", "is_foam": True},
"AlSi12": {"density": 0.50, "shrinkage": 0.012, "name": "AlSi12", "is_foam": True},
"Pure Al Foam": {"density": 0.35, "shrinkage": 0.020, "name": "Pure Al Foam", "is_foam": True},
"AlSi7Mg": {"density": 0.40, "shrinkage": 0.018, "name": "AlSi7Mg", "is_foam": True},
}
# 默认使用 ABS
selected_material = material_properties["ABS"]
# 获取材料属性(支持前端传递的材料参数)
requested_material = material if material in material_properties else "ABS"
selected_material = material_properties.get(requested_material, material_properties["ABS"])
# 检查是否是泡沫材料
is_foam_material = selected_material.get("is_foam", False)
material_density = selected_material["density"]
shrinkage_rate = selected_material["shrinkage"]