diff --git a/freecad/silo_commands.py b/freecad/silo_commands.py index 8b8bc90..b5a0fb3 100644 --- a/freecad/silo_commands.py +++ b/freecad/silo_commands.py @@ -234,41 +234,45 @@ def get_projects_dir() -> Path: def get_cad_file_path(part_number: str, description: str = "") -> Path: """Generate canonical file path for a CAD file. - Path format: ~/projects/cad/{category_code}_{category_name}/{part_number}_{description}.FCStd + Path format: ~/projects/cad/{category_code}_{category_name}/{part_number}_{description}.kc """ category, _ = parse_part_number(part_number) folder_name = get_category_folder_name(category) if description: - filename = f"{part_number}_{sanitize_filename(description)}.FCStd" + filename = f"{part_number}_{sanitize_filename(description)}.kc" else: - filename = f"{part_number}.FCStd" + filename = f"{part_number}.kc" return get_projects_dir() / "cad" / folder_name / filename def find_file_by_part_number(part_number: str) -> Optional[Path]: - """Find existing CAD file for a part number.""" + """Find existing CAD file for a part number. Prefers .kc over .FCStd.""" category, _ = parse_part_number(part_number) folder_name = get_category_folder_name(category) cad_dir = get_projects_dir() / "cad" / folder_name - if cad_dir.exists(): - matches = list(cad_dir.glob(f"{part_number}*.FCStd")) - if matches: - return matches[0] - - base_cad_dir = get_projects_dir() / "cad" - if base_cad_dir.exists(): - for subdir in base_cad_dir.iterdir(): - if subdir.is_dir(): - matches = list(subdir.glob(f"{part_number}*.FCStd")) - if matches: - return matches[0] + for search_dir in _search_dirs(cad_dir): + for ext in ("*.kc", "*.FCStd"): + matches = list(search_dir.glob(f"{part_number}{ext[1:]}")) + if matches: + return matches[0] return None +def _search_dirs(category_dir: Path): + """Yield the category dir, then all sibling dirs under cad/.""" + if category_dir.exists(): + yield category_dir + base_cad_dir = category_dir.parent + if base_cad_dir.exists(): + for subdir in base_cad_dir.iterdir(): + if subdir.is_dir() and subdir != category_dir: + yield subdir + + def search_local_files(search_term: str = "", category_filter: str = "") -> list: """Search for CAD files in local cad directory.""" results = [] @@ -288,7 +292,9 @@ def search_local_files(search_term: str = "", category_filter: str = "") -> list if category_filter and category_code.upper() != category_filter.upper(): continue - for fcstd_file in category_dir.glob("*.FCStd"): + for fcstd_file in sorted( + list(category_dir.glob("*.kc")) + list(category_dir.glob("*.FCStd")) + ): filename = fcstd_file.stem parts = filename.split("_", 1) part_number = parts[0]