# Parametrik CAD — Knowledge / Parametre Sistemi (CATIA tarzı)

**Tarih:** 2026-06-20
**Durum:** Tasarım onaylandı, plan aşamasına geçiliyor
**Konum:** `src/service/fikoyt-ui/src/lib/fiko-three-js/IFikoThreeJS/fiko-modelleme/`

## Amaç

FikoYT 3D modelleme motorunu CATIA Knowledge seviyesinde **tamamen merkezi parametrik** hale getirmek.
Modelin **her geometrik değeri** merkezi parametre deposunda yaşar (tek otorite): feature'lar oluşurken
sayısal alanları otomatik parametre olur; kullanıcı **Parametre Workbench**'te serbest/adlı/tipli parametreler
de ekler ve istediğini formüle bağlar. Bir parametre değişince bağlı her şey (seçimli: otomatik ya da manuel)
güncellenir. Belge kaydedilip açıldığında tüm parametreler, formüller, gruplar ve intrinsic bağlar eksiksiz çalışır.

## Hedef Deneyim (kullanıcı gözünden)

1. Parametre Workbench'i aç → `Gövde` grubu oluştur, altına `etKalinlik = 5mm`, `boy = 100mm`,
   `delikCap = etKalinlik * 2` ekle (serbest parametreler).
2. Pad çiz → feature oluşur oluşmaz `Pad.1\Uzunluk = 20mm` gibi **intrinsic parametreleri otomatik**
   ağaca düşer. Adını `kapakKalinligi` yap, ya da `boy / 4` formülüne bağla.
3. Pad'in "Derinlik" alanındaki **f(x)** butonuyla doğrudan `boy` parametresini de seçebilirsin.
4. Workbench'te `etKalinlik`'i 8mm yap → bağlı delik çapı otomatik 16mm olur, model güncellenir.
5. Parametreleri sürükleyip istediğin grubun altına taşı; grupları iç içe oluştur.
6. Manuel moda al → birkaç parametreyi değiştir → tek seferde **Güncelle**'ye bas.
7. Kaydet, kapat, aç → tüm parametreler, formüller, gruplar, intrinsic bağlar aynen çalışır.

## Saf merkezi model: depo tek otorite

**Tüm 3D sistem merkezi parametrelerle çalışır.** `FikoParametreDeposu` modelin her geometrik değeri için
**tek doğruluk kaynağıdır (single source of truth)**. Feature alanları (`IOzellik.param`, `holeCap`...) artık
"asıl değer" değil — depodan türetilen **yazılır önbellektir (write-through cache)**.

İki tür parametre (ikisi de depoda, yeniden adlandırılabilir, formül alabilir, birbirine referans verebilir):

| Tür | Kaynak | Feature backref | Otorite |
|-----|--------|-----------------|---------|
| **Serbest** | Workbench'te elle | yok | depo |
| **Intrinsic** | Feature oluşunca **otomatik** | `(featId, alan)` | depo (feature alanı = türev önbellek) |

- Pad/Delik/Fillet vb. oluşturulunca sayısal alanlarının **TAMAMI** depoya intrinsic parametre olarak
  yayınlanır (`Pad.1\Uzunluk`, `Hole.1\Çap`, `EdgeFillet.1\Yarıçap`, `Pattern.1\Adet`...).
- **Otorite depodadır:** bir dialogdan değer değiştirmek aslında ilgili **parametreyi** değiştirir.
- **rebuild başında çözümleme (resolve) geçişi:** her feature'ın parametreleri çözülür (formül varsa
  hesaplanır) ve değerleri `IOzellik` alanlarına yazılır. Bundan sonrası mevcut geometri kodu (7200 satır)
  alanları bugünkü gibi okur → **geometri kodu değişmez** (risk burada kontrol altında).
- **Gruplar (`IFikoParametreGrup`):** iç içe (ağaç). Parametreler ve alt gruplar istenen grubun altına taşınabilir.
  Intrinsic parametreler varsayılan ilgili feature'ın grubu altında; kullanıcı taşıyabilir.

