#pragma once // Sketcher (2B eskiz) UI durumu — main.cpp'deki dev calistir() döngüsünün sketch'e // özgü yerel değişkenleri TEK struct'ta toplanır. main.cpp bu struct'ı bir yerel // olarak tutar ve eski bare local'ları buraya REFERANS bağlar (uygulama_baglam.hpp // tasarım deseninin aynısı) → dev döngü gövdesi AYNEN kalır, davranış değişmez. // UygulamaBaglam bu struct'a referansla erişir → modüller aynı sketch durumunu paylaşır. #include #include #include #include #include #include #include #include "fiko/cekirdek/dunya.hpp" // Varlik / VARLIK_YOK #include "fiko/core/temel.hpp" // f32/f64/u32/i32 #include "fiko/core/mat/vec.hpp" // Vec3f #include "fiko/sketch/snap.hpp" // eskiz::SnapMotoru / SnapSonuc struct ImDrawList; struct ImGuiIO; struct ImVec2; namespace fiko { struct Dugum; struct UygulamaBaglam; namespace eskiz { class EskizVeri; } // Sketcher workbench + Sketch Tools durumu (main.cpp local'larından birebir). struct SketchUIDurum { Varlik aktifSketch = VARLIK_YOK; // düzenlenen sketch (Sketcher workbench) bool panelSketch = false; // Sketcher paneli görünürlüğü Varlik sketchKaynakGovde = VARLIK_YOK; // sketchDuzlemBul düz yüzden türetince o gövde (DM it/çek Pad/Cep hedefi) // ---- Sketch'e girmeden önceki bağlam (çıkışta AYNEN geri yüklenir) ---- std::string sketchOncekiWb; // önceki workbench kimliği (çıkışta geri dön) bool sketchKamVar = false; // kamera snapshot geçerli mi f32 sketchKamYon[4] = {0, 0, 0, 1}; // yönelim quat (x,y,z,w) f32 sketchKamOdak[3] = {0, 0, 0}; // odak noktası f32 sketchKamMesafe = 9.0f, sketchKamFov = 45.0f; bool sketchKamOrtho = false; bool sketchUstte = true; // Sketcher paneli "üstte tut" std::string sketchArac; // "" | "cizgi" | "dikdortgen" | "daire" | "nokta" std::vector> sketchNoktalar; // bekleyen tık uv'leri (aktif araç için) std::vector sketchSecili; // kısıt için seçilen eskiz geometri kimlikleri std::vector sketchSeciliKisit; // sahnede seçilen kısıt sembolleri (silinebilir) // Kısıt sembolü ekran-uzayı hit kutuları (overlay her kare doldurur, tık bunu okur). struct KisitHitKutu { u32 kimlik; f32 x0, y0, x1, y1; }; std::vector kisitHitKutulari; // CATIA per-eleman "tam kısıtlı = yeşil" (AzKisitli eskizde kilitli elemanlar). bool sketchTamKisitRenk = true; // ayar: sketcher.tam_kisit_renk (kapalı=eski) u64 tamKisitImza = 0; // çözüm imzası (önbellek anahtarı) std::set tamKisitOnb; // tam kısıtlı geo kimlikleri (kare önbelleği) // Boyutsal kısıt değer düzenleme (çift-tık boyut → kutu; CATIA davranışı). u32 kisitDuzenle = 0; // düzenlenen kısıt kimliği (0=kapalı) char kisitDuzenleGiris[32] = {}; // değer metni (açı DERECE gösterilir) bool kisitDuzenleIlk = false; // ilk kare: konum + metin + odak kur // ---- CATIA tarzı Sketch Tools çekirdeği (SmartPick snap + canlı giriş) ---- eskiz::SnapMotoru snapMotoru; // 2B snap/inference (aperture her kare set) eskiz::SnapSonuc sonSnap; // son çözülen snap (marker + inference çizimi) bool sketchGrid = true; // izgara görünür bool sketchGridAdaptif = true; // adaptif ızgara: zoom ne olursa ekranı KAPLAR (1/2/5·10^k) bool sketchAnalizAcik = false; // Sketch Analizi penceresi (açık uç/profil tanısı) bool sketchGridSnap = false; // izgaraya snap bool sketchKisitGizle = false; // Sketch Analizi: kısıt sembollerini gizle (overlay) bool sketchYapiGizle = false; // Sketch Analizi: yapı (construction) geometrisini gizle (overlay) bool sketchYapiMod = false; // çizilen eleman construction (yapı) bool sketchOtoGeoKisit = true; // oto geometrik kısıt (coincidence/H/V) bool sketchOtoOlcuKisit = false; // oto boyutsal kısıt (yer tutucu) // Oto-kısıt eşikleri (AyarSistemi "Sketcher" kategorisi — sihirli sayı değil): f64 sketchOtoCakisikTol = 0.15; // oto coincidence: uç-uç çakışık sayılma toleransı bool sketchOtoCakisikYayUc = true; // yay/spline uçları da oto coincidence'a girer (kapalı=eski) f64 sketchOtoHVEsik = 0.035; // oto Yatay/Dikey: ~2° (sin) sapma eşiği f64 sketchOtoMinUzunluk = 0.5; // oto H/V uygulanan asgari segment uzunluğu f64 sketchFilletYedekYari = 1.0; // interaktif fillet/pah: değer/imleç yoksa yedek yarıçap f32 sketchGridAralik = 1.0f; // izgara adımı (sketch birimi) int sketchPolyKenar = 6; // çokgen kenar sayısı (canlı giriş, 3-20) int sonsuzMod = 0; // sonsuz çizgi modu: 0=Yatay 1=Dikey 2=2 Nokta char sketchGiris[4][32] = {}; // canlı değer giriş metinleri (L/A/En/Boy/R) bool sketchGirisAktif = false; // canlı giriş penceresi bu kare gösterildi mi // ---- 2B Düzenleme (Operations) durumu ---- int sketchDuzenFaz = 0; // düzenleme akış fazı (araç bazlı) u32 sketchHover = 0; // imleç-altı eskiz geometrisi (cyan) u32 disHoverGeo = 0; // ürün ağacından hover edilen geo (ağaç→sahne highlight) u32 disHoverKisit = 0; // ürün ağacından hover edilen kısıt std::array sketchDuzenRef = {0, 0}; // referans nokta (otele/döndür/ölçek/ofset) char sketchDuzGiris[4][32] = {}; // düzenleme değer metinleri (r/dx/dy/açı/oran/kopya) bool sketchDuzGirisAktif = false; // düzenleme değer penceresi bu kare açık mı bool sketchAynaKopya = true; // ayna/simetri modu: true=kopyala, false=taşı int filletTrimMod = 0; // Corner/Chamfer trim: 0=Trim All, 1=No Trim, 2=Trim First int pahOlcuMod = 0; // Chamfer ölçü: 0=Açı+Hipotenüs, 1=1.+2. Uzunluk, 2=Açı+Uzunluk int kirpMod = 0; // Quick Trim: 0=Rubber In (içi sil), 1=Rubber Out (dışı sil), 2=Keep (sadece böl) int ofsetYayilim = 0; // Ofset yayılım (CATIA propagation): 0=Yok, 1=Teğet, 2=Nokta bool ofsetCiftTaraf = false; // Ofset Both Side: +/- iki yönde kopya // Sketch segment seçim kopyası (cpuKenar/cpuKenarAlt) yenileme imzası — sketch başına // son (geo+kısıt+param+düzlem) hash. Değişince Sahne::sketchKenarYenile çağrılır (perf: // her kare değil, yalnız geometri/düzlem değişince rebuild). std::unordered_map kenarImza; // ---- Sahnede sağ-tık bağlam menüsü (duruma göre özel öğeler) ---- u32 baglamGeo = 0; // hedef geometri (0 = boş alan → genel menü) u32 baglamKisit = 0; // hedef kısıt sembolü (0 = yok → geometri/genel menü) bool baglamAc = false; // bu kare bağlam menüsü açılsın (main sağ-tık set eder) // ---- Kısıt animasyonu (CATIA Animate Constraint, PDF p33-34) ---- bool animAcik = false; // animasyon penceresi görünür u32 animKisit = 0; // hedef boyutsal kısıt kimliği f64 animIlk = 0; // başlangıç değeri (motor birimi: Açı için RADYAN) f64 animSon = 0; // bitiş değeri int animAdim = 20; // adım sayısı (İlk→Son bölme) int animIndeks = 0; // güncel adım [0..animAdim] int animYon = 1; // ilerleme yönü (+1/-1, ileri-geri modunda döner) int animOynat = 0; // 0=dur 1=oynat int animDongu = 0; // 0=bir kez 1=ileri-geri 2=döngü f32 animHiz = 1.0f; // oynatma hızı (adım/sn) f32 animSayac = 0.0f; // DeltaTime birikimi (kare başına en fazla 1 adım) // ---- Spline/NURBS kontrol noktası tut-sürükle (onaylanmış eğriyi düzenleme) ---- u32 sketchSurukleGeo = 0; // sürüklenen geometrinin kimliği (0=yok) int sketchSurukleIndex = -100; // -2=A ucu, -1=B ucu, >=0=ekNoktalar[idx] bool sketchSurukleTuttu = false; // bu basma-bırakma bir sürüklemeydi (bırakınca normal // seçim toggle'ına düşülmesin — belge_penceresi.cpp okur) }; // Chamfer ölçü modundan (pahOlcuMod) iki kenar setback'ini hesaplar (merkezi; // UI + click-apply + önizleme paylaşır). 90° köşe varsayımlı dik-üçgen bağıntısı: // 0 Açı+Hipotenüs: v0=hipotenüs, v1=açı° → a=h·cos, b=h·sin // 1 1.+2. Uzunluk : v0=a, v1=b (doğrudan) // 2 Açı+Uzunluk : v0=a, v1=açı° → b=a·tan inline void pahMesafeHesapla(int olcuMod, f64 v0, f64 v1, f64& mesafeA, f64& mesafeB) { constexpr f64 d2r = 3.14159265358979323846 / 180.0; if (olcuMod == 1) { mesafeA = v0; mesafeB = v1; } else if (olcuMod == 2) { mesafeA = v0; mesafeB = v0 * std::tan(v1 * d2r); } else { mesafeA = v0 * std::cos(v1 * d2r); mesafeB = v0 * std::sin(v1 * d2r); } } // Sketch overlay'in (viewport çizim döngüsü) ihtiyaç duyduğu KARE-YEREL çizim // bağlamı. main.cpp her kare doldurup sketchOverlayCiz'e geçer; böylece overlay // gövdesi (ekrana/uvDunya/ekranUV/ciz/io/vpHover projeksiyon durumu) main.cpp'nin // yerel lambda'larını AYNEN kullanır (davranış birebir), ama kod modüle taşınır. struct SketchCizimBaglam { ImDrawList* ciz = nullptr; // aktif viewport ImGui DrawList ImGuiIO* io = nullptr; // fare konumu (io->MousePos) bool vpHover = false; // imleç 3D viewport üstünde mi f32 vpRectMinX = 0, vpRectMinY = 0; // viewport görüntü dikdörtgeni sol-üst (mutlak ekran) f32 vpBoyutX = 0, vpBoyutY = 0; // 3D viewport genişlik/yükseklik (grid ekran-kaplama için) // Dünya noktası → ekran (ölçüm overlay'iyle aynı olcVp projeksiyonu). false=arkada. std::function ekrana; // Düzlem-yerel (u,v) → dünya noktası (z=0 düzleminde). std::function uvDunya; // İmleç ışınını sketch düzlemiyle kes → düzlem-yerel (u,v). false=paralel/arkada. std::function ekranUV; // İmleç uv'sine en yakın eskiz geometrisi (0=yok). std::function sketchEnYakin; }; // ---- Sketcher UI çizim fonksiyonları (main.cpp'den taşındı, davranış birebir) ---- // Sketcher paneli (araç + kısıt + DOF durumu) — b.panelSketch açıksa. void sketcherPaneliCiz(UygulamaBaglam& b); // CATIA "Sketch Tools" sabit toolbar + çizim/düzenleme tamamlama akışı. void sketchAraclariCiz(UygulamaBaglam& b); // Sketch overlay (eskiz geometri + seçim + snap + önizleme) — viewport DrawList'e. void sketchOverlayCiz(UygulamaBaglam& b, const SketchCizimBaglam& cb); // Sahnede sağ-tık bağlam menüsü (duruma göre: kısıt / geometri / boş alan öğeleri). void sketchBaglamMenuCiz(UygulamaBaglam& b); // CATIA "Sketch Analysis" penceresi (geometri tablosu tip·durum·yorum + General // Status + düzeltici aksiyonlar) — b.sketch.sketchAnalizAcik iken görünür. void sketchAnalizPenceresiCiz(UygulamaBaglam& b); // CATIA "Animate Constraint" penceresi (İlk/Son değer + adım + oynatma + döngü // modu) — b.sketch.animAcik iken görünür; her adımda kısıt değeri değişir + // eskiz yeniden çözülür (2B mekanizma animasyonu). Stop/kapanışta İLK değere döner. void sketchAnimasyonPenceresiCiz(UygulamaBaglam& b); // Çift-tık boyutsal kısıt değer kutusu (kisitDuzenle != 0 iken; Enter=uygula+çöz). void sketchKisitDegerPenceresiCiz(UygulamaBaglam& b); // Animasyon penceresini hedef kısıtla aç (0 = sahnede seçili kısıtın ilki). // Boyutsal olmayan/bulunamayan hedefte bilgi verir, pencere açılmaz. void sketchAnimasyonAc(UygulamaBaglam& b, u32 kisitKimlik = 0); } // namespace fiko