Watch at Ease세상을 읽고, 일상의 답을 찾다.

기술 · 실용 가이드

Bambu Studio 프리셋이 사라졌나요? 재설치 전에 파일부터 감사하세요

메뉴에서 보이지 않는다고 JSON이 삭제된 것은 아닙니다. 설정 트리를 보존하고 사용자 프리셋의 해시와 상속 부모를 확인하세요.

Bambu Studio JSON 찾기, 정확한 증거 기록, 부모 상태 분류의 세 단계를 보여 주는 원본 편집 일러스트.
원본 편집 일러스트: 운영 프로필을 수리하기 전에 모든 사용자 범위를 조사하세요. Watch at Ease

Bambu Studio에서 사용자 필라멘트 프리셋이 사라지면 임의의 JSON을 운영 프로필에 복사하거나 덮어쓰기 재설치부터 하지 마세요. 현재 보고에는 상속 프리셋이 디스크에 남아 있지만 숨겨지는 경우와 업데이트 뒤 시스템 프로필 패키지가 비는 경우가 각각 있습니다. 같은 화면 증상도 표시 조건, 부모 누락, 손상, 실제 파일 부재로 나누어야 합니다.

이 가이드는 보존한 Bambu Studio 설정 트리 복사본에서 읽기 전용 증거 CSV를 만듭니다. 각 사용자 프리셋의 계정 범위, 상대 경로, 정확한 바이트 수, SHA-256, 이름, inherits, 호환 프린터와 root-preset·parent-found·parent-missing·unreadable 상태를 기록합니다. 클라우드 로그인이나 운영 설정 변경을 하지 않으며 삭제된 파일 복구를 보장하지 않습니다.

Studio를 바꾸기 전에 증거를 고정하세요

Bambu Studio를 완전히 종료하고 실제 설정 루트를 확인한 뒤 별도 이름의 전체 복사본을 만드세요. filament 폴더만 복사하지 말고 가능한 경우 시간과 권한을 유지합니다. 정리, 동기화, 가져오기, 초기화, 재설치는 숨김과 부재를 구분할 증거를 바꿀 수 있으므로 먼저 하지 않습니다.

Bambu Studio 버전, 운영체제, 선택한 프린터와 노즐, 복사 시간을 기록하세요. 프리셋이 여전히 보이는 프로필이 있다면 그 세션에서 문서화된 프리셋 번들 내보내기도 실행하세요. 화면 내보내기와 디스크 감사는 서로 다른 질문에 답합니다.

사용자 프리셋과 시스템 부모를 분리하세요

사용자 필라멘트 프리셋은 default와 계정별 폴더 등 여러 범위에 저장될 수 있습니다. 또한 전체 값을 담지 않고 inherits로 시스템 프리셋과의 차이만 저장할 수 있습니다. JSON 파일을 찾는 것은 필요하지만 Studio가 읽을 수 있다는 충분한 증거는 아닙니다.

감사는 system/BBL/filament의 이름 있는 시스템 프리셋을 색인하고 모든 사용자 프리셋의 inherits를 대조합니다. 같은 파일명을 같은 프리셋으로 가정하지 않고 JSON 이름과 정확한 바이트를 기록하며, 중복 키 JSON은 마지막 값을 조용히 채택하지 않고 거부합니다.

보존 복사본에서만 감사를 실행하세요

아래 스크립트를 bambu_preset_audit.py로 저장하세요. Python 3.12 또는 호환 Python 3에서 보존한 설정 루트와 그 바깥의 새 CSV 경로를 전달합니다. 기존 보고서를 덮어쓰지 않고 심볼릭 링크를 건너뛰며 입력 트리에 쓰지 않습니다.

