# Resimden 3D (ComfyUI) — Durum Dosyası

> **Bu dosya kalıcı proje takibi içindir.** Yeni bir Claude oturumunda önce bunu oku;
> projeyi baştan analiz etme, sadece burada yazan dosyalara odaklan.
> Bir iş bittiğinde "Yapılanlar" ve "Sıradaki adımlar" bölümlerini güncelle.

**Son güncelleme:** 2026-09-17
**Durum:** ✅ Uçtan uca çalışıyor + dialogdan doğrudan STEP indirme eklendi

---

## 1. Amaç

`fikoyt-3d` bileşeninin **sol araç çubuğuna** bir buton. Tıklayınca kullanıcı resim
seçer → resim ComfyUI'daki **`FikoYT-img2-3d`** iş akışına gönderilir → üretilen
**dokulu (renkli) GLB** doğrudan aktif sahneye eklenir.

> **STL vs GLB (güncel karar):** İş akışı yalnızca **GLB** üretebiliyor
> (`MeshToFile3D`'nin tek girdisi `mesh`, format seçeneği yok — doğrulandı).
> Bu yüzden STL **tarayıcı tarafında** GLB'den üretiliyor (`STLExporter`).
> Dialogda "Sahneye eklenecek" seçeneği var: **GLB (renkli) / STL (renksiz) / Ekleme**.
> Varsayılan artık **STL** — çünkü GLB dosyası Windows'ta çoğu makinede
> doğrudan açılmıyor, STL her CAD/dilimleyicide açılıyor.

---

## 2. Ortam / altyapı gerçekleri (tekrar araştırma!)

| Konu | Değer |
|---|---|
| ComfyUI | `http://127.0.0.1:8188` — **çalışıyor** |
| ComfyUI kurulum yolu | `D:\Comfy\App\ComfyUI_windows_portable\ComfyUI` |
| ComfyUI başlatma bayrakları | `--enable-manager --enable-cors-header` |
| `fikoyt.com:8188` | **Dışarıdan erişilemiyor** (TCP kapalı, IP 95.70.139.167) |
| Site yayını | `ng serve` · HTTPS · port 443 (`start-prod.bat`, dist deploy DEĞİL) |
| Mixed-content | HTTPS sayfadan `http://...:8188` çağrılamaz → **proxy zorunlu** |
| Proxy yolu | `/comfyapi/**` → `http://127.0.0.1:8188` (`proxy.conf.js`, `ws: true`) |
| Taban adres override | `localStorage.setItem('fikoComfyTaban','https://xxx:8188')` |

---

## 3. İş akışı analizi — `FikoYT-img2-3d.json`

- 66 node, hepsi aktif (bypass/mute yok). 3 tanesi Note → API'ye girmez, **63 node**.
- Zincir: `LoadImage` → `RemoveBackground` (switch'li) → **Trellis2** shape/upsample/texture
  → `VoxelToMesh` → `Decimate/Remesh/Unwrap` → texture bake (BaseColor, Normal, Roughness,
  Metallic, AO) → `ApplyTextureToMesh` → `MeshToFile3D` → **`Save3DAdvanced`**.
- `MeshToFile3D` dönüş tipi: `FILE_3D_GLB`.
- **Çıktı okuma:** `history[promptId].outputs["322"].result[0]` = `"3d/ComfyUI_00004.glb"`
  (alt klasör + dosya adı; bazı node'larda sonda ` [output]` etiketi olabilir — kod ikisini de işler).
- Dışarıdan ayarlanan node'lar (id ile değil, `class_type` + `_meta.title` ile bulunur):
  - `LoadImage` → seçilen resim
  - `ComfySwitchNode` / title `"Switch: Remove background"` → arka plan sil
  - `PrimitiveInt` / title `"Texture Resolution"` → 1024 / 2048 / 4096
  - Tüm `seed` / `noise_seed` alanları → "her seferinde farklı sonuç"

---

## 4. Yapılanlar

### Araçlar (`tools/`)
- **`comfy-workflow-to-api.py`** — UI-workflow → `/prompt` API formatı dönüştürücü.
  Widget sırasını `object_info`'dan DEĞİL, node'un kendi `inputs[].widget` listesinden alır;
  `seed`/`control_after_generate` ekstra değerini atlar. (Bu iki detay olmadan eşleşme kayıyor.)
  ```
  python tools/comfy-workflow-to-api.py --workflow "FikoYT-img2-3d.json" --out public/comfy/FikoYT-img2-3d.api.json
  ```
- **`comfy-api-dogrula.py`** — API JSON'u ComfyUI'a doğrulatır (kuyruğa atar, hemen iptal eder).
- **`comfy-uctan-uca-test.py`** — gerçek üretim testi; GLB'yi masaüstüne indirir.

### Üretilen veri
- **`public/comfy/FikoYT-img2-3d.api.json`** — 63 node, `node_errors: {}` (doğrulandı).

### Uygulama kodu (`src/service/fikoyt-ui/src/lib/fiko-three-js/IFikoThreeJS/fiko-ai-3d/`)
- **`fiko-comfy-api.ts`** — `FikoComfyAPI`: resim upload → workflow yamalama → `/prompt`
  → WebSocket ilerleme (+ 3sn'lik history polling yedeği) → `/view` ile GLB indirme. İptal destekli.
- **`fiko-ai-3d-yukleyici.ts`** — `fikoAi3DSahneyeEkle()`: GLB → `FikoCizimGLB`, STL → `FikoCizimSTL`.
  Doku `SRGBColorSpace`, `DoubleSide`, mm'e ölçekleme (varsayılan 100 mm), merkezleme + tabana oturtma,
  `sahne.cizimler`'e ekleme, `ekranaSigdir`.
- **`fiko-ai-3d-dialog.component.ts`** — standalone dialog: resim seç + önizleme, arka plan sil,
  doku çözünürlüğü, hedef boyut (mm), rastgele seed, ilerleme çubuğu, iptal, hata gösterimi.

### Entegrasyon
- `Fiko3DComponent/.component.html` → `solAracCubugu` içine mor/pembe **magic** ikonlu buton
  (`#butonFikoAi3D`, `acFikoAi3DDialog()`), Annotation ile Parça Takip butonları arasında.
- `Fiko3DComponent/.component.ts` → `acFikoAi3DDialog()` (dinamik `import()` ile lazy, `DialogFiko.ac`).
- `proxy.conf.js` → `/comfyapi` bloğu eklendi (ws + 30 dk timeout).
- `angular.json` → serve'in **hem** `production` **hem** `development` konfigine
  `"proxyConfig": "proxy.conf.js"` eklendi (önceden hiç bağlı değildi!).

### STL dışa aktarma (2026-09-16 eklendi)
- **`FikoThreeCam/FikoSTLDisaAktar.ts`** (yeni, "yaprak" modül — hiçbir `FikoCizim*` import etmez,
  döngü riski yok):
  `fikoStlAdi`, `fikoDosyaIndir`, `fikoMeshSayisi`, `fikoOlcekleVeOturt`,
  `fikoObjeyiStlBlob`, `fikoObjeyiStlIndir`, `fikoGlbBlobundanStl`.
  İkili STL üretir; `LineSegments` (kenar çizgileri) STLExporter tarafından atlanır.
- `fiko-ai-3d-yukleyici.ts` artık kendi `boyutlandir`'ını tutmuyor →
  `fikoOlcekleVeOturt`'u import ediyor (tek kaynak, sahne ile STL birebir aynı ölçek).
- **Ağaç menüsü**: `FikoCizimGLB` ve `FikoCizimSTL`'nin `komutlar` dizisine
  **"STL olarak indir"** eklendi (dünya matrisi kullanılır → ekrandaki ölçek STL'e yansır).
- **Dialog**: "Sahneye eklenecek" (GLB / STL / Ekleme) + "Bitince STL indir" (varsayılan açık)
  + "Bitince GLB indir". STL, hedef boyuta (mm) ölçeklenip tabana oturtulmuş halde üretilir.

### Araç: tarayıcısız GLB→STL
- **`tools/glb-stl-cevir.py`** — bağımsız (kütüphanesiz) GLB→ikili STL dönüştürücü,
  `FikoSTLDisaAktar.ts` ile aynı ölçekleme/oturtma mantığı.
  ```
  python tools/glb-stl-cevir.py girdi.glb cikti.stl --mm 100
  ```
- **`tools/glb-incele.py`** — GLB sağlık kontrolü (chunk, extension, mesh/doku sayısı, üçgen).

### 🐞 ÇÖZÜLDÜ: yanlış dosya indiriliyordu (ham voxel ara mesh'i) — 2026-09-16
**Belirti:** Sahneye blok blok (voxel), renksiz, kaba bir model geliyordu — final değil.

**Sebep:** `history.outputs` içinde 3D dosya veren **birden fazla** node var ve
anahtar sırası garanti değil. Gerçek dökümde sıra şöyle:
`246 Preview3DAdvanced → preview3d_advanced_*.glb [temp]` (ham `VoxelToMesh` mesh'i),
`323 Preview3DAdvanced → *.glb [temp]`, **`322 Save3DAdvanced → 3d/ComfyUI_*.glb`** (FİNAL).
Eski `ciktiBul()` ilk eşleşeni döndürdüğü için **246**'nın temp önizlemesini alıyordu.

**Düzeltme (`fiko-comfy-api.ts`):**
- Yeni `finalNodeIdleri(prompt)` — `class_type` `Save3D*`/`SaveGLB*` olan node'u bulur,
  ardından onun `inputs.model_3d` kaynağını (son `MeshToFile3D`) ekler. Node id'lerine
  bağımlı değil, sınıf adına bakar; workflow yeniden numaralansa da kırılmaz.
- `ciktiBul(outputs, oncelikliIdler)` sırası: **1)** öncelikli node'lar →
  **2)** `type='output'` olanlar (temp önizlemeler elenir) → **3)** son çare ilk bulunan.
- Teşhis aracı: **`tools/comfy-cikti-dokum.py`** — son çalışmaların hangi node'un hangi
  dosyayı verdiğini dökümler. Çıktı sorunlarında önce bunu çalıştır.

### Sayfa/pencere kapanırken otomatik iptal (2026-09-17 eklendi)
- **Sorun:** Kullanıcı üretim sürüyorken sekmeyi/pencereyi kapatırsa veya sayfayı yenilerse,
  ComfyUI tarafında is hala calisıyor olarak kalıyordu (kimse `/api/interrupt` cagirmiyordu) —
  GPU bosuna mesgul kalıyordu.
- **`fiko-comfy-api.ts`** — yeni `FikoComfyAPI.iptalBeaconGonder()`: `navigator.sendBeacon`
  ile `/api/interrupt`'a istek yollar. `sendBeacon` secıldı cünkü normal `fetch` (mevcut
  `kontrol.abort()` yolundaki) sayfa kapanırken yarıda kesilebiliyor; `sendBeacon` tarayıcı
  tarafından kuyruga alınıp sayfa kapansa da teslim ediliyor.
- **`fiko-ai-3d-dialog.component.ts`** — yeni `sayfaKapaniyor()` metodu,
  `@HostListener('window:beforeunload')` + `@HostListener('window:pagehide')` ile tetikleniyor;
  `calisiyor` true ise beacon'u gonderiyor. **`ngOnDestroy()`** de ayni beacon'u cagiriyor
  (dialogun kendisi X/ESC ile kapatildiginda) — boylece hem "dialog kapat", hem "sekme/pencere
  kapat" hem de "sayfa yenile" durumlarinin hepsinde ayni guvenilir sinyal kullaniliyor;
  `kontrol.abort()` da hala cagriliyor (yerel AbortController + varolan fetch tabanli yol icin).
- **Dogrulama:** henüz tarayıcıda manuel denenmedi.

### Dialogdan dogrudan STEP indirme (2026-09-17 eklendi)
- **Sorun:** `FikoSTEPDisaAktar.ts` ve `FikoCizimGLB`/`FikoCizimSTL` ağaç menüsü komutları
  ("STEP olarak indir") önceden yazılmıştı ama **"Resimden 3D" dialogunun kendisi**
  bunlara bağlı değildi — kullanıcı STEP indirmek için önce sahneye eklemesi, sonra
  ağaçta sağ tıklaması gerekiyordu, dialogda buton yoktu.
- **`fiko-ai-3d-dialog.component.ts`** güncellendi:
  - Yeni checkbox **"Bitince STEP dosyasını indir"** + mod seçici (`B-Rep` / `AP242 Tessellated`),
    yalnızca `sahneFormat !== 'yok'` iken aktif (STEP mesh'i sahnedeki objeden okuyor, bu yüzden
    önce sahneye eklenmiş olması şart).
  - Sonuç panelinde iki yeni buton: **"STEP indir (B-Rep)"** / **"STEP indir (Tessellated)"**,
    `eklendiMi` true olunca aktifleşiyor.
  - Yeni `indirStep(mod)` metodu → `fikoObjeyiStepIndir(this.eklenenCizim, mod, ad)` çağırıyor.
  - `uret()` sonunda `stepIndir` işaretliyse otomatik STEP indirmesi de tetikleniyor.
  - Not metni STEP'in sahneye eklenmiş olma şartını açıklayacak şekilde güncellendi.
- **Doğrulama:** henüz `ng serve` üzerinde manuel denenmedi — sıradaki adımlara eklendi.

### Sonuç paneli + 3D görüntüleyicide açma (2026-09-16 eklendi)
- **`fiko-ai-3d/fiko-ai-3d-kasa.ts`** (yeni) — üretilen modeli tarayıcıda geçici saklayan
  IndexedDB kasası (`fikoyt-ai3d` / `modeller`), 1 gün ömürlü, sunucuya yükleme YOK.
  `fikoAi3DKasayaKoy` / `fikoAi3DKasadanAl` / `fikoAi3DKasadanSil` /
  `fikoAi3DGoruntuleyiciAdres` → `/🧩/🌌?fikoAi3D=<anahtar>`.
- **`Fiko3DComponent/.component.ts`** — `ngAfterViewInit` içinde mevcut `?dosya_id`
  bloğunun hemen ardına **`?fikoAi3D=<anahtar>`** desteği eklendi; yeni `ai3DKasadanYukle()`
  metodu kasadan okuyup `fikoAi3DSahneyeEkle` ile sahneye basar (ikisi de dinamik `import()`).
  Sahne hazır değilse 500 ms'de bir tekrar dener (dosyaYukle ile aynı desen).
- **Dialog sonuç paneli** — üretim bitince görünen kutu: dosya boyutları + hedef mm bilgisi,
  **Ekranda göster / Sahneye ekle**, **Yeni sekmede aç** (kasa üzerinden `/🧩/🌌`),
  **STL indir**, **GLB indir**. İlerleme çubuğuna yüzde etiketi eklendi.
- STL artık her üretimde hazırlanıyor (sadece checkbox işaretliyken değil), böylece
  "STL indir" butonu her zaman çalışıyor.
- Not: `/🧩/🌌` rotası zaten **bu** `Fiko3DComponent` — "Resimden 3D" butonu o sayfanın
  sol araç çubuğunda. Yani aynı sekmede zaten oraya ekleniyor; yeni sekme seçeneği ek.

### Doğrulama
- `npx tsc -p tsconfig.app.json --noEmit` → **0 hata** (STL değişiklikleri sonrası tekrar çalıştırıldı).
- Gerçek üretim: `Döküm-1.png` → ~218 sn → `3d/ComfyUI_00004.glb`, **38.7 MB**, magic `glTF`. ✅
- GLB incelemesi: glTF 2.0, uzantı yok, 1 mesh / 1 materyal / 3 PNG doku,
  **696.343 üçgen** → dosya **bozuk değil**; açılamama nedeni Windows'ta .glb
  eşleşmiş görüntüleyici olmaması.
- GLB→STL testi: `ComfyUI_00004.glb` → `ComfyUI_00004.stl`, 696.343 üçgen,
  ölçü **100 × 89.75 × 47.61 mm**, 34.8 MB. ✅ (masaüstüne yazıldı)
- `npx ng build --configuration development` → **başarılı** (şablonlar da derlendi;
  çıkan uyarılar HMI dashboard'a ait, bu işle ilgisiz ve önceden vardı).

---

## 5. Bilinen sorunlar / dikkat edilecekler

- **Dev server yeniden başlatılmalı** — `proxy.conf.js` ve `angular.json` değişti, `ng serve` restart şart.
- **"Yeni sekmede aç" aynı tarayıcıda çalışır** — model IndexedDB'de duruyor, sunucuda değil.
  Başka cihaz/tarayıcı ya da gizli pencere anahtarı çözemez ("Model bulunamadı" uyarısı verir).
  Kayıtlar 1 gün sonra otomatik silinir. Kalıcı paylaşım gerekirse dosyayı karta yükleyip
  mevcut `?dosya_id=` yolu kullanılmalı.
- **Açılır pencere engelleyici** — "Yeni sekmede aç" `window.open` kullanıyor; tarayıcı
  engellerse kullanıcıya izin vermesi söylenmeli.
- **Dosya boyutu** — 38 MB GLB. Doku 4096 seçilirse daha da büyür; yavaş ağda sıkıntı olabilir.
  Gerekirse `MeshToFile3D` öncesine Draco/KTX2 sıkıştırma eklenebilir.
- **Süre** — 1024 dokuda ~3.5 dk. Dialog açıkken sekme kapatılmamalı (WS kopunca polling devralır ama
  sonuç sahneye eklenemez; `history`den elle çekmek gerekir).
- **`fikoyt.com:8188` kapalı** — uzak makineden kullanılacaksa ya port açılmalı ya da
  proxy hedefi değiştirilmeli.
- **Workflow değişirse** `comfy-workflow-to-api.py`'yi tekrar çalıştır; node id'leri değişse bile kod
  `class_type` + `_meta.title` ile bulduğu için kırılmaz — ama **title'lar korunmalı**.

---

## 6. Sıradaki adımlar (öneriler, henüz yapılmadı)

1. `ng serve` restart + tarayıcıda butonu gerçek kullanımla dene (STL sahneye, yeni sekmede aç,
   **STEP indir butonları — B-Rep ve Tessellated ikisi de, ozellikle 25k ucgen tavaniyla
   B-Rep'in artik donmadan bitip bitmedigi ve tessellated dosyanin gercek CAD programinda
   dolu (bos degil) acildigi**, **sekme kapatılınca ComfyUI'da is gerçekten iptal oluyor mu**).

### STEP hatalari (2026-09-17 duzeltildi)
- **Tessellated bos aciliyordu:** `TRIANGULATED_SURFACE_SET` varliginda `normals` ve
  `pnindex` alanlari `$` (tanimsiz) yazilmisti. AP242 semasina gore pnindex bossa **bos
  liste `()`** olmali, `$` degil (WR2: pnindex boyutu 0 ise pnmax=nokta sayisina esit
  olmali — pnmax zaten dogruydu, ama `$` gecersiz sozdizimiydi). Cogu kati cekirdek
  (SolidWorks/NX/CATIA) bunu sessizce atlayip varligi yok sayiyor, dosya aciliyor ama
  icinde geometri olmuyordu. `FikoStepYazici.ts` → `(),(),`  olarak duzeltildi.
- **B-Rep'te PC kilitleniyordu:** `varsayilanSecenek()`'teki `uyarlanabilirSadelestirme: true`
  yalnizca `hedefUcgen` acikca verilirse calisiyordu, dialog hic vermiyordu — yani
  AI'dan gelen 500k-700k ucgenlik ham mesh dogrudan B-Rep'e giriyordu. B-Rep'te ucgen
  basina ~9 STEP satiri uretildigi icin (nokta+yon+yerlesim+duzlem+poly_loop+face...) bu
  milyonlarca satir demekti — tek senkron JS dongusu tarayıcıyi kilitliyordu.
  `FikoSTEPDisaAktar.ts` → `varsayilanSecenek()`'e mod bazli varsayilan eklendi:
  **B-Rep icin `hedefUcgen: 25000`** (kullanici acikca baska deger verirse o gecerli),
  **Tessellated icin sinirsiz** (ucgen basina 1 satir oldugu icin sorun cikarmiyordu).
- **Ek:** dialogdaki `indirStep()` artık `ilerleme` callback'ini `durum`/`yuzde`'ye
  bagliyor — uzun suren asamalarda (sadelestirme, cimdik onarimi) en azindan yuzde
  gostergesi ilerliyor, tamamen donmus gibi gorunmuyor.
- **Dogrulama:** henüz tarayıcıda / hedef CAD programinda manuel denenmedi.

### STEP ayarlari kullaniciya acildi (2026-09-17 eklendi)
- **Sorun:** 25000 ucgen tavani (yukaridaki fix) ve kaynak toleransi kod icinde
  sabit kodlanmisti — kullanicinin bunu kendi parcasina gore ayarlamasinin yolu yoktu.
- **`fiko-ai-3d-dialog.component.ts`** — STEP secim satirina bir dis (cog) butonu
  eklendi; tiklayinca acilan panelde:
  - **B-Rep hedef ucgen** (varsayilan 25000, 0 = sinirsiz)
  - **Tessellated hedef ucgen** (varsayilan 0 = sinirsiz)
  - **Kaynak toleransi (mm)** (varsayilan 0.001)
  üç alan var. `indirStep(mod)` artık bu degerleri `fikoObjeyiStepIndir`'e secenek olarak
  geciyor (0/bos girilirse `undefined` gecilir, boylece `FikoSTEPDisaAktar.ts`'teki
  modul-ici varsayilan da devre disi kalip tam mesh gider). Ayarlar `localStorage`'a
  (`fikoStepAyarlari` anahtari) yaziliyor, dialog her acildiginda geri yukleniyor.
- **Dogrulama:** henüz tarayıcıda denenmedi.
2. Draco/meshopt sıkıştırma ile GLB boyutunu düşür. *(Kullanıcı isteğiyle şimdilik ertelendi.)*
3. ~~STL dışa aktarma~~ **YAPILDI** (dialog seçeneği + ağaç menüsü komutu + python aracı).
4. Mesh sadeleştirme (decimate) seçeneği — 696k üçgen çoğu iş için fazla; dialogda
   "üçgen sınırı" ile STL'i küçültmek boyutu ve sahne performansını ciddi düşürür.
5. Birden fazla resim (multi-view) desteği — iş akışı `Trellis2Conditioning` ile çoklu ref alabiliyor.
6. Son N üretimin geçmişi (küçük galeri) — kasa zaten IndexedDB'de tutuyor, listelemek kolay.

### 🐞 GERÇEK KÖK SEBEP: Tessellated CATIA'da "0 0 0 0 0 0" (hiçbir şey transfer edilmiyor) — 2026-09-17
**Belirti (kullanıcının CATIA V5 `.rpt` raporu):** Entity Type tablosunun tüm sütunları
(OK/KO/NS/OUT/DEG/INV) **0** — CATIA dosyayı okudu (header/schema doğru göründü) ama
transfer edilecek **hiçbir varlık bile bulamadı**. Bu, önceki `$,$,` → `(),()` düzeltmesinden
(WR2 kuralı, doğruydu) daha temel bir hata olduğunu gösterdi.

**Gerçek sebep:** `tessellatedYuzeyUret()` koordinat listesini **`CARTESIAN_POINT_LIST_3D`**
olarak yazıyordu. CAx-IF "Recommended Practices for 3D Tessellated Geometry" (AP242)
şemasına göre `tessellated_surface_set.coordinates` alanının tipi **`COORDINATES_LIST`**
(`npoints` + `position_coords`) — `CARTESIAN_POINT_LIST_3D` tamamen farklı bir varlık
(B-Spline yüzey kontrol noktaları için). Tip uyuşmazlığı olunca CATIA'nın katı EXPRESS
ayrıştırıcısı `TRIANGULATED_SURFACE_SET`'i (ve dolayısıyla tüm temsili) sessizce reddediyor —
"0 0 0 0 0 0" tam olarak bunu gösteriyor.
- **`FikoStepYazici.ts`** → `CARTESIAN_POINT_LIST_3D('',(...))` yerine
  `COORDINATES_LIST('',<noktaSayisi>,(...))` yazılacak şekilde düzeltildi (resmi Part21
  örneğiyle birebir aynı format: `COORDINATES_LIST(' ',72,((x,y,z),...))`).
- Not: Üst düzey `SHAPE_REPRESENTATION` (TESSELLATED_SHAPE_REPRESENTATION değil) sarmalayıcı
  doğruydu — CAx-IF dokümanı bunu AP242 Edition 1 için **önerilen workaround** olarak
  tanımlıyor (tessellated_shape_representation'da axis2_placement_3d'ye izin verilmiyor).
- **Doğrulama:** henüz CATIA/başka bir CAD programında denenmedi — sıradaki testte
  doğrulanmalı.