### Kapsamlı alan haritası (Faz 1 ana iş kalemi)
`IOzellik`'teki ~70 feature türünün her sayısal alanı için yayın tanımı: `{ alan, etiket, tip }`.
Mekanik ama hacimli kataloglama (pad/pocket/shaft/groove, hole tüm varyantları, fillet/chamfer/draft/shell,
pattern türleri, loft/sweep/rib, primitifler, transformlar, GSD wireframe/surface...). Bu harita = sistemin
merkezi parametre kaydı. Eksik alan = o değer parametrik değil → harita tam olmalı.

## Mevcut Durum (temel alınan + yeniden kullanılacak)

- `FikoModellemeYonetici.ts` (~7200 satır): `IOzellik[]` parametrik feature geçmişi + `rebuild()` zaten var.
- Feature sayısal alanları şu an **sabit sayı** (`param`, `holeCap`, `kenarMesafe`, `adet`, `aci`...).
- `serialize()` / `deserialize()` **alan-alan manuel** (tam JSON kopya değil) → yeni alanlar açıkça eklenmeli.
- **Ürün ağacında inline parametre ZATEN var:** `grp.userData.FikoParametreler` → `agac-item.component.html`
  chip render (Sayı/Açılır/Çubuk/Renk, her biri `{ isim, turu, degeri, degisti, ayar }`). Intrinsic
  parametre gösterimi **bu mekanizma yeniden kullanılarak** yapılır; sadece **formül/f(x)** chip türü eklenir.
- `ParametrelerComponent` (`fikoyt-parametreler`, `IParametreTumu`) SaaS form/kart odaklı → CAD Knowledge
  için KULLANILMAZ (formül grafiği/birim/feature bağı yok). Workbench yeni odaklı panel.
- **İsim çakışması:** `interfaces/IParametre/IParametre.ts` zaten `IParametre` tanımlı → bu sistemde
  `IFikoParametre` / `IFikoParametreGrup` adları kullanılır.
- Eskiz: `FikoSketch` + `FikoKisitSolver` (ölçü/kısıt sistemi) — Faz 2.

## Yaklaşım — Saf merkezi + write-through önbellek

Depo tek otoritedir; tüm geometrik değerler merkezi parametredir. Riski kontrol altında tutan kilit fikir:
feature alanları **türev önbellek** olarak korunur ve `rebuild()` başındaki tek **çözümleme geçişi**
depodan alanlara değer yazar. Böylece 7200 satırlık geometri kodu OKUMA tarafında değişmeden çalışır;
sadece (a) kapsamlı alan haritası, (b) dialog edit'lerinin depoya yönlenmesi, (c) rebuild başına resolve
geçişi eklenir. Her feature'a **kararlı `id`** eklenir.

Reddedilenler: her sayısal alanı `{val, formul?}` nesnesine çevirmek → 7200 satır + tüm geometri okumaları
değişir, çok yüksek risk. Yan-tablo / sadece-elle-bağlama → "tüm sistem merkezi parametre" hedefini karşılamaz.

## Mimari Birimler

Tüm çekirdek birimler **saf TypeScript**, THREE bağımsız → bağımsız test edilebilir.

### 1. FikoIfadeMotoru (`FikoIfadeMotoru.ts`)
İfade motoru: Tokenizer + Pratt parser → AST → evaluator.
- Operatörler: `+ - * / % ^`, parantez, birli `-`.
- Karşılaştırma/mantık: `< <= > >= == != && ||`.
- Fonksiyonlar: `sin cos tan asin acos atan atan2 sqrt abs min max pow round floor ceil log exp sign`.
- Koşullu: `if(kosul, a, b)`.
- Sabitler: `PI`, `E`.
- Birim literali: `10mm`, `30deg`, `2.5cm` → iç birime (mm / radyan ya da derece — karar: **mm + derece**) çevrilir.
- Çıktı: `{ deger: number|boolean|string, tip }` + `referanslar: string[]` (bağımlılık grafiği için).
- Saf, deterministik, yan etkisiz. Birim testleri zorunlu (kritik iş mantığı).

