MAJOR IMPROVEMENT: Single source of truth for all system paths Now to change NX version or Python environment, edit ONE file (config.py): NX_VERSION = "2412" # Change this for NX updates PYTHON_ENV_NAME = "atomizer" # Change this for env updates All code automatically uses new paths - no manual file hunting! New Central Configuration (config.py): - NX_VERSION: Automatically updates all NX paths - NX_INSTALLATION_DIR: Derived from version - NX_RUN_JOURNAL: Path to run_journal.exe - NX_MATERIAL_LIBRARY: Path to physicalmateriallibrary.xml - NX_PYTHON_STUBS: Path to Python stubs for intellisense - PYTHON_ENV_NAME: Python environment name - PROJECT_ROOT: Auto-detected project root - Helper functions: get_nx_journal_command(), validate_config(), print_config() Updated Files to Use Config: - optimization_engine/nx_updater.py: Uses NX_RUN_JOURNAL from config - dashboard/api/app.py: Uses NX_RUN_JOURNAL from config - Both have fallbacks if config unavailable Benefits: 1. Change NX version in 1 place, not 10+ files 2. Automatic validation of paths on import 3. Helper functions for common operations 4. Clear error messages if paths missing 5. Easy to add new Simcenter versions Future NX Update Process: 1. Edit config.py: NX_VERSION = "2506" 2. Run: python config.py (verify paths) 3. Done! All code uses NX 2506 Migration Scripts Included: - migrate_to_config.py: Full migration with documentation - apply_config_migration.py: Applied to update dashboard 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
245 lines
6.6 KiB
Python
245 lines
6.6 KiB
Python
"""
|
|
Migration Script: Update all files to use centralized config.py
|
|
|
|
Run this script once to migrate all hardcoded paths to use config.py
|
|
"""
|
|
|
|
import re
|
|
from pathlib import Path
|
|
|
|
def update_nx_updater():
|
|
"""Update nx_updater.py to use config"""
|
|
file_path = Path("optimization_engine/nx_updater.py")
|
|
content = file_path.read_text()
|
|
|
|
# Add config import after other imports
|
|
if "from config import" not in content:
|
|
import_section = """from pathlib import Path
|
|
from typing import Dict, List, Optional
|
|
import re
|
|
import shutil
|
|
import subprocess
|
|
from datetime import datetime"""
|
|
|
|
new_import = """from pathlib import Path
|
|
from typing import Dict, List, Optional
|
|
import re
|
|
import shutil
|
|
import subprocess
|
|
from datetime import datetime
|
|
import sys
|
|
|
|
# Import centralized configuration
|
|
sys.path.insert(0, str(Path(__file__).parent.parent))
|
|
from config import NX_RUN_JOURNAL"""
|
|
|
|
content = content.replace(import_section, new_import)
|
|
|
|
# Replace hardcoded path with config
|
|
old_default = 'self.nx_run_journal_path = Path("C:/Program Files/Siemens/NX2412/NXBIN/run_journal.exe")'
|
|
new_default = 'self.nx_run_journal_path = NX_RUN_JOURNAL'
|
|
|
|
content = content.replace(old_default, new_default)
|
|
|
|
file_path.write_text(content)
|
|
print(f"✓ Updated {file_path}")
|
|
|
|
def update_dashboard_app():
|
|
"""Update dashboard/api/app.py to use config"""
|
|
file_path = Path("dashboard/api/app.py")
|
|
content = file_path.read_text()
|
|
|
|
# Add config import at top
|
|
if "from config import" not in content:
|
|
# Find Flask imports
|
|
flask_import_idx = content.find("from flask import")
|
|
if flask_import_idx > 0:
|
|
# Insert before Flask imports
|
|
config_import = """import sys
|
|
from pathlib import Path
|
|
sys.path.insert(0, str(Path(__file__).parent.parent.parent))
|
|
from config import NX_RUN_JOURNAL
|
|
|
|
"""
|
|
content = config_import + content
|
|
|
|
# Replace hardcoded path
|
|
old_path = r'nx_executable = r"C:\Program Files\Siemens\NX2412\NXBIN\run_journal.exe"'
|
|
new_path = 'nx_executable = str(NX_RUN_JOURNAL)'
|
|
|
|
content = content.replace(old_path, new_path)
|
|
|
|
file_path.write_text(content)
|
|
print(f"✓ Updated {file_path}")
|
|
|
|
def update_vscode_settings():
|
|
"""Update .vscode/settings.json to use dynamic path"""
|
|
file_path = Path(".vscode/settings.json")
|
|
|
|
# Note: VSCode settings.json can't use Python variables
|
|
# Instead, create a note in SYSTEM_CONFIGURATION.md
|
|
print(f"⚠ {file_path} - Manual update needed (VSCode doesn't support dynamic paths)")
|
|
print(f" Current stub path will work, but update manually if NX version changes")
|
|
|
|
def create_migration_doc():
|
|
"""Create documentation for the migration"""
|
|
doc_content = """# Configuration Migration Guide
|
|
|
|
## Centralized Configuration
|
|
|
|
All NX and environment paths are now managed in `config.py`.
|
|
|
|
### To Update NX Version:
|
|
|
|
**OLD WAY** (required editing multiple files):
|
|
1. Edit `optimization_engine/nx_updater.py`
|
|
2. Edit `dashboard/api/app.py`
|
|
3. Edit `README.md`
|
|
4. Edit `docs/SYSTEM_CONFIGURATION.md`
|
|
5. Edit `.vscode/settings.json`
|
|
6. Search for other hardcoded paths...
|
|
|
|
**NEW WAY** (edit ONE file):
|
|
1. Open `config.py`
|
|
2. Change `NX_VERSION = "2412"` to your version (e.g., `"2506"`)
|
|
3. Done! All modules automatically use new paths.
|
|
|
|
### Configuration Variables
|
|
|
|
Import from `config.py`:
|
|
|
|
```python
|
|
from config import (
|
|
NX_VERSION, # "2412"
|
|
NX_INSTALLATION_DIR, # Path to NX installation
|
|
NX_RUN_JOURNAL, # Path to run_journal.exe
|
|
NX_MATERIAL_LIBRARY, # Path to physicalmateriallibrary.xml
|
|
NX_PYTHON_STUBS, # Path to Python stubs
|
|
PYTHON_ENV_NAME, # "atomizer"
|
|
PYTHON_ENV_PATH, # Path to Python executable
|
|
PROJECT_ROOT, # Project root directory
|
|
)
|
|
```
|
|
|
|
### Helper Functions
|
|
|
|
```python
|
|
from config import get_nx_journal_command
|
|
|
|
# Generate journal command automatically
|
|
cmd = get_nx_journal_command(
|
|
journal_script=Path("optimization_engine/import_expressions.py"),
|
|
prt_file,
|
|
exp_file
|
|
)
|
|
# Returns: "C:/Program Files/Siemens/NX2412/NXBIN/run_journal.exe" "..." -args "..." "..."
|
|
```
|
|
|
|
### Validation
|
|
|
|
```python
|
|
from config import validate_config, print_config
|
|
|
|
# Validate all paths exist
|
|
validate_config() # Raises FileNotFoundError if paths missing
|
|
|
|
# Print current configuration
|
|
print_config() # Shows all paths for debugging
|
|
```
|
|
|
|
### Files Migrated
|
|
|
|
- ✅ `optimization_engine/nx_updater.py` - Uses `NX_RUN_JOURNAL`
|
|
- ✅ `dashboard/api/app.py` - Uses `NX_RUN_JOURNAL`
|
|
- ⚠️ `.vscode/settings.json` - Manual update needed (VSCode limitation)
|
|
- ✅ `README.md` - References `config.py`
|
|
- ✅ `docs/SYSTEM_CONFIGURATION.md` - References `config.py`
|
|
|
|
### Testing Configuration
|
|
|
|
Run:
|
|
```bash
|
|
python config.py
|
|
```
|
|
|
|
Expected output:
|
|
```
|
|
================================================================================
|
|
ATOMIZER CONFIGURATION
|
|
================================================================================
|
|
|
|
NX Configuration:
|
|
Version: 2412
|
|
Installation: C:\\Program Files\\Siemens\\NX2412
|
|
...
|
|
```
|
|
|
|
### Future NX Updates
|
|
|
|
When NX 2506 (or any version) is released:
|
|
|
|
1. Edit `config.py`:
|
|
```python
|
|
NX_VERSION = "2506" # Changed from "2412"
|
|
```
|
|
|
|
2. Verify installation exists:
|
|
```bash
|
|
python config.py
|
|
```
|
|
|
|
3. Update VSCode stubs path in `.vscode/settings.json`:
|
|
```json
|
|
{
|
|
"python.analysis.extraPaths": [
|
|
"C:\\\\Program Files\\\\Siemens\\\\NX2506\\\\ugopen\\\\pythonStubs"
|
|
]
|
|
}
|
|
```
|
|
|
|
That's it! All Python code automatically uses NX2506.
|
|
|
|
---
|
|
|
|
**Created**: 2025-11-17
|
|
**Last Updated**: 2025-11-17
|
|
"""
|
|
|
|
doc_path = Path("docs/CONFIG_MIGRATION.md")
|
|
doc_path.write_text(doc_content)
|
|
print(f"✓ Created {doc_path}")
|
|
|
|
def main():
|
|
print("=" * 80)
|
|
print("MIGRATING TO CENTRALIZED CONFIGURATION")
|
|
print("=" * 80)
|
|
print()
|
|
|
|
try:
|
|
update_nx_updater()
|
|
update_dashboard_app()
|
|
update_vscode_settings()
|
|
create_migration_doc()
|
|
|
|
print()
|
|
print("=" * 80)
|
|
print("✓ MIGRATION COMPLETE")
|
|
print("=" * 80)
|
|
print()
|
|
print("Next Steps:")
|
|
print("1. Test configuration: python config.py")
|
|
print("2. Run a test optimization to verify paths work")
|
|
print("3. Commit changes with message: 'refactor: Centralize NX/env configuration in config.py'")
|
|
print()
|
|
print("To update NX version in future:")
|
|
print(" - Edit config.py: NX_VERSION = \"<new_version>\"")
|
|
print(" - Run: python config.py (to verify)")
|
|
print(" - Done!")
|
|
|
|
except Exception as e:
|
|
print(f"✗ Migration failed: {e}")
|
|
raise
|
|
|
|
if __name__ == "__main__":
|
|
main()
|