Run this exact reviewed script from a copy of the configuration tree, not the live tree: ```python #!/usr/bin/env python3 """Read-only inventory for Bambu Studio user filament preset JSON files.""" from __future__ import annotations import argparse import csv import hashlib import json from pathlib import Path def object_no_duplicates(pairs): result = {} for key, value in pairs: if key in result: raise ValueError(f"duplicate JSON key: {key}") result[key] = value return result def load_json(path: Path): raw = path.read_bytes() value = json.loads(raw.decode("utf-8-sig"), object_pairs_hook=object_no_duplicates) if not isinstance(value, dict): raise ValueError("top-level JSON value is not an object") return raw, value def text_list(value): if value is None: return [] if isinstance(value, str): return [value] if isinstance(value, list) and all(isinstance(item, str) for item in value): return value raise ValueError("compatible_printers is not a string list") def system_names(root: Path): names = {} system_root = root / "system" / "BBL" / "filament" if not system_root.is_dir(): return names for path in sorted(system_root.rglob("*.json")): if path.is_symlink() or not path.is_file(): continue try: _, data = load_json(path) name = data.get("name") if isinstance(name, str) and name: names.setdefault(name, []).append(path.relative_to(root).as_posix()) except (OSError, UnicodeError, ValueError, json.JSONDecodeError): continue return names def audit(root: Path): parents = system_names(root) user_root = root / "user" rows = [] if not user_root.is_dir(): return rows for scope in sorted(user_root.iterdir()): filament = scope / "filament" if scope.is_symlink() or not scope.is_dir() or not filament.is_dir(): continue for path in sorted(filament.rglob("*.json")): if path.is_symlink() or not path.is_file(): continue row = { "account_scope": scope.name, "relative_path": path.relative_to(root).as_posix(), "bytes": path.stat().st_size, "sha256": "", "preset_name": "", "inherits": "", "parent_status": "unreadable", "parent_paths": "", "compatible_printers": "", "error": "", } try: raw, data = load_json(path) row["sha256"] = hashlib.sha256(raw).hexdigest() name = data.get("name", path.stem) if not isinstance(name, str): raise ValueError("name is not a string") inherits = data.get("inherits", "") if not isinstance(inherits, str): raise ValueError("inherits is not a string") printers = text_list(data.get("compatible_printers")) row["preset_name"] = name row["inherits"] = inherits row["compatible_printers"] = " | ".join(printers) if not inherits: row["parent_status"] = "root-preset" elif inherits in parents: row["parent_status"] = "parent-found" row["parent_paths"] = " | ".join(parents[inherits]) else: row["parent_status"] = "parent-missing" except (OSError, UnicodeError, ValueError, json.JSONDecodeError) as exc: row["error"] = str(exc) rows.append(row) return rows def main(): parser = argparse.ArgumentParser() parser.add_argument("config_root", type=Path) parser.add_argument("report_csv", type=Path) args = parser.parse_args() root = args.config_root.resolve(strict=True) report = args.report_csv.resolve() if not root.is_dir(): raise SystemExit("config_root is not a directory") if report == root or root in report.parents: raise SystemExit("report_csv must be outside config_root") rows = audit(root) fields = [ "account_scope", "relative_path", "bytes", "sha256", "preset_name", "inherits", "parent_status", "parent_paths", "compatible_printers", "error", ] with report.open("x", encoding="utf-8-sig", newline="") as handle: writer = csv.DictWriter(handle, fieldnames=fields) writer.writeheader() writer.writerows(rows) print(json.dumps({"config_root": str(root), "report_csv": str(report), "rows": len(rows)})) if __name__ == "__main__": main() ```

명령과 출력 경계를 확인하세요

예: python3 bambu_preset_audit.py '/evidence/BambuStudio-copy' '/evidence/bambu-preset-report.csv'. 두 번째 경로는 설정 복사본 밖이어야 합니다. 터미널에는 해석된 입력 경로, 보고서 경로, 행 수만 출력하고 상세 증거는 CSV에 둡니다. 스크립트와 보고서 해시도 보존하세요.

검토한 도구는 4,697바이트이며 SHA-256은 4711e9c5db94afee575fc6dbbc2a206a29178eeae4ce17387db8a6159a21cf0입니다. CPython 3.12.14에서 루트, 부모 발견, 부모 누락, 중복 키 손상 JSON 픽스처를 통과했습니다. 이는 분류기 경계만 증명하며 실제 계정·프린터·클라우드 호환성을 증명하지 않습니다.

수리 전에 모든 행을 읽으세요

root-preset은 부모 선언이 없고, parent-found는 inherits 이름과 일치하는 시스템 부모가 하나 이상 있다는 뜻입니다. parent_paths와 compatible_printers를 함께 보세요. parent-missing은 사용자 파일은 있지만 부모가 없고, unreadable은 경로와 오류를 남기되 손상 JSON을 유효하게 취급하지 않습니다.

병합 전 account_scope를 비교하세요. 같은 이름도 바이트가 다를 수 있습니다. SHA-256은 정확한 바이트 동일성이지 품질이나 호환성 판정이 아닙니다. 경로와 해시가 의도적 병합을 지지하지 않으면 별도로 유지하세요.

증거가 다음 분기를 선택하게 하세요

필요 파일과 부모가 모두 있으면 먼저 선택 프린터/노즐과 비호환 프리셋 숨김 여부를 확인하고, 보일 때 내보내세요. 운영 JSON을 직접 편집하지 마세요. 부모가 없으면 사용자 파일을 보존하고 해당 버전에 맞는 신뢰할 수 있는 시스템 계층만 복구하세요.

unreadable JSON은 복사본에서 검토하고 알려진 백업과 비교하세요. 유일한 증거를 다시 쓰지 마세요. 사용자 파일 자체가 없으면 감사로 재생성할 수 없으며 알려진 백업, 보이는 내보내기 또는 공급자 지원이 필요합니다.

완료 기준과 한계를 아세요

복사본의 모든 사용자 범위 필라멘트 JSON이 CSV 한 행씩 있고 CSV가 복사본 밖에 있으며 parent-missing과 unreadable 행을 검토했을 때 증거 단계가 끝납니다. 수리 성공은 별도이며, 보존 후 Studio를 열어 대상 프린터/노즐과 정확한 값을 확인해야 합니다.

이 절차는 재료 안전성, 프린터 호환성, 클라우드 동기화, 모든 과거 보고를 진단하지 않습니다. 운영 트리를 쓰기 전에 의도적으로 멈춥니다. 화면과 보고서가 다르면 복사본과 CSV를 유지해 경로, 해시, 부모 상태, 버전을 지원팀에 전달하세요.

부모 발견, 부모 누락, 읽기 불가 또는 파일 부재로 나뉘는 원본 감사 의사결정 일러스트.
원본 편집 일러스트: 보존한 증거가 제한된 수리 분기를 선택하게 하세요. Watch at Ease