# Seçim Sistemleri Denetimi + Akıllı Seçim (WOW W1) Spesifikasyonu

> fikatia-local · Baş denetim + mimari spec. Bu belge doğrudan implementasyon
> ajanına verilebilir. Kod DEĞİŞTİRİLMEDİ; yalnızca okundu + tasarlandı.
> Referanslar `dosya:satır` formatındadır (denetim anındaki hâl).

---

## GÖREV 1 — SEÇİM ENVANTERİ + TUTARLILIK DENETİMİ

### 1.1 Envanter Tablosu (8 seçim yolu)

| # | Yol | Kaynak dosya | Girdi | Havuz / hedef | Hover ön-vurgu | Kip filtresi (1/2/3/4) | Ctrl | Shift | ESC | Olay | Makro |
|---|-----|--------------|-------|---------------|----------------|------------------------|------|-------|-----|------|-------|
| 1 | Tek-tık GPU pick | `secim_sistemi.cpp` + `main.cpp:2526` | Sol-tık (drag<6px, <0.45s) | `sahne.secililer_` (SecimOge) | ✅ `hoverCozumle`→`sahne.vurgu`+`VurguDegisti` | ✅ `fYuz/fKenar/fNokta/fGovde` | ✅ çoklu (`io.KeyCtrl`) | ❌ | Temizle (zincir sonu) | ✅ `fiko.secim.sec/kip/temizle/secililer` |
| 2 | Alan seçim trap | `alan_secim.cpp` + `main.cpp:2271,2348` | Sol-drag boş alanda / poligon tık | `sahne.secililer_` (SecimOge) | ❌ (canlı overlay kutu + "N öğe" HUD) | ✅ `sahne.kip()`'e göre (Govde/Yuz/Kenar/Nokta) | ✅ Ekle (`TrapModifier::Ekle`) | ✅ Çıkar (`TrapModifier::Cikar`) | ✅ `alan.iptal()` | ✅ `AlanSecimYapildi{tip,adet}` | ✅ `fiko.sahne.alanSec` |
| 3 | CAM seçim | `cam_secim.cpp` + `main.cpp:2500` | Sol-tık (op penceresi mod açar) | `op.geometri/takimYonu/stok` (SecimOge DEĞİL) | ✅ pick filtresi kilitli (`main.cpp:3930`) | 🔒 zorla (`beklenenVurguTur`) | ❌ | ❌ | ✅ `camSis.secim().bitir()` | ✅ `CamSecimBasladi/Bitti/Yapildi` | ✅ `fiko.cam.secimBaslat/Bitir` |
| 4 | SahneRefSecim (GSD/Hole) | `sahne_ref_secim.cpp` + `main.cpp:2470` | Sol-tık (feature penceresi mod açar) | callback (feature param) | ✅ pick filtresi kilitli (`main.cpp:3920`) | 🔒 zorla (`beklenenTur`) | ❌ | ❌ | ✅ `refSecim.bitir()` | ❌ **olay YOK** | ❌ **makro YOK** |
| 5 | Ölçüm seçimi | `olcum_sistemi.*` + `main.cpp:2516` | Sol-tık (ölçüm penceresi açık) | `olcum` (OlcumBaglanti) | ✅ pick filtresi filtreye sürülür (`main.cpp:3939`) | 🔒 `SecimFiltre`'den sürülür | ❌ | ❌ | ❌ **ESC zincirinde YOK** | ✅ `OlcumEklendi/Silindi` | ❌ **makro YOK** |
| 6 | Sketch seçimi | `main.cpp:2369,2442` (`eskiz_veri`) | Sol-tık (sketcher workbench) | `sketchSecili` (u32 geometri id) | ❌ (snap overlay farklı görsel dil) | ❌ (2B, kip yok) | ✅ toggle (`io.KeyCtrl`) | ❌ | ✅ `sketchSecili.clear()` | ❌ **olay YOK** | ❌ **makro YOK** |
| 7 | Ürün ağacı seçimi | `main.cpp:2672,2727` (`cizDugum`) | Ağaç satır tık | `sahne.secililer_` (govdeToparla) | ✅ hover→`sahne.vurgu={v,0}` (`main.cpp:2736`) | ❌ (yalnız Govde: `{hv,0}`) | ✅ (`io.KeyCtrl`) | ❌ | (ağaç odaklı değil) | ✅ `SecimDegisti` (sahne.sec) | kısmi |
| 8 | Yön-seç + sketchDuzlemBul | `main.cpp:2458,705` | Sol-tık (`hizliYonSecim>0`) / seçimden | `hizliYon1/2` (Vec3f) / Varlik | ❌ (imlecVurus normal) | 🔒 imlecVurus (yüz normali) | ❌ | ❌ | ✅ `hizliYonSecim=0` | ❌ | ❌ |

