feat: Add Studio UI, intake system, and extractor improvements

Dashboard:
- Add Studio page with drag-drop model upload and Claude chat
- Add intake system for study creation workflow
- Improve session manager and context builder
- Add intake API routes and frontend components

Optimization Engine:
- Add CLI module for command-line operations
- Add intake module for study preprocessing
- Add validation module with gate checks
- Improve Zernike extractor documentation
- Update spec models with better validation
- Enhance solve_simulation robustness

Documentation:
- Add ATOMIZER_STUDIO.md planning doc
- Add ATOMIZER_UX_SYSTEM.md for UX patterns
- Update extractor library docs
- Add study-readme-generator skill

Tools:
- Add test scripts for extraction validation
- Add Zernike recentering test

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-27 12:02:30 -05:00
parent 3193831340
commit a26914bbe8
56 changed files with 14173 additions and 646 deletions

View File

@@ -65,6 +65,16 @@ from optimization_engine.extractors.extract_zernike_figure import (
extract_zernike_figure_rms,
)
# Displacement extraction
from optimization_engine.extractors.extract_displacement import (
extract_displacement,
)
# Mass extraction from BDF
from optimization_engine.extractors.extract_mass_from_bdf import (
extract_mass_from_bdf,
)
# Part mass and material extractor (from NX .prt files)
from optimization_engine.extractors.extract_part_mass_material import (
extract_part_mass_material,
@@ -145,72 +155,76 @@ from optimization_engine.extractors.spec_extractor_builder import (
)
__all__ = [
# Displacement extraction
"extract_displacement",
# Mass extraction (from BDF)
"extract_mass_from_bdf",
# Part mass & material (from .prt)
'extract_part_mass_material',
'extract_part_mass',
'extract_part_material',
'PartMassExtractor',
"extract_part_mass_material",
"extract_part_mass",
"extract_part_material",
"PartMassExtractor",
# Stress extractors
'extract_solid_stress',
'extract_principal_stress',
'extract_max_principal_stress',
'extract_min_principal_stress',
"extract_solid_stress",
"extract_principal_stress",
"extract_max_principal_stress",
"extract_min_principal_stress",
# Strain energy
'extract_strain_energy',
'extract_total_strain_energy',
'extract_strain_energy_density',
"extract_strain_energy",
"extract_total_strain_energy",
"extract_strain_energy_density",
# SPC forces / reactions
'extract_spc_forces',
'extract_total_reaction_force',
'extract_reaction_component',
'check_force_equilibrium',
"extract_spc_forces",
"extract_total_reaction_force",
"extract_reaction_component",
"check_force_equilibrium",
# Zernike (telescope mirrors) - Standard Z-only method
'ZernikeExtractor',
'extract_zernike_from_op2',
'extract_zernike_filtered_rms',
'extract_zernike_relative_rms',
"ZernikeExtractor",
"extract_zernike_from_op2",
"extract_zernike_filtered_rms",
"extract_zernike_relative_rms",
# Zernike OPD (RECOMMENDED - uses actual geometry, no shape assumption)
# Supports annular apertures via inner_radius parameter
'ZernikeOPDExtractor',
'extract_zernike_opd',
'extract_zernike_opd_filtered_rms',
'compute_zernike_coefficients_annular',
"ZernikeOPDExtractor",
"extract_zernike_opd",
"extract_zernike_opd_filtered_rms",
"compute_zernike_coefficients_annular",
# Zernike Analytic (parabola-based with lateral displacement correction)
'ZernikeAnalyticExtractor',
'extract_zernike_analytic',
'extract_zernike_analytic_filtered_rms',
'compare_zernike_methods',
"ZernikeAnalyticExtractor",
"extract_zernike_analytic",
"extract_zernike_analytic_filtered_rms",
"compare_zernike_methods",
# Backwards compatibility (deprecated)
'ZernikeFigureExtractor',
'extract_zernike_figure',
'extract_zernike_figure_rms',
"ZernikeFigureExtractor",
"extract_zernike_figure",
"extract_zernike_figure_rms",
# Temperature (Phase 3 - thermal)
'extract_temperature',
'extract_temperature_gradient',
'extract_heat_flux',
'get_max_temperature',
"extract_temperature",
"extract_temperature_gradient",
"extract_heat_flux",
"get_max_temperature",
# Modal mass (Phase 3 - dynamics)
'extract_modal_mass',
'extract_frequencies',
'get_first_frequency',
'get_modal_mass_ratio',
"extract_modal_mass",
"extract_frequencies",
"get_first_frequency",
"get_modal_mass_ratio",
# Part introspection (Phase 4)
'introspect_part',
'get_expressions_dict',
'get_expression_value',
'print_introspection_summary',
"introspect_part",
"get_expressions_dict",
"get_expression_value",
"print_introspection_summary",
# Custom extractor loader (Phase 5)
'CustomExtractor',
'CustomExtractorLoader',
'CustomExtractorContext',
'ExtractorSecurityError',
'ExtractorValidationError',
'load_custom_extractors',
'execute_custom_extractor',
'validate_custom_extractor',
"CustomExtractor",
"CustomExtractorLoader",
"CustomExtractorContext",
"ExtractorSecurityError",
"ExtractorValidationError",
"load_custom_extractors",
"execute_custom_extractor",
"validate_custom_extractor",
# Spec extractor builder
'SpecExtractorBuilder',
'build_extractors_from_spec',
'get_extractor_outputs',
'list_available_builtin_extractors',
"SpecExtractorBuilder",
"build_extractors_from_spec",
"get_extractor_outputs",
"list_available_builtin_extractors",
]