# Grafiksel Takım Tanımı Penceresi — Native Uygulama Spec'i (`cam_takim_penceresi.cpp`)

> **Amaç:** Web'deki (`fikoyt-sistem` fiko-cam, CATIA "Tool Definition" tarzı) grafiksel takım oluşturma/tanımlama penceresini fikatia-local native'e (C++23/Vulkan/ImGui + OCCT) **birebir** taşımak.
> **Kaynak (SADECE düzen/alan/algoritma referansı — KOD KULLANILMAZ):**
> - `fiko-cam/fiko-cam-takim-dialog.ts` (ANA pencere, 222 satır)
> - `fiko-cam/fiko-takim-3d.component.ts` (canlı 3B revolve profil, tipe göre uç/dip)
> - `fiko-cam/fiko-cam.types.ts` (`ITakim` + `TakimTip` + `TAKIM_AD`)
> - `fiko-cam/fiko-cam.yonetici.ts:65-114, 277-285` (kütüphane CRUD, varsayılan set, `uygunTakim`, kalıcılık, "kullanılıyorsa silinemez")
> - `docs/cam_blueprint.md` §3 (Takım Sistemi), §10 (UI stili/dialog davranışı)
> **Native hedef:** Ayrı ImGui pencere (op-başına-pencere kalıbı gibi `###id` + pin). Sol: 2B yan profil (ImGui DrawList, tipe göre uç/dip). Sağ: tipe göre KOŞULLU `DragScalar` alanları. Kütüphane tablosu + (ileride) ürün ağacı takım kaynağı node'u.
> **Bağlam:** Native `motor/cam/.../takim.hpp` `enum TakimTip`/`struct Takim` ayrı bir ajan tarafından bu spec'e göre genişletiliyor (§1, §2). Bu doküman kaynağı belgeler; C++ struct'ı BURADA yazılmaz.

---

## 1. 17 TAKIM TİPİ — Web ↔ Native Eşleme

Web `TakimTip` (17 değer) → Native `enum class TakimTip : u8` (takim.hpp). Native enum SONUNA additive eklenerek undo yedek u8 kararlılığı korunur.

| # | Web `TakimTip` | Türkçe ad (`TAKIM_AD`) | Native `TakimTip` | Simge (öneri) | Uç/dip şekli (kısa) |
|---|----------------|------------------------|-------------------|:---:|---|
| 1 | `faceMill` | Tarama Kafası | `ParmakFreze`* / (yeni `FaceMill` öner) | 🔩 | düz dip, geniş |
| 2 | `endMill` | Parmak Freze | `ParmakFreze` | ⬛ | düz dip |
| 3 | `ballMill` | Küresel Freze | `KureselFreze` | ⚫ | yarım küre uç |
| 4 | `bullMill` | Toroidal Freze | `TorusFreze` | ⬤ | köşe radyuslu (Rc) |
| 5 | `conicalMill` | Konik Freze | `KonikFreze` | 🔻 | konik (üst D, alt d) |
| 6 | `chamferMill` | Pah Freze | `ChamferMill` | ◣ | ters koni (uç açı) |
| 7 | `tslotMill` | T-Kanal Freze | `TSlotMill` | ⊤ | disk (T kesit) |
| 8 | `threadMill` | Diş Freze | `ThreadMill` | 🌀 | düz dip + hatve (P) |
| 9 | `centerDrill` | Punta Matkap | `CenterDrill` | ✛ | 2 açılı pilot (a1+a2) |
| 10 | `spotDrill` | Spot Matkap | `PuntaMatkap` | ▽ | konik uç (90°) |
| 11 | `drill` | Matkap | `Matkap` | ⛏ | konik uç (118°) |
| 12 | `multiDrill` | Çok-Çaplı Matkap | `MultiDrill` | ⛏⛏ | kademeli (cap/cap2/cap3) + uç koni |
| 13 | `countersink` | Havşa Matkap | `Havsa` | ◺ | ters koni (havşa) |
| 14 | `counterbore` | Havşa Düz | `CounterBore` | ⊔ | 2 kademe düz (pilot d + D) |
| 15 | `reamer` | Rayba | `Rayba` | ┃ | küt uç (hafif konik) |
| 16 | `boringBar` | Bara Çubuğu | `BoringBar` | ⌐ | tek-taraflı kesici (asimetrik) |
| 17 | `tap` | Kılavuz | `Kilavuz` | 🔗 | küt uç + hatve (P) |