**Ortak çekirdek:** Yol 1, 2, 7 hepsi `sahne.sec()/secimCikar()/secimTemizle()` → `sahne.secililer_` havuzuna akar → `SecimDegisti` yayınlar. Yol 3, 4, 5, 6, 8 AYRI havuzlara yazar (op geometri / callback / olcum / sketchSecili / Vec3f) ve ana seçim havuzuna DOKUNMAZ.

### 1.2 Tutarlılık Kusur Listesi (öncelikli)

#### 🔴 K1 — Görünürlük değişimi olay-bypass (veri tutarsızlığı)
`main.cpp:3078` (bağlam menüsü "Gizle/Göster") ve `main.cpp:3148` (Hızlı 3D widget) `hedef->gorunur = !hedef->gorunur` **doğrudan** yazar. Ağaç ise `gv->gorunurAyarla()` (`main.cpp:2769`) kullanır → `GorunurlukDegisti` yayınlar + `GorunumSaglayici` senkron. Doğrudan yazım: (a) `GorunurlukDegisti` yayınlamaz → aboneler (makro/olay/disk günlüğü) kaçırır, (b) `agacGorunur` cascade doğru olsa da GorunumSaglayici'nin kendi durumu (varsa) sızabilir.
**Fix:** İki yeri de `if (GorunumSaglayici* gv = cekirdek.gorunum(kimlik)) gv->gorunurAyarla(!gv->gorunur());` ile değiştir. Merkezi tek yol.

#### 🔴 K2 — Sahne→ağaç hover senkronu YOK (tek yönlü)
Ağaç→sahne çalışır (`main.cpp:2736` ağaç hover → `sahne.vurgu`). Ama sahnede hover/seçim → ağaç satırı **kaydırılmıyor/vurgulanmıyor**. Ağaç seçim vurgusu var (`govdeSeciliMi` `main.cpp:2679`) ama pencere kapalı/uzun ağaçta seçili satır görünmüyor → `ImGui::SetScrollHereY()` çağrısı yok.
**Fix:** `cizDugum` içinde `if (secili && seciliDegistiBuKare) ImGui::SetScrollHereY(0.5f);`. Ayrıca sahne-hover'daki gövdenin ağaç satırına hafif arka plan (opsiyonel). "Seçili değişti" tespiti için `SecimDegisti`'ye main.cpp'de abone olup `agacKaydirGerek=true` bayrağı.

#### 🟠 K3 — ESC zinciri ölçüm modunu atlıyor
`main.cpp:1200-1213` ESC zinciri: palet→alan→yönSeç→refSecim→camSecim→sketchArac→sketchSecili→pusula→secimTemizle. **Ölçüm modu (`olcum.acik`) zincirde YOK.** Ölçüm açıkken ESC doğrudan `sahne.secimTemizle()`'ye düşer; ölçüm penceresi/aktif nokta-koyma iptal edilmez. Kullanıcı ESC ile ölçümden çıkamaz (tutarsız: diğer tüm tek-tık modları ESC ile çıkar).
**Fix:** `else if (olcum.acik && olcum.kip != OlcumKip::Ayarlar) { /* aktif nokta akışını iptal veya olcum.acik=false */ }` satırını `camSis.secim()` dalından SONRA ekle.

#### 🟠 K4 — Ctrl/Shift anlamları modlar arası tutarsız
- Yol 1 (tek-tık): Ctrl = çoklu toggle. Shift = **kullanılmıyor**.
- Yol 2 (trap): Ctrl = Ekle, Shift = Çıkar (replace varsayılan).
- Yol 6 (sketch): Ctrl = toggle çoklu. Shift = yok.
- Yol 7 (ağaç): Ctrl = ekle. Shift = yok.
Tek-tık'ta Ctrl toggle iken trap'ta Ctrl "sadece ekle" (çıkarmaz). Kullanıcı zihninde iki farklı "Ctrl". CATIA/SW standardı: **Ctrl = toggle her yerde**; Shift = aralık/çıkar.
**Fix (spec kararı):** Tüm yollarda **Ctrl = toggle-ekle** birleştir. Trap `TrapModifier::Ekle`'yi toggle'a çevir (zaten seçiliyse çıkar). Shift'i tek-tık'a da ekle (Yol 1: Shift = aralık seçimi ağaçta, sahnede = çıkar). En azından trap Ekle→toggle yeterli minimum düzeltme.

