# Design Document ## Overview 本设计文档描述了如何移除CAE仿真网格生成助手中的仿真模式,并实现完全基于真实ANSYS Mechanical集成的系统。系统将通过PyMechanical API直接与ANSYS Mechanical交互,提供真实的网格生成、质量检查和可视化功能。 ## Architecture ### 系统架构图 ```mermaid 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 清理策略 ```python # 移除前 def __init__(self, simulation_mode: bool = False): self.simulation_mode = simulation_mode if self.simulation_mode: # 仿真逻辑 else: # 真实逻辑 # 移除后 def __init__(self): # 只保留真实逻辑 ``` ### 2. 增强的PyMechanical集成层 #### 2.1 真实网格生成器 ```python 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 真实质量检查器 ```python 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 真实可视化导出器 ```python 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进度监控 ```python 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特定错误处理 ```python 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. 真实网格结果模型 ```python 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. 网格文件信息模型 ```python 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. 移除仿真模式参数 ```python # 移除前 @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 ```python @api_bp.route('/mesh/files', methods=['GET']) def get_mesh_files(): """获取生成的网格文件列表""" @api_bp.route('/mesh/files/', methods=['GET']) def download_mesh_file(file_format): """下载指定格式的网格文件""" @api_bp.route('/mesh/quality/detailed', methods=['GET']) def get_detailed_quality_metrics(): """获取详细的网格质量指标""" ``` ## Implementation Strategy ### 1. 分阶段移除仿真模式 1. **第一阶段**: 识别所有simulation_mode相关代码 2. **第二阶段**: 逐个模块移除仿真逻辑,保留真实逻辑 3. **第三阶段**: 清理相关参数和配置 4. **第四阶段**: 更新API文档和测试 ### 2. 增强真实功能 1. **网格文件导出**: 实现多格式网格文件导出 2. **质量数据获取**: 从ANSYS获取真实质量指标 3. **可视化增强**: 支持质量颜色映射和多视角 4. **进度跟踪**: 实现真实的ANSYS操作进度监控 ### 3. 错误处理改进 1. **ANSYS错误分类**: 根据错误类型提供具体建议 2. **诊断信息收集**: 收集ANSYS环境信息用于故障排除 3. **恢复机制**: 实现会话恢复和资源清理 ## Testing Strategy ### 1. 真实环境测试 - **ANSYS集成测试**: 使用真实ANSYS环境测试所有功能 - **网格文件验证**: 验证导出的网格文件可以被其他软件读取 - **质量数据准确性**: 对比ANSYS GUI中的质量数据 ### 2. 错误场景测试 - **ANSYS不可用**: 测试ANSYS未安装或许可证不可用的情况 - **内存不足**: 测试大型网格生成时的内存限制 - **文件权限**: 测试文件导出权限问题 ### 3. 性能测试 - **大型模型**: 测试复杂叶片模型的处理性能 - **并发处理**: 测试多个用户同时使用的情况 - **长时间运行**: 测试长时间网格生成的稳定性 ## Migration Plan ### 1. 代码迁移步骤 1. 创建新的真实模式专用类 2. 逐步替换现有的混合模式类 3. 移除所有仿真相关代码 4. 更新配置和文档 ### 2. 数据迁移 - 无需数据迁移,因为仿真数据不需要保留 ### 3. 部署策略 - 蓝绿部署:先部署到测试环境验证,再切换生产环境 - 回滚计划:保留当前版本作为备份 ## Security Considerations ### 1. 文件安全 - 网格文件访问权限控制 - 临时文件自动清理 - 文件路径验证防止目录遍历 ### 2. ANSYS会话安全 - 会话隔离确保用户数据不混淆 - 自动会话超时和清理 - 错误信息过滤避免泄露敏感信息