Files
Atomizer/migrate_to_config.py
Anto01 91fb929f6a refactor: Centralize NX and environment configuration in config.py
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>
2025-11-17 14:31:33 -05:00

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()