AnsysLink/.kiro/specs/remove-simulation-mode/design.md
2025-08-11 13:58:59 +08:00

12 KiB
Raw Blame History

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. 分阶段移除仿真模式

  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会话安全

  • 会话隔离确保用户数据不混淆
  • 自动会话超时和清理
  • 错误信息过滤避免泄露敏感信息