#### 🟠 K5 — SahneRefSecim + Sketch + Ölçüm seçimi olay/makro yok (anayasa ihlali)
Hafıza kaydı `fikatia-mimari-ilke-makro-plugin-olay.md`: **eklenen HER sistem doğduğu an makro+plugin+olay erişilebilir olmalı.** Denetim:
- SahneRefSecim (Yol 4): olay YOK, makro YOK.
- Ölçüm seçimi (Yol 5): `OlcumEklendi` var ama "seçim yapıldı" ara-olayı ve makro seçim API'si yok.
- Sketch seçimi (Yol 6): `sketchSecili` değişimi olay yayınlamaz, makro erişimi yok.
**Fix:** Ortak bir `RefSecimYapildi{sahip, govde, alt, kaynak}` olayı ekle (SahneRefSecim.tik içinde). Sketch için `SketchSecimDegisti{sketch, adet}`. Makro: `fiko.sketch.secililer()`, `fiko.olcum.*`. (Ayrı W-dalgası; kusur dalgasına dahil değil — kapsam notu.)

#### 🟡 K6 — `fiko.secim.sec` yalnız gövde seçer (alt=0 sabit)
`makro_motor.cpp:585` `m->sahne_.sec({k, 0}, true)` — makrodan yüz/kenar/nokta seçilemez. Yol 1 UI'sı seçebilir ama makro paritesi yok.
**Fix:** `l_secimSec(kimlik, alt?)` — ikinci opsiyonel arg alt ordinali. Ayrıca `fiko.secim.kip` ile birlikte tutarlı.

#### 🟡 K7 — Ortak seçim-sonrası eylemler her kaynaktan çalışmıyor
Sil/gizle/renk eylemleri `sahne.seciliGovdeler()` üzerinden çalışır (`main.cpp:367,550,570`). Yol 3-6 kendi havuzuna yazdığından bu eylemler CAM/sketch/olcum seçimini görmez — bu **doğru** (bağlam ayrı). Ancak `VK_DELETE`→`seciliSil()` (`main.cpp:1199`) sketcher'da aktifken sketch geometrisini DEĞİL sahne gövdesini siler → sketcher'da Delete beklenmedik davranış.
**Fix:** `seciliSil()` başında `if (sketchNesne() && workbench=="sketcher") { sketchSecili'yi sil; return; }` guard.

#### 🟡 K8 — Trap sonucu tek-tık ile aynı havuza akıyor (✅ DOĞRU — teyit)
Denetim sorusu "trap sonucu ile tık sonucu aynı havuza mı akıyor": **EVET**, ikisi de `sahne.sec/secimCikar` (`alan_secim.cpp:386-390`). Tutarlı. Kusur değil; teyit.

#### 🟡 K9 — Seçim HUD dil tutarsızlığı (küçük)
- CAM: `"%s seç · %d seçili · ESC=bitir"` (`cam_secim.cpp:375`).
- RefSecim: `"%s seç · ESC=bitir"` (`sahne_ref_secim.cpp:15`).
- Trap: `"N öğe seçildi (TipAdı)"` (bitince; `main.cpp:2299`).
Farklı format/zamanlama. CAM+RefSecim tutarlı; trap bitiş-mesajı farklı ama bağlam farklı (kabul edilebilir). Öneri: ortak `secimHudMetni(mod, ad, sayi)` yardımcısı — tek dil.

#### 🟢 K10 — Kip filtresi kapsamı (teyit + boşluk)
Kip filtresi (1/2/3/4) yalnız Yol 1 (tek-tık) ve dolaylı Yol 2 (trap, `sahne.kip()`) için geçerli. Yol 3/4/5 filtreyi **zorla ezer** ve mod bitince geri yükler (`main.cpp:3908-3916` yedek/geri-yükle — ✅ doğru tasarım, sızma yok). Ağaç (Yol 7) her zaman Govde seçer — kip filtresini yok sayar → ağaçtan yüz/kenar seçilemez. Bu bilinçli sınır; W1'de "ağaçta topoloji düğümü" kapsam dışı.