### 2. FikoParametreDeposu (`FikoParametreDeposu.ts`)
```ts
type ParamTip = 'Uzunluk' | 'Aci' | 'Tamsayi' | 'Reel' | 'Boolean' | 'Metin';
interface IFikoParametre {
  id: string;          // kararlı (FikoYTId)
  ad: string;          // benzersiz, geçerli tanımlayıcı (formülde kullanılır)
  tip: ParamTip;
  deger: number | boolean | string;   // çözülmüş güncel değer
  formul?: string;     // varsa değer formülden hesaplanır
  birim?: string;      // gösterim (mm/deg/...)
  aciklama?: string;
  kilitli?: boolean;   // salt-okunur
  grupId?: string;     // ait olduğu grup (yoksa kök)
  // intrinsic parametre ise feature alanına geri-referans (serbest parametrede yok):
  feat?: { featId: string; alan: string };
}
interface IFikoParametreGrup {
  id: string;
  ad: string;
  ustGrupId?: string;  // iç içe gruplar (yoksa kök)
  aciklama?: string;
}
```
**Parametre API:** ekle / sil / adDegistir / getir / listele. Ad çakışması + geçerli-tanımlayıcı doğrulaması.
adDegistir → tüm formüllerde referansı günceller (rename-safe). intrinsic auto-yayın: `featAlanYayinla(featId, alan, etiket, deger)`.
**Grup API:** grupEkle / grupSil (içindekiler üst gruba taşınır) / grupAdDegistir / tasi(paramId|grupId, hedefGrupId). Döngüsüz grup ağacı.

### 3. FikoBagimlilikGrafi (`FikoBagimlilikGrafi.ts`)
Düğümler: parametreler + bağlı feature/eskiz alanları. Kenarlar: referanslardan türetilir.
- Topolojik sıralama (parametre→parametre formül zinciri).
- **Döngü tespiti** (A=B+1, B=A+1 → hata, kullanıcıya Türkçe uyarı).
- Bir parametre değiştiğinde **aşağı-akış (downstream)** etkilenen düğümleri verir.
- Feature geçmişi sıralı olduğundan: etkilenen feature alanlarının **en küçük index'i** → rebuild oradan başlar.

### 4. Merkezi çözümleme (resolve) + write-through önbellek
Ayrı `baglamalar` Map YOK — bağlama = parametrenin formülü. Tek otorite: parametre deposu.
- `IOzellik`'e `id: string` eklenir (kararlı, mevcut feature'lar deserialize'da id alır).
- **Feature oluşunca** alan haritasındaki tüm sayısal alanları depoya intrinsic parametre olarak yayınlanır
  (`feat:{featId,alan}` backref + otomatik ad `Feature.N\Etiket`, mevcut alan değeriyle tohumlanır).
- **`rebuild()` başında tek çözümleme geçişi:** topolojik sırada tüm parametreler çözülür (formüller
  hesaplanır) → her intrinsic parametrenin değeri `IOzellik` alanına yazılır. Geometri kodu değişmeden devam eder.
- Dialogdan değer değişimi → `FikoKnowledgeYonetici.parametreGuncelle` → (oto/manuel moda göre) akıllı rebuild.
  Feature alanına doğrudan yazım yok; tek kapı depo.
- Eskiz ölçüleri (Faz 2) aynı modelle: ölçü intrinsic parametre olarak yayınlanır, `FikoKisitSolver`'a girmeden çözülür.

