12 KiB
12 KiB
Design Document
Overview
本设计文档描述了如何移除CAE仿真网格生成助手中的仿真模式,并实现完全基于真实ANSYS Mechanical集成的系统。系统将通过PyMechanical API直接与ANSYS Mechanical交互,提供真实的网格生成、质量检查和可视化功能。
Architecture
系统架构图
graph TB
A[Web前端界面] --> B[Flask后端API]
B --> C[真实PyMechanical接口层]
C --> D[ANSYS Mechanical]
B --> E[文件管理系统]
E --> C
D --> F[网格文件输出]
D --> G[可视化图像输出]
D --> H[质量数据输出]
核心变更
- 移除: 所有simulation_mode相关的代码和逻辑
- 增强: PyMechanical集成层,提供更强大的真实ANSYS交互
- 新增: 真实网格文件导出功能
- 改进: 错误处理和进度跟踪机制
Components and Interfaces
1. 移除仿真模式组件
1.1 需要移除的代码
ANSYSSessionManager.__init__(simulation_mode=False)中的simulation_mode参数- 所有
if self.simulation_mode:条件分支 - 仿真数据生成逻辑
- API中的simulation_mode请求参数处理
1.2 清理策略
# 移除前
def __init__(self, simulation_mode: bool = False):
self.simulation_mode = simulation_mode
if self.simulation_mode:
# 仿真逻辑
else:
# 真实逻辑
# 移除后
def __init__(self):
# 只保留真实逻辑
2. 增强的PyMechanical集成层
2.1 真实网格生成器
class RealMeshGenerator:
def __init__(self, mechanical_session):
self.mechanical = mechanical_session
self.mesh_file_paths = {}
def generate_mesh_with_export(self) -> Dict[str, Any]:
"""生成网格并导出文件"""
# 1. 生成网格
result = self._generate_mesh()
# 2. 导出网格文件
if result.success:
self._export_mesh_files()
return result
def _export_mesh_files(self):
"""导出网格文件为多种格式"""
export_script = '''
# 导出网格为.msh格式
mesh = Model.Mesh
mesh.ExportFormat = MeshExportFormat.ANSYS
mesh.ExportSettings.Path = r"{output_path}"
mesh.Export()
'''
2.2 真实质量检查器
class RealMeshQualityChecker:
def get_detailed_quality_metrics(self) -> Dict[str, Any]:
"""获取详细的网格质量指标"""
quality_script = '''
# 获取真实的网格质量数据
mesh = Model.Mesh
quality_data = {
"element_quality": [],
"aspect_ratio": [],
"skewness": [],
"orthogonal_quality": []
}
# 遍历所有单元获取质量数据
for element in mesh.Elements:
if hasattr(element, 'Quality'):
quality_data["element_quality"].append(element.Quality)
if hasattr(element, 'AspectRatio'):
quality_data["aspect_ratio"].append(element.AspectRatio)
# 计算统计信息
min_quality = min(quality_data["element_quality"]) if quality_data["element_quality"] else 0
max_aspect_ratio = max(quality_data["aspect_ratio"]) if quality_data["aspect_ratio"] else 0
print("MIN_QUALITY:" + str(min_quality))
print("MAX_ASPECT_RATIO:" + str(max_aspect_ratio))
'''
result = self.mechanical.run_python_script(quality_script)
return self._parse_quality_results(result)
2.3 真实可视化导出器
class RealVisualizationExporter:
def export_mesh_visualization(self, view_settings: Dict) -> Dict[str, Any]:
"""导出真实的网格可视化图片"""
visualization_script = f'''
# 设置视图和导出参数
graphics = ExtAPI.Graphics
# 设置相机视角
camera = graphics.Camera
if "{view_settings['view']}" == "isometric":
camera.SetFit()
camera.Rotate(45, 35)
elif "{view_settings['view']}" == "front":
camera.SetSpecificViewOrientation(ViewOrientationType.Front)
elif "{view_settings['view']}" == "side":
camera.SetSpecificViewOrientation(ViewOrientationType.Right)
elif "{view_settings['view']}" == "top":
camera.SetSpecificViewOrientation(ViewOrientationType.Top)
# 设置网格显示
mesh_display = graphics.Mesh
mesh_display.Visible = True
mesh_display.ShowElements = True
mesh_display.ShowNodes = False
# 设置质量颜色映射(如果需要)
if "{view_settings.get('show_quality', False)}":
mesh_display.ColorBy = MeshColorType.ElementQuality
mesh_display.ShowLegend = True
# 导出图像
export_settings = Ansys.Mechanical.Graphics.GraphicsImageExportSettings()
export_settings.Resolution = GraphicsResolutionType.EnhancedResolution
export_settings.Background = GraphicsBackgroundType.White
export_settings.Width = {view_settings['width']}
export_settings.Height = {view_settings['height']}
output_path = r"{view_settings['output_path']}"
graphics.ExportImage(output_path, GraphicsImageExportFormat.PNG, export_settings)
print("IMAGE_EXPORTED:" + output_path)
'''
result = self.mechanical.run_python_script(visualization_script)
return self._parse_export_result(result)
3. 真实进度跟踪系统
3.1 ANSYS进度监控
class RealProgressTracker:
def __init__(self, mechanical_session):
self.mechanical = mechanical_session
self.progress_callbacks = []
def monitor_mesh_generation(self, callback):
"""监控真实的网格生成进度"""
# 启动进度监控线程
def progress_monitor():
while self.is_generating:
progress_script = '''
# 获取当前网格生成状态
mesh = Model.Mesh
if hasattr(mesh, 'GenerationStatus'):
status = mesh.GenerationStatus
print("MESH_STATUS:" + str(status))
# 获取已生成的单元数量作为进度指标
if hasattr(mesh, 'Elements'):
current_elements = len(mesh.Elements) if mesh.Elements else 0
print("CURRENT_ELEMENTS:" + str(current_elements))
'''
result = self.mechanical.run_python_script(progress_script)
progress_info = self._parse_progress(result)
if callback:
callback(progress_info)
time.sleep(2) # 每2秒检查一次
4. 增强的错误处理系统
4.1 ANSYS特定错误处理
class ANSYSErrorHandler:
@staticmethod
def handle_ansys_error(error: Exception) -> Dict[str, Any]:
"""处理ANSYS特定错误"""
error_info = {
'error_type': type(error).__name__,
'error_message': str(error),
'suggestions': [],
'diagnostic_info': {}
}
# 根据错误类型提供具体建议
if "license" in str(error).lower():
error_info['suggestions'].extend([
"检查ANSYS许可证服务器状态",
"确认许可证未被其他用户占用",
"联系系统管理员检查许可证配置"
])
elif "memory" in str(error).lower():
error_info['suggestions'].extend([
"减小网格密度设置",
"关闭其他占用内存的应用程序",
"考虑使用更大内存的计算机"
])
elif "geometry" in str(error).lower():
error_info['suggestions'].extend([
"检查CAD文件完整性",
"尝试修复几何体",
"简化复杂的几何特征"
])
return error_info
Data Models
1. 真实网格结果模型
class RealMeshResult:
def __init__(self):
self.success: bool = False
self.element_count: int = 0
self.node_count: int = 0
self.generation_time: float = 0.0
self.mesh_files: Dict[str, str] = {} # 格式 -> 文件路径
self.quality_metrics: Dict[str, float] = {}
self.visualization_images: Dict[str, str] = {} # 视角 -> 图片路径
self.ansys_version: str = ""
self.mesh_statistics: Dict[str, Any] = {}
2. 网格文件信息模型
class MeshFileInfo:
def __init__(self):
self.file_path: str = ""
self.file_format: str = "" # msh, cdb, etc.
self.file_size: int = 0
self.created_at: datetime = None
self.element_types: List[str] = []
self.coordinate_system: str = ""
API Changes
1. 移除仿真模式参数
# 移除前
@api_bp.route('/mesh/generate', methods=['POST'])
def generate_mesh():
simulation_mode = request.json.get('simulation_mode', False)
# ...
# 移除后
@api_bp.route('/mesh/generate', methods=['POST'])
def generate_mesh():
# 直接使用真实模式,无需参数
# ...
2. 新增网格文件API
@api_bp.route('/mesh/files', methods=['GET'])
def get_mesh_files():
"""获取生成的网格文件列表"""
@api_bp.route('/mesh/files/<file_format>', methods=['GET'])
def download_mesh_file(file_format):
"""下载指定格式的网格文件"""
@api_bp.route('/mesh/quality/detailed', methods=['GET'])
def get_detailed_quality_metrics():
"""获取详细的网格质量指标"""
Implementation Strategy
1. 分阶段移除仿真模式
- 第一阶段: 识别所有simulation_mode相关代码
- 第二阶段: 逐个模块移除仿真逻辑,保留真实逻辑
- 第三阶段: 清理相关参数和配置
- 第四阶段: 更新API文档和测试
2. 增强真实功能
- 网格文件导出: 实现多格式网格文件导出
- 质量数据获取: 从ANSYS获取真实质量指标
- 可视化增强: 支持质量颜色映射和多视角
- 进度跟踪: 实现真实的ANSYS操作进度监控
3. 错误处理改进
- ANSYS错误分类: 根据错误类型提供具体建议
- 诊断信息收集: 收集ANSYS环境信息用于故障排除
- 恢复机制: 实现会话恢复和资源清理
Testing Strategy
1. 真实环境测试
- ANSYS集成测试: 使用真实ANSYS环境测试所有功能
- 网格文件验证: 验证导出的网格文件可以被其他软件读取
- 质量数据准确性: 对比ANSYS GUI中的质量数据
2. 错误场景测试
- ANSYS不可用: 测试ANSYS未安装或许可证不可用的情况
- 内存不足: 测试大型网格生成时的内存限制
- 文件权限: 测试文件导出权限问题
3. 性能测试
- 大型模型: 测试复杂叶片模型的处理性能
- 并发处理: 测试多个用户同时使用的情况
- 长时间运行: 测试长时间网格生成的稳定性
Migration Plan
1. 代码迁移步骤
- 创建新的真实模式专用类
- 逐步替换现有的混合模式类
- 移除所有仿真相关代码
- 更新配置和文档
2. 数据迁移
- 无需数据迁移,因为仿真数据不需要保留
3. 部署策略
- 蓝绿部署:先部署到测试环境验证,再切换生产环境
- 回滚计划:保留当前版本作为备份
Security Considerations
1. 文件安全
- 网格文件访问权限控制
- 临时文件自动清理
- 文件路径验证防止目录遍历
2. ANSYS会话安全
- 会话隔离确保用户数据不混淆
- 自动会话超时和清理
- 错误信息过滤避免泄露敏感信息