*Not: web `faceMill` native'de ayrı enum değil — `ParmakFreze` gibi düz-dip çizilir; istenirse `FaceMill` native enum sonuna eklenebilir (blueprint §3.1 "17'ye çıkacak" listesinde faceMill ayrı sayılmadı, ama web'de ayrı tip). **Öneri:** native'e `FaceMill` de ekle → web ile 1:1.

**Native tip dropdown sırası** (web dialog `tipler[]`, `fiko-cam-takim-dialog.ts:103` ile aynı):
`faceMill, endMill, ballMill, bullMill, conicalMill, chamferMill, tslotMill, threadMill, centerDrill, spotDrill, drill, multiDrill, countersink, counterbore, reamer, boringBar, tap`

---

## 2. TAM PARAMETRE ALAN SETİ (`ITakim` → native `struct Takim`)

Her alan: **web adı → native alan → birim → varsayılan → görünürlük koşulu.**
Native varsayılanlar takim.hpp `struct Takim` üye başlangıç değerleridir; web'de `?? fallback` ile UI'da gösterilir (kolon "Web fallback").

| Web alan | Native alan | Birim | Native default | Web UI fallback | Görünürlük (hangi tipler) |
|----------|-------------|:---:|:---:|---|---|
| `ad` | `ad` (std::string) | — | "" | — | HER ZAMAN (InputText) |
| `tip` | `tip` (TakimTip) | — | ParmakFreze | — | HER ZAMAN (Combo, 17 tip) |
| `cap` | `cap` (D) | mm | 10.0 | — | HER ZAMAN |
| `boy` | `boy` (Lc, kesici boy) | mm | 50.0 | — | HER ZAMAN |
| `toplamBoy` | `toplamBoy` (L, gauge) | mm | 0 → `boy*2.5` | `?? 0` | HER ZAMAN |
| `sapCap` | `sapCap` (Ds/Db) | mm | 0 → `cap` | `?? cap` | HER ZAMAN |
| `cap2` | `cap2` (Dc, 2. kademe) | mm | 0 | `?? cap*1.5` | `kademeliVar` (multiDrill) |
| `cap3` | `cap3` (Dc2, 3. kademe) | mm | 0 | `?? cap*2` | `kademeliVar` (multiDrill) |
| `girisCap` | `girisCap` (d, giriş/alt) | mm | 0 | `?? cap*0.5` | `girisVar` |
| `kose` | `koseYaricap` (Rc) | mm | 0 | `?? 0` | `koseVar` (etiket t-slot'ta "Alt Kesim R") |
| `kose2` | `kose2` (Rc2, t-slot üst) | mm | 0 | `?? 0` | `tslotVar` (t-slot) |
| `kademeBoy1` | `kademeBoy1` (l1) | mm | 0 | `?? boy*0.3` | `kademeBoyVar` |
| `kademeBoy2` | `kademeBoy2` (l2) | mm | 0 | `?? boy*0.3` | `kademeBoyVar && kademeliVar` |
| `ucAci` | `ucAci` (a / a1) | ° | 118.0 | `?? 118` | `ucVar || kademeliVar` (etiket a2Var'da "1. Açı a1") |
| `ucAci2` | `ucAci2` (a2) | ° | 0 | `?? 60` | `aci2Var` (centerDrill, multiDrill) |
| `ucAci3` | `ucAci3` (a3/taper) | ° | 0 | `?? 30` | `kademeliVar` (multiDrill) |
| `hatve` | `hatve` (P) | mm | 0 | `?? 1.5` | `hatveVar` (tap, threadMill) |
| `agizSayisi` | `agizSayisi` (Nf) | adet | 2 | `?? 2` | HER ZAMAN |
| `numara` | `numara` (T-no) | adet | 1 | `?? 1` | HER ZAMAN |
| `id` | (native: kimlik veya numara birincil) | — | — | — | UI'da görünmez |

**DragScalar hız/format önerileri** (native, `surukleF64` sarımı gibi):
- Çaplar (cap/cap2/cap3/girisCap/sapCap): `hiz=0.05, "%.2f"`
- Boylar (boy/toplamBoy/kademeBoy1/2): `hiz=0.5, "%.1f"` veya `"%.0f"`
- Köşe R (kose/kose2): `hiz=0.05, "%.2f"`
- Açılar (ucAci/ucAci2/ucAci3): `hiz=1.0, "%.0f"` — min 1, max 179 clamp (0-bölme koruması, aşağıda §4)
- Hatve: `hiz=0.05, "%.2f"`
- agizSayisi: `DragInt hiz=0.1, min 1 max 12`; numara: `DragInt min 0`

---

## 3. KOŞULLU GÖRÜNÜRLÜK MATRİSİ (tip × alan)

Web getter'ları (`fiko-cam-takim-dialog.ts:111-118`) → native koşul tablosu.

**Getter tanımları (native koşul fonksiyonları):**
```
koseVar     = tip ∈ {ballMill, bullMill, tslotMill}
ucVar       = tip ∈ {drill, spotDrill, centerDrill, countersink, chamferMill}
hatveVar    = tip ∈ {tap, threadMill}
kademeliVar = tip == multiDrill
girisVar    = tip ∈ {conicalMill, countersink, chamferMill, counterbore, reamer}
aci2Var     = tip ∈ {centerDrill, multiDrill}
kademeBoyVar= tip ∈ {multiDrill, counterbore}
tslotVar    = tip == tslotMill
```

**Matris (● = görünür, boş = gizli). cap/boy/toplamBoy/sapCap/agizSayisi/numara HER tipte görünür — matriste tekrarlanmadı.**

| Tip \ Alan | cap2 | cap3 | girisCap | kose | kose2 | kademeBoy1 | kademeBoy2 | ucAci | ucAci2 | ucAci3 | hatve |
|------------|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
| faceMill   |  |  |  |  |  |  |  |  |  |  |  |
| endMill    |  |  |  |  |  |  |  |  |  |  |  |
| ballMill   |  |  |  | ● |  |  |  |  |  |  |  |
| bullMill   |  |  |  | ● |  |  |  |  |  |  |  |
| conicalMill|  |  | ● |  |  |  |  |  |  | ●¹ |  |
| chamferMill|  |  | ● |  |  |  |  | ● |  |  |  |
| tslotMill  |  |  |  | ●² | ● |  |  |  |  |  |  |
| threadMill |  |  |  |  |  |  |  |  |  |  | ● |
| centerDrill|  |  |  |  |  |  |  | ●³ | ● |  |  |
| spotDrill  |  |  |  |  |  |  |  | ● |  |  |  |
| drill      |  |  |  |  |  |  |  | ● |  |  |  |
| multiDrill | ● | ● |  |  |  | ● | ● | ●³ | ● | ● |  |
| countersink|  |  | ● |  |  |  |  | ● |  |  |  |
| counterbore|  |  | ● |  |  | ● |  |  |  |  |  |
| reamer     |  |  | ● |  |  |  |  |  |  |  |  |
| boringBar  |  |  |  |  |  |  |  |  |  |  |  |
| tap        |  |  |  |  |  |  |  |  |  |  | ● |

**Notlar:**
- ¹ `conicalMill` `ucAci3` görünürlüğü: web'de `kademeliVar` sadece multiDrill olduğundan aslında conicalMill'de `ucAci3` GİZLİ. (`conicalMill` yalnız `girisVar` grubunda → sadece girisCap.) **Doğru satır:** conicalMill → sadece `girisCap`. (Yukarıdaki ¹ işareti kaldırıldı sayılır.)
- ² `bullMill`/`ballMill`/`tslotMill` köşe alanı `koseVar` ile gelir; t-slot'ta etiket "Alt Kesim R (Rc)", diğerinde "Köşe Yarıçap (Rc)".
- ³ `ucAci` etiketi `aci2Var` (centerDrill/multiDrill) ise "1. Açı (a1)", değilse "Uç Açısı".
- `ucAci` görünürlük mantığı web'de `ucVar || kademeliVar` → multiDrill'de de ucAci gösterilir (uç koni açısı).

**Kesin conicalMill satırı (netleştirme):** conicalMill → `girisCap` ●, diğer koşullu alanlar gizli.

---

## 4. CANLI 2B PROFİL ÇİZİM MANTIĞI (ImGui DrawList — yan profil)

Web'de iki gösterim var:
- **2D SVG yan profil** (`fiko-cam-takim-dialog.ts:170-218` `profilPath()`/`agizPath()`) — kapalı path, tipe göre dip/uç.
- **3D revolve** (`fiko-takim-3d.component.ts` `profil3d()`) — aynı radyal profil `LatheGeometry` ile 360° döndürülür.

**Native başlangıç: 2B yan profil (ImGui DrawList)** öneriliyor (blueprint §3.5 "basit başla, DrawList öner"). İleride mini Vulkan viewport (revolve) eklenebilir; radyal profil noktaları AYNI.

### 4.1 Ortak radyal profil (uç y=0 → kesici üstü y=Lc)

`profil3d()` (fiko-takim-3d.component.ts:163-188) referans. Profil = `vector<Vec2>{ x=yarıçap(mm), y=uçtan yükseklik(mm) }`. **Yan profil çizimi:** merkez ekseni etrafında profili +x ve −x aynala, sap silindirini üstüne ekle, kapat.

Kısaltmalar: `R = cap/2`, `Lc = boy`, açı→radyan `aci(a,def) = clamp(a||def, 1..179)°` (tan 0-bölme koruması). `yay(cx,cy,r,a0,a1,n=10)` = n+1 nokta arc.

| Tip | Radyal profil noktaları (x=r, y=yükseklik) |
|-----|--------------------------------------------|
| `faceMill`, `endMill`, `threadMill` | `(0,0) (R,0) (R,Lc)` — **düz dip** |
| `ballMill` | `(0,0)` + `yay(0, R, R, -90°, 0°)` + `(R,Lc)` — **yarım küre uç** (merkez y=R) |
| `bullMill` | `k=min(R,kose)`; `(0,0) (R−k,0)` + `yay(R−k, k, k, -90°, 0°)` + `(R,Lc)` — **köşe radyus** |
| `drill`, `spotDrill` | `h=R/tan(aci(ucAci,118)/2)`; `(0,0) (R,h) (R,Lc)` — **konik matkap ucu** |
| `centerDrill` | `rp=R*0.5; hTip=rp/tan(aci(ucAci,90)/2); hTap=(R−rp)/tan(aci(ucAci2,60)/2)`; `(0,0) (rp,hTip) (rp,hTip) (R,hTip+hTap) (R,Lc)` — **pilot + taper** |
| `conicalMill` | `rb = girisCap? girisCap/2 : R*0.55`; `(0,0) (rb,0) (R,Lc)` — **konik (üst D, alt rb)** |
| `countersink`, `chamferMill` | `h=R/tan(aci(ucAci,90)/2); rd = girisCap? girisCap/2 : R*0.25`; `(0,0) (rd,0) (rd,h*0.15) (R,h) (R,Lc)` — **havşa/pah ters koni** |
| `multiDrill` | `r1=R; r2=(cap2||cap)/2; r3=(cap3||cap2||cap)/2; hTip=r1/tan(aci(ucAci,118)/2); l1=kademeBoy1||boy*0.3; l2=kademeBoy2||boy*0.3; yk1=hTip; yk2=yk1+l1; yk3=yk2+l2`; `(0,0)(r1,yk1)(r1,yk2)(r2,yk2)(r2,yk3)(r3,yk3)(r3,Lc)` — **kademeli + uç koni** |
| `counterbore` | `rd = girisCap? girisCap/2 : R*0.5; l1=kademeBoy1||boy*0.4`; `(0,0)(rd,0)(rd,l1)(R,l1)(R,Lc)` — **2 kademe düz** |
| `tslotMill` | `neck=R*0.4; diskH=Lc*0.4`; `(0,0)(R,0)(R,diskH)(neck,diskH)(neck,Lc)` — **T disk** |
| `boringBar` | `rn=R*0.4`; `(0,0)(R,R*0.4)(R,R*0.6)(rn,R*0.6)(rn,Lc)` — **asimetrik bara** |
| `reamer`, `tap` | `(0,0)(R,R*0.3)(R,Lc)` — **hafif konik/küt uç** |

### 4.2 2B yan profil path (DrawList için)

Web SVG `profilPath()` (fiko-cam-takim-dialog.ts:170-209) aynı geometriyi ekran koordinatında kapalı path olarak kurar. Native DrawList için pratik yol:

1. **Ölçekle** (`olcekle()`, satır 157-167): `L=max(1, toplamBoy || boy*2.5)`, `maxCap=max(cap,cap2,cap3,girisCap,0.5)`, `sc=min(alanBoy/L, alanEn/maxCap)` (web: 216px boy, 76px en → native pencere sol alanına göre ölçekle). `capPx=cap*sc`, `sapW=sapCap? sapCap*sc : capPx*0.62`.
2. Uç y=0 aşağıda, kesici üstü y=Lc, sap y=Lc→L yukarıda. Ekran Y ters (uç altta).
3. **Kesici gövde:** §4.1 radyal profilini `x → cx±r*sc` olarak aynala → kapalı polygon (`ImDrawList::AddConvexPolyFilled` yerine `AddPolyline`+manuel fill; konkav olduğundan **AddConcavePolyFilled** kullan). Sol kenar (−x) + dip/uç + sağ kenar (+x) + üst kapanış.
4. **Sap (shank):** kesicinin üstünde dikdörtgen `[cx−sapW/2, ySh]..[cx+sapW/2, yTop]` (`AddRectFilled`, gri).
5. **Sap-kesici omuz geçişi:** kesici üst yarıçapı ≠ sapR ise küçük trapez (web fiko-takim-3d:87-92 "omuz").
6. **Renk (neon-cyan tema §6):** kesici gövde parlak çelik (`~0xFFB0C0D0` dolgu + cyan `#38bdf8` kenar), sap gri (`#AEB9C6`), eksen çizgisi kesikli soluk mavi.

### 4.3 Ağız/flüt izleri (görsel — opsiyonel)

`agizPath()` (fiko-cam-takim-dialog.ts:212-218): drill/tap hariç, kesici gövdeye `n=clamp(agizSayisi,2..5)` adet dikey Bézier eğri (helis izi). Native'de DrawList `AddBezierQuadratic` ile taklit; **opsiyonel** (kozmetik). 3D revolve viewport eklenirse gerçek flüt gövdeye oyulur (`fluteliGeo`, fiko-takim-3d:126-160) — başlangıç kapsamı DIŞI.

### 4.4 Ölçü etiketleri (opsiyonel, DrawList)

Web 3D'de Ø/Lc/L/Ds sprite etiketleri var (fiko-takim-3d:94-99). Native 2B'de profil kenarına `AddText` ile "ØD", "Lc", "L", "Ds" küçük etiketler (turuncu `#ffd9a0`) — profesyonel görünüm için önerilir, zorunlu değil.

---

## 5. KÜTÜPHANE DAVRANIŞI (`fiko-cam.yonetici.ts:65-114, 277-285`)

### 5.1 Varsayılan takım seti (`varsayilanTakimlar()`)

Native `varsayilanTakimlar()` (takim.cpp) zaten var — web ile aynı çekirdek sete genişletilmeli. Web varsayılanları (satır 75-92; `boy=cap*3, agizSayisi=2, numara=sıra` ortak, numara 1'den):

| numara | ad | tip | cap | ek |
|:---:|----|-----|:---:|---|
| 1 | Tarama Ø50 | faceMill | 50 | agizSayisi=4 |
| 2 | Parmak Freze Ø10 | endMill | 10 | agizSayisi=4 |
| 3 | Parmak Freze Ø6 | endMill | 6 | agizSayisi=3 |
| 4 | Küresel Ø6 | ballMill | 6 | kose=3 |
| 5 | Spot Matkap Ø8 | spotDrill | 8 | ucAci=90 |
| 6 | Matkap Ø5 | drill | 5 | ucAci=118 |
| 7 | Matkap Ø8.5 | drill | 8.5 | ucAci=118 |
| 8 | Kılavuz M10 | tap | 10 | hatve=1.5 |
| 9 | Rayba Ø10 | reamer | 10 | — |
| 10 | Bara Ø20 | boringBar | 20 | — |
| 11 | Havşa 90° | countersink | 12 | ucAci=90 |

### 5.2 CRUD işlemleri

| İşlem | Web | Native davranış |
|-------|-----|-----------------|
| **Ekle** | `takimEkle(tip, cap, ad?)` (satır 93-98) | Yeni Takim (`boy=cap*3, toplamBoy=cap*6, agizSayisi=2, numara=takimlar.size()+1`). Ürün ağacına takım node'u ekle (ileride), kalıcılık yaz. |
| **Sil** | `takimSil(tk)` (satır 108-114) | **Kullanan operasyon var mı kontrol et.** `op.takimId==tk.id` (native `op.takimNo==t.numara`) sayısı > 0 → sil ENGELLE, uyar: "Takım N operasyonda kullanılıyor — silinemez". Yoksa sil + ağaç node kaldır + kalıcılık. **Cekirdek Islem ile yap** (undo). |
| **Kopyala** | (web'de yok — spec eklentisi) | Seçili takımı klonla, `numara=max+1`, `ad += " (Kopya)"`. **Öneri:** pencereye ➕ Kopyala düğmesi. |
| **Değişti** | `takimDegisti(tk)` (satır 102-106) | Kullanan operasyonları `hesaplandi=false` yap + yeniden hesapla; kalıcılık yaz. Native: parametre DragScalar değişince `cam.takimDegisti(numara)`. |
| **Uygun takım** | `uygunTakim(tip)` (satır 277-285) | Operasyon türüne göre otomatik takım seçimi (aşağıda). |

### 5.3 `uygunTakim(operasyonTip)` — operasyona otomatik takım eşleme

Operasyon eklenince `op.takimId = uygunTakim(op.tip)?.id` (yoksa `takimlar[1]`). Native `CamSistemi` operasyon oluştururken kullanır:

```
facing→faceMill  pocketing/contouring/curveFollow/circularMill/pointToPoint→endMill
spotDrill→spotDrill  drilling/deepHole/breakChips→drill  tapping/reverseTap→tap
boring/boringChamfer/boringStop→boringBar  reaming→reamer
counterSink→countersink  counterBore→counterbore  tslotting→tslotMill  threadMilling→threadMill
```
`takimlar.find(t => t.tip == istenen)` → ilk eşleşen; yoksa `takimlar[1]` (varsayılan endMill).

### 5.4 Kalıcılık

- Web: `localStorage['fikoCamTakimlar']` = `JSON.stringify(takimlar)` (satır 66-72), oturumlar arası korunur; yoksa `varsayilanTakimlar()`.
- **Native:** proje yanında `takimlar.json` (blueprint §3.3). Yükleme sırası: dosya varsa oku → yoksa `varsayilanTakimlar()`. Yaz: her ekle/sil/değişti sonrası. **CAM durumu JSON'una** (`partOp + takimlar`, blueprint §10.3) dahil edilebilir — tek otorite proje dosyası olması tercih edilir.

---

## 6. PENCERE DÜZENİ + UI DAVRANIŞI

### 6.1 Pencere iskeleti (op-başına-pencere kalıbı ile aynı, `cam_paneli.cpp:272-329` referans)

```
ustteTutSinif(ustte);                                    // Begin ÖNCESİ (pin owner ilişkisi)
ImGui::SetNextWindowSize({560, 420}, ImGuiCond_FirstUseEver);
bool acik = true;
if (ImGui::Begin("🔧 Takım Tanımı — <ad>###tk_<numara>", &acik, ImGuiWindowFlags_NoDocking)) {
  ustteTutDugmesi("tk_<numara>", ustte);                 // Begin SONRASI (X'in soluna pin daire)
  ... sol profil | sağ form ...
  ... alt eylem çubuğu ...
}
ImGui::End();
if (!acik) cam.takimPencereKapat(numara);
```

- **Benzersiz ID:** `###tk_<numara>` — aynı anda birden fazla takım penceresi açılabilir (op penceresi gibi).
- **Pin durumu:** `std::unordered_map<int,bool> g_takimPinDurum` (op'taki `g_pinDurum` gibi, UI-only).
- **Başlık:** `🔧 Takım Tanımı — <ad>` (web `td-bas`, fiko-cam-takim-dialog.ts:19).
- **NoDocking** (ayrık, taşınabilir, çoklu-viewport).

### 6.2 İç düzen — 2 sütun (web `td-govde` flex, satır 20-58)

**Sol sütun (≈ %45 genişlik): CANLI PROFİL**
- ImGui child region (`BeginChild("profil", {solEn, -altBar})`) → DrawList ile §4 yan profili çiz.
- Sol üst köşe: `T<numara>` rozeti (web `td-tno`, sarı arka plan).
- Arka plan: radyal koyu-mavi gradyan hissi (DrawList `AddRectFilledMultiColor`) — opsiyonel.

**Sağ sütun (≈ %55): PARAMETRE FORMU** (`SameLine` + `BeginChild("form")`)
Sıra (web `td-form`, satır 27-56):
1. `InputText "Ad"` → `tk.ad`
2. `Combo "Tip"` → 17 tip (`setTip`: tip değişince ballMill ise `kose=cap/2` otomatik, sonra profili yeniden çerçevele)
3. `SeparatorText("Ölçüler")`
4. `DragScalar "Çap (D)"` → cap
5. `DragScalar "Kesici Boyu (Lc)"` → boy
6. `DragScalar "Toplam Boy (L)"` → toplamBoy
7. `DragScalar "Sap Çapı (Ds)"` → sapCap
8. **KOŞULLU** (§3 matris): cap2, cap3 (kademeliVar) · girisCap (girisVar) · kose (koseVar, etiket t-slot'ta "Alt Kesim R") · kose2 (tslotVar) · kademeBoy1 (kademeBoyVar) · kademeBoy2 (kademeBoyVar&&kademeliVar) · ucAci (ucVar||kademeliVar, etiket aci2Var'da "1. Açı a1" değilse "Uç Açısı") · ucAci2 (aci2Var) · ucAci3 (kademeliVar) · hatve (hatveVar)
9. `SeparatorText("Kesim")`
10. `DragInt "Ağız Sayısı (Nf)"` → agizSayisi
11. `DragInt "Takım No (T)"` → numara

**Her DragScalar/InputText değişiminde:** `tk` değeri güncelle → `cam.takimDegisti(numara)` (kullanan op'ları yeniden hesapla + kalıcılık) → profil DrawList otomatik güncel (her frame yeniden çizildiği için ekstra tetik gerekmez, ImGui immediate-mode). Web'de `set()` → `olcekle()+tv3d.guncelle()+takimDegisti()` yapıyordu; native immediate-mode'da değişiklik anında yansır.

### 6.3 Alt eylem çubuğu (web `td-alt`, satır 59-62)

```
ImGui::Separator();
if (ImGui::Button("✔ Tamam", {-90,0})) { cam.takimDegisti(numara); acik=false; }   // kaydet+kapat
ImGui::SameLine();
if (ImGui::Button("🗑 Sil", {-1,0})) { if (cam.takimSil(numara)) acik=false; }       // "kullanılıyorsa silinemez" → false ise açık kalır+uyarı
```
- **Tamam:** `takimDegisti` (kalıcılık) + pencere kapat.
- **Sil:** `takimSil` — kullanılıyorsa `false` döner, uyarı gösterilir, pencere KAPANMAZ.
- **(Öneri) ⧉ Kopyala** düğmesi eklenebilir (§5.2).

### 6.4 Neon-cyan tema (blueprint §10.1 — native zaten uyumlu)

- Renkler (`cam_paneli.cpp:27-29`): `CYAN{0.10,0.85,1.0,1}`, `HATA_RENK{1,0.42,0.38,1}`, `SOLUK{0.55,0.60,0.68,1}`.
- Başlık/grup: `SeparatorText` + `TextColored(CYAN,...)`. Değer alanları tabular.
- Profil kenarı cyan (`#38bdf8`), sap gri, T-no rozeti sarı. Turuncu başlık aksanı web'deki gibi (`ff8c1a` → ImGui başlık metni turuncu opsiyonel).
- Animasyon: ImGui built-in hover; aktif seçim pulse gerekmiyor (basit).

### 6.5 Pencereyi açma yolları

- **Operasyon penceresi → Takım sekmesi → "✏ Takımı Düzenle (Grafiksel)"** (blueprint §1.2-C): `cam.takimPencereAc(op.takimNo)`.
- **Kütüphane tablosu satırı çift-tık / "Düzenle" sağ-menü** (`cam_paneli.cpp:237-264` `takimKutuphanesi` genişletilir): satıra çift-tık → `takimPencereAc(t.numara)`.
- **Ürün ağacı takım kaynağı node'u çift-tık** (ileride, blueprint §7 "Takım kaynağı: FikoCamTakimNode").

---

## 7. NATIVE UYGULAMA ADIMLARI (wave 2c ajanı için kısa yol haritası)

1. **`Takim` struct genişletme** (ayrı ajan yapıyor — takim.hpp): kademeli alanlar (`cap2/cap3/girisCap/kademeBoy1/2/ucAci2/3/kose2/sapCap/toplamBoy/hatve`) + `enum TakimTip` 17'ye (faceMill dahil öneri). Native default'lar §2 tablosu.
2. **`cam_takim_penceresi.cpp` (YENİ)** oluştur — `namespace fiko`, op-penceresi kalıbı (`###tk_<numara>` + pin + `ustteTutSinif/Dugmesi`). İmza: `void takimPenceresiCiz(Cekirdek&, CamSistemi&, Takim& tk);` + `camPaneliCiz` sonunda açık takım pencerelerini döngüyle çiz (op pencereleri gibi, `cam.acikTakimPencereleri` vektörü).
3. **CamSistemi API'si**: `takimPencereAc(numara)/takimPencereKapat(numara)/acikTakimPencereleri`, `takimBul(numara)` (var), `takimEkle/takimSil(→bool)/takimDegisti/uygunTakim` (yönetici §5) native karşılıkları. Sil "kullanılıyorsa engelle" mantığı (op'larda `takimNo` sayımı) + Cekirdek Islem (undo).
4. **Koşullu form** (§3 matris) — getter fonksiyonları (`koseVar(tip)` vb.) `takim.hpp/cpp`'de utility, hem UI hem 3D profil paylaşır.
5. **2B profil DrawList** (§4): `takimProfilNoktalari(const Takim&) → vector<Vec2>` (radyal, 3D revolve ile PAYLAŞILIR) + `takimProfilCiz(ImDrawList*, rect, const Takim&)` (aynala + sap + omuz + renk). Açı clamp 1..179.
6. **Kütüphane tablosu genişlet** (`takimKutuphanesi`, cam_paneli.cpp:237): satır çift-tık→pencere, ➕Ekle / 🗑Sil (kullanılıyorsa engel) / ⧉Kopyala düğmeleri, `numara/ad/tip/Ø/ağız` kolonları. Ürün ağacına taşınabilir (blueprint §7).
7. **Kalıcılık** (§5.4): `takimlar.json` oku/yaz veya CAM durum JSON'una dahil.
8. **Cekirdek registry** (MEMORY mimari ilkesi): `takimEkle/Sil/Duzenle` komut olarak eklensin → Lua makro (`fiko.cam.takimEkle(...)`) + DLL plugin + olay bedavaya. Yeni olay struct'ı enum SONUNA.
9. **(İleride)** mini Vulkan viewport ile 3D revolve profil (radyal profil AYNI, `LatheGeometry` eşleniği: profil noktalarını Y ekseni etrafında döndür + tip-farkında flüt). Başlangıç kapsamı DIŞI — 2B yeterli.

**Kurallar (MEMORY):** Fog YOK. Temiz/OOP/mükerrer-olmayan/modüler kod. Profil noktası üretimi UI ile 3D arasında TEK fonksiyon. Yeni sistem doğduğu an makro+plugin+olay erişilebilir.