### 5. FikoKnowledgeYonetici (`FikoKnowledgeYonetici.ts`) — orkestratör
Depo + ifade motoru + grafik + bağlamaları birleştirir. `FikoModellemeYonetici` içinde tek instance.
```ts
mode: 'oto' | 'manuel';
kirli: Set<string>;          // manuel modda bekleyen değişiklikler
parametreEkle/Guncelle/AdDegistir/Sil(...)        // serbest parametreler
formulSet(paramId, formul) / formulCoz(paramId)   // intrinsic ya da serbest: formül ata/kaldır
grupEkle/grupSil/grupAdDegistir/tasi(...)          // grup ağacı
featYayinla(feat) / featKaldir(featId)             // feature yaşam döngüsü ile intrinsic senkron
degerCoz(formul): çözülmüş değer (canlı önizleme/doğrulama için)
guncelle(): manuel modda kirli düğümleri çöz + akıllı rebuild tetikle
```
- **Oto mod:** değişiklik → grafikten en erken etkilenen index → `rebuild(o index'ten)`. Hiçbir
  feature'a beslenmeyen parametre → rebuild yok.
- **Manuel mod:** değişiklik → `kirli`'ye ekle, ağaçta/panelde "kirli" rozeti, kullanıcı `Güncelle`'ye basana kadar bekle.
- Akıllı rebuild için `FikoModellemeYonetici.rebuild()` opsiyonel `baslangicIndex` parametresi alacak şekilde genişler
  (mevcut tam-rebuild davranışı `baslangicIndex=0` ile korunur).

### 6. UI — Parametre Workbench + f(x) bağlama
Angular, `FikoYTKokBilesenComponent` extend, `OnPush` + `signal()` + `trackBy`.

