# v0.1.237 — QA-015 Edit Duplicate P1 구현

- 버전: v0.1.237
- 분류: 48th stable seal (v0.1.366) 일괄 봉인 사이클
- 다운로드: [factory00-windows-x64-v0.1.237.zip](../../downloads/archive/factory00-windows-x64-v0.1.237.zip) (archive 보존)
- 캡처: [qa-screenshots/v0.1.237/](../../qa-screenshots/v0.1.237/)

---

## QA-015 Edit Duplicate P1 구현 — Ctrl+D · UndoStack 통합
협업자 spec edit-duplicate (summary/brief/plan/checklist). PM 회신 QA-013 A1 정책:
- 메시 Instance 참조 (Object.Instantiate sharedMesh 자동 공유)- Material 공유 (sharedMaterials 유지)- 컴포넌트 제거: ISensor / IActuator / ModbusAddressMap 계열 전체 (Transform/Mesh* 유지)- 하위 재귀 자동 (Object.Instantiate가 트리 전체 복제)- Ctrl+D 단축키 + UndoStack push
## 구현 위치
- Assets/Scripts/Game/Factory00Bootstrap.cs (+~125라인)- DuplicateSelectedPart() 메서드 (line 6540 부근, VisibilityCommand 옆)- DuplicateCommand : IEditCommand nested class- Execute: Object.Instantiate(origGo, parent) + 위치 오프셋 50mm X + RemoveRuntimeComponents + 새 Part 객체 + Parts.Add + _partByTransform 갱신 + UI Rebuild- Undo: GameObject SetActive(false) + Parts.Remove + 캐시 cleanup + 선택 해제- Redo: GameObject SetActive(true) + Parts 재추가- RemoveRuntimeComponents: Transform/MeshFilter/MeshRenderer/Collider 외 MonoBehaviour 전체 Destroy- Ctrl+D 단축키 (line 3285 부근, Ctrl+Z/Y/A 옆)- Edit 탭 edit-duplicate 버튼 핸들러 = DuplicateSelectedPart 호출 (Placeholder 제거)
## 정책 매핑 (PM 회신 QA-013 A1)
| 정책 | 구현 |
|---|---|
| 메시 Instance | Object.Instantiate 기본 sharedMesh 공유 || Material 공유 | sharedMaterials 그대로 (renderer.material 사용 금지) |
| 컴포넌트 제외 | RemoveRuntimeComponents — Transform·MeshFilter·MeshRenderer·Collider 제외 모두 Destroy |
| 하위 재귀 | GetComponentsInChildren(true) — 전체 자식 GameObject 순회 || Ctrl+D 단축키 | Update() line 3285 — ctrlEdit && !IsAnyTextFieldFocused() && KeyCode.D || UndoStack | _undoStack.ExecuteAndPush(new DuplicateCommand(this, target)) |
## ID/Name 생성 규칙
- **id**: {원본id}_copy_{GUID 8자} — 유일성 보장- **name**: {원본name} (copy) — 부품 트리 직관적 표시- **위치**: 원본 + Vector3(50f, 0, 0) — 50mm X 오프셋 (Unity Transform = mm scaled, 본 단위 매칭)
## 검증 시나리오 (PM checklist)
1. 씬에서 부품 1개 선택 -> Edit 탭 Duplicate 클릭 -> 복제본 50mm 옆 생성 [OK]
2. 부품 트리 ListView에 새 항목 출현 [OK]
3. 복제본 Inspector -> Sensor/Servo/Pneumatic 모두 없음 (컴포넌트 제외) [OK]
4. Ctrl+Z -> 복제 취소 (복제본 사라짐) [OK]
5. Ctrl+Y -> 복제 재실행 (복제본 재등장) [OK]
6. Ctrl+D 단축키 동작 확인 [OK]

## P2 예약
- 다중 선택 복제 (MultiSelect) — spec 명시 P2- 오프셋 방향 사용자 설정 — P3
## 변경 파일
- Assets/Scripts/Game/Factory00Bootstrap.cs (+125라인)- line 1846 부근: edit-duplicate 핸들러 (Placeholder -> DuplicateSelectedPart)- line 3285: Ctrl+D 단축키- line 6540~6660: DuplicateSelectedPart + DuplicateCommand class
## 다음 단계
- 협업자 PM checklist 검증 (edit-duplicate-checklist.md)- QA-019 에어 진공 패밀리 P1 / QA-011 구동부 델타타임 검증- 38th stable seal 후보 (v0.1.234~237 4 사이클)


---

## 봉인 참조

본 사이클은 **48th stable seal (v0.1.366, 2026-05-24)** 일괄 봉인에 포함됨.

- journal: [2026-05-24-v0.1.298-366-48th-stable-seal.md](../../journal/2026-05-24-v0.1.298-366-48th-stable-seal.md)
- alias zip: [factory00-windows-x64-v0.1.366-stable.zip](../../downloads/factory00-windows-x64-v0.1.366-stable.zip) (170 MB)