---

## GÖREV 2 — AKILLI SEÇİM (WOW paketi W1) SPEC

### Ön koşul: eksik native veri kaynakları
Mevcut: `YuzBilgi{alan, merkez, duzlemMi, normal, silindirMi/kureMi, eksen, eksenNokta, yaricap}`, `KenarBilgi{uzunluk, dogruMu, yon, cemberMi, merkez, normal, yaricap}` (`brep.hpp:14-34`), per-vertex yüz-ordinal etiketi (`ucgenle`). **EKSİK ve W1 için gerekli** yeni BRep accessor'ları (`geometri/brep.hpp` + `brep.cpp`, OCCT `TopExp::MapShapesAndAncestors`):
```
u32  yuzSayisi() const;                          // toplam yüz ordinali (döngü sınırı yerine)
u32  kenarSayisi() const;
std::vector<u32> yuzKomsulari(u32 yuz) const;    // kenar paylaşan yüzler
std::vector<u32> kenarYuzleri(u32 kenar) const;  // kenara komşu 2 yüz (G1 testi için)
std::vector<u32> yuzKenarlari(u32 yuz) const;    // yüzün sınır kenarları (Loop için)
bool tegetMi(u32 yuzA, u32 yuzB, u32 ortakKenar, f64 aciTol=1e-3) const; // G1 süreklilik
```
Bunlar OCCT'de ucuz (ancestor map). **Bu accessor katmanı W1'in D0 (temel) dalgasıdır** — tüm akıllı seçim buna dayanır.

Yeni merkezi motor: `motor/sahne/akilli_secim.{hpp,cpp}` → `class AkilliSecim`. `sahne.secililer_` havuzunu okur/genişletir (ayrı havuz DEĞİL — K8 tutarlılığını korur). Her fonksiyon `std::vector<SecimOge>` üretir → `sahne.sec(o, true)` ile mevcut seçime ekler.

---

