SYMBOL INDEX (1617 symbols across 243 files) FILE: api/app.py function lifespan (line 41) | async def lifespan(app: FastAPI) -> AsyncIterator[None]: function create_app (line 79) | def create_app() -> FastAPI: FILE: api/dependencies.py function get_session_store (line 24) | def get_session_store() -> SessionStore: function get_file_registry (line 29) | def get_file_registry() -> FileRegistry: function get_worker_pool (line 34) | def get_worker_pool() -> WorkerPoolManager: FILE: api/file_bridge.py function upload_to_ndarray (line 12) | async def upload_to_ndarray(file: UploadFile) -> np.ndarray: function upload_to_tempfile (line 34) | async def upload_to_tempfile( function pil_to_png_bytes (line 57) | def pil_to_png_bytes(img: Image.Image) -> bytes: function ndarray_to_png_bytes (line 64) | def ndarray_to_png_bytes(arr: np.ndarray) -> bytes: function pil_to_streaming_response (line 70) | def pil_to_streaming_response(img: Image.Image, fmt: str = "PNG") -> Str... function file_to_response (line 79) | def file_to_response(path: str, filename: Optional[str] = None) -> FileR... function _guess_media_type (line 87) | def _guess_media_type(path: str) -> str: FILE: api/file_registry.py class FileRegistry (line 7) | class FileRegistry: method __init__ (line 15) | def __init__(self) -> None: method register_path (line 19) | def register_path(self, session_id: str, path: str, method register_bytes (line 33) | def register_bytes(self, session_id: str, data: bytes, method resolve (line 45) | def resolve(self, file_id: str) -> Optional[Tuple[str, str]]: method cleanup_session (line 56) | def cleanup_session(self, session_id: str) -> int: method clear_all (line 67) | def clear_all(self) -> int: FILE: api/routers/calibration.py function _handle_core_error (line 25) | def _handle_core_error(e: Exception, context: str) -> None: function calibration_generate (line 32) | def calibration_generate( FILE: api/routers/converter.py function _handle_core_error (line 62) | def _handle_core_error(e: Exception, context: str) -> None: function _require_session (line 68) | def _require_session(store: SessionStore, session_id: str) -> dict: function _require_preview_cache (line 76) | def _require_preview_cache(session_data: dict) -> dict: function _image_to_png_bytes (line 86) | def _image_to_png_bytes(img: object) -> bytes: function get_bed_sizes (line 96) | def get_bed_sizes() -> BedSizeListResponse: function get_bed_preview (line 113) | def get_bed_preview( function crop_image (line 140) | async def crop_image( function convert_preview (line 192) | async def convert_preview( function upload_heightmap (line 349) | async def upload_heightmap( class _GenerateBody (line 458) | class _GenerateBody(BaseModel): function convert_generate (line 466) | async def convert_generate( function convert_batch (line 606) | async def convert_batch( function replace_color (line 724) | def replace_color( function _rgb_to_lab (line 810) | def _rgb_to_lab(rgb_array: np.ndarray) -> np.ndarray: function merge_colors (line 826) | def merge_colors( FILE: api/routers/extractor.py function _handle_core_error (line 26) | def _handle_core_error(e: Exception, context: str) -> None: function _image_to_png_bytes (line 32) | def _image_to_png_bytes(img: object) -> bytes: function extractor_extract (line 42) | async def extractor_extract( function extractor_manual_fix (line 165) | def extractor_manual_fix( function extractor_merge_5color_extended (line 205) | def extractor_merge_5color_extended( function extractor_merge_8color (line 255) | def extractor_merge_8color( FILE: api/routers/five_color.py function _load_engine (line 29) | def _load_engine(lut_name: str) -> tuple[ColorQueryEngine, str]: function get_base_colors (line 89) | def get_base_colors(lut_name: str = Query(..., description="LUT 显示名称")) ... function query_five_color (line 115) | def query_five_color(request: FiveColorQueryRequest) -> FiveColorQueryRe... FILE: api/routers/health.py function health_check (line 23) | def health_check( FILE: api/routers/lut.py function list_luts (line 29) | def list_luts() -> LUTListResponse: function merge_luts_endpoint (line 46) | def merge_luts_endpoint(request: MergeRequest) -> MergeResponse: function get_lut_colors (line 151) | def get_lut_colors(lut_name: str) -> LutColorsResponse: function get_lut_info (line 169) | def get_lut_info(lut_name: str) -> LutInfoResponse: FILE: api/routers/slicer.py function detect_slicers (line 24) | def detect_slicers() -> SlicerDetectResponse: function launch_slicer_endpoint (line 40) | def launch_slicer_endpoint(request: SlicerLaunchRequest) -> SlicerLaunch... FILE: api/routers/system.py function cleanup_output_dir (line 35) | def cleanup_output_dir(output_dir: str) -> tuple[int, int]: function perform_cache_cleanup (line 68) | def perform_cache_cleanup( function clear_cache (line 96) | def clear_cache( function get_settings (line 133) | def get_settings() -> UserSettingsResponse: function save_settings (line 145) | def save_settings(settings: UserSettings) -> SaveSettingsResponse: function get_stats (line 160) | def get_stats() -> StatsResponse: FILE: api/schemas/calibration.py class BackingColor (line 22) | class BackingColor(str, Enum): class CalibrationGenerateRequest (line 52) | class CalibrationGenerateRequest(BaseModel): FILE: api/schemas/converter.py class ColorMode (line 21) | class ColorMode(str, Enum): class ModelingMode (line 47) | class ModelingMode(str, Enum): class StructureMode (line 65) | class StructureMode(str, Enum): class AutoHeightMode (line 80) | class AutoHeightMode(str, Enum): class ColorReplacementItem (line 101) | class ColorReplacementItem(BaseModel): class ConvertPreviewRequest (line 123) | class ConvertPreviewRequest(BaseModel): class ConvertGenerateRequest (line 168) | class ConvertGenerateRequest(BaseModel): class ConvertBatchRequest (line 306) | class ConvertBatchRequest(BaseModel): class ColorReplaceRequest (line 322) | class ColorReplaceRequest(BaseModel): class ColorMergePreviewRequest (line 345) | class ColorMergePreviewRequest(BaseModel): class BedSizeItem (line 375) | class BedSizeItem(BaseModel): class BedSizeListResponse (line 396) | class BedSizeListResponse(BaseModel): FILE: api/schemas/extractor.py class CalibrationColorMode (line 21) | class CalibrationColorMode(str, Enum): class ExtractorPage (line 47) | class ExtractorPage(str, Enum): class ExtractorExtractRequest (line 65) | class ExtractorExtractRequest(BaseModel): class ExtractorManualFixRequest (line 111) | class ExtractorManualFixRequest(BaseModel): FILE: api/schemas/five_color.py class BaseColorEntry (line 10) | class BaseColorEntry(BaseModel): class BaseColorsResponse (line 19) | class BaseColorsResponse(BaseModel): class FiveColorQueryRequest (line 27) | class FiveColorQueryRequest(BaseModel): class FiveColorQueryResponse (line 36) | class FiveColorQueryResponse(BaseModel): FILE: api/schemas/lut.py class MergeStats (line 18) | class MergeStats(BaseModel): class MergeRequest (line 39) | class MergeRequest(BaseModel): class MergeResponse (line 65) | class MergeResponse(BaseModel): class LutInfoResponse (line 90) | class LutInfoResponse(BaseModel): FILE: api/schemas/responses.py class CalibrationResponse (line 13) | class CalibrationResponse(BaseModel): class PreviewResponse (line 22) | class PreviewResponse(BaseModel): class ColorReplaceResponse (line 35) | class ColorReplaceResponse(BaseModel): class MergePreviewResponse (line 44) | class MergePreviewResponse(BaseModel): class GenerateResponse (line 56) | class GenerateResponse(BaseModel): class BatchItemResult (line 66) | class BatchItemResult(BaseModel): class BatchResponse (line 74) | class BatchResponse(BaseModel): class LutInfo (line 83) | class LutInfo(BaseModel): class LUTListResponse (line 91) | class LUTListResponse(BaseModel): class WorkerPoolStatus (line 97) | class WorkerPoolStatus(BaseModel): class HealthResponse (line 104) | class HealthResponse(BaseModel): class ExtractResponse (line 113) | class ExtractResponse(BaseModel): class ManualFixResponse (line 124) | class ManualFixResponse(BaseModel): class HeightmapUploadResponse (line 132) | class HeightmapUploadResponse(BaseModel): class LutColorEntry (line 143) | class LutColorEntry(BaseModel): class LutColorsResponse (line 150) | class LutColorsResponse(BaseModel): class CropResponse (line 158) | class CropResponse(BaseModel): FILE: api/schemas/slicer.py class SlicerInfo (line 18) | class SlicerInfo(BaseModel): class SlicerDetectResponse (line 36) | class SlicerDetectResponse(BaseModel): class SlicerLaunchRequest (line 48) | class SlicerLaunchRequest(BaseModel): class SlicerLaunchResponse (line 63) | class SlicerLaunchResponse(BaseModel): FILE: api/schemas/system.py class CacheCleanupDetails (line 13) | class CacheCleanupDetails(BaseModel): class ClearCacheResponse (line 21) | class ClearCacheResponse(BaseModel): class ClearCacheResult (line 32) | class ClearCacheResult: class UserSettings (line 41) | class UserSettings(BaseModel): class UserSettingsResponse (line 52) | class UserSettingsResponse(BaseModel): class SaveSettingsResponse (line 59) | class SaveSettingsResponse(BaseModel): class StatsResponse (line 66) | class StatsResponse(BaseModel): FILE: api/session_store.py class SessionStore (line 8) | class SessionStore: method __init__ (line 17) | def __init__(self, ttl: int = DEFAULT_TTL) -> None: method create (line 24) | def create(self) -> str: method get (line 33) | def get(self, session_id: str) -> Optional[Dict[str, Any]]: method put (line 41) | def put(self, session_id: str, key: str, value: Any) -> None: method register_temp_file (line 51) | def register_temp_file(self, session_id: str, path: str) -> None: method cleanup_expired (line 57) | def cleanup_expired(self) -> int: method _remove_session (line 69) | def _remove_session(self, session_id: str) -> None: method clear_all (line 81) | def clear_all(self) -> int: method exists (line 89) | def exists(self, session_id: str) -> bool: FILE: api/worker_pool.py class WorkerPoolManager (line 18) | class WorkerPoolManager: method __init__ (line 27) | def __init__(self, max_workers: int | None = None) -> None: method start (line 38) | def start(self) -> None: method submit (line 44) | async def submit( method shutdown (line 74) | def shutdown(self, wait: bool = True) -> None: method is_alive (line 87) | def is_alive(self) -> bool: method max_workers (line 97) | def max_workers(self) -> int: FILE: api/workers/converter_workers.py function worker_generate_preview (line 18) | def worker_generate_preview( function worker_batch_convert_item (line 112) | def worker_batch_convert_item( function worker_generate_model (line 183) | def worker_generate_model( FILE: benchmark.py class _Tee (line 35) | class _Tee: method __init__ (line 36) | def __init__(self, log_path, console_stream=None, lock=None): method write (line 43) | def write(self, msg): method flush (line 63) | def flush(self): method __getattr__ (line 70) | def __getattr__(self, name): class _TeeStderr (line 74) | class _TeeStderr: method __init__ (line 75) | def __init__(self, log_file, lock): method write (line 82) | def write(self, msg): method flush (line 101) | def flush(self): method __getattr__ (line 108) | def __getattr__(self, name): function _pick_first_existing (line 128) | def _pick_first_existing(candidates): function _pick_latest_lut (line 137) | def _pick_latest_lut(): function _calc_target_width (line 160) | def _calc_target_width(image_path: str, long_edge_mm: float) -> float: function _bench_header (line 195) | def _bench_header(label: str): function _bench_result (line 201) | def _bench_result(label: str, timings: dict, total: float): function run_svg_benchmark (line 207) | def run_svg_benchmark(run_preview: bool = True): function run_hifi_benchmark (line 262) | def run_hifi_benchmark(run_preview: bool = True): function main (line 322) | def main(): FILE: config.py function get_asset_path (line 20) | def get_asset_path(relative_path: str) -> str: class PrinterConfig (line 57) | class PrinterConfig: class WorkerPoolConfig (line 66) | class WorkerPoolConfig: method from_env (line 78) | def from_env(cls) -> "WorkerPoolConfig": class SmartConfig (line 98) | class SmartConfig: class ModelingMode (line 115) | class ModelingMode(str, Enum): method get_display_name (line 121) | def get_display_name(self) -> str: class ColorSystem (line 131) | class ColorSystem: method get (line 223) | def get(mode: str): class BedManager (line 284) | class BedManager: method get_choices (line 307) | def get_choices(cls): method get_bed_size (line 312) | def get_bed_size(cls, label: str): method compute_scale (line 320) | def compute_scale(cls, bed_w_mm, bed_h_mm): class VectorConfig (line 328) | class VectorConfig: function _env_flag (line 353) | def _env_flag(name: str) -> bool: function is_wsl_runtime (line 358) | def is_wsl_runtime() -> bool: function get_tray_runtime_policy (line 368) | def get_tray_runtime_policy(): FILE: core/calibration.py function _generate_voxel_mesh (line 26) | def _generate_voxel_mesh(voxel_matrix: np.ndarray, material_index: int, function generate_calibration_board (line 86) | def generate_calibration_board(color_mode: str, block_size_mm: float, function get_top_1296_colors (line 204) | def get_top_1296_colors(): function generate_smart_board (line 301) | def generate_smart_board(block_size_mm=5.0, gap_mm=0.8): function generate_8color_board (line 449) | def generate_8color_board(page_index=0): function generate_8color_batch_zip (line 565) | def generate_8color_batch_zip(): function generate_bw_calibration_board (line 581) | def generate_bw_calibration_board(block_size_mm=5.0, gap_mm=0.8, backing... function select_extended_1444_colors (line 737) | def select_extended_1444_colors(base_1024_stacks): function get_top_1444_colors (line 855) | def get_top_1444_colors(): function generate_5color1444_board (line 965) | def generate_5color1444_board(block_size_mm=5.0, gap_mm=0.8): function merge_5color_extended (line 1096) | def merge_5color_extended(base_lut_path, extended_lut_path, output_path=... function generate_5color_extended_board (line 1159) | def generate_5color_extended_board(block_size_mm=5.0, gap_mm=0.8, page_i... function _generate_5color_base_page (line 1197) | def _generate_5color_base_page(block_size_mm, gap_mm, preview_colors, sl... function _generate_5color_extended_page (line 1305) | def _generate_5color_extended_page(block_size_mm, gap_mm, preview_colors... function generate_5color_extended_batch_zip (line 1427) | def generate_5color_extended_batch_zip(block_size_mm=5.0, gap_mm=0.8): FILE: core/color_analyzer.py class ColorAnalysisResult (line 27) | class ColorAnalysisResult: method to_dict (line 41) | def to_dict(self) -> dict: class ColorAnalyzer (line 50) | class ColorAnalyzer: method analyze (line 71) | def analyze(cls, image_path: str, target_width_mm: float = 60.0, method _load_image (line 169) | def _load_image(cls, image_path: str, verbose: bool): method _resize_for_analysis (line 194) | def _resize_for_analysis(cls, img_rgb, original_w: int, method _calc_unique_colors (line 214) | def _calc_unique_colors(cls, img_rgb, verbose: bool) -> int: method _calc_hue_distribution (line 228) | def _calc_hue_distribution(cls, img_rgb, pixel_count: int, verbose: bo... method _calc_color_concentration (line 257) | def _calc_color_concentration(cls, img_rgb, verbose: bool): method _calc_edge_complexity (line 278) | def _calc_edge_complexity(cls, img_rgb, pixel_count: int, verbose: boo... method _score_hue (line 292) | def _score_hue(hue_bins: int, colored_ratio: float) -> int: method _score_concentration (line 316) | def _score_concentration(top8_ratio: float) -> int: method _score_unique_colors (line 332) | def _score_unique_colors(unique_colors: int) -> int: method _score_edge (line 346) | def _score_edge(edge_ratio: float) -> int: method _complexity_to_colors (line 358) | def _complexity_to_colors(complexity_score: int) -> tuple: method _calc_width_factor (line 374) | def _calc_width_factor(target_width_mm: float) -> float: method _align_to_common (line 381) | def _align_to_common(cls, value: int) -> int: function analyze_recommended_colors (line 387) | def analyze_recommended_colors(image_path: str, target_width_mm: float =... FILE: core/color_matching_hue_aware.py class HueAwareColorMatcher (line 26) | class HueAwareColorMatcher: method __init__ (line 43) | def __init__(self, lut_rgb: np.ndarray, lut_lab: np.ndarray, method _resolve_weights (line 74) | def _resolve_weights(self, hue_weight, preset, w_L, w_C, w_H): method _lab_to_lch (line 103) | def _lab_to_lch(lab: np.ndarray) -> np.ndarray: method _delta_hue (line 121) | def _delta_hue(h1_deg, h2_deg, c1, c2): method _weighted_distance (line 138) | def _weighted_distance(self, input_lch, candidate_lch): method match_colors_batch (line 156) | def match_colors_batch(self, input_rgb: np.ndarray, k: int = 16) -> np... method _rgb_to_lab (line 202) | def _rgb_to_lab(rgb: np.ndarray) -> np.ndarray: FILE: core/color_merger.py class ColorMerger (line 13) | class ColorMerger: method __init__ (line 28) | def __init__(self, rgb_to_lab_func: Callable): method identify_low_usage_colors (line 40) | def identify_low_usage_colors(self, palette: List[dict], method calculate_color_distance (line 75) | def calculate_color_distance(self, color1_rgb: Tuple[int, int, int], method find_merge_target (line 109) | def find_merge_target(self, source_color: str, palette: List[dict], method build_merge_map (line 183) | def build_merge_map(self, palette: List[dict], method apply_color_merging (line 258) | def apply_color_merging(self, matched_rgb: np.ndarray, method calculate_quality_metric (line 300) | def calculate_quality_metric(self, original_palette: List[dict], method _hex_to_rgb (line 391) | def _hex_to_rgb(hex_str: str) -> Tuple[int, int, int]: FILE: core/color_replacement.py class ColorReplacementManager (line 12) | class ColorReplacementManager: method __init__ (line 20) | def __init__(self): method add_replacement (line 24) | def add_replacement(self, original: Tuple[int, int, int], method remove_replacement (line 46) | def remove_replacement(self, original: Tuple[int, int, int]) -> bool: method get_replacement (line 62) | def get_replacement(self, original: Tuple[int, int, int]) -> Optional[... method apply_to_image (line 75) | def apply_to_image(self, rgb_array: np.ndarray) -> np.ndarray: method clear (line 97) | def clear(self) -> None: method __len__ (line 101) | def __len__(self) -> int: method __contains__ (line 105) | def __contains__(self, original: Tuple[int, int, int]) -> bool: method get_all_replacements (line 110) | def get_all_replacements(self) -> Dict[Tuple[int, int, int], Tuple[int... method to_dict (line 119) | def to_dict(self) -> Dict: method from_dict (line 132) | def from_dict(cls, data: Dict) -> 'ColorReplacementManager': method _validate_color (line 150) | def _validate_color(color: Tuple[int, int, int]) -> Tuple[int, int, int]: method _color_to_hex (line 169) | def _color_to_hex(color: Tuple[int, int, int]) -> str: method _hex_to_color (line 174) | def _hex_to_color(hex_str: str) -> Tuple[int, int, int]: FILE: core/converter.py function extract_lut_available_colors (line 43) | def extract_lut_available_colors(lut_path: str) -> List[dict]: function get_lut_color_choices (line 99) | def get_lut_color_choices(lut_path: str) -> List[tuple]: function generate_lut_color_dropdown_html (line 126) | def generate_lut_color_dropdown_html(lut_path: str, selected_color: str ... function _compute_connected_region_mask_4n (line 151) | def _compute_connected_region_mask_4n(quantized_image, mask_solid, x, y): function _recommend_lut_colors_by_rgb (line 173) | def _recommend_lut_colors_by_rgb(base_rgb, lut_colors, top_k=10): function _ensure_quantized_image_in_cache (line 209) | def _ensure_quantized_image_in_cache(cache): function _rgb_to_hex (line 223) | def _rgb_to_hex(rgb): function _hex_to_rgb_tuple (line 229) | def _hex_to_rgb_tuple(hex_color): function _build_selection_meta (line 243) | def _build_selection_meta(q_rgb, m_rgb, scope="region"): function _resolve_highlight_mask (line 252) | def _resolve_highlight_mask(color_match, mask_solid, region_mask=None, s... function _normalize_color_replacements_input (line 259) | def _normalize_color_replacements_input(color_replacements): function _apply_region_replacement (line 291) | def _apply_region_replacement(image_rgb, region_mask, replacement_rgb): function _apply_regions_to_raster_outputs (line 298) | def _apply_regions_to_raster_outputs(matched_rgb, material_matrix, mask_... function _build_dual_recommendations (line 323) | def _build_dual_recommendations(q_rgb, m_rgb, lut_colors, top_k=10): function _resolve_click_selection_hexes (line 331) | def _resolve_click_selection_hexes(cache, default_hex): function extract_color_palette (line 349) | def extract_color_palette(preview_cache: dict) -> List[dict]: function _save_debug_preview (line 405) | def _save_debug_preview(debug_data, material_matrix, mask_solid, image_p... function _get_actual_lut_slot_colors (line 466) | def _get_actual_lut_slot_colors(processor) -> dict: function convert_image_to_3d (line 509) | def convert_image_to_3d(image_path, lut_path, target_width_mm, spacer_th... function _parse_outline_slot (line 1596) | def _parse_outline_slot(slot_str, num_materials): function _generate_outline_mesh (line 1613) | def _generate_outline_mesh(mask_solid, pixel_scale, outline_width_mm, ou... function _calculate_loop_info (line 1739) | def _calculate_loop_info(loop_pos, loop_width, loop_length, loop_hole, function _draw_loop_on_preview (line 1793) | def _draw_loop_on_preview(preview_rgba, loop_info, color_conf, pixel_sca... function calculate_luminance (line 1840) | def calculate_luminance(hex_color): function generate_auto_height_map (line 1866) | def generate_auto_height_map(color_list, mode, base_thickness, max_relie... function _build_relief_voxel_matrix (line 1954) | def _build_relief_voxel_matrix(matched_rgb, material_matrix, mask_solid,... function _build_cloisonne_voxel_matrix (line 2079) | def _build_cloisonne_voxel_matrix(material_matrix, mask_solid, mask_wire... function _build_voxel_matrix (line 2150) | def _build_voxel_matrix(material_matrix, mask_solid, spacer_thick, struc... function _build_voxel_matrix_6layer (line 2215) | def _build_voxel_matrix_6layer(material_matrix, mask_solid, spacer_thick... function _build_voxel_matrix_faceup (line 2238) | def _build_voxel_matrix_faceup(material_matrix, mask_solid, spacer_thick... function _create_bed_mesh (line 2280) | def _create_bed_mesh(bed_w_mm, bed_h_mm, is_dark=True): function _create_preview_mesh (line 2395) | def _create_preview_mesh(matched_rgb, mask_solid, total_layers, backing_... function generate_empty_bed_glb (line 2554) | def generate_empty_bed_glb(bed_w: int = None, bed_h: int = None, is_dark... function _merge_low_frequency_colors (line 2582) | def _merge_low_frequency_colors( function _build_color_voxel_mesh (line 2622) | def _build_color_voxel_mesh( function generate_segmented_glb (line 2693) | def generate_segmented_glb(cache: dict, max_meshes: int = 64) -> Optiona... function generate_realtime_glb (line 2883) | def generate_realtime_glb(cache): function generate_preview_cached (line 2949) | def generate_preview_cached(image_path, lut_path, target_width_mm, function render_preview (line 3059) | def render_preview(preview_rgba, loop_pos, loop_width, loop_length, function _draw_loop_on_canvas (line 3184) | def _draw_loop_on_canvas(pil_img, loop_pos, loop_width, loop_length, function on_preview_click (line 3250) | def on_preview_click(cache, loop_pos, evt: gr.SelectData, bed_label=None): function update_preview_with_loop (line 3307) | def update_preview_with_loop(cache, loop_pos, add_loop, function on_remove_loop (line 3329) | def on_remove_loop(): function generate_final_model (line 3334) | def generate_final_model(image_path, lut_path, target_width_mm, spacer_t... function update_preview_with_backing_color (line 3417) | def update_preview_with_backing_color(cache, backing_color_id: int): function update_preview_with_replacements (line 3540) | def update_preview_with_replacements(cache, replacement_regions=None, function generate_highlight_preview (line 3662) | def generate_highlight_preview(cache, highlight_color: str, function clear_highlight_preview (line 3802) | def clear_highlight_preview(cache, loop_pos=None, add_loop=False, function on_preview_click_select_color (line 3850) | def on_preview_click_select_color(cache, evt: gr.SelectData, bed_label=N... function generate_lut_grid_html (line 3953) | def generate_lut_grid_html(lut_path, lang: str = "zh"): function generate_lut_card_grid_html (line 4032) | def generate_lut_card_grid_html(lut_path, lang: str = "zh"): function _infer_4color_subtype (line 4142) | def _infer_4color_subtype(lut_path: str) -> str: function detect_lut_color_mode (line 4153) | def detect_lut_color_mode(lut_path): function detect_image_type (line 4252) | def detect_image_type(image_path): FILE: core/extractor.py function generate_simulated_reference (line 23) | def generate_simulated_reference(): function rotate_image (line 47) | def rotate_image(img, direction): function draw_corner_points (line 58) | def draw_corner_points(img, points, color_mode: str, page_choice: str | ... function apply_auto_white_balance (line 133) | def apply_auto_white_balance(img): function apply_brightness_correction (line 143) | def apply_brightness_correction(img): function run_extraction (line 163) | def run_extraction(img, points, offset_x, offset_y, zoom, barrel, wb, br... function probe_lut_cell (line 290) | def probe_lut_cell(lut_path, evt: gr.SelectData): function manual_fix_cell (line 327) | def manual_fix_cell(coord, color_input, lut_path=None): FILE: core/five_color_combination.py class ColorQueryResult (line 15) | class ColorQueryResult: class ColorCountDetector (line 24) | class ColorCountDetector: method detect_color_count (line 36) | def detect_color_count(lut_data: np.ndarray) -> Tuple[int, int]: class StackFileManager (line 59) | class StackFileManager: method find_stack_file (line 66) | def find_stack_file(color_count: int) -> Optional[str]: method validate_stack_format (line 83) | def validate_stack_format(stack_data: np.ndarray, color_count: int) ->... class StackLUTLoader (line 104) | class StackLUTLoader: method load_stack_lut (line 108) | def load_stack_lut(file_path: str) -> Tuple[bool, str, Optional[np.nda... method load_npz_file (line 140) | def load_npz_file(file_path: str) -> Tuple[bool, str, Optional[np.ndar... method load_lut_rgb (line 188) | def load_lut_rgb(file_path: str) -> Tuple[bool, str, Optional[np.ndarr... class ColorQueryEngine (line 223) | class ColorQueryEngine: method __init__ (line 226) | def __init__(self, stack_lut: Optional[np.ndarray], lut_rgb: np.ndarra... method query (line 262) | def query(self, selected_indices: List[int]) -> ColorQueryResult: method _query_with_stack (line 288) | def _query_with_stack(self, selected_indices: List[int]) -> ColorQuery... method _query_without_stack (line 312) | def _query_without_stack(self, selected_indices: List[int]) -> ColorQu... method get_base_colors (line 340) | def get_base_colors(self) -> List[Tuple[int, int, int]]: method get_color_names (line 348) | def get_color_names(self) -> List[str]: method reverse_selection (line 356) | def reverse_selection(self, selected_indices: List[int]) -> List[int]: function rgb_to_hex (line 369) | def rgb_to_hex(rgb: Tuple[int, int, int]) -> str: function format_selection_sequence (line 381) | def format_selection_sequence(selected_indices: List[int], color_names: ... function get_color_name_from_rgb (line 408) | def get_color_name_from_rgb(rgb: Tuple[int, int, int]) -> str: FILE: core/geometry_utils.py function create_keychain_loop (line 10) | def create_keychain_loop(width_mm, length_mm, hole_dia_mm, thickness_mm, function _connect_rings (line 144) | def _connect_rings(outer_indices, hole_indices, vertices_arr, is_top=True): FILE: core/heightmap_loader.py class HeightmapLoader (line 20) | class HeightmapLoader: method _to_grayscale (line 27) | def _to_grayscale(image: np.ndarray) -> np.ndarray: method _resize_to_target (line 57) | def _resize_to_target(grayscale: np.ndarray, target_w: int, target_h: ... method _map_grayscale_to_height (line 75) | def _map_grayscale_to_height( method _check_aspect_ratio (line 99) | def _check_aspect_ratio( method _check_contrast (line 124) | def _check_contrast(grayscale: np.ndarray) -> str | None: method load_and_validate (line 136) | def load_and_validate(heightmap_path: str) -> dict: method load_and_process (line 213) | def load_and_process( FILE: core/i18n.py class I18n (line 7) | class I18n: method get (line 1338) | def get(key: str, lang: str = 'zh') -> str: method get_all (line 1354) | def get_all(lang: str = 'zh') -> dict: FILE: core/image_preprocessor.py class CropRegion (line 28) | class CropRegion: method to_tuple (line 35) | def to_tuple(self) -> Tuple[int, int, int, int]: method clamp (line 39) | def clamp(self, img_width: int, img_height: int) -> 'CropRegion': class ImageInfo (line 49) | class ImageInfo: class ImagePreprocessor (line 59) | class ImagePreprocessor: method detect_format (line 71) | def detect_format(image_path: str) -> str: method get_image_dimensions (line 112) | def get_image_dimensions(image_path: str) -> Tuple[int, int]: method convert_to_png (line 135) | def convert_to_png(image_path: str, output_path: Optional[str] = None)... method crop_image (line 177) | def crop_image(image_path: str, x: int, y: int, method validate_crop_region (line 238) | def validate_crop_region(img_width: int, img_height: int, method process_upload (line 260) | def process_upload(cls, image_path: str) -> ImageInfo: method analyze_recommended_colors (line 298) | def analyze_recommended_colors(image_path: str, target_width_mm: float... FILE: core/image_processing.py class LuminaImageProcessor (line 36) | class LuminaImageProcessor: method _rgb_to_lab (line 44) | def _rgb_to_lab(rgb_array): method __init__ (line 64) | def __init__(self, lut_path, color_mode, hue_weight: float = 0.0): method _load_svg (line 89) | def _load_svg(self, svg_path, target_width_mm, pixels_per_mm: float = ... method _load_lut (line 218) | def _load_lut(self, lut_path): method process_image (line 489) | def process_image(self, image_path, target_width_mm, modeling_mode, method _process_high_fidelity_mode (line 654) | def _process_high_fidelity_mode(self, rgb_arr, target_h, target_w, qua... method _process_pixel_mode (line 872) | def _process_pixel_mode(self, rgb_arr, target_h, target_w): method _extract_wireframe_mask (line 897) | def _extract_wireframe_mask(self, rgb_arr, target_w, pixel_scale, wire... FILE: core/isolated_pixel_cleanup.py function _encode_stacks (line 17) | def _encode_stacks(material_matrix: np.ndarray, base: int) -> np.ndarray: function _detect_isolated (line 39) | def _detect_isolated(encoded: np.ndarray) -> np.ndarray: function _find_neighbor_mode (line 96) | def _find_neighbor_mode(encoded: np.ndarray, isolated_mask: np.ndarray) ... function cleanup_isolated_pixels (line 135) | def cleanup_isolated_pixels( FILE: core/lut_merger.py function _detect_mode_by_size (line 47) | def _detect_mode_by_size(count): function _detect_4color_subtype (line 91) | def _detect_4color_subtype(lut_path): function _detect_6color_subtype (line 103) | def _detect_6color_subtype(lut_path): function _remap_stacks (line 115) | def _remap_stacks(stacks, color_mode, lut_path=None): class LUTMerger (line 149) | class LUTMerger: method detect_color_mode (line 153) | def detect_color_mode(lut_path: str): method validate_compatibility (line 184) | def validate_compatibility(modes): method load_lut_with_stacks (line 224) | def load_lut_with_stacks(lut_path: str, color_mode: str): method merge_luts (line 347) | def merge_luts(lut_entries, dedup_threshold=3.0): method save_merged_lut (line 439) | def save_merged_lut(rgb, stacks, output_path): FILE: core/mesh_generators.py function _greedy_rect_numba (line 39) | def _greedy_rect_numba(mask): function _greedy_rect_numba (line 80) | def _greedy_rect_numba(mask): class BaseMesher (line 84) | class BaseMesher(ABC): method generate_mesh (line 88) | def generate_mesh(self, voxel_matrix, mat_id, height_px): method generate_backing_mesh (line 102) | def generate_backing_mesh(self, voxel_matrix, height_px): class VoxelMesher (line 116) | class VoxelMesher(BaseMesher): method generate_mesh (line 124) | def generate_mesh(self, voxel_matrix, mat_id, height_px): class HighFidelityMesher (line 177) | class HighFidelityMesher(BaseMesher): method generate_mesh (line 198) | def generate_mesh(self, voxel_matrix, mat_id, height_px): method _greedy_rect_merge (line 300) | def _greedy_rect_merge(self, mask, height_px): method _merge_layers_with_dilation (line 378) | def _merge_layers_with_dilation(self, voxel_matrix, mat_id): function get_mesher (line 427) | def get_mesher(mode_name: ModelingMode): FILE: core/naming.py function _get_timestamp (line 38) | def _get_timestamp() -> str: function _sanitize (line 43) | def _sanitize(name: str) -> str: function _strip_temp_prefix (line 55) | def _strip_temp_prefix(name: str) -> str: function generate_model_filename (line 60) | def generate_model_filename( function generate_preview_filename (line 81) | def generate_preview_filename( function generate_calibration_filename (line 96) | def generate_calibration_filename( function generate_batch_filename (line 113) | def generate_batch_filename( function parse_filename (line 146) | def parse_filename(filename: str) -> Optional[Dict[str, str]]: FILE: core/slicer.py class DetectedSlicer (line 32) | class DetectedSlicer: function _match_slicer_id (line 43) | def _match_slicer_id(display_name: str) -> tuple[str, str] | None: function _extract_exe_from_icon (line 59) | def _extract_exe_from_icon(icon_value: str) -> str | None: function _find_exe_in_directory (line 77) | def _find_exe_in_directory(directory: str) -> str | None: function scan_registry (line 89) | def scan_registry() -> list[DetectedSlicer]: function detect_installed_slicers (line 176) | def detect_installed_slicers() -> list[DetectedSlicer]: function launch_slicer (line 191) | def launch_slicer( FILE: core/tray.py class LuminaTray (line 21) | class LuminaTray: method __init__ (line 22) | def __init__(self, port=7860): method _get_system_language (line 28) | def _get_system_language(self): method _get_text (line 38) | def _get_text(self, key): method open_browser (line 56) | def open_browser(self, icon=None, item=None): method open_github (line 60) | def open_github(self, icon=None, item=None): method exit_app (line 64) | def exit_app(self, icon=None, item=None): method setup_tray (line 72) | def setup_tray(self): method run (line 130) | def run(self): FILE: core/vector_engine.py function _get_image_processor_class (line 37) | def _get_image_processor_class(): class VectorProcessor (line 45) | class VectorProcessor: method __init__ (line 59) | def __init__(self, lut_path: str, color_mode: str): method svg_to_mesh (line 72) | def svg_to_mesh( method _clip_occlusion (line 308) | def _clip_occlusion(shape_data, return_silhouette=False): method _match_colors (line 394) | def _match_colors(self, clipped_shapes, replacement_manager, num_chann... method _build_channel_runs (line 458) | def _build_channel_runs(recipe, layers_to_use, num_channels): method _run_length_extrude (line 481) | def _run_length_extrude(matched_shapes, num_layers, layer_h, method _add_double_sided_layers (line 534) | def _add_double_sided_layers(matched_shapes, num_layers, layer_h, method _parse_svg (line 575) | def _parse_svg(self, svg_path: str, target_width_mm: float): method _extrude_geometry (line 729) | def _extrude_geometry(geometry, height, z_offset, scale, extrude_cache... method _fix_coordinates (line 771) | def _fix_coordinates(mesh, svg_height_mm): FILE: frontend/scripts/generate-test-glb.mjs function buildGlb (line 12) | function buildGlb() { FILE: frontend/src/App.tsx type ErrorBoundaryProps (line 24) | interface ErrorBoundaryProps { type ErrorBoundaryState (line 29) | interface ErrorBoundaryState { class SceneErrorBoundary (line 33) | class SceneErrorBoundary extends Component = { function AppContent (line 107) | function AppContent() { function App (line 212) | function App() { FILE: frontend/src/__tests__/LutColorGrid.test.ts function entry (line 6) | function entry(hex: string, rgb: [number, number, number]): LutColorEntry { FILE: frontend/src/__tests__/action-bar-always-visible.property.test.ts function computeIsDisabled (line 20) | function computeIsDisabled( FILE: frontend/src/__tests__/autoPreview.test.ts function fakeFile (line 7) | function fakeFile(name = "test.png"): File { FILE: frontend/src/__tests__/bed-size-selector.property.test.ts function resetStore (line 8) | function resetStore(): void { FILE: frontend/src/__tests__/calibration-store.property.test.ts function snapshotCalibrationState (line 75) | function snapshotCalibrationState() { function snapshotConverterState (line 92) | function snapshotConverterState() { FILE: frontend/src/__tests__/colorRemap.property.test.ts function resetRemapState (line 16) | function resetRemapState(): void { FILE: frontend/src/__tests__/converter-store.property.test.ts constant NUMERIC_FIELDS (line 12) | const NUMERIC_FIELDS = [ constant ISOLATED_NUMERIC_FIELDS (line 29) | const ISOLATED_NUMERIC_FIELDS = NUMERIC_FIELDS.filter( function resetStore (line 34) | function resetStore(): void { FILE: frontend/src/__tests__/extractor-5color.property.test.ts constant DEFAULT_STATE (line 42) | const DEFAULT_STATE: Partial = { function resetStore (line 72) | function resetStore(): void { function mockExtractResponse (line 77) | function mockExtractResponse(): ExtractResponse { FILE: frontend/src/__tests__/extractor-api.property.test.ts function resetExtractorStore (line 30) | function resetExtractorStore(): void { FILE: frontend/src/__tests__/extractor-canvas.test.tsx method fillStyle (line 27) | set fillStyle(_v: string) {} method strokeStyle (line 28) | set strokeStyle(_v: string) {} method lineWidth (line 29) | set lineWidth(_v: number) {} method font (line 30) | set font(_v: string) {} method textAlign (line 31) | set textAlign(_v: string) {} method textBaseline (line 32) | set textBaseline(_v: string) {} class MockImage (line 37) | class MockImage { method src (line 42) | get src() { method src (line 45) | set src(val: string) { function resetExtractorStore (line 55) | function resetExtractorStore(): void { FILE: frontend/src/__tests__/extractor-panel.test.tsx class MockImage (line 18) | class MockImage { method src (line 23) | get src() { method src (line 26) | set src(val: string) { function resetExtractorStore (line 41) | function resetExtractorStore(): void { FILE: frontend/src/__tests__/extractor-store.property.test.ts function resetExtractorStore (line 26) | function resetExtractorStore(): void { function snapshotExtractorState (line 53) | function snapshotExtractorState() { function snapshotConverterState (line 81) | function snapshotConverterState() { function snapshotCalibrationState (line 120) | function snapshotCalibrationState() { FILE: frontend/src/__tests__/five-color-store.property.test.ts constant DEFAULT_STATE (line 19) | const DEFAULT_STATE: Partial = { function resetStore (line 28) | function resetStore() { FILE: frontend/src/__tests__/lut-manager-store.property.test.ts constant COLOR_MODES (line 8) | const COLOR_MODES = [ constant PRIMARY_MODES (line 17) | const PRIMARY_MODES = ["6-Color", "8-Color"] as const; constant ALLOWED_SECONDARY (line 19) | const ALLOWED_SECONDARY: Record = { FILE: frontend/src/__tests__/lutColorFilter.property.test.ts constant VALID_HUE_CATEGORIES (line 54) | const VALID_HUE_CATEGORIES: HueCategory[] = [ FILE: frontend/src/__tests__/paletteLutMerge.test.tsx function renderWithI18n (line 48) | function renderWithI18n(ui: React.ReactElement) { FILE: frontend/src/__tests__/paletteOptimization.test.tsx constant PALETTE (line 18) | const PALETTE: PaletteEntry[] = [ constant LUT_COLORS (line 24) | const LUT_COLORS: LutColorEntry[] = [ function resetStore (line 40) | function resetStore() { function importLutColorGrid (line 61) | async function importLutColorGrid() { function importPalettePanel (line 66) | async function importPalettePanel() { FILE: frontend/src/__tests__/realtimePreview.property.test.ts type MutualExclusionOp (line 146) | type MutualExclusionOp = "relief" | "cloisonne"; function resetMutualExclusionState (line 155) | function resetMutualExclusionState(): void { FILE: frontend/src/__tests__/reliefHeight.property.test.ts function resetReliefState (line 44) | function resetReliefState(palette: PaletteEntry[] = []): void { function computeMeshScaleZ (line 58) | function computeMeshScaleZ(heightMm: number, baseHeight: number): number { FILE: frontend/src/__tests__/replace-preview.property.test.ts method src (line 37) | set src(_: string) { constant DEFAULT_STATE (line 46) | const DEFAULT_STATE: Partial = { function resetStore (line 66) | function resetStore(): void { FILE: frontend/src/__tests__/settings-store.property.test.ts function resetStore (line 8) | function resetStore() { FILE: frontend/src/__tests__/slicer.property.test.ts function mapThreemfDiskPath (line 16) | function mapThreemfDiskPath( function mapDownloadUrl (line 26) | function mapDownloadUrl(download_url: string | null | undefined): string... function seedThreemfPath (line 115) | function seedThreemfPath() { function expectInvalidated (line 123) | function expectInvalidated() { function resolveSelectedSlicerId (line 382) | function resolveSelectedSlicerId( FILE: frontend/src/__tests__/stack-positions-nonoverlap.property.test.ts constant ALL_WIDGET_IDS (line 24) | const ALL_WIDGET_IDS: WidgetId[] = [ function assertNoOverlap (line 122) | function assertNoOverlap( FILE: frontend/src/__tests__/tab-filter.property.test.ts constant ALL_TAB_IDS (line 19) | const ALL_TAB_IDS: TabId[] = ['converter', 'calibration', 'extractor', '... FILE: frontend/src/__tests__/tab-switch-layout.property.test.ts constant ALL_TAB_IDS (line 19) | const ALL_TAB_IDS: TabId[] = ['converter', 'calibration', 'extractor', '... constant ALL_WIDGET_IDS (line 22) | const ALL_WIDGET_IDS: WidgetId[] = [ FILE: frontend/src/__tests__/theme.property.test.ts constant STRING_FIELDS (line 11) | const STRING_FIELDS: (keyof ThemeColors)[] = [ constant NUMBER_FIELDS (line 21) | const NUMBER_FIELDS: (keyof ThemeColors)[] = [ constant ALL_FIELDS (line 26) | const ALL_FIELDS = [...STRING_FIELDS, ...NUMBER_FIELDS]; FILE: frontend/src/__tests__/widget-workspace.test.tsx function renderWithI18n (line 13) | function renderWithI18n(ui: React.ReactElement) { FILE: frontend/src/api/calibration.ts function calibrationGenerate (line 5) | async function calibrationGenerate( FILE: frontend/src/api/converter.ts function convertPreview (line 17) | async function convertPreview( function convertGenerate (line 36) | async function convertGenerate( function fetchLutList (line 49) | async function fetchLutList(): Promise { function getFileUrl (line 57) | function getFileUrl(fileId: string): string { function fetchBedSizes (line 62) | async function fetchBedSizes(): Promise { function fetchBedPreview (line 68) | async function fetchBedPreview(bedLabel: string): Promise { function uploadHeightmap (line 77) | async function uploadHeightmap( function fetchLutColors (line 94) | async function fetchLutColors( type CropResponse (line 105) | interface CropResponse { function cropImage (line 114) | async function cropImage( function convertBatch (line 132) | async function convertBatch( function replaceColor (line 153) | async function replaceColor( FILE: frontend/src/api/extractor.ts function extractColors (line 5) | async function extractColors( function manualFixCell (line 40) | async function manualFixCell( function mergeEightColor (line 53) | async function mergeEightColor(): Promise { function mergeFiveColorExtended (line 63) | async function mergeFiveColorExtended(): Promise { FILE: frontend/src/api/fiveColor.ts function fetchBaseColors (line 5) | async function fetchBaseColors(lutName: string): Promise { function launchSlicer (line 15) | async function launchSlicer( FILE: frontend/src/api/system.ts function clearCache (line 11) | async function clearCache(): Promise { function getSettings (line 19) | async function getSettings(): Promise { function saveSettings (line 25) | async function saveSettings(settings: UserSettings): Promise { FILE: frontend/src/api/types.ts type HealthResponse (line 1) | interface HealthResponse { type ColorMode (line 9) | enum ColorMode { type ModelingMode (line 19) | enum ModelingMode { type StructureMode (line 25) | enum StructureMode { type ConvertPreviewRequest (line 32) | interface ConvertPreviewRequest { type ConvertGenerateRequest (line 45) | interface ConvertGenerateRequest extends ConvertPreviewRequest { type ColorReplacementItem (line 69) | interface ColorReplacementItem { type PaletteEntry (line 78) | interface PaletteEntry { type AutoHeightMode (line 86) | type AutoHeightMode = type HeightmapUploadResponse (line 92) | interface HeightmapUploadResponse { type PreviewResponse (line 104) | interface PreviewResponse { type GenerateResponse (line 116) | interface GenerateResponse { type LutListResponse (line 124) | interface LutListResponse { type LutInfo (line 128) | interface LutInfo { type BedSizeItem (line 134) | interface BedSizeItem { type BedSizeListResponse (line 141) | interface BedSizeListResponse { type CalibrationColorMode (line 147) | enum CalibrationColorMode { type BackingColor (line 157) | enum BackingColor { type CalibrationGenerateRequest (line 168) | interface CalibrationGenerateRequest { type CalibrationResponse (line 177) | interface CalibrationResponse { type ExtractorColorMode (line 186) | enum ExtractorColorMode { type ExtractorPage (line 196) | enum ExtractorPage { type ExtractResponse (line 203) | interface ExtractResponse { type ManualFixResponse (line 212) | interface ManualFixResponse { type LutInfoResponse (line 220) | interface LutInfoResponse { type MergeStats (line 226) | interface MergeStats { type MergeRequest (line 233) | interface MergeRequest { type MergeResponse (line 239) | interface MergeResponse { type ClearCacheResponse (line 248) | interface ClearCacheResponse { type LutColorEntry (line 262) | interface LutColorEntry { type LutColorsResponse (line 267) | interface LutColorsResponse { type SlicerInfo (line 275) | interface SlicerInfo { type SlicerDetectResponse (line 281) | interface SlicerDetectResponse { type SlicerLaunchRequest (line 285) | interface SlicerLaunchRequest { type SlicerLaunchResponse (line 290) | interface SlicerLaunchResponse { type BatchItemResult (line 297) | interface BatchItemResult { type BatchResponse (line 303) | interface BatchResponse { type BatchConvertParams (line 310) | interface BatchConvertParams { type BaseColorEntry (line 326) | interface BaseColorEntry { type BaseColorsResponse (line 333) | interface BaseColorsResponse { type FiveColorQueryRequest (line 339) | interface FiveColorQueryRequest { type FiveColorQueryResponse (line 344) | interface FiveColorQueryResponse { type ColorReplaceResponse (line 355) | interface ColorReplaceResponse { type UserSettings (line 364) | interface UserSettings { type UserSettingsResponse (line 373) | interface UserSettingsResponse { type SaveSettingsResponse (line 378) | interface SaveSettingsResponse { type StatsResponse (line 383) | interface StatsResponse { FILE: frontend/src/components/AboutView.tsx function AboutView (line 5) | function AboutView() { FILE: frontend/src/components/BedPlatform.tsx function createBedTexture (line 13) | function createBedTexture( function createRoundedBedGeometry (line 89) | function createRoundedBedGeometry( function BedPlatform (line 124) | function BedPlatform() { FILE: frontend/src/components/CalibrationPanel.tsx function CalibrationPanel (line 18) | function CalibrationPanel() { FILE: frontend/src/components/ExtractorCanvas.tsx constant CORNER_LABELS (line 8) | const CORNER_LABELS: Record = { function canvasClickToImageCoord (line 38) | function canvasClickToImageCoord( constant MARKER_RADIUS (line 54) | const MARKER_RADIUS = 8; constant MARKER_FONT (line 55) | const MARKER_FONT = "bold 12px sans-serif"; constant MARKER_FILL (line 56) | const MARKER_FILL = "rgba(255, 50, 50, 0.85)"; constant MARKER_STROKE (line 57) | const MARKER_STROKE = "#ffffff"; constant MARKER_TEXT_COLOR (line 58) | const MARKER_TEXT_COLOR = "#ffffff"; function drawCanvas (line 62) | function drawCanvas( constant LUT_GRID_SIZE (line 97) | const LUT_GRID_SIZE: Record = { function ExtractorCanvas (line 107) | function ExtractorCanvas() { FILE: frontend/src/components/ExtractorPanel.tsx function ExtractorPanel (line 20) | function ExtractorPanel() { FILE: frontend/src/components/FiveColorCanvas.tsx type SliceColor (line 8) | interface SliceColor { type FiveColorCanvasProps (line 13) | interface FiveColorCanvasProps { constant SLICE_W (line 23) | const SLICE_W = 160; constant SLICE_H (line 24) | const SLICE_H = 24; constant SLICE_SKEW (line 25) | const SLICE_SKEW = 20; constant SLICE_GAP (line 26) | const SLICE_GAP = 6; constant CORNER_R (line 27) | const CORNER_R = 6; function drawSlice (line 30) | function drawSlice( function drawResultCircle (line 84) | function drawResultCircle( function FiveColorCanvas (line 114) | function FiveColorCanvas({ slices, resultHex, isLoading }: FiveColorCanv... FILE: frontend/src/components/FiveColorQueryPanel.tsx function FiveColorQueryPanel (line 8) | function FiveColorQueryPanel() { FILE: frontend/src/components/InteractiveModelViewer.tsx function extractHexFromMeshName (line 16) | function extractHexFromMeshName(meshName: string): string { function toggleColorSelection (line 28) | function toggleColorSelection( type InteractiveModelViewerProps (line 37) | interface InteractiveModelViewerProps { constant COLOR_LAYER_HEIGHT (line 52) | const COLOR_LAYER_HEIGHT = 0.4; function InteractiveModelViewer (line 54) | function InteractiveModelViewer({ FILE: frontend/src/components/KeychainRing3D.tsx constant EXTRUDE_DEPTH (line 13) | const EXTRUDE_DEPTH = 1.2; constant TOP_OFFSET (line 16) | const TOP_OFFSET = 0.1; constant HOLE_SEGMENTS (line 19) | const HOLE_SEGMENTS = 32; type KeychainRing3DProps (line 21) | interface KeychainRing3DProps { function createKeychainRingGeometry (line 44) | function createKeychainRingGeometry( function KeychainRing3D (line 85) | function KeychainRing3D({ FILE: frontend/src/components/LanguageToggle.tsx function LanguageToggle (line 4) | function LanguageToggle() { FILE: frontend/src/components/LoadingSpinner.tsx function LoadingSpinner (line 1) | function LoadingSpinner() { FILE: frontend/src/components/LutManagerPanel.tsx function LutManagerPanel (line 8) | function LutManagerPanel() { FILE: frontend/src/components/ModelViewer.tsx function computeCenterOffset (line 10) | function computeCenterOffset( function computeFitDistance (line 25) | function computeFitDistance( type ModelViewerProps (line 33) | interface ModelViewerProps { function ModelViewer (line 37) | function ModelViewer({ url }: ModelViewerProps) { FILE: frontend/src/components/Scene3D.tsx type Scene3DProps (line 15) | interface Scene3DProps { function ScreenshotHelper (line 23) | function ScreenshotHelper({ function CameraDebugHelper (line 40) | function CameraDebugHelper() { function ThemeUpdater (line 63) | function ThemeUpdater() { function Scene3D (line 72) | function Scene3D({ modelUrl }: Scene3DProps) { FILE: frontend/src/components/ThemeToggle.tsx function ThemeToggle (line 5) | function ThemeToggle() { FILE: frontend/src/components/__tests__/ActionBar.batch.test.tsx function makeFile (line 15) | function makeFile(name: string, type = "image/png"): File { FILE: frontend/src/components/__tests__/BasicSettings.batch.test.tsx function makeFile (line 29) | function makeFile(name: string, type = "image/png"): File { FILE: frontend/src/components/__tests__/BatchFileUploader.test.tsx function makeFile (line 5) | function makeFile(name: string): File { FILE: frontend/src/components/lightingConfig.ts constant LIGHTING_CONFIG (line 4) | const LIGHTING_CONFIG = { type LightingConfig (line 26) | type LightingConfig = typeof LIGHTING_CONFIG; FILE: frontend/src/components/sections/ActionBar.tsx function ActionBar (line 9) | function ActionBar() { FILE: frontend/src/components/sections/AdvancedSettings.tsx function AdvancedSettings (line 6) | function AdvancedSettings() { FILE: frontend/src/components/sections/BasicSettings.tsx function BasicSettings (line 18) | function BasicSettings() { FILE: frontend/src/components/sections/BedSizeSelector.tsx function BedSizeSelector (line 5) | function BedSizeSelector() { FILE: frontend/src/components/sections/CloisonneSettings.tsx function CloisonneSettings (line 7) | function CloisonneSettings() { FILE: frontend/src/components/sections/CoatingSettings.tsx function CoatingSettings (line 6) | function CoatingSettings() { FILE: frontend/src/components/sections/KeychainLoopSettings.tsx function KeychainLoopSettings (line 6) | function KeychainLoopSettings() { FILE: frontend/src/components/sections/LutColorGrid.tsx type HueCategory (line 7) | type HueCategory = function classifyHue (line 21) | function classifyHue(r: number, g: number, b: number): HueCategory { function matchesSearch (line 55) | function matchesSearch(entry: LutColorEntry, query: string): boolean { function loadFavorites (line 71) | function loadFavorites(lutKey: string): Set { function saveFavorites (line 78) | function saveFavorites(lutKey: string, favs: Set) { function ColorSwatch (line 86) | function ColorSwatch({ function ColorSection (line 128) | function ColorSection({ function LutColorGrid (line 177) | function LutColorGrid() { FILE: frontend/src/components/sections/OutlineSettings.tsx function OutlineSettings (line 7) | function OutlineSettings() { FILE: frontend/src/components/sections/PalettePanel.tsx type PaletteItemProps (line 9) | interface PaletteItemProps { function PaletteItem (line 20) | function PaletteItem({ type ColorBlockProps (line 120) | interface ColorBlockProps { function ColorBlock (line 125) | function ColorBlock({ label, hex }: ColorBlockProps) { type SelectedColorDetailProps (line 140) | interface SelectedColorDetailProps { function SelectedColorDetail (line 145) | function SelectedColorDetail({ entry, remappedHex }: SelectedColorDetail... function PalettePanel (line 158) | function PalettePanel() { FILE: frontend/src/components/sections/ReliefSettings.tsx function ReliefSettings (line 11) | function ReliefSettings() { FILE: frontend/src/components/sections/SlicerSelector.tsx type SlicerBrandStyle (line 7) | interface SlicerBrandStyle { constant DEFAULT_BRAND_STYLE (line 14) | const DEFAULT_BRAND_STYLE: SlicerBrandStyle = { constant SLICER_BRAND_COLORS (line 24) | const SLICER_BRAND_COLORS: Record = { function getSlicerBrandStyle (line 39) | function getSlicerBrandStyle(slicerId: string): SlicerBrandStyle { function getButtonLabel (line 54) | function getButtonLabel( type SlicerSelectorProps (line 68) | interface SlicerSelectorProps { function SlicerSelector (line 75) | function SlicerSelector({ FILE: frontend/src/components/themeConfig.ts type ThemeColors (line 10) | interface ThemeColors { constant THEME_CONFIG (line 35) | const THEME_CONFIG: Record<"light" | "dark", ThemeColors> = { FILE: frontend/src/components/ui/Accordion.tsx type AccordionProps (line 3) | interface AccordionProps { function Accordion (line 9) | function Accordion({ FILE: frontend/src/components/ui/BatchFileUploader.tsx type BatchFileUploaderProps (line 4) | interface BatchFileUploaderProps { function BatchFileUploader (line 11) | function BatchFileUploader({ FILE: frontend/src/components/ui/BatchResultSummary.tsx type BatchResultSummaryProps (line 4) | interface BatchResultSummaryProps { function BatchResultSummary (line 8) | function BatchResultSummary({ result }: BatchResultSummaryProps) { FILE: frontend/src/components/ui/Button.tsx type ButtonProps (line 1) | interface ButtonProps { function Button (line 9) | function Button({ FILE: frontend/src/components/ui/Checkbox.tsx type CheckboxProps (line 1) | interface CheckboxProps { function Checkbox (line 8) | function Checkbox({ FILE: frontend/src/components/ui/ColorModeBadge.tsx type ColorModeBadgeProps (line 1) | interface ColorModeBadgeProps { constant DOTS_RYBW (line 6) | const DOTS_RYBW = ["#DC143C", "#FFE600", "#0064F0", "#F0F0F0"]; constant DOTS_CMYW (line 7) | const DOTS_CMYW = ["#00FFFF", "#FF00FF", "#FFFF00", "#F0F0F0"]; constant DOTS_RYBWGK (line 8) | const DOTS_RYBWGK = ["#00AE42", "#111111", "#DC143C", "#FFE600", "#0064... constant DOTS_CMYWGK (line 9) | const DOTS_CMYWGK = ["#00AE42", "#111111", "#00FFFF", "#FF00FF", "#FFFF... constant DOTS_8COLOR (line 10) | const DOTS_8COLOR = ["#C12E1F", "#FFFF00", "#0064F0", "#FF00FF", "#00FF... constant DOTS_BW (line 11) | const DOTS_BW = ["#F0F0F0", "#111111"]; constant DOTS_5COLOR (line 12) | const DOTS_5COLOR = ["#DC143C", "#FFE600", "#0064F0", "#F0F0F0", "#1111... type BadgeInfo (line 14) | interface BadgeInfo { function resolveBadge (line 19) | function resolveBadge(mode: string): BadgeInfo { function Dot (line 32) | function Dot({ color }: { color: string }) { function RainbowDot (line 44) | function RainbowDot() { function ColorModeBadge (line 56) | function ColorModeBadge({ mode }: ColorModeBadgeProps) { FILE: frontend/src/components/ui/CropModal.tsx type CropData (line 11) | interface CropData { type CropModalProps (line 18) | interface CropModalProps { type AspectRatioPreset (line 29) | interface AspectRatioPreset { constant ASPECT_RATIO_PRESETS (line 34) | const ASPECT_RATIO_PRESETS: AspectRatioPreset[] = [ function CropModal (line 46) | function CropModal({ FILE: frontend/src/components/ui/Dropdown.tsx type DropdownProps (line 3) | interface DropdownProps { function Dropdown (line 12) | function Dropdown({ FILE: frontend/src/components/ui/FullScreenModal.tsx type FullScreenModalProps (line 10) | interface FullScreenModalProps { function FullScreenModal (line 17) | function FullScreenModal({ open, title, onClose, children }: FullScreenM... FILE: frontend/src/components/ui/ImageUpload.tsx type ImageUploadProps (line 4) | interface ImageUploadProps { function ImageUpload (line 10) | function ImageUpload({ FILE: frontend/src/components/ui/RadioGroup.tsx type RadioGroupProps (line 3) | interface RadioGroupProps { function RadioGroup (line 11) | function RadioGroup({ FILE: frontend/src/components/ui/Slider.tsx type SliderProps (line 3) | interface SliderProps { function Slider (line 14) | function Slider({ FILE: frontend/src/components/ui/ZoomableImage.tsx function clampScale (line 5) | function clampScale(value: number): number { function computeZoomTranslate (line 14) | function computeZoomTranslate( type ZoomableImageProps (line 27) | interface ZoomableImageProps { function ZoomableImage (line 33) | function ZoomableImage({ src, alt, className }: ZoomableImageProps) { FILE: frontend/src/components/widget/ActionBarWidgetContent.tsx function ActionBarWidgetContent (line 8) | function ActionBarWidgetContent() { FILE: frontend/src/components/widget/AdvancedSettingsWidgetContent.tsx function AdvancedSettingsWidgetContent (line 8) | function AdvancedSettingsWidgetContent() { FILE: frontend/src/components/widget/BasicSettingsWidgetContent.tsx function BasicSettingsWidgetContent (line 8) | function BasicSettingsWidgetContent() { FILE: frontend/src/components/widget/CalibrationWidgetContent.tsx function CalibrationWidgetContent (line 8) | function CalibrationWidgetContent() { FILE: frontend/src/components/widget/CloisonneSettingsWidgetContent.tsx function CloisonneSettingsWidgetContent (line 8) | function CloisonneSettingsWidgetContent() { FILE: frontend/src/components/widget/CoatingSettingsWidgetContent.tsx function CoatingSettingsWidgetContent (line 8) | function CoatingSettingsWidgetContent() { FILE: frontend/src/components/widget/ColorWorkstation.tsx constant TITLE_BAR_HEIGHT (line 19) | const TITLE_BAR_HEIGHT = 32; function ChevronUp (line 22) | function ChevronUp() { function ChevronDown (line 31) | function ChevronDown() { function ColorWorkstation (line 39) | function ColorWorkstation() { FILE: frontend/src/components/widget/ExtractorWidgetContent.tsx function ExtractorWidgetContent (line 8) | function ExtractorWidgetContent() { FILE: frontend/src/components/widget/FiveColorWidgetContent.tsx function FiveColorWidgetContent (line 8) | function FiveColorWidgetContent() { FILE: frontend/src/components/widget/KeychainLoopWidgetContent.tsx function KeychainLoopWidgetContent (line 8) | function KeychainLoopWidgetContent() { FILE: frontend/src/components/widget/LutManagerWidgetContent.tsx function LutManagerWidgetContent (line 8) | function LutManagerWidgetContent() { FILE: frontend/src/components/widget/OutlineSettingsWidgetContent.tsx function OutlineSettingsWidgetContent (line 8) | function OutlineSettingsWidgetContent() { FILE: frontend/src/components/widget/ReliefSettingsWidgetContent.tsx function ReliefSettingsWidgetContent (line 8) | function ReliefSettingsWidgetContent() { FILE: frontend/src/components/widget/SnapGuides.tsx type SnapGuidesProps (line 12) | interface SnapGuidesProps { function SnapGuides (line 18) | function SnapGuides({ isDraggingRef, dragPositionRef, containerRef }: Sn... FILE: frontend/src/components/widget/TabNavBar.tsx type TabNavBarProps (line 8) | interface TabNavBarProps { constant TAB_LIST (line 14) | const TAB_LIST: { id: TabId; titleKey: string }[] = [ function TabNavBar (line 22) | function TabNavBar({ activeTab, modalTab, onTabChange }: TabNavBarProps) { FILE: frontend/src/components/widget/WidgetHeader.tsx type WidgetHeaderProps (line 10) | interface WidgetHeaderProps { function WidgetHeader (line 19) | function WidgetHeader({ FILE: frontend/src/components/widget/WidgetPanel.tsx type ErrorBoundaryProps (line 24) | interface ErrorBoundaryProps { type ErrorBoundaryState (line 29) | interface ErrorBoundaryState { class WidgetErrorBoundary (line 33) | class WidgetErrorBoundary extends Component void }) { type WidgetPanelProps (line 67) | interface WidgetPanelProps { constant TRANSITION_CONFIG (line 80) | const TRANSITION_CONFIG = { FILE: frontend/src/components/widget/WidgetWorkspace.tsx constant WIDGET_CONTENT_MAP (line 52) | const WIDGET_CONTENT_MAP: Record = { type WidgetWorkspaceProps (line 67) | interface WidgetWorkspaceProps { function WidgetWorkspace (line 71) | function WidgetWorkspace({ children }: WidgetWorkspaceProps) { FILE: frontend/src/hooks/useActiveModelUrl.ts function useActiveModelUrl (line 11) | function useActiveModelUrl( FILE: frontend/src/hooks/useAutoPreview.ts function useAutoPreview (line 12) | function useAutoPreview(): void { FILE: frontend/src/hooks/useConverterDataInit.ts function useConverterDataInit (line 11) | function useConverterDataInit() { FILE: frontend/src/hooks/useThemeConfig.ts function useThemeConfig (line 14) | function useThemeConfig(): ThemeColors { FILE: frontend/src/i18n/context.tsx type I18nContextValue (line 6) | interface I18nContextValue { function I18nProvider (line 16) | function I18nProvider({ children }: { children: ReactNode }) { function useI18n (line 34) | function useI18n(): I18nContextValue { FILE: frontend/src/setupTests.ts method observe (line 7) | observe() {} method unobserve (line 8) | unobserve() {} method disconnect (line 9) | disconnect() {} FILE: frontend/src/stores/__tests__/batchStore.property.test.ts constant VALID_MIME_TYPES (line 8) | const VALID_MIME_TYPES = ["image/jpeg", "image/png", "image/svg+xml"] as... constant INVALID_MIME_TYPES (line 10) | const INVALID_MIME_TYPES = [ function resetStore (line 60) | function resetStore(): void { FILE: frontend/src/stores/__tests__/batchStore.test.ts function resetStore (line 28) | function resetStore(): void { FILE: frontend/src/stores/__tests__/converterStore.property.test.ts type ApplyOp (line 33) | type ApplyOp = { type: 'apply'; origHex: string; newHex: string }; type UndoOp (line 34) | type UndoOp = { type: 'undo' }; type Op (line 35) | type Op = ApplyOp | UndoOp; function resetStore (line 56) | function resetStore(): void { function simulateOps (line 72) | function simulateOps(ops: Op[]): Record { FILE: frontend/src/stores/__tests__/converterStore.test.ts function resetStore (line 9) | function resetStore(): void { FILE: frontend/src/stores/__tests__/cropStore.property.test.ts class MockImage (line 19) | class MockImage { method length (line 34) | get length() { return localStorageMap.size; } function resetStore (line 41) | function resetStore(): void { FILE: frontend/src/stores/__tests__/cropStore.test.ts function resetStore (line 31) | function resetStore(): void { FILE: frontend/src/stores/__tests__/slicerStore.property.test.ts function resetStore (line 22) | function resetStore(): void { FILE: frontend/src/stores/__tests__/slicerStore.test.ts constant MOCK_SLICERS (line 23) | const MOCK_SLICERS: SlicerInfo[] = [ function resetStore (line 28) | function resetStore(): void { FILE: frontend/src/stores/aboutStore.ts type AboutState (line 6) | interface AboutState { type AboutActions (line 13) | interface AboutActions { constant DEFAULT_STATE (line 20) | const DEFAULT_STATE: AboutState = { FILE: frontend/src/stores/calibrationStore.ts type CalibrationState (line 12) | interface CalibrationState { type CalibrationActions (line 27) | interface CalibrationActions { constant DEFAULT_STATE (line 39) | const DEFAULT_STATE: CalibrationState = { FILE: frontend/src/stores/converterStore.ts function clampValue (line 37) | function clampValue(value: number, min: number, max: number): number { constant VALID_IMAGE_TYPES (line 41) | const VALID_IMAGE_TYPES = new Set(["image/jpeg", "image/png", "image/svg... function isValidImageType (line 43) | function isValidImageType(mimeType: string): boolean { type ConverterState (line 49) | interface ConverterState { type ConverterActions (line 178) | interface ConverterActions { function loadEnableCrop (line 276) | function loadEnableCrop(): boolean { function loadLutName (line 286) | function loadLutName(): string { constant DEFAULT_STATE (line 296) | const DEFAULT_STATE: ConverterState = { FILE: frontend/src/stores/extractorStore.ts type ExtractorState (line 12) | interface ExtractorState { type ExtractorActions (line 61) | interface ExtractorActions { constant DEFAULT_STATE (line 82) | const DEFAULT_STATE: ExtractorState = { FILE: frontend/src/stores/fiveColorStore.ts type FiveColorState (line 7) | interface FiveColorState { type FiveColorActions (line 18) | interface FiveColorActions { constant DEFAULT_STATE (line 30) | const DEFAULT_STATE: FiveColorState = { FILE: frontend/src/stores/lutManagerStore.ts constant ALLOWED_SECONDARY_MODES (line 19) | const ALLOWED_SECONDARY_MODES: Record = { function matchesMode (line 25) | function matchesMode(listColorMode: string, shortMode: string): boolean { function filterSecondaryOptions (line 33) | function filterSecondaryOptions( type LutManagerState (line 57) | interface LutManagerState { type LutManagerActions (line 72) | interface LutManagerActions { constant DEFAULT_STATE (line 84) | const DEFAULT_STATE: LutManagerState = { FILE: frontend/src/stores/settingsStore.ts type SettingsState (line 7) | interface SettingsState { type SettingsActions (line 21) | interface SettingsActions { constant DEFAULT_SETTINGS (line 36) | const DEFAULT_SETTINGS: SettingsState = { FILE: frontend/src/stores/slicerStore.ts type SlicerState (line 11) | interface SlicerState { type SlicerActions (line 22) | interface SlicerActions { constant DEFAULT_STATE (line 31) | const DEFAULT_STATE: SlicerState = { FILE: frontend/src/stores/widgetStore.ts constant TAB_WIDGET_MAP (line 24) | const TAB_WIDGET_MAP: Record = { constant DEFAULT_LAYOUT (line 43) | const DEFAULT_LAYOUT: Record = { constant WIDGET_REGISTRY (line 158) | const WIDGET_REGISTRY: Omit[] = [ FILE: frontend/src/types/widget.ts type TabId (line 7) | type TabId = 'converter' | 'calibration' | 'extractor' | 'lut-manager' |... type WidgetId (line 10) | type WidgetId = type WidgetLayoutState (line 25) | interface WidgetLayoutState { type WidgetStore (line 36) | interface WidgetStore { type SnapResult (line 65) | interface SnapResult { type WidgetConfig (line 72) | interface WidgetConfig { type PersistedWidgetState (line 82) | interface PersistedWidgetState { FILE: frontend/src/utils/colorUtils.ts function hexToLuminance (line 8) | function hexToLuminance(hex: string): number { function computeAutoHeightMap (line 23) | function computeAutoHeightMap( function colorRemapToReplacementRegions (line 54) | function colorRemapToReplacementRegions( function hexToRgb (line 84) | function hexToRgb(hex: string): [number, number, number] { function rgbEuclideanDistance (line 101) | function rgbEuclideanDistance( function sortByColorDistance (line 119) | function sortByColorDistance( FILE: frontend/src/utils/scaleUtils.ts type ScaleFactor (line 6) | interface ScaleFactor { function computeScaleFactor (line 24) | function computeScaleFactor( function computeThicknessScale (line 56) | function computeThicknessScale( FILE: frontend/src/utils/widgetUtils.ts constant WIDGET_WIDTH (line 10) | const WIDGET_WIDTH = 350; constant COLLAPSED_HEIGHT (line 13) | const COLLAPSED_HEIGHT = 40; constant EXPANDED_HEIGHT (line 16) | const EXPANDED_HEIGHT = 400; constant SNAP_THRESHOLD (line 19) | const SNAP_THRESHOLD = 48; constant STACK_GAP (line 22) | const STACK_GAP = 8; function clampPosition (line 38) | function clampPosition( function computeSnap (line 71) | function computeSnap( function computeStackPositions (line 110) | function computeStackPositions( FILE: main.py function patch_asscalar (line 24) | def patch_asscalar(a): class _Tee (line 33) | class _Tee: method __init__ (line 34) | def __init__(self, log_path, console_stream=None, lock=None): method write (line 41) | def write(self, msg): method flush (line 61) | def flush(self): method __getattr__ (line 69) | def __getattr__(self, name): class _TeeStderr (line 75) | class _TeeStderr: method __init__ (line 76) | def __init__(self, log_file, lock): method write (line 83) | def write(self, msg): method flush (line 103) | def flush(self): method __getattr__ (line 111) | def __getattr__(self, name): function init_runtime_log (line 117) | def init_runtime_log(): function find_available_port (line 167) | def find_available_port(start_port=7860, max_attempts=1000): function start_browser (line 177) | def start_browser(port): function get_platform_head_js (line 182) | def get_platform_head_js() -> str: function get_server_host (line 222) | def get_server_host() -> str: function _graceful_shutdown (line 231) | def _graceful_shutdown(signum, frame): FILE: tests/test_5color_merge_properties.py function _make_join_redirector (line 29) | def _make_join_redirector(assets_dir: str): function lut_array_strategy (line 44) | def lut_array_strategy( class TestLUTMergeShapeInvariant (line 64) | class TestLUTMergeShapeInvariant: method test_merge_shape_is_sum (line 78) | def test_merge_shape_is_sum(self, n: int, m: int) -> None: method test_merge_preserves_all_values (line 92) | def test_merge_preserves_all_values(self, n: int, m: int) -> None: method test_merge_via_endpoint_shape (line 107) | def test_merge_via_endpoint_shape(self, n: int, m: int) -> None: class TestExtractTempFilePath (line 139) | class TestExtractTempFilePath: method test_temp_file_path_matches_page (line 151) | def test_temp_file_path_matches_page(self, page: str) -> None: method test_page1_and_page2_produce_distinct_files (line 167) | def test_page1_and_page2_produce_distinct_files(self, page: str) -> None: method test_extract_endpoint_saves_temp_file (line 182) | def test_extract_endpoint_saves_temp_file(self, page: str, n: int) -> ... FILE: tests/test_5color_merge_unit.py function _make_join_redirector (line 34) | def _make_join_redirector(assets_dir: str): class TestMerge5ColorExtendedSuccess (line 50) | class TestMerge5ColorExtendedSuccess: method test_merge_success_returns_200_with_extract_response (line 53) | def test_merge_success_returns_200_with_extract_response(self) -> None: method test_merge_produces_correct_shape (line 76) | def test_merge_produces_correct_shape(self) -> None: class TestMerge5ColorExtendedMissingFiles (line 105) | class TestMerge5ColorExtendedMissingFiles: method test_missing_both_pages_returns_400 (line 108) | def test_missing_both_pages_returns_400(self) -> None: method test_missing_page2_returns_400 (line 120) | def test_missing_page2_returns_400(self) -> None: method test_missing_page1_returns_400 (line 136) | def test_missing_page1_returns_400(self) -> None: class TestCalibration5ColorExtended (line 159) | class TestCalibration5ColorExtended: method test_5color_extended_routes_to_generate_5color_extended_batch_zip (line 162) | def test_5color_extended_routes_to_generate_5color_extended_batch_zip(... method test_5color_extended_response_contains_download_and_preview_urls (line 181) | def test_5color_extended_response_contains_download_and_preview_urls(s... method test_5color_extended_core_error_returns_500 (line 203) | def test_5color_extended_core_error_returns_500(self) -> None: FILE: tests/test_api_app_unit.py function client (line 39) | def client() -> TestClient: class TestSwaggerUI (line 51) | class TestSwaggerUI: method test_docs_returns_200 (line 56) | def test_docs_returns_200(self, client: TestClient) -> None: class TestOpenAPIJSON (line 71) | class TestOpenAPIJSON: method test_openapi_json_returns_200 (line 76) | def test_openapi_json_returns_200(self, client: TestClient) -> None: method test_openapi_json_contains_all_endpoints (line 85) | def test_openapi_json_contains_all_endpoints(self, client: TestClient)... method test_openapi_json_has_correct_title (line 101) | def test_openapi_json_has_correct_title(self, client: TestClient) -> N... method test_openapi_json_has_correct_version (line 112) | def test_openapi_json_has_correct_version(self, client: TestClient) ->... class TestCORSHeaders (line 129) | class TestCORSHeaders: method test_cors_allows_any_origin (line 136) | def test_cors_allows_any_origin(self, client: TestClient) -> None: method test_cors_allows_all_methods (line 158) | def test_cors_allows_all_methods(self, client: TestClient) -> None: method test_cors_allows_all_headers (line 172) | def test_cors_allows_all_headers(self, client: TestClient) -> None: method test_cors_allows_credentials (line 187) | def test_cors_allows_credentials(self, client: TestClient) -> None: FILE: tests/test_api_routers_unit.py function client (line 52) | def client() -> TestClient: class TestConverterEndpoints (line 64) | class TestConverterEndpoints: method test_post_preview_missing_lut_returns_404 (line 69) | def test_post_preview_missing_lut_returns_404(self, client: TestClient... method test_post_preview_missing_image_returns_422 (line 85) | def test_post_preview_missing_image_returns_422(self, client: TestClie... method test_post_generate_missing_session_returns_422 (line 93) | def test_post_generate_missing_session_returns_422(self, client: TestC... method test_post_generate_unknown_session_returns_404 (line 99) | def test_post_generate_unknown_session_returns_404(self, client: TestC... method test_post_batch (line 108) | def test_post_batch(self, client: TestClient) -> None: method test_post_replace_color (line 115) | def test_post_replace_color(self, client: TestClient) -> None: method test_post_merge_colors (line 125) | def test_post_merge_colors(self, client: TestClient) -> None: class TestExtractorEndpoints (line 132) | class TestExtractorEndpoints: method test_post_extract (line 137) | def test_post_extract(self, client: TestClient) -> None: method test_post_manual_fix (line 147) | def test_post_manual_fix(self, client: TestClient) -> None: class TestCalibrationEndpoints (line 159) | class TestCalibrationEndpoints: method test_post_generate (line 164) | def test_post_generate(self, client: TestClient) -> None: function st_convert_preview_request (line 192) | def st_convert_preview_request(draw: st.DrawFn) -> Dict[str, Any]: function st_convert_generate_request (line 207) | def st_convert_generate_request(draw: st.DrawFn) -> Dict[str, Any]: function st_convert_batch_request (line 238) | def st_convert_batch_request(draw: st.DrawFn) -> Dict[str, Any]: function st_color_replace_request (line 245) | def st_color_replace_request(draw: st.DrawFn) -> Dict[str, Any]: function st_color_merge_preview_request (line 255) | def st_color_merge_preview_request(draw: st.DrawFn) -> Dict[str, Any]: function st_extractor_extract_request (line 266) | def st_extractor_extract_request(draw: st.DrawFn) -> Dict[str, Any]: function st_extractor_manual_fix_request (line 287) | def st_extractor_manual_fix_request(draw: st.DrawFn) -> Dict[str, Any]: function st_calibration_generate_request (line 300) | def st_calibration_generate_request(draw: st.DrawFn) -> Dict[str, Any]: function test_all_endpoints_return_stub_response (line 337) | def test_all_endpoints_return_stub_response(data: st.DataObject) -> None: FILE: tests/test_api_schemas_properties.py function st_convert_preview_request (line 64) | def st_convert_preview_request(draw: st.DrawFn) -> ConvertPreviewRequest: function st_color_replacement_item (line 79) | def st_color_replacement_item(draw: st.DrawFn) -> ColorReplacementItem: function st_convert_generate_request (line 89) | def st_convert_generate_request(draw: st.DrawFn) -> ConvertGenerateRequest: function st_convert_batch_request (line 133) | def st_convert_batch_request(draw: st.DrawFn) -> ConvertBatchRequest: function st_color_replace_request (line 139) | def st_color_replace_request(draw: st.DrawFn) -> ColorReplaceRequest: function st_color_merge_preview_request (line 149) | def st_color_merge_preview_request(draw: st.DrawFn) -> ColorMergePreview... function st_extractor_extract_request (line 160) | def st_extractor_extract_request(draw: st.DrawFn) -> ExtractorExtractReq... function st_extractor_manual_fix_request (line 181) | def st_extractor_manual_fix_request(draw: st.DrawFn) -> ExtractorManualF... function st_calibration_generate_request (line 194) | def st_calibration_generate_request(draw: st.DrawFn) -> CalibrationGener... function test_schema_serialization_round_trip (line 230) | def test_schema_serialization_round_trip(instance: BaseModel) -> None: function test_valid_data_passes_validation (line 254) | def test_valid_data_passes_validation(instance: BaseModel) -> None: function _build_minimal_valid_data (line 303) | def _build_minimal_valid_data(model_cls: Type[BaseModel]) -> Dict[str, A... function test_out_of_range_values_rejected (line 323) | def test_out_of_range_values_rejected(data: st.DataObject) -> None: function test_enum_field_string_serialization (line 387) | def test_enum_field_string_serialization(instance: BaseModel) -> None: function test_optional_field_default_values (line 463) | def test_optional_field_default_values(data: st.DataObject) -> None: FILE: tests/test_bed_size_properties.py function test_compute_scale_equals_target_over_max (line 22) | def test_compute_scale_equals_target_over_max(width_mm: int, height_mm: ... function test_invalid_bed_label_returns_fallback (line 46) | def test_invalid_bed_label_returns_fallback(label: str) -> None: FILE: tests/test_calibration_integration_unit.py class TestColorModeRouting (line 31) | class TestColorModeRouting: method test_bw_mode_routes_to_generate_bw (line 34) | def test_bw_mode_routes_to_generate_bw(self) -> None: method test_four_color_mode_routes_to_generate_calibration_board (line 55) | def test_four_color_mode_routes_to_generate_calibration_board(self) ->... method test_six_color_mode_routes_to_generate_smart_board (line 77) | def test_six_color_mode_routes_to_generate_smart_board(self) -> None: method test_eight_color_mode_routes_to_generate_8color_batch_zip (line 97) | def test_eight_color_mode_routes_to_generate_8color_batch_zip(self) ->... class TestParameterMapping (line 120) | class TestParameterMapping: method test_block_size_and_gap_mapped_correctly (line 123) | def test_block_size_and_gap_mapped_correctly(self) -> None: class TestErrorHandling (line 153) | class TestErrorHandling: method test_core_exception_returns_500 (line 156) | def test_core_exception_returns_500(self) -> None: FILE: tests/test_calibration_routing_properties.py function test_all_color_modes_route_to_valid_core_function (line 70) | def test_all_color_modes_route_to_valid_core_function( function test_block_size_and_gap_do_not_cause_parameter_errors (line 110) | def test_block_size_and_gap_do_not_cause_parameter_errors( function test_enum_coverage_is_exhaustive (line 164) | def test_enum_coverage_is_exhaustive() -> None: FILE: tests/test_cleanup_output_dir_properties.py function _filename_with_ext (line 42) | def _filename_with_ext(ext_strategy: st.SearchStrategy[str]) -> st.Searc... function test_cleanup_output_dir_only_deletes_cleanable_extensions (line 67) | def test_cleanup_output_dir_only_deletes_cleanable_extensions( FILE: tests/test_clear_cache_response_properties.py function test_clear_cache_response_json_round_trip (line 46) | def test_clear_cache_response_json_round_trip( FILE: tests/test_color_merge_map_properties.py function _rgb_to_lab (line 29) | def _rgb_to_lab(rgb_array: np.ndarray) -> np.ndarray: function st_palette (line 41) | def st_palette(draw: st.DrawFn) -> List[dict]: class TestMergeMapConsistency (line 82) | class TestMergeMapConsistency: method test_merge_map_invariants (line 93) | def test_merge_map_invariants( FILE: tests/test_color_merge_unit.py function setup_module (line 25) | def setup_module(module): function teardown_module (line 33) | def teardown_module(module): function _create_session_with_preview (line 47) | def _create_session_with_preview() -> str: class TestMergeSessionNotFound (line 68) | class TestMergeSessionNotFound: method test_merge_colors_unknown_session_returns_404 (line 71) | def test_merge_colors_unknown_session_returns_404(self) -> None: class TestMergeNoPreviewCacheReturns409 (line 89) | class TestMergeNoPreviewCacheReturns409: method test_merge_colors_no_cache_returns_409 (line 92) | def test_merge_colors_no_cache_returns_409(self) -> None: class TestMergeDisabled (line 113) | class TestMergeDisabled: method test_merge_disabled_returns_empty_map_and_perfect_quality (line 116) | def test_merge_disabled_returns_empty_map_and_perfect_quality(self) ->... class TestSuccessfulMerge (line 140) | class TestSuccessfulMerge: method _create_session_with_mergeable_colors (line 143) | def _create_session_with_mergeable_colors(self) -> str: method test_merge_response_has_required_fields (line 159) | def test_merge_response_has_required_fields(self) -> None: class TestMergeMapStoredInSession (line 188) | class TestMergeMapStoredInSession: method test_merge_map_saved_to_session (line 191) | def test_merge_map_saved_to_session(self) -> None: method test_merge_disabled_stores_empty_map (line 207) | def test_merge_disabled_stores_empty_map(self) -> None: FILE: tests/test_color_replace_unit.py function setup_module (line 24) | def setup_module(module): function teardown_module (line 32) | def teardown_module(module): function _create_session_with_preview (line 46) | def _create_session_with_preview() -> str: class TestSessionNotFound (line 65) | class TestSessionNotFound: method test_replace_color_unknown_session_returns_404 (line 68) | def test_replace_color_unknown_session_returns_404(self) -> None: class TestNoPreviewCacheReturns409 (line 85) | class TestNoPreviewCacheReturns409: method test_replace_color_no_cache_returns_409 (line 88) | def test_replace_color_no_cache_returns_409(self) -> None: class TestSuccessfulReplacement (line 108) | class TestSuccessfulReplacement: method test_replace_color_returns_ok_response (line 111) | def test_replace_color_returns_ok_response(self) -> None: method test_replacement_regions_updated_in_session (line 127) | def test_replacement_regions_updated_in_session(self) -> None: class TestReplacementHistory (line 149) | class TestReplacementHistory: method test_history_snapshot_saved_before_change (line 152) | def test_history_snapshot_saved_before_change(self) -> None: FILE: tests/test_converter_batch_unit.py class _MockWorkerPool (line 34) | class _MockWorkerPool: method __init__ (line 39) | def __init__(self) -> None: method is_alive (line 43) | def is_alive(self) -> bool: method max_workers (line 47) | def max_workers(self) -> int: function setup_module (line 53) | def setup_module(module): function teardown_module (line 62) | def teardown_module(module): function _make_test_image_buf (line 77) | def _make_test_image_buf(name: str = "test.png") -> tuple[str, io.BytesI... function _make_fake_3mf (line 86) | def _make_fake_3mf(suffix: str = ".3mf") -> str: class TestBatchLutNotFound (line 99) | class TestBatchLutNotFound: method test_batch_unknown_lut_returns_404 (line 102) | def test_batch_unknown_lut_returns_404(self) -> None: class TestBatchPartialFailure (line 121) | class TestBatchPartialFailure: method test_batch_partial_failure_continues (line 124) | def test_batch_partial_failure_continues(self) -> None: class TestBatchAllSuccess (line 176) | class TestBatchAllSuccess: method test_batch_all_success (line 179) | def test_batch_all_success(self) -> None: class TestBatchAllFailed (line 216) | class TestBatchAllFailed: method test_batch_all_fail (line 219) | def test_batch_all_fail(self) -> None: class TestBatchTimeout (line 250) | class TestBatchTimeout: method test_batch_timeout_per_item (line 253) | def test_batch_timeout_per_item(self) -> None: class TestBatchWorkerPoolSubmit (line 283) | class TestBatchWorkerPoolSubmit: method test_batch_submits_to_pool (line 286) | def test_batch_submits_to_pool(self) -> None: FILE: tests/test_converter_generate_unit.py function setup_module (line 32) | def setup_module(module): function teardown_module (line 41) | def teardown_module(module): function _create_session_with_preview_and_files (line 57) | def _create_session_with_preview_and_files(store: SessionStore) -> str: class TestGenerateSessionNotFound (line 73) | class TestGenerateSessionNotFound: method test_generate_unknown_session_returns_404 (line 76) | def test_generate_unknown_session_returns_404(self) -> None: class TestGenerateNoPreviewCache (line 91) | class TestGenerateNoPreviewCache: method test_generate_no_preview_cache_returns_409 (line 94) | def test_generate_no_preview_cache_returns_409(self) -> None: class TestGenerateMissingImagePath (line 110) | class TestGenerateMissingImagePath: method test_generate_missing_image_path_returns_409 (line 113) | def test_generate_missing_image_path_returns_409(self) -> None: method test_generate_nonexistent_image_file_returns_409 (line 124) | def test_generate_nonexistent_image_file_returns_409(self) -> None: class TestGenerateParameterCompleteness (line 142) | class TestGenerateParameterCompleteness: method test_generate_passes_all_advanced_params (line 145) | def test_generate_passes_all_advanced_params(self) -> None: method test_generate_passes_replacement_regions_from_request (line 258) | def test_generate_passes_replacement_regions_from_request(self) -> None: class TestGenerateTimeout (line 300) | class TestGenerateTimeout: method test_generate_timeout_returns_504 (line 303) | def test_generate_timeout_returns_504(self) -> None: class TestGenerateWorkerException (line 325) | class TestGenerateWorkerException: method test_generate_worker_exception_returns_500 (line 328) | def test_generate_worker_exception_returns_500(self) -> None: FILE: tests/test_converter_preview_unit.py function setup_module (line 37) | def setup_module(module): function teardown_module (line 46) | def teardown_module(module): function _create_worker_result_files (line 85) | def _create_worker_result_files() -> dict: function _make_test_image_buf (line 110) | def _make_test_image_buf() -> io.BytesIO: class TestLutNotFoundReturns404 (line 124) | class TestLutNotFoundReturns404: method test_preview_unknown_lut_returns_404 (line 127) | def test_preview_unknown_lut_returns_404(self) -> None: class TestSessionContainsPreviewCache (line 151) | class TestSessionContainsPreviewCache: method test_preview_stores_cache_in_session (line 154) | def test_preview_stores_cache_in_session(self) -> None: class TestResponseContainsPaletteAndDimensions (line 198) | class TestResponseContainsPaletteAndDimensions: method test_preview_response_has_palette_and_dimensions (line 201) | def test_preview_response_has_palette_and_dimensions(self) -> None: class TestTimeoutReturns504 (line 257) | class TestTimeoutReturns504: method test_preview_timeout_returns_504 (line 260) | def test_preview_timeout_returns_504(self) -> None: class TestGeneralExceptionReturns500 (line 291) | class TestGeneralExceptionReturns500: method test_preview_exception_returns_500 (line 294) | def test_preview_exception_returns_500(self) -> None: FILE: tests/test_converter_vector_export_unit.py function _build_fake_processor (line 34) | def _build_fake_processor(scene): class TestVectorBranchExport (line 47) | class TestVectorBranchExport: method test_bambu_export_called (line 53) | def test_bambu_export_called(self, MockVP, mock_bambu_export, tmp_path): method test_slot_names_match_scene_geometry (line 95) | def test_slot_names_match_scene_geometry(self, MockVP, mock_bambu_expo... method test_empty_scene_returns_error (line 138) | def test_empty_scene_returns_error(self, MockVP, mock_bambu_export, tm... class TestBambuExportGuardrails (line 178) | class TestBambuExportGuardrails: method test_export_scene_raises_on_missing_slot_geometry (line 180) | def test_export_scene_raises_on_missing_slot_geometry(self, tmp_path): method test_writer_add_mesh_rejects_empty_mesh (line 195) | def test_writer_add_mesh_rejects_empty_mesh(self, tmp_path): FILE: tests/test_converter_workers_unit.py class TestWorkerImportability (line 33) | class TestWorkerImportability: method test_worker_generate_preview_is_importable (line 36) | def test_worker_generate_preview_is_importable(self) -> None: method test_worker_generate_model_is_importable (line 40) | def test_worker_generate_model_is_importable(self) -> None: method test_worker_generate_preview_is_function (line 44) | def test_worker_generate_preview_is_function(self) -> None: method test_worker_generate_model_is_function (line 48) | def test_worker_generate_model_is_function(self) -> None: class TestWorkerPicklability (line 57) | class TestWorkerPicklability: method test_worker_generate_preview_is_picklable (line 60) | def test_worker_generate_preview_is_picklable(self) -> None: method test_worker_generate_model_is_picklable (line 65) | def test_worker_generate_model_is_picklable(self) -> None: class TestParameterAnnotations (line 75) | class TestParameterAnnotations: method _get_param_annotations (line 79) | def _get_param_annotations(fn) -> dict[str, type]: method test_preview_params_are_serializable (line 88) | def test_preview_params_are_serializable(self) -> None: method test_model_params_are_serializable (line 97) | def test_model_params_are_serializable(self) -> None: method test_preview_has_expected_param_count (line 106) | def test_preview_has_expected_param_count(self) -> None: method test_model_has_expected_param_count (line 111) | def test_model_has_expected_param_count(self) -> None: method test_preview_param_names (line 116) | def test_preview_param_names(self) -> None: method test_model_param_names (line 126) | def test_model_param_names(self) -> None: class TestReturnAnnotations (line 137) | class TestReturnAnnotations: method test_preview_returns_dict (line 140) | def test_preview_returns_dict(self) -> None: method test_model_returns_dict (line 145) | def test_model_returns_dict(self) -> None: class TestTopLevelFunctions (line 155) | class TestTopLevelFunctions: method test_preview_has_no_self_param (line 158) | def test_preview_has_no_self_param(self) -> None: method test_model_has_no_self_param (line 164) | def test_model_has_no_self_param(self) -> None: method test_preview_qualname_is_module_level (line 170) | def test_preview_qualname_is_module_level(self) -> None: method test_model_qualname_is_module_level (line 174) | def test_model_qualname_is_module_level(self) -> None: FILE: tests/test_crop_properties.py function test_clamp_boundary_invariant (line 51) | def test_clamp_boundary_invariant( function _make_test_png (line 102) | def _make_test_png(width: int = 100, height: int = 80) -> io.BytesIO: function test_crop_endpoint_response_completeness (line 119) | def test_crop_endpoint_response_completeness( FILE: tests/test_crop_unit.py function _make_rgb_png (line 29) | def _make_rgb_png(width: int = 200, height: int = 150) -> io.BytesIO: function _make_text_file (line 41) | def _make_text_file() -> io.BytesIO: class TestNormalCropFlow (line 53) | class TestNormalCropFlow: method test_crop_valid_image_returns_200 (line 56) | def test_crop_valid_image_returns_200(self) -> None: class TestCoordinateClamping (line 79) | class TestCoordinateClamping: method test_large_xy_clamped_to_valid_range (line 82) | def test_large_xy_clamped_to_valid_range(self) -> None: class TestInvalidFileUpload (line 105) | class TestInvalidFileUpload: method test_text_file_returns_422 (line 108) | def test_text_file_returns_422(self) -> None: class TestZeroSizeCrop (line 127) | class TestZeroSizeCrop: method test_zero_width_returns_422 (line 135) | def test_zero_width_returns_422(self) -> None: FILE: tests/test_extractor_integration_unit.py function _make_test_image_buf (line 30) | def _make_test_image_buf() -> io.BytesIO: class TestCornerPointsValidation (line 44) | class TestCornerPointsValidation: method test_extract_invalid_corner_points_count_returns_422 (line 47) | def test_extract_invalid_corner_points_count_returns_422(self) -> None: class TestSessionStatePersistence (line 70) | class TestSessionStatePersistence: method test_extract_stores_session_state (line 73) | def test_extract_stores_session_state(self) -> None: class TestFieldNameMapping (line 110) | class TestFieldNameMapping: method test_extract_field_name_mapping (line 113) | def test_extract_field_name_mapping(self) -> None: FILE: tests/test_file_bridge_properties.py function test_ndarray_png_roundtrip (line 42) | def test_ndarray_png_roundtrip(arr: np.ndarray) -> None: function test_pil_png_roundtrip (line 63) | def test_pil_png_roundtrip(arr: np.ndarray) -> None: FILE: tests/test_file_registry_clear_properties.py function _create_temp_file (line 49) | def _create_temp_file() -> str: function test_clear_all_empties_registry_and_returns_entry_count (line 71) | def test_clear_all_empties_registry_and_returns_entry_count( FILE: tests/test_file_registry_properties.py function _create_temp_file (line 49) | def _create_temp_file() -> str: function test_register_path_returns_valid_uuid4 (line 67) | def test_register_path_returns_valid_uuid4(sid: str, filename: str) -> N... function test_register_resolve_consistency (line 84) | def test_register_resolve_consistency(sid: str, filename: str) -> None: function test_resolve_unknown_id_returns_none (line 104) | def test_resolve_unknown_id_returns_none(unknown_id: str) -> None: function test_cleanup_session_invalidates_file_ids (line 118) | def test_cleanup_session_invalidates_file_ids( FILE: tests/test_five_color_api_unit.py function _make_npz_data (line 26) | def _make_npz_data(): function test_get_base_colors_npz (line 43) | def test_get_base_colors_npz(): function test_get_base_colors_npy (line 71) | def test_get_base_colors_npy(): function test_get_base_colors_not_found (line 104) | def test_get_base_colors_not_found(): function test_query_success (line 120) | def test_query_success(): function test_query_no_match (line 146) | def test_query_no_match(): FILE: tests/test_five_color_query_properties.py function test_base_color_hex_rgb_consistency (line 34) | def test_base_color_hex_rgb_consistency(rgb: tuple[int, int, int]) -> None: function synthetic_engine_and_row (line 59) | def synthetic_engine_and_row(draw): function test_query_round_trip_known_stack_entry (line 87) | def test_query_round_trip_known_stack_entry(data) -> None: function engine_with_out_of_range_indices (line 129) | def engine_with_out_of_range_indices(draw): function test_out_of_range_index_rejection (line 161) | def test_out_of_range_index_rejection(data) -> None: function test_five_color_query_request_rejects_non_5_length (line 208) | def test_five_color_query_request_rejects_non_5_length(length: int, valu... FILE: tests/test_health_lut_unit.py class TestHealthEndpoint (line 23) | class TestHealthEndpoint: method test_health_returns_200 (line 26) | def test_health_returns_200(self) -> None: method test_health_contains_required_fields (line 30) | def test_health_contains_required_fields(self) -> None: method test_health_status_is_ok (line 37) | def test_health_status_is_ok(self) -> None: method test_health_version_is_2_0 (line 41) | def test_health_version_is_2_0(self) -> None: method test_health_uptime_is_non_negative_float (line 45) | def test_health_uptime_is_non_negative_float(self) -> None: method test_health_worker_pool_contains_required_fields (line 51) | def test_health_worker_pool_contains_required_fields(self) -> None: method test_health_worker_pool_healthy_is_bool (line 57) | def test_health_worker_pool_healthy_is_bool(self) -> None: method test_health_worker_pool_max_workers_is_positive_int (line 61) | def test_health_worker_pool_max_workers_is_positive_int(self) -> None: class TestHealthWorkerPoolState (line 73) | class TestHealthWorkerPoolState: method _make_client_with_pool (line 78) | def _make_client_with_pool(self, pool: WorkerPoolManager) -> TestClient: method teardown_method (line 86) | def teardown_method(self) -> None: method test_pool_alive_reports_healthy_true (line 92) | def test_pool_alive_reports_healthy_true(self) -> None: method test_pool_not_started_reports_healthy_false (line 105) | def test_pool_not_started_reports_healthy_false(self) -> None: method test_pool_shutdown_reports_healthy_false (line 115) | def test_pool_shutdown_reports_healthy_false(self) -> None: method test_pool_alive_max_workers_matches (line 126) | def test_pool_alive_max_workers_matches(self) -> None: method test_pool_not_started_max_workers_still_positive (line 139) | def test_pool_not_started_max_workers_still_positive(self) -> None: class TestLUTListEndpoint (line 157) | class TestLUTListEndpoint: method test_lut_list_returns_200 (line 160) | def test_lut_list_returns_200(self) -> None: method test_lut_list_contains_required_fields (line 164) | def test_lut_list_contains_required_fields(self) -> None: method test_lut_list_luts_is_list (line 168) | def test_lut_list_luts_is_list(self) -> None: method test_lut_list_items_have_required_fields (line 172) | def test_lut_list_items_have_required_fields(self) -> None: method test_lut_list_names_sorted_alphabetically (line 179) | def test_lut_list_names_sorted_alphabetically(self) -> None: FILE: tests/test_heic_support_properties.py function test_required_format_present (line 28) | def test_required_format_present(ext: str) -> None: function test_extension_format_valid (line 42) | def test_extension_format_valid(ext: str) -> None: function test_no_duplicate_extensions (line 59) | def test_no_duplicate_extensions() -> None: FILE: tests/test_heightmap_color_height_properties.py function compute_color_height_map (line 25) | def compute_color_height_map( function heightmap_color_strategy (line 77) | def heightmap_color_strategy(draw: st.DrawFn): function test_heightmap_color_height_bounded (line 146) | def test_heightmap_color_height_bounded(data): FILE: tests/test_heightmap_properties.py function test_grayscale_mapping_formula (line 43) | def test_grayscale_mapping_formula(grayscale_val, max_relief_height, bas... function test_height_matrix_shape_and_type (line 94) | def test_height_matrix_shape_and_type( function test_voxel_matrix_structure (line 154) | def test_voxel_matrix_structure(size, max_height, backing_color_id): function _simulate_branch_selection (line 243) | def _simulate_branch_selection( function _expected_branch (line 279) | def _expected_branch( function test_decision_matrix_correctness (line 322) | def test_decision_matrix_correctness( function test_clamping_flat_output (line 378) | def test_clamping_flat_output( function test_range_invariant_after_clamping (line 449) | def test_range_invariant_after_clamping( function test_aspect_ratio_warning (line 516) | def test_aspect_ratio_warning(hm_w, hm_h, tgt_w, tgt_h): function test_contrast_warning (line 544) | def test_contrast_warning(size, fill_value): function test_contrast_no_warning_for_varied_image (line 563) | def test_contrast_no_warning_for_varied_image(size): function test_invalid_file_error_handling (line 592) | def test_invalid_file_error_handling(random_bytes): FILE: tests/test_heightmap_unit.py class TestGrayscaleMapping (line 25) | class TestGrayscaleMapping: method test_pure_black_maps_to_max_height (line 28) | def test_pure_black_maps_to_max_height(self): method test_pure_white_maps_to_base_thickness (line 39) | def test_pure_white_maps_to_base_thickness(self): method test_mid_gray_maps_to_middle_value (line 49) | def test_mid_gray_maps_to_middle_value(self): class TestColorToGrayscale (line 64) | class TestColorToGrayscale: method test_rgb_image_converts_to_grayscale (line 67) | def test_rgb_image_converts_to_grayscale(self): method test_rgba_image_converts_to_grayscale (line 81) | def test_rgba_image_converts_to_grayscale(self): method test_grayscale_image_passthrough (line 96) | def test_grayscale_image_passthrough(self): class TestResizeToTarget (line 108) | class TestResizeToTarget: method test_resize_different_sizes (line 111) | def test_resize_different_sizes(self): method test_resize_upscale (line 121) | def test_resize_upscale(self): method test_resize_preserves_shape (line 130) | def test_resize_preserves_shape(self): class TestHeightClamping (line 144) | class TestHeightClamping: method test_height_below_optical_thickness_is_clamped (line 147) | def test_height_below_optical_thickness_is_clamped(self): class TestErrorHandling (line 188) | class TestErrorHandling: method test_invalid_file_returns_error (line 191) | def test_invalid_file_returns_error(self): method test_nonexistent_file_returns_error (line 205) | def test_nonexistent_file_returns_error(self): method test_aspect_ratio_deviation_warning (line 211) | def test_aspect_ratio_deviation_warning(self): method test_aspect_ratio_no_warning_when_close (line 217) | def test_aspect_ratio_no_warning_when_close(self): method test_low_contrast_warning (line 222) | def test_low_contrast_warning(self): method test_no_contrast_warning_for_normal_image (line 229) | def test_no_contrast_warning_for_normal_image(self): FILE: tests/test_heightmap_upload_unit.py function _make_grayscale_png (line 35) | def _make_grayscale_png(width: int = 100, height: int = 100) -> io.BytesIO: function _make_rgb_png (line 45) | def _make_rgb_png(width: int = 100, height: int = 100) -> io.BytesIO: function _make_text_file (line 56) | def _make_text_file() -> io.BytesIO: function _setup_session_with_preview (line 63) | def _setup_session_with_preview( class TestValidHeightmapUpload (line 114) | class TestValidHeightmapUpload: method test_valid_grayscale_png_returns_200 (line 117) | def test_valid_grayscale_png_returns_200(self) -> None: method test_valid_rgb_png_returns_200 (line 144) | def test_valid_rgb_png_returns_200(self) -> None: class TestInvalidFormatReturns422 (line 166) | class TestInvalidFormatReturns422: method test_text_file_returns_422 (line 169) | def test_text_file_returns_422(self) -> None: class TestAspectRatioWarning (line 189) | class TestAspectRatioWarning: method test_mismatched_aspect_ratio_returns_warning (line 192) | def test_mismatched_aspect_ratio_returns_warning(self) -> None: method test_matching_aspect_ratio_no_warning (line 210) | def test_matching_aspect_ratio_no_warning(self) -> None: class TestMissingSessionReturns404 (line 231) | class TestMissingSessionReturns404: method test_unknown_session_returns_404 (line 234) | def test_unknown_session_returns_404(self) -> None: class TestMissingPreviewCacheReturns409 (line 252) | class TestMissingPreviewCacheReturns409: method test_no_preview_cache_returns_409 (line 255) | def test_no_preview_cache_returns_409(self) -> None: FILE: tests/test_layout_new_tabs_unit.py function test_header_css_shows_converter_by_default_and_hides_other_tabs (line 6) | def test_header_css_shows_converter_by_default_and_hides_other_tabs(): function test_custom_tab_js_explicitly_switches_active_content_display (line 19) | def test_custom_tab_js_explicitly_switches_active_content_display(): function test_create_app_registers_all_custom_tab_ids (line 25) | def test_create_app_registers_all_custom_tab_ids(): function test_create_app_marks_converter_tab_selected_by_default (line 55) | def test_create_app_marks_converter_tab_selected_by_default(): FILE: tests/test_lut_api_properties.py function rgb_array_st (line 34) | def rgb_array_st(draw: st.DrawFn, min_size: int = 2, max_size: int = 30)... function stacks_for_rgb (line 52) | def stacks_for_rgb(draw: st.DrawFn, rgb: np.ndarray, max_id: int = 7) ->... function lut_entry (line 66) | def lut_entry(draw: st.DrawFn, mode: str | None = None, min_size: int = ... function merge_input (line 77) | def merge_input(draw: st.DrawFn): function merge_input_small (line 93) | def merge_input_small(draw: st.DrawFn): class TestLutInfoApiRoundTrip (line 111) | class TestLutInfoApiRoundTrip: method test_info_consistent_with_list (line 129) | def test_info_consistent_with_list(self, names_and_modes): class TestMergeStatsConsistencyBackend (line 201) | class TestMergeStatsConsistencyBackend: method test_stats_invariants_no_dedup (line 212) | def test_stats_invariants_no_dedup(self, entries): method test_stats_invariants_with_small_threshold (line 254) | def test_stats_invariants_with_small_threshold(self, entries): FILE: tests/test_lut_api_unit.py class TestLutInfoSuccess (line 24) | class TestLutInfoSuccess: method test_info_returns_200_with_correct_fields (line 29) | def test_info_returns_200_with_correct_fields( class TestLutInfoNotFound (line 45) | class TestLutInfoNotFound: method test_info_returns_404_when_lut_not_found (line 49) | def test_info_returns_404_when_lut_not_found(self, mock_path) -> None: class TestMergeEmptySecondary (line 60) | class TestMergeEmptySecondary: method test_merge_empty_secondary_returns_400 (line 63) | def test_merge_empty_secondary_returns_400(self) -> None: class TestMergePrimaryModeInvalid (line 79) | class TestMergePrimaryModeInvalid: method test_merge_4color_primary_returns_400 (line 84) | def test_merge_4color_primary_returns_400(self, mock_path, mock_detect... class TestMergeCompatibilityFailure (line 100) | class TestMergeCompatibilityFailure: method test_merge_incompatible_modes_returns_400 (line 110) | def test_merge_incompatible_modes_returns_400( FILE: tests/test_lut_list_properties.py function test_lut_list_keys_always_sorted (line 64) | def test_lut_list_keys_always_sorted() -> None: function test_lut_list_via_api_keys_sorted (line 82) | def test_lut_list_via_api_keys_sorted() -> None: function test_sorting_preserved_for_random_lut_entries (line 104) | def test_sorting_preserved_for_random_lut_entries( function test_api_returns_sorted_keys_with_mocked_luts (line 123) | def test_api_returns_sorted_keys_with_mocked_luts( function _find_unsorted_pair (line 146) | def _find_unsorted_pair(keys: list) -> str: FILE: tests/test_lut_merger_properties.py function rgb_array (line 31) | def rgb_array(size): function stack_array (line 34) | def stack_array(size, max_id=7): class TestColorModeDetection (line 42) | class TestColorModeDetection: method test_standard_size_detection (line 50) | def test_standard_size_detection(self, size): method test_non_standard_size_returns_merged (line 63) | def test_non_standard_size_returns_merged(self, size): method test_npz_detection (line 74) | def test_npz_detection(self): class TestCompatibilityValidation (line 90) | class TestCompatibilityValidation: method test_valid_with_high_mode (line 101) | def test_valid_with_high_mode(self, low_modes, high_mode): method test_invalid_without_high_mode (line 119) | def test_invalid_without_high_mode(self, modes): method test_single_lut_invalid (line 126) | def test_single_lut_invalid(self): method test_8color_allows_all (line 131) | def test_8color_allows_all(self): class TestMergeConcatenation (line 142) | class TestMergeConcatenation: method test_no_dedup_preserves_all (line 153) | def test_no_dedup_preserves_all(self, n1, n2): class TestMaterialIDRange (line 198) | class TestMaterialIDRange: method test_material_ids_in_range (line 208) | def test_material_ids_in_range(self, n): class TestDedupNoSimilarColors (line 233) | class TestDedupNoSimilarColors: method test_exact_dedup_removes_duplicates (line 239) | def test_exact_dedup_removes_duplicates(self): method test_threshold_dedup_removes_similar (line 256) | def test_threshold_dedup_removes_similar(self): class TestDedupPriority (line 281) | class TestDedupPriority: method test_higher_mode_preserved (line 287) | def test_higher_mode_preserved(self): class TestMergeStatsConsistency (line 311) | class TestMergeStatsConsistency: method test_stats_add_up (line 322) | def test_stats_add_up(self, n1, n2): class TestSaveLoadRoundTrip (line 345) | class TestSaveLoadRoundTrip: method test_roundtrip (line 353) | def test_roundtrip(self, n): method test_npz_extension_enforced (line 373) | def test_npz_extension_enforced(self): class TestNonStandardSizeDetection (line 388) | class TestNonStandardSizeDetection: method test_npz_detected_as_merged (line 394) | def test_npz_detected_as_merged(self): method test_non_standard_npy_detected_as_merged (line 408) | def test_non_standard_npy_detected_as_merged(self, size): FILE: tests/test_mime_type_properties.py function test_known_extensions_return_correct_mime (line 64) | def test_known_extensions_return_correct_mime(ext: str, base: str) -> None: function test_unknown_extensions_return_octet_stream (line 79) | def test_unknown_extensions_return_octet_stream(ext: str, base: str) -> ... function test_case_insensitive (line 91) | def test_case_insensitive(ext: str, base: str) -> None: FILE: tests/test_naming_properties.py function test_model_filename_format_correctness (line 46) | def test_model_filename_format_correctness(base_name, modeling_mode, col... function test_no_forbidden_characters_in_filenames (line 74) | def test_no_forbidden_characters_in_filenames( function test_generate_parse_round_trip (line 109) | def test_generate_parse_round_trip(base_name, modeling_mode, color_mode): function _is_standard_filename (line 152) | def _is_standard_filename(s: str) -> bool: function test_non_standard_filename_parse_safety (line 169) | def test_non_standard_filename_parse_safety(arbitrary): function test_parse_filename_never_raises (line 185) | def test_parse_filename_never_raises(arbitrary): FILE: tests/test_naming_unit.py class TestModelingModeTags (line 32) | class TestModelingModeTags: method test_high_fidelity_maps_to_hifi (line 35) | def test_high_fidelity_maps_to_hifi(self): method test_pixel_maps_to_pixel (line 38) | def test_pixel_maps_to_pixel(self): method test_vector_maps_to_vector (line 41) | def test_vector_maps_to_vector(self): method test_all_enum_members_have_mapping (line 44) | def test_all_enum_members_have_mapping(self): class TestColorModeTags (line 53) | class TestColorModeTags: method test_4color_variants_map_to_4c (line 57) | def test_4color_variants_map_to_4c(self, color_mode): method test_6color_maps_to_6c (line 60) | def test_6color_maps_to_6c(self): method test_8color_variants_map_to_8c (line 64) | def test_8color_variants_map_to_8c(self, color_mode): method test_bw_variants_map_to_bw (line 68) | def test_bw_variants_map_to_bw(self, color_mode): class TestEdgeCases (line 76) | class TestEdgeCases: method test_empty_base_name_uses_untitled (line 79) | def test_empty_base_name_uses_untitled(self): method test_whitespace_only_base_name_uses_untitled (line 83) | def test_whitespace_only_base_name_uses_untitled(self): method test_special_characters_sanitized (line 87) | def test_special_characters_sanitized(self): method test_all_forbidden_chars_sanitized (line 96) | def test_all_forbidden_chars_sanitized(self): method test_unicode_base_name (line 104) | def test_unicode_base_name(self): method test_unicode_emoji_base_name (line 109) | def test_unicode_emoji_base_name(self): method test_unknown_modeling_mode_uses_unknown (line 113) | def test_unknown_modeling_mode_uses_unknown(self): method test_unknown_color_mode_uses_unknown (line 119) | def test_unknown_color_mode_uses_unknown(self): method test_sanitize_preserves_normal_chars (line 123) | def test_sanitize_preserves_normal_chars(self): method test_sanitize_replaces_forbidden (line 126) | def test_sanitize_replaces_forbidden(self): class TestGeneratedFilenameFormat (line 138) | class TestGeneratedFilenameFormat: method test_model_filename_structure (line 142) | def test_model_filename_structure(self, _mock_ts): method test_model_filename_pixel_6c (line 149) | def test_model_filename_pixel_6c(self, _mock_ts): method test_model_filename_vector_8c (line 154) | def test_model_filename_vector_8c(self, _mock_ts): method test_model_filename_bw (line 161) | def test_model_filename_bw(self, _mock_ts): method test_preview_filename_structure (line 166) | def test_preview_filename_structure(self, _mock_ts): method test_calibration_filename_structure (line 171) | def test_calibration_filename_structure(self, _mock_ts): method test_batch_filename_structure (line 176) | def test_batch_filename_structure(self, _mock_ts): method test_custom_extension (line 181) | def test_custom_extension(self, _mock_ts): method test_model_filename_matches_regex (line 187) | def test_model_filename_matches_regex(self): class TestParseFilename (line 201) | class TestParseFilename: method test_parse_returns_none_for_empty_string (line 204) | def test_parse_returns_none_for_empty_string(self): method test_parse_returns_none_for_random_string (line 207) | def test_parse_returns_none_for_random_string(self): method test_parse_returns_none_for_none_input (line 210) | def test_parse_returns_none_for_none_input(self): method test_parse_returns_none_for_non_string (line 213) | def test_parse_returns_none_for_non_string(self): method test_parse_model_filename (line 217) | def test_parse_model_filename(self, _mock_ts): method test_parse_preview_filename (line 228) | def test_parse_preview_filename(self, _mock_ts): method test_parse_calibration_filename (line 236) | def test_parse_calibration_filename(self, _mock_ts): method test_parse_batch_filename (line 244) | def test_parse_batch_filename(self, _mock_ts): FILE: tests/test_palette_connected_selection_unit.py function test_connected_region_4n_splits_diagonal_islands (line 13) | def test_connected_region_4n_splits_diagonal_islands(): function test_recommend_lut_colors_returns_top_k_sorted (line 27) | def test_recommend_lut_colors_returns_top_k_sorted(): function test_generate_preview_cache_contract_requires_quantized_image_key (line 40) | def test_generate_preview_cache_contract_requires_quantized_image_key(): function test_preview_click_records_region_and_dual_hex (line 50) | def test_preview_click_records_region_and_dual_hex(): function test_highlight_uses_region_mask_when_present (line 62) | def test_highlight_uses_region_mask_when_present(): function test_apply_region_replacement_only_changes_masked_pixels (line 74) | def test_apply_region_replacement_only_changes_masked_pixels(): function test_dual_recommendation_returns_two_groups_of_ten_or_less (line 89) | def test_dual_recommendation_returns_two_groups_of_ten_or_less(): function test_resolve_click_selection_hexes_prefers_matched_for_display (line 100) | def test_resolve_click_selection_hexes_prefers_matched_for_display(): FILE: tests/test_preview_click_selection_unit.py class _EvtNoneIndex (line 20) | class _EvtNoneIndex: function test_invalid_click_returns_none_hex (line 24) | def test_invalid_click_returns_none_hex(): function test_resolve_click_selection_hexes_rejects_non_string_default (line 32) | def test_resolve_click_selection_hexes_rejects_non_string_default(): function test_resolve_click_selection_hexes_prefers_cached_strings (line 39) | def test_resolve_click_selection_hexes_prefers_cached_strings(): function test_selected_dual_color_html_accepts_non_string_inputs (line 46) | def test_selected_dual_color_html_accepts_non_string_inputs(): FILE: tests/test_relief_mode_fix_properties.py function extract_unique_colors (line 25) | def extract_unique_colors( function test_black_solid_pixels_included_in_color_set (line 76) | def test_black_solid_pixels_included_in_color_set( function test_black_non_solid_pixels_excluded (line 132) | def test_black_non_solid_pixels_excluded( function test_fallback_without_mask_includes_black (line 176) | def test_fallback_without_mask_includes_black( FILE: tests/test_relief_mode_fix_unit.py function _real_gr (line 17) | def _real_gr(): function on_height_mode_change (line 27) | def on_height_mode_change(mode: str) -> tuple: function on_relief_mode_toggle (line 46) | def on_relief_mode_toggle(enable_relief, selected_color, height_map, bas... class TestOnHeightModeChange (line 94) | class TestOnHeightModeChange: method test_switch_to_dark_raised_clears_heightmap (line 97) | def test_switch_to_dark_raised_clears_heightmap(self) -> None: method test_switch_to_light_raised_clears_heightmap (line 104) | def test_switch_to_light_raised_clears_heightmap(self) -> None: method test_switch_to_heightmap_mode_preserves (line 111) | def test_switch_to_heightmap_mode_preserves(self) -> None: method test_return_tuple_length (line 117) | def test_return_tuple_length(self) -> None: class TestOnReliefModeToggle (line 125) | class TestOnReliefModeToggle: method test_disable_relief_clears_heightmap (line 128) | def test_disable_relief_clears_heightmap(self) -> None: method test_enable_relief_preserves_heightmap (line 135) | def test_enable_relief_preserves_heightmap(self) -> None: method test_disable_relief_return_length (line 141) | def test_disable_relief_return_length(self) -> None: method test_enable_relief_no_selected_color_preserves_heightmap (line 146) | def test_enable_relief_no_selected_color_preserves_heightmap(self) -> ... FILE: tests/test_segmented_glb_properties.py function _hex_to_rgb (line 27) | def _hex_to_rgb(hex_str: str) -> tuple[int, int, int]: function _make_cache (line 32) | def _make_cache( function matched_rgb_strategy (line 51) | def matched_rgb_strategy(draw: st.DrawFn): function test_glb_segmentation_correctness (line 106) | def test_glb_segmentation_correctness(data): function many_colors_strategy (line 193) | def many_colors_strategy(draw: st.DrawFn): function test_glb_mesh_count_limit (line 259) | def test_glb_mesh_count_limit(data): FILE: tests/test_segmented_glb_unit.py function _make_cache (line 23) | def _make_cache( function _get_color_nodes (line 39) | def _get_color_nodes(scene: trimesh.Scene) -> dict[str, trimesh.Trimesh]: class TestEmptyAndNoneInputs (line 54) | class TestEmptyAndNoneInputs: method test_none_cache_returns_none (line 57) | def test_none_cache_returns_none(self) -> None: method test_empty_image_all_transparent_returns_none (line 62) | def test_empty_image_all_transparent_returns_none(self) -> None: method test_missing_matched_rgb_returns_none (line 72) | def test_missing_matched_rgb_returns_none(self) -> None: method test_missing_mask_solid_returns_none (line 83) | def test_missing_mask_solid_returns_none(self) -> None: class TestSingleColorImage (line 99) | class TestSingleColorImage: method test_single_color_generates_one_mesh (line 102) | def test_single_color_generates_one_mesh(self) -> None: method test_single_color_with_partial_mask (line 130) | def test_single_color_with_partial_mask(self) -> None: class TestExactly64Colors (line 157) | class TestExactly64Colors: method test_64_colors_no_merge (line 160) | def test_64_colors_no_merge(self) -> None: FILE: tests/test_session_store_clear_properties.py function _create_temp_file (line 35) | def _create_temp_file() -> str: function test_clear_all_empties_store_and_returns_session_count (line 56) | def test_clear_all_empties_store_and_returns_session_count( FILE: tests/test_session_store_properties.py function test_create_returns_valid_uuid4 (line 47) | def test_create_returns_valid_uuid4(data: st.DataObject) -> None: function test_create_then_get_returns_empty_dict (line 61) | def test_create_then_get_returns_empty_dict(data: st.DataObject) -> None: function test_put_then_get_consistency (line 74) | def test_put_then_get_consistency(key: str, value: object) -> None: function test_multiple_puts_all_retrievable (line 90) | def test_multiple_puts_all_retrievable(kv: dict) -> None: function test_exists_after_create (line 111) | def test_exists_after_create(data: st.DataObject) -> None: FILE: tests/test_session_thread_safety_properties.py function test_concurrent_create_put_get_no_exceptions (line 30) | def test_concurrent_create_put_get_no_exceptions( function test_concurrent_sessions_data_isolation (line 73) | def test_concurrent_sessions_data_isolation(n_threads: int) -> None: FILE: tests/test_session_ttl_properties.py function _create_temp_files (line 50) | def _create_temp_files(n: int) -> List[Tuple[str, int]]: function test_ttl_zero_cleanup_removes_session (line 69) | def test_ttl_zero_cleanup_removes_session( FILE: tests/test_settings_api_properties.py function test_settings_round_trip (line 50) | def test_settings_round_trip( function test_settings_rejects_invalid_enable_crop_modal (line 113) | def test_settings_rejects_invalid_enable_crop_modal(bad_value) -> None: FILE: tests/test_settings_api_unit.py class TestGetSettings (line 27) | class TestGetSettings: method test_get_settings_file_not_exists (line 30) | def test_get_settings_file_not_exists(self) -> None: method test_get_settings_file_exists (line 47) | def test_get_settings_file_exists(self) -> None: class TestPostSettings (line 81) | class TestPostSettings: method test_post_settings_success (line 84) | def test_post_settings_success(self) -> None: method test_post_settings_io_error (line 104) | def test_post_settings_io_error(self) -> None: class TestGetStats (line 129) | class TestGetStats: method test_get_stats_success (line 132) | def test_get_stats_success(self) -> None: method test_get_stats_no_file (line 144) | def test_get_stats_no_file(self) -> None: FILE: tests/test_slicer_properties.py function _make_app (line 30) | def _make_app(): function _make_client (line 39) | def _make_client() -> TestClient: function test_nonexistent_exe_paths_filtered (line 81) | def test_nonexistent_exe_paths_filtered(num_valid: int, num_invalid: int... function test_unknown_slicer_id_returns_error (line 143) | def test_unknown_slicer_id_returns_error(slicer_id: str) -> None: function test_nonexistent_file_path_returns_error (line 174) | def test_nonexistent_file_path_returns_error(file_path: str) -> None: function test_invalid_request_body_returns_422 (line 239) | def test_invalid_request_body_returns_422(body: dict) -> None: function test_registry_match_produces_correct_display_name (line 282) | def test_registry_match_produces_correct_display_name( function test_generate_response_contains_threemf_disk_path (line 331) | def test_generate_response_contains_threemf_disk_path(path: str) -> None: function test_generate_response_threemf_disk_path_none_when_omitted (line 357) | def test_generate_response_threemf_disk_path_none_when_omitted() -> None: function test_generate_response_threemf_disk_path_explicit_none (line 375) | def test_generate_response_threemf_disk_path_explicit_none(path) -> None: FILE: tests/test_slicer_unit.py function _make_app (line 35) | def _make_app(): function _make_client (line 44) | def _make_client() -> TestClient: class TestScanRegistry (line 52) | class TestScanRegistry: method test_scan_registry_non_windows_linux (line 56) | def test_scan_registry_non_windows_linux(self, _mock_sys): method test_scan_registry_non_windows_darwin (line 60) | def test_scan_registry_non_windows_darwin(self, _mock_sys): class TestDetectInstalledSlicers (line 68) | class TestDetectInstalledSlicers: method test_filters_invalid_paths (line 71) | def test_filters_invalid_paths(self, tmp_path): method test_returns_empty_when_all_invalid (line 86) | def test_returns_empty_when_all_invalid(self): method test_returns_empty_when_scan_empty (line 94) | def test_returns_empty_when_scan_empty(self): class TestLaunchSlicer (line 104) | class TestLaunchSlicer: method test_success (line 107) | def test_success(self, tmp_path): method test_unknown_slicer_id (line 120) | def test_unknown_slicer_id(self, tmp_path): method test_file_not_found (line 130) | def test_file_not_found(self): method test_process_error (line 137) | def test_process_error(self, tmp_path): class TestPydanticModels (line 154) | class TestPydanticModels: method test_slicer_info_valid (line 157) | def test_slicer_info_valid(self): method test_slicer_info_empty_id_rejected (line 162) | def test_slicer_info_empty_id_rejected(self): method test_launch_request_valid (line 167) | def test_launch_request_valid(self): method test_launch_request_empty_path_rejected (line 171) | def test_launch_request_empty_path_rejected(self): method test_detect_response_defaults_to_empty_list (line 176) | def test_detect_response_defaults_to_empty_list(self): method test_launch_response_valid (line 180) | def test_launch_response_valid(self): class TestRouterEndpoints (line 189) | class TestRouterEndpoints: method test_detect_endpoint_returns_200 (line 192) | def test_detect_endpoint_returns_200(self): method test_detect_endpoint_empty (line 207) | def test_detect_endpoint_empty(self): method test_launch_success (line 216) | def test_launch_success(self, tmp_path): method test_launch_file_not_found (line 235) | def test_launch_file_not_found(self): method test_launch_invalid_body_returns_422 (line 245) | def test_launch_invalid_body_returns_422(self): method test_launch_empty_body_returns_422 (line 251) | def test_launch_empty_body_returns_422(self): method test_launch_slicer_not_found_returns_404 (line 257) | def test_launch_slicer_not_found_returns_404(self, tmp_path): FILE: tests/test_stack_order_properties.py class TestStackReversalEquivalence (line 25) | class TestStackReversalEquivalence: method test_reversal_equivalence_6color (line 33) | def test_reversal_equivalence_6color(self, stack: tuple): method test_reversal_equivalence_8color (line 49) | def test_reversal_equivalence_8color(self, stack: tuple): method test_reversal_equivalence_generic (line 62) | def test_reversal_equivalence_generic(self, stack: list): method test_old_vs_new_calibration_write_6color (line 70) | def test_old_vs_new_calibration_write_6color(self, stack: tuple): method test_old_vs_new_calibration_write_8color (line 97) | def test_old_vs_new_calibration_write_8color(self, stack: tuple): class TestEndToEndOutputEquivalence (line 121) | class TestEndToEndOutputEquivalence: method test_calibration_board_6color_pipeline (line 135) | def test_calibration_board_6color_pipeline(self, stack: tuple): method test_calibration_board_8color_pipeline (line 169) | def test_calibration_board_8color_pipeline(self, stack: tuple): method test_lut_loading_6color_ref_stacks (line 201) | def test_lut_loading_6color_ref_stacks(self, stack: tuple): method test_lut_loading_8color_ref_stacks (line 225) | def test_lut_loading_8color_ref_stacks(self, stack: tuple): method test_full_pipeline_6color (line 249) | def test_full_pipeline_6color(self, stack: tuple): method test_full_pipeline_8color (line 283) | def test_full_pipeline_8color(self, stack: tuple): class TestLUTRefStacksInvariance (line 312) | class TestLUTRefStacksInvariance: method test_ref_stacks_invariance_single_6color (line 335) | def test_ref_stacks_invariance_single_6color(self, stack: tuple): method test_ref_stacks_invariance_single_8color (line 365) | def test_ref_stacks_invariance_single_8color(self, stack: tuple): method test_ref_stacks_invariance_batch_6color (line 396) | def test_ref_stacks_invariance_batch_6color(self, batch: list): method test_ref_stacks_invariance_batch_8color (line 424) | def test_ref_stacks_invariance_batch_8color(self, batch: list): method test_convention_correctness_6color (line 454) | def test_convention_correctness_6color(self, stack: tuple): method test_convention_correctness_8color (line 472) | def test_convention_correctness_8color(self, stack: tuple): FILE: tests/test_user_replacement_list_ui_unit.py function test_palette_list_i18n_keys_exist (line 17) | def test_palette_list_i18n_keys_exist(): function test_generate_palette_html_uses_list_cards_and_selected_classes (line 31) | def test_generate_palette_html_uses_list_cards_and_selected_classes(): function test_delete_selected_user_replacement_removes_target_row (line 48) | def test_delete_selected_user_replacement_removes_target_row(monkeypatch): function test_apply_replacement_global_scope_writes_region_not_map (line 66) | def test_apply_replacement_global_scope_writes_region_not_map(monkeypatch): function test_normalize_color_replacements_accepts_region_list_without_crash (line 114) | def test_normalize_color_replacements_accepts_region_list_without_crash(): function test_normalize_color_replacements_prefers_matched_when_present_in_region_item (line 128) | def test_normalize_color_replacements_prefers_matched_when_present_in_re... function test_process_batch_generation_single_accepts_replacement_regions_list (line 140) | def test_process_batch_generation_single_accepts_replacement_regions_lis... function test_process_batch_generation_full_pipeline_replacement_regions_affect_preview_and_model (line 199) | def test_process_batch_generation_full_pipeline_replacement_regions_affe... function test_update_preview_with_replacement_regions_applies_hex_without_nameerror (line 281) | def test_update_preview_with_replacement_regions_applies_hex_without_nam... function test_undo_uses_regions_only_history (line 319) | def test_undo_uses_regions_only_history(monkeypatch): function test_update_preview_applies_regions_in_order_without_map (line 344) | def test_update_preview_applies_regions_in_order_without_map(monkeypatch): function test_create_converter_tab_content_initializes_without_replacement_map_nameerror (line 365) | def test_create_converter_tab_content_initializes_without_replacement_ma... function test_regions_override_updates_material_matrix_in_order (line 380) | def test_regions_override_updates_material_matrix_in_order(): FILE: tests/test_vector_engine_unit.py function _rect (line 43) | def _rect(x0, y0, x1, y1, color=(255, 0, 0)): function _make_parse_only_processor (line 48) | def _make_parse_only_processor(sampling_precision=0.05): class TestClipOcclusion (line 59) | class TestClipOcclusion: method test_no_overlap_preserves_all (line 62) | def test_no_overlap_preserves_all(self): method test_later_shape_covers_earlier (line 73) | def test_later_shape_covers_earlier(self): method test_partial_overlap (line 86) | def test_partial_overlap(self): method test_draw_order_preserved (line 106) | def test_draw_order_preserved(self): method test_empty_input (line 117) | def test_empty_input(self): method test_return_silhouette_when_requested (line 121) | def test_return_silhouette_when_requested(self): method test_three_stacked_shapes (line 134) | def test_three_stacked_shapes(self): method test_no_small_feature_exemption (line 145) | def test_no_small_feature_exemption(self): class TestRunLengthExtrude (line 160) | class TestRunLengthExtrude: method _make_matched (line 166) | def _make_matched(self, geometry, recipe): method test_single_channel_all_layers (line 169) | def test_single_channel_all_layers(self): method test_alternating_channels_no_merge (line 182) | def test_alternating_channels_no_merge(self): method test_run_merges_consecutive (line 197) | def test_run_merges_consecutive(self): method test_material_id_in_result (line 211) | def test_material_id_in_result(self): method test_empty_geometry_skipped (line 223) | def test_empty_geometry_skipped(self): class TestOutputOrdering (line 240) | class TestOutputOrdering: method test_sorted_by_mat_id (line 243) | def test_sorted_by_mat_id(self): class TestExtrudeGeometry (line 259) | class TestExtrudeGeometry: method test_polygon_produces_mesh (line 261) | def test_polygon_produces_mesh(self): method test_multipolygon (line 267) | def test_multipolygon(self): method test_empty_returns_empty (line 273) | def test_empty_returns_empty(self): method test_none_returns_empty (line 277) | def test_none_returns_empty(self): method test_extrude_cache_reuses_base_mesh (line 281) | def test_extrude_cache_reuses_base_mesh(self): class TestParseSvgSubpaths (line 311) | class TestParseSvgSubpaths: method test_split_multi_subpath_path_into_multiple_polygons (line 313) | def test_split_multi_subpath_path_into_multiple_polygons(self, tmp_path): method test_parse_falls_back_when_subpath_split_unavailable (line 338) | def test_parse_falls_back_when_subpath_split_unavailable(self, tmp_path): method test_occlusion_keeps_uncovered_large_block (line 357) | def test_occlusion_keeps_uncovered_large_block(self, tmp_path): FILE: tests/test_worker_pool_properties.py function _worker_raise_value_error (line 32) | def _worker_raise_value_error(msg: str) -> None: function _worker_raise_runtime_error (line 37) | def _worker_raise_runtime_error(msg: str) -> None: function _worker_raise_os_error (line 42) | def _worker_raise_os_error(msg: str) -> None: function _worker_raise_type_error (line 47) | def _worker_raise_type_error(msg: str) -> None: function _worker_raise_io_error (line 52) | def _worker_raise_io_error(msg: str) -> None: function _worker_sleep (line 66) | def _worker_sleep(seconds: float) -> str: class TestWorkerPoolMaxWorkersProperty (line 78) | class TestWorkerPoolMaxWorkersProperty: method test_max_workers_equals_min_cpu_count_4 (line 86) | def test_max_workers_equals_min_cpu_count_4(self, cpu_count: int) -> N... class TestWorkerPoolConfigEnvOverrideProperty (line 106) | class TestWorkerPoolConfigEnvOverrideProperty: method test_env_vars_override_config (line 117) | def test_env_vars_override_config(self, n: int, f: float) -> None: class TestWorkerExceptionPropagationProperty (line 143) | class TestWorkerExceptionPropagationProperty: method test_worker_exception_propagates (line 158) | def test_worker_exception_propagates(self, exc_index: int, msg: str) -... class TestTaskTimeoutCancellationProperty (line 184) | class TestTaskTimeoutCancellationProperty: method test_task_timeout_raises_timeout_error (line 194) | def test_task_timeout_raises_timeout_error(self, timeout: float) -> None: FILE: tests/test_worker_pool_unit.py function _add (line 21) | def _add(a: int, b: int) -> int: function _raise_value_error (line 26) | def _raise_value_error(msg: str) -> None: function _slow_task (line 31) | def _slow_task(seconds: float) -> str: class TestWorkerPoolLifecycle (line 42) | class TestWorkerPoolLifecycle: method test_not_alive_before_start (line 45) | def test_not_alive_before_start(self) -> None: method test_alive_after_start (line 49) | def test_alive_after_start(self) -> None: method test_not_alive_after_shutdown (line 57) | def test_not_alive_after_shutdown(self) -> None: method test_shutdown_without_start_is_noop (line 63) | def test_shutdown_without_start_is_noop(self) -> None: method test_double_shutdown_is_safe (line 68) | def test_double_shutdown_is_safe(self) -> None: class TestMaxWorkers (line 80) | class TestMaxWorkers: method test_explicit_max_workers (line 83) | def test_explicit_max_workers(self) -> None: method test_default_max_workers (line 87) | def test_default_max_workers(self) -> None: method test_none_max_workers_uses_default (line 92) | def test_none_max_workers_uses_default(self) -> None: class TestSubmit (line 102) | class TestSubmit: method test_submit_returns_result (line 106) | async def test_submit_returns_result(self) -> None: method test_submit_raises_runtime_error_when_not_started (line 116) | async def test_submit_raises_runtime_error_when_not_started(self) -> N... method test_submit_propagates_worker_exception (line 122) | async def test_submit_propagates_worker_exception(self) -> None: method test_submit_timeout_raises_timeout_error (line 133) | async def test_submit_timeout_raises_timeout_error(self) -> None: FILE: tests/verify_merge_remap.py function verify_remap_table (line 42) | def verify_remap_table(remap_key, src_slots, expected_mapping): function verify_subtype_detection (line 70) | def verify_subtype_detection(): function verify_remap_with_real_stacks (line 114) | def verify_remap_with_real_stacks(): function verify_real_lut_files (line 197) | def verify_real_lut_files(): function verify_merged_npz (line 274) | def verify_merged_npz(): function verify_image_conversion (line 310) | def verify_image_conversion(): FILE: ui/callbacks.py function _hex_to_rgb_tuple (line 16) | def _hex_to_rgb_tuple(hex_color: str): function _build_full_color_region_mask (line 23) | def _build_full_color_region_mask(cache, selected_color: str): function _resolve_mode_key (line 51) | def _resolve_mode_key(mode: str) -> str: function _color_mode_html (line 62) | def _color_mode_html(mode: str) -> str: function on_lut_select (line 83) | def on_lut_select(display_name): function on_lut_upload_save (line 104) | def on_lut_upload_save(uploaded_file): function _get_corner_labels (line 120) | def _get_corner_labels(mode, page_choice=None): function get_first_hint (line 127) | def get_first_hint(mode, page_choice=None): function get_next_hint (line 134) | def get_next_hint(mode, pts_count, page_choice=None): function on_extractor_upload (line 143) | def on_extractor_upload(i, mode, page_choice=None): function on_extractor_mode_change (line 149) | def on_extractor_mode_change(img, mode, page_choice=None): function on_extractor_rotate (line 157) | def on_extractor_rotate(i, mode, page_choice=None): function on_extractor_click (line 166) | def on_extractor_click(img, pts, mode, page_choice, evt: gr.SelectData): function on_extractor_clear (line 177) | def on_extractor_clear(img, mode, page_choice=None): function on_extractor_page_change (line 183) | def on_extractor_page_change(img, mode, page_choice): function on_palette_color_select (line 192) | def on_palette_color_select(palette_html, evt: gr.SelectData, lang: str ... function on_apply_color_replacement (line 212) | def on_apply_color_replacement(cache, selected_color, replacement_color, function on_clear_color_replacements (line 265) | def on_clear_color_replacements(cache, replacement_regions, replacement_... function on_preview_generated_update_palette (line 296) | def on_preview_generated_update_palette(cache, lang: str = "zh"): function on_color_swatch_click (line 346) | def on_color_swatch_click(selected_hex): function on_color_dropdown_select (line 365) | def on_color_dropdown_select(selected_value): function on_lut_change_update_colors (line 381) | def on_lut_change_update_colors(lut_path, cache=None): function on_preview_update_lut_colors (line 411) | def on_preview_update_lut_colors(cache, lut_path): function on_lut_color_swatch_click (line 440) | def on_lut_color_swatch_click(selected_hex): function on_replacement_color_select (line 459) | def on_replacement_color_select(selected_value): function on_highlight_color_change (line 479) | def on_highlight_color_change(highlight_hex, cache, loop_pos, add_loop, function on_clear_highlight (line 517) | def on_clear_highlight(cache, loop_pos, add_loop, function on_delete_selected_user_replacement (line 552) | def on_delete_selected_user_replacement( function on_undo_color_replacement (line 621) | def on_undo_color_replacement(cache, replacement_regions, replacement_hi... function run_extraction_wrapper (line 647) | def run_extraction_wrapper(img, points, offset_x, offset_y, zoom, barrel... function merge_8color_data (line 702) | def merge_8color_data(): function merge_5color_extended_data (line 742) | def merge_5color_extended_data(): function on_merge_lut_select (line 788) | def on_merge_lut_select(display_name, lang="zh"): function on_merge_primary_select (line 813) | def on_merge_primary_select(display_name, lang="zh"): function on_merge_secondary_change (line 885) | def on_merge_secondary_change(selected_names, lang="zh"): function on_merge_execute (line 915) | def on_merge_execute(primary_name, secondary_names, dedup_threshold, lan... function on_merge_preview (line 1004) | def on_merge_preview(cache, merge_enable, merge_threshold, merge_max_dis... function on_merge_apply (line 1110) | def on_merge_apply(cache, merge_map, merge_stats, loop_pos, add_loop, function on_merge_revert (line 1176) | def on_merge_revert(cache, loop_pos, add_loop, loop_width, loop_length, ... FILE: ui/crop_extension.py function get_crop_modal_html (line 9) | def get_crop_modal_html(lang: str) -> str: function get_crop_head_js (line 698) | def get_crop_head_js(): FILE: ui/fivecolor_tab_v2.py function create_5color_tab_v2 (line 11) | def create_5color_tab_v2(lang="zh"): function _get_8color_luts (line 223) | def _get_8color_luts(): function _format_seq (line 259) | def _format_seq(selected, color_names=None): function _empty_colors_html (line 275) | def _empty_colors_html(): function _generate_colors_html_v2 (line 279) | def _generate_colors_html_v2(base_colors, color_count=None, color_names=... function _empty_result (line 375) | def _empty_result(): function _error_result (line 379) | def _error_result(msg): function _result_html (line 383) | def _result_html(result): FILE: ui/layout_new.py function load_last_lut_setting (line 173) | def load_last_lut_setting(): function save_last_lut_setting (line 189) | def save_last_lut_setting(lut_name): function _load_user_settings (line 212) | def _load_user_settings(): function _save_user_setting (line 223) | def _save_user_setting(key, value): function save_color_mode (line 234) | def save_color_mode(color_mode): function save_modeling_mode (line 239) | def save_modeling_mode(modeling_mode): function resolve_height_mode (line 245) | def resolve_height_mode(radio_value: str) -> str: function _scan_registry_for_slicers (line 279) | def _scan_registry_for_slicers(): function detect_installed_slicers (line 375) | def detect_installed_slicers(): function open_in_slicer (line 402) | def open_in_slicer(file_path, slicer_id): function _get_slicer_choices (line 430) | def _get_slicer_choices(lang="zh"): function _get_default_slicer (line 443) | def _get_default_slicer(): function _slicer_css_class (line 455) | def _slicer_css_class(slicer_id): function _get_image_size (line 956) | def _get_image_size(img): function calc_height_from_width (line 994) | def calc_height_from_width(width, img): function calc_width_from_height (line 1016) | def calc_width_from_height(height, img): function init_dims (line 1038) | def init_dims(img): function _scale_preview_image (line 1057) | def _scale_preview_image(img, max_w: int = 1200, max_h: int = 750): function _preview_update (line 1085) | def _preview_update(img): function process_batch_generation (line 1092) | def process_batch_generation(batch_files, is_batch, single_image, lut_pa... function _update_lut_grid (line 1228) | def _update_lut_grid(lut_path, lang, palette_mode="swatch"): function _detect_and_enforce_structure (line 1242) | def _detect_and_enforce_structure(lut_path): function create_app (line 1259) | def create_app(): function _get_header_html (line 1675) | def _get_header_html(lang: str) -> str: function _get_stats_html (line 1680) | def _get_stats_html(lang: str, stats: dict) -> str: function _get_footer_html (line 1692) | def _get_footer_html(lang: str) -> str: function _get_all_component_updates (line 1701) | def _get_all_component_updates(lang: str, components: dict) -> list: function _get_component_list (line 1879) | def _get_component_list(components: dict) -> list: function get_extractor_reference_image (line 1892) | def get_extractor_reference_image(mode_str, page_choice="Page 1"): function create_converter_tab_content (line 2009) | def create_converter_tab_content(lang: str, lang_state=None, theme_state... function create_calibration_tab_content (line 4699) | def create_calibration_tab_content(lang: str) -> dict: function create_extractor_tab_content (line 4804) | def create_extractor_tab_content(lang: str) -> dict: function create_merge_tab_content (line 5057) | def create_merge_tab_content(lang: str) -> dict: function create_advanced_tab_content (line 5105) | def create_advanced_tab_content(lang: str) -> dict: function create_about_tab_content (line 5142) | def create_about_tab_content(lang: str) -> dict: function _format_bytes (line 5184) | def _format_bytes(size_bytes: int) -> str: FILE: ui/palette_extension.py function build_hue_filter_bar_html (line 15) | def build_hue_filter_bar_html(lang: str = "zh") -> str: function build_search_bar_html (line 53) | def build_search_bar_html(lang: str = "zh") -> str: function dedupe_auto_pairs (line 69) | def dedupe_auto_pairs(pairs): function generate_palette_html (line 84) | def generate_palette_html( function build_selected_dual_color_html (line 196) | def build_selected_dual_color_html(quantized_hex: str = None, matched_he... function generate_lut_color_grid_html (line 221) | def generate_lut_color_grid_html(colors: List[dict], selected_color: str... function generate_dual_recommendations_html (line 332) | def generate_dual_recommendations_html(recommendations: dict, lang: str ... FILE: utils/bambu_3mf_writer.py class BambuStudio3MFWriter (line 21) | class BambuStudio3MFWriter: method __init__ (line 51) | def __init__(self, output_path: str, settings: Optional[Dict] = None, ... method add_mesh (line 66) | def add_mesh(self, mesh: trimesh.Trimesh, name: str, color_rgb: tuple): method export (line 89) | def export(self): method _write_content_types (line 133) | def _write_content_types(self, tmpdir: str): method _write_root_rels (line 149) | def _write_root_rels(self, tmpdir: str): method _write_main_model (line 159) | def _write_main_model(self, tmpdir: str): method _write_model_rels (line 195) | def _write_model_rels(self, tmpdir: str): method _write_object_files (line 205) | def _write_object_files(self, tmpdir: str): method _write_vertices_stream (line 231) | def _write_vertices_stream(stream, vertices): method _write_triangles_stream (line 246) | def _write_triangles_stream(stream, faces): method _write_vertices_bytes (line 261) | def _write_vertices_bytes(raw, vertices): method _write_triangles_bytes (line 279) | def _write_triangles_bytes(raw, faces): method _format_vertices (line 295) | def _format_vertices(vertices): method _format_triangles (line 314) | def _format_triangles(faces): method _write_single_object (line 332) | def _write_single_object(self, tmpdir: str, obj_id: int, mesh: trimesh... method _write_metadata_files (line 379) | def _write_metadata_files(self, tmpdir: str): method _write_model_settings (line 396) | def _write_model_settings(self, tmpdir: str): method _get_base_config_template (line 438) | def _get_base_config_template(self): method _get_minimal_config_template (line 463) | def _get_minimal_config_template(self): method _build_filament_arrays (line 477) | def _build_filament_arrays(self, num_colors: int, color_conf: dict): method _write_project_settings (line 530) | def _write_project_settings(self, tmpdir: str): method _write_slice_info (line 588) | def _write_slice_info(self, tmpdir: str): method _write_filament_sequence (line 603) | def _write_filament_sequence(self, tmpdir: str): method _write_cut_information (line 612) | def _write_cut_information(self, tmpdir: str): method _write_object_file_to_zip (line 631) | def _write_object_file_to_zip(self, zf: zipfile.ZipFile): method _create_zip (line 655) | def _create_zip(self, tmpdir: str, include_object_model: bool = False): method _generate_uuid (line 670) | def _generate_uuid() -> str: function export_scene_with_bambu_metadata (line 676) | def export_scene_with_bambu_metadata(scene: trimesh.Scene, output_path: ... function inject_bambu_metadata (line 766) | def inject_bambu_metadata(filepath: str, settings: Optional[Dict], FILE: utils/color_recipe_logger.py class ColorRecipeLogger (line 18) | class ColorRecipeLogger: method __init__ (line 23) | def __init__(self, lut_path: str, lut_rgb: np.ndarray, ref_stacks: np.... method _extract_color_names_from_filename (line 45) | def _extract_color_names_from_filename(self) -> Optional[List[str]]: method _get_color_name (line 102) | def _get_color_name(self, material_id: int) -> str: method add_mapping (line 128) | def add_mapping(self, original_rgb: Tuple[int, int, int], method generate_report (line 165) | def generate_report(self, output_path: str, model_filename: str): method create_from_processor (line 257) | def create_from_processor(processor, output_dir: str, model_filename: ... FILE: utils/helpers.py function safe_fix_3mf_names (line 11) | def safe_fix_3mf_names(filepath: str, slot_names: List[str], create_asse... FILE: utils/lut_manager.py class LUTManager (line 14) | class LUTManager: method get_all_lut_files (line 41) | def get_all_lut_files(cls) -> dict[str, str]: method get_lut_choices (line 85) | def get_lut_choices(cls): method infer_color_mode (line 97) | def infer_color_mode(display_name: str, file_path: str) -> str: method get_lut_path (line 158) | def get_lut_path(cls, display_name: str) -> str | None: method save_uploaded_lut (line 172) | def save_uploaded_lut(cls, uploaded_file, custom_name=None): method delete_lut (line 237) | def delete_lut(cls, display_name): FILE: utils/stats.py class Stats (line 11) | class Stats: method increment (line 22) | def increment(key: str) -> int: method get_all (line 29) | def get_all() -> dict: method reset_all (line 33) | def reset_all() -> dict: method clear_cache (line 40) | def clear_cache() -> tuple: method get_cache_size (line 69) | def get_cache_size() -> int: method _load (line 90) | def _load() -> dict: method clear_output (line 99) | def clear_output() -> tuple: method get_output_size (line 131) | def get_output_size() -> int: method _save (line 154) | def _save(data: dict):