**Parametre Workbench paneli** (`fiko-parametre-workbench/`):
- **Grup ağacı (sol):** iç içe gruplar, ekle/sil/yeniden-adlandır, sürükle-bırak ile parametre/grup taşıma.
- Parametre tablosu: ad / tip / değer-veya-formül (inline düzenleme), ekle / sil / yeniden-adlandır.
  Intrinsic parametreler ikonla ayırt edilir (feature'a bağlı), serbest parametreler düz.
- **Formül editörü:** parametre adı + fonksiyon otomatik tamamlama, canlı değer önizleme + Türkçe hata.
- Üstte **oto/manuel toggle** + **Güncelle** butonu (kirliyse vurgulu/animasyonlu).
- Tip seçimi, birim gösterimi, açıklama alanı.
- Belge ağacında **"Parametreler"** düğümü (grup ağacını yansıtır).

**Ürün ağacında parametreler (CATIA tarzı) — MEVCUT chip sistemi yeniden kullanılır:**
- `grp.userData.FikoParametreler` zaten var; intrinsic parametreler bu diziye doldurulur → `agac-item`
  feature düğümü altında chip olarak görünür (mekanizma hazır).
- Mevcut chip türleri: Sayı/Açılır/Çubuk/Renk. **Yeni:** formüle bağlı parametre için **f(x) chip** (değer
  salt-okunur + formül metni + f(x) ikonu, tıkla → formül editörü). `agac-item.component.html`'e tek yeni `*ngIf` bloğu.
- Chip `degisti` callback'i `FikoKnowledgeYonetici.parametreGuncelle`'ye bağlanır (tek kapı).
- Performans: chip'ler yalnızca düğüm açıkken (`listeGoster`) render — mevcut davranış korunur.

**f(x) bağlama (çizim sırasında):**
- Feature/sketch dialoglarındaki sayısal alanın yanına **f(x)** butonu.
- Tıklayınca küçük seçici: mevcut parametre listesinden seç **veya** formül yaz.
- Bağlı alan görsel olarak işaretli (f(x) ikonu + değer salt-okunur, "düzenle/çöz" seçenekli).
- Merkezi tek bileşen (`fiko-fx-baglama`), tüm dialoglarda yeniden kullanılır.

### 7. Kalıcılık
`serialize()` / `deserialize()` genişler:
```ts
{ ...mevcut, parametreler: IFikoParametre[], gruplar: IFikoParametreGrup[], knowledgeMode: 'oto'|'manuel' }
```
- Bağlama ayrı tutulmaz — intrinsic parametreler `feat:{featId,alan}` backref'i ve `formul`'ü ile zaten serialize edilir.
- Geriye uyumlu: eski belgede alanlar yoksa boş başlar; mevcut feature'lar açılışta intrinsic parametre yayınlar.
- deserialize sonrası: parametreler topolojik çözülür (formül zinciri), feature alanlarına yazılır, bir kez rebuild.
- Feature `id`'leri serialize edilir; eski belgelerde yoksa deserialize'da üretilir (intrinsic backref tutarlılığı için).

## Veri Akışı

```
Workbench'te parametre düzenle  /  feature dialogundan değer değiştir
      │   (ikisi de tek kapı)
      ▼
FikoKnowledgeYonetici.parametreGuncelle  →  IParametre.deger (depo = otorite)
      │
      ▼
FikoBagimlilikGrafi: aşağı-akış etkilenenler + en erken feature index
      │
      ├─ oto  → FikoModellemeYonetici.rebuild(baslangicIndex)
      └─ manuel → kirli işaretle → kullanıcı "Güncelle" → rebuild(min index)
      │
      ▼
rebuild() BAŞI: çözümleme geçişi — tüm parametreler topolojik çözülür,
                değerler IOzellik alanlarına (önbellek) yazılır
      │
      ▼
mevcut geometri kodu alanları okur → geometri yeniden hesaplanır → sahne güncellenir
```

## Hata Yönetimi
- Formül sözdizimi hatası → alan kırmızı, Türkçe mesaj, eski değer korunur (model bozulmaz).
- Döngüsel bağımlılık → uyarı, kaydetmeye izin verilir ama o zincir "hatalı" işaretlenir.
- Bilinmeyen parametre referansı → formül hatalı, kullanıcıya hangi adın eksik olduğu söylenir.
- Tip uyuşmazlığı (örn. Boolean'ı Uzunluğa bağlama) → engellenir, Türkçe uyarı.
- rebuild içinde bir feature hata verirse mevcut davranış korunur (`IOzellik.hata` bayrağı).

## Test (kritik iş mantığı)
- **FikoIfadeMotoru:** operatör önceliği, fonksiyonlar, koşullu, birim çevrimi, hatalı ifade, referans çıkarımı.
- **FikoBagimlilikGrafi:** topolojik sıra, döngü tespiti, downstream hesaplama, en-erken-index.
- **FikoParametreDeposu:** intrinsic auto-yayın, çözümleme geçişi (depo→alan write-through), grup taşıma/döngüsüzlük, rename referans güncellemesi.
- **Serialize/deserialize round-trip:** serbest + intrinsic parametre + formül + grup ağacı + feature backref korunur.

## Fazlama
- **Faz 1 (dikey dilim):** İfade motoru + depo (serbest + **intrinsic auto-yayın**) + **gruplar** + grafik +
  Knowledge Yönetici + oto/manuel toggle + Parametre Workbench paneli (grup ağacı + sürükle-bırak) +
  f(x) bağlama (feature dialoglarında) + serialize/deserialize.
  → Tek başına çalışan, kaydet/aç ile kalıcı sistem.
- **Faz 2:** Eskiz ölçü/kısıt bağlama (`FikoKisitSolver` entegrasyonu), f(x) tüm sketch dialoglarında.
- **Faz 3:** Tasarım tablosu (design table / Excel), kontrol kuralları (checks/reactions), gelişmiş grup işlemleri.

## Kapsam Dışı (YAGNI)
- VBA/CATScript makro motoru (zaten `fiko-makro.*` var, ayrı konu).
- Harici Excel canlı bağlantı (Faz 3 tasarım tablosu yeterli).
- Çok-belge arası parametre paylaşımı (publish/subscribe) — ileride.