### W1.1 — Benzerini Seç (Select Similar)
**Native:** seçili yüz(ler)in `YuzBilgi`'sini referans al; tüm gövdelerin tüm yüzlerini gez (`yuzSayisi`), kritere göre eşleştir.
Kriterler (mini pencere combo, çoklu-and):
- **Aynı çap silindir** → `silindirMi && |yaricap−ref.yaricap|<tol` (delikler! en yaygın).
- **Aynı alan** → `|alan−ref.alan|/ref.alan < %tol`.
- **Aynı tip** → duzlem/silindir/kure/koni eşleşmesi.
- **Aynı renk gövde** → `Dugum.renk` eşleşmesi (gövde kipinde).
- Kapsam combo: "Bu gövde" / "Tüm sahne".
**UI:** Sağ-tık menü "Benzerini Seç…" → küçük pencere (kriter checkbox'ları + tol slider + "Uygula"). Kısayol: `Ctrl+Shift+S`. Referans yoksa (seçim boş) pasif.
**Olay:** `AkilliSecimYapildi{tur=Benzer, adet}`. **Makro:** `fiko.secim.benzer(kriter, tol)`.
**Not:** Tol varsayılan silindir 0.01mm, alan %1. Web `yuzBilgi` combo kalıbı.

### W1.2 — Teğet Zincir (Select Tangency)
**Native:** seçili yüzden BFS: `yuzKomsulari(y)` → her komşu için `tegetMi(y, komsu, ortakKenar)` true ise zincire ekle, kuyruğa koy. G1 süreklilik = ortak kenarda iki yüz normalleri açı toleransı içinde. Fillet şeridi tek tıkla toplanır.
Kenar varyantı: seçili kenardan teğet komşu kenarlar (`kenarYuzleri` + kenar teğetliği) — SW "Select Tangency" kenar modu.
**UI:** Sağ-tık "Teğet Zincir Seç" (yüz/kenar seçiliyken). Kısayol: `T` (viewport odaklı, trap-`T` ile çakışmaz çünkü seçim varken). Çift-tık döngüsüne de girer (W1.5).
**Olay:** `AkilliSecimYapildi{tur=Teget, adet}`. **Makro:** `fiko.secim.teget()`.

### W1.3 — Delik/Feature Tanıma Seçimi (Select Hole)
**Native:** silindirik yüzden deliğin TÜM yüzeyleri. Algoritma: seçili silindir yüzünden `yuzKomsulari` gez; aynı eksen (`eksen` paralel + `eksenNokta` eksen üzerinde) silindir/koni yüzleri + delik tabanı (eksene dik düzlem, silindir ağzında) topla. Bu, taskteki "cam delikAdaylari kalıbı"nın **genelleştirilmesi** — mevcutta `delikAdaylari` YOK (denetlendi: yalnız `delikYolu` nokta-tabanlı var, `cam_hesap.cpp:385`). Yeni: `geometri::delikYuzleri(brep, silindirYuz) -> std::vector<u32>` saf fonksiyon (test edilebilir).
**UI:** Sağ-tık silindirik yüzde "Deliği Seç". Çift-tık döngüsünde silindir yüz → delik feature adımı.
**Olay:** `AkilliSecimYapildi{tur=Delik, adet}`. **Makro:** `fiko.secim.delik()`.

### W1.4 — Other Selection (derinlik-sıralı aday listesi)
**Native:** GPU pick tek en-yakını döndürür (`secim_gpu.cpp`). Katman gezme için: `sahne.isinVur` zaten en-yakın; **çoklu-isabet** gerekir. İki seçenek:
- (A) CPU ışın: `sahne.isinVurCoklu(orij, yon) -> std::vector<IsinVurus>` (t'ye göre sıralı, tüm gövde+yüz). BVH yok ama sahne küçük — kabul.
- (B) GPU pick derinlik-peel (pahalı, ertelenir).
**Öneri: (A).** Tık-bekle (0.4s aynı noktada 2. tık) → imleç altındaki aday listesi overlay (t sıralı, "Yüz 3 · Kutu · 12mm derin"). Scroll/ok tuşu ile katman gez; hover'da o aday sahne-vurgusu olur; tık = seç.
**UI:** Kısayol `Alt+tık` (CATIA "Other Selection" muadili) → overlay liste. Ok yukarı/aşağı gez, Enter seç, ESC iptal.
**Olay:** yok (seçim `sahne.sec`'e düşer). **Makro:** `fiko.secim.altindakiler(x,y)` → aday listesi.

### W1.5 — Akıllı Çift-Tık Döngüsü (Progressive Selection)
**Native:** durum makinesi (main.cpp yerel state `ciftTikFaz`, `ciftTikGovde`): 1. çift-tık = yüz → 2. = gövde (tüm yüzler / `{govde,0}`) → 3. (varsa feature) → 1'e döngü.
**Uyarı:** çift-tık şu an odaklama yapıyor (`main.cpp:2291,2300`). Çakışma: seçim-döngüsü mü odaklama mı? **Karar:** boşta çift-tık = odaklama (mevcut korunur); seçim VARKEN aynı gövdeye çift-tık = döngü büyüt. Faz sıfırlama: farklı gövde/boş tık.
**UI:** Ekstra kısayol yok (çift-tık davranışı). HUD "Yüz → Gövde → Feature".
**Makro:** yok (etkileşim).

### W1.6 — Seçim Setleri (Named Selection Sets)
**Native:** adlandırılmış kayıt = `DokumanNesnesi` (anayasa). Yeni bileşen `SecimSetiBilesen{ad, std::vector<SecimOge> ogeler}`. Ağaçta "Seçim Setleri" grubu (originKur kalıbı gibi kalıcı grup). Kaydet = mevcut `sahne.secililer()` snapshot. Yükle = havuza uygula (`secimTemizle`+`sec`).
**UI:** Seçim varken sağ-tık "Seçim Setine Kaydet…" (ad iste). Ağaçta set düğümü çift-tık = yükle, sağ-tık = sil/yeniden-adlandır. `cizDugum` CAM-sanal-düğüm kalıbıyla (varlik tabanlı, gerçek nesne).
**Olay:** `SecimSetiEklendi/Silindi{varlik}`. **Makro:** `fiko.secim.setKaydet(ad)`, `fiko.secim.setYukle(ad)`.
**Kalıcılık:** DokumanNesnesi → undo/redo + disk günlüğü bedavaya.

### W1.7 — İzole Et (Isolate)
**Native:** seçili gövdeleri bırak, gerisini soluklaştır/gizle. Yeni sahne durumu `izoleAktif` + `std::vector<u32> izoleGovdeler`. Render: izole dışı gövdeler alfa=0.15 (soluk) veya `agacGorunur` override. **Fog kullanma** (hafıza: `feedback_sis_yok.md`).
**UI:** Seçim varken kısayol `I` / sağ-tık "İzole Et". Viewport köşesinde "İzole — Çık" butonu (overlay). Çık = eski görünürlük geri.
**Olay:** `IzoleGirildi/Cikildi`. **Makro:** `fiko.sahne.izole(kimlikler)`, `fiko.sahne.izoleCik()`.
**Uyarı:** izole çıkışta K1'deki merkezi `gorunurAyarla` yolunu kullan (doğrudan `d.gorunur` yazma).

---

## UYGULAMA DALGALARI

Dosya kilitleri parantez içinde. **Alan seçim ajanı `alan_secim.cpp`'de çalışıyor → o dosyaya HİÇBİR dalga dokunmaz.**

### DALGA A — Kusur Düzeltme (kısa, düşük risk, önce)
| Adım | Kusur | Dosya (kilit) |
|------|-------|---------------|
| A1 | K1 görünürlük olay-bypass | `main.cpp:3078,3148` |
| A2 | K3 ESC ölçüm dalı | `main.cpp:1200-1213` |
| A3 | K4 trap Ctrl→toggle | (⚠️ `alan_secim.cpp` ajanı bitince) — **A dalgasına ALMA**, D2'ye ertele |
| A4 | K2 ağaç seçili satır `SetScrollHereY` + SecimDegisti abonesi | `main.cpp:2672-2778` + üst kurulum |
| A5 | K7 sketcher Delete guard | `main.cpp:1199` (`seciliSil`) |
| A6 | K6 makro `sec(kimlik,alt)` | `makro_motor.cpp:578` |

### DALGA D0 — Akıllı seçim temeli (BRep accessor katmanı)
`geometri/brep.hpp` + `brep.cpp`: `yuzSayisi/kenarSayisi/yuzKomsulari/kenarYuzleri/yuzKenarlari/tegetMi` + saf `geometri::delikYuzleri`. Test: `test_brep.cpp` (6+ yeni). **Kilit:** geometri modülü — sahne/main dokunmaz.

### DALGA D1 — AkilliSecim motoru + Benzerini Seç + Teğet + Delik
`motor/sahne/akilli_secim.{hpp,cpp}` (yeni). W1.1/W1.2/W1.3. Olay `AkilliSecimYapildi` (olay.hpp enum SONUNA — anayasa). Makro `fiko.secim.benzer/teget/delik`. Test `test_akilli_secim.cpp`. **Kilit:** yeni dosyalar + `olay.hpp` (enum ekle) + `makro_motor.cpp` (fonksiyon ekle). main.cpp yalnız sağ-tık menü + kısayol bağlar.

### DALGA D2 — Other Selection + Çift-tık döngüsü + K4
`sahne.isinVurCoklu` (`sahne.cpp`), overlay liste + çift-tık faz makinesi (`main.cpp`), K4 trap toggle (`alan_secim.cpp` — ajan bittikten SONRA). **Kilit:** `sahne.cpp` + `main.cpp` + `alan_secim.cpp` (geç).

### DALGA D3 — Seçim Setleri + İzole
`SecimSetiBilesen` (yeni bileşen), sahne izole durumu (`sahne.hpp/cpp`), ağaç grubu (`main.cpp cizDugum`), olaylar + makro. **Kilit:** `sahne.*` + `main.cpp` + `olay.hpp` + `makro_motor.cpp`.

### DALGA D4 — Olay/makro paritesi (K5) + HUD birleştirme (K9)
SahneRefSecim/Sketch/Olcum seçim olayları + makro API'leri, ortak `secimHudMetni` yardımcısı. **Kilit:** `sahne_ref_secim.*`, `olcum_sistemi.*`, `main.cpp`, `olay.hpp`, `makro_motor.cpp`.

---

## Sıra önerisi
**A (kusur) → D0 → D1** en yüksek değer/risk oranı (WOW görünür, temel sağlam). D2-D4 sonra. A3+D2'deki `alan_secim.cpp` dokunuşları alan-ajanı bitişini bekler.

## Kaynaklar (endüstri kalıbı)
- SOLIDWORKS Select Tangency / Select Loop — help.solidworks.com
- CATIA Edge/Face Selection (Chain/Loop/Tangency) — catiadoc.free.fr
- CADimensions: Chain vs Loop vs Tangency
