# PrusaSlicer Profiles Module This module handles the parsing, management, and evaluation of PrusaSlicer configuration profiles (`.ini` files). It supports profile inheritance, compatibility evaluation using PrusaSlicer's expression language, and generating merged configurations for slicing. ## Core Components ### 1. `profiles.py` - **`Profile` Class**: Represents a single PrusaSlicer profile (Printer, Filament, or Print). - Stores configuration as a dictionary (`conf_dict`). - Handles inheritance logic via `generate_inherited_confs`. - Supports compatibility checks via `evaluate_compatibility`. - **`generate_conf` Function**: Recursively merges inherited profiles into a single configuration dictionary. ### 2. `profile_cache.py` - **`LocalCache` Class**: Manages a collection of profiles loaded from disk. - Scans directories for `.ini` files and tracks changes using file metadata. - Categorizes profiles into `printers`, `print`, and `filament`. - `evaluate_compatibility`: Checks which filament and print profiles are compatible with specific printer profiles. - `generate_conf_writer`: Creates a `ConfigWriter` by merging a printer, print, and one or more filament profiles (multi-extruder support). - **`ConfigWriter` Class**: Helper to write the merged configuration to a file (e.g., for passing to a slicer or embedding in a 3MF). - **Utility Functions**: `ini_to_dict` and `ini_content_to_dict` use `ConfigParser` to parse PrusaSlicer's INI format. ### 3. `expression_parser.py` - Implements a recursive descent parser for PrusaSlicer's expression language (used in `compatible_printers_condition` and similar fields). - **AST Nodes**: `ExprNode`, `LiteralNode`, `VarNode`, `IndexNode`, `UnaryOpNode`, `BinaryOpNode`. - **`Parser` Class**: Tokenizes and parses expression strings into an AST that can be evaluated against a configuration dictionary. ### 4. `prusaslicer_fields.py` - Loads metadata about PrusaSlicer configuration fields from `prusaslicer_fields.json` and `prusaslicer_modifier_fields.csv`. - Provides `search_in_db` and `search_in_mod_db` for looking up field definitions, types, and labels. ## Data Files - `prusaslicer_fields.json`: Exhaustive database of PrusaSlicer settings, including types, default values, and labels. - `prusaslicer_modifier_fields.csv`: List of fields that are valid as modifiers. ## Typical Workflow 1. Initialize `LocalCache`. 2. Call `cache.load([paths_to_profiles])`. 3. Select a printer, print, and filament profile(s). 4. (Optional) Evaluate compatibility using `cache.evaluate_compatibility`. 5. Generate a merged config using `cache.generate_conf_writer`. 6. Use `ConfigWriter` to output the final configuration for slicing.