#pragma once // Uygulama bağlamı: main.cpp'deki dev calistir() döngüsünün paylaşılan durumu + // alt sistem referansları + modüller-arası yardımcı lambda'lar tek struct'ta // toplanır. Modül dosyaları (dosya_islemleri / ozellikler_paneli / yardimci_penceler // / ... ) bu bağlamı referansla alır. // // TASARIM: mutable durum üyeleri REFERANS'tır ve calistir() içindeki yerel // değişkenlere bağlanır. Böylece main.cpp'nin dev döngü gövdesi (bare local'lar) // AYNEN kalır — davranış değişikliği kanıtlanabilir biçimde SIFIR — ama modüller // aynı durumu paylaşır (ör. ImGui::Begin(&b.panelMakro) main'in panelMakro'sudur). // Alt sistemler de referans (sahiplik main.cpp'de; Vulkan'a bağlı yaşam döngüsü). #include #include #include #include #include #include "fiko/io/fiko_format.hpp" // FikoCaeKurulum (belge verisi; CAEK) #include "fiko/core/temel.hpp" // i32/u32/f32/f64 #include "fiko/core/mat/vec.hpp" // Vec3f #include "fiko/malzeme/malzeme.hpp" // MalzemeKutuphanesi / MalzemeAtama #include "fiko/cekirdek/dunya.hpp" // Varlik / VARLIK_YOK #include "fiko/sahne/pmi_sistemi.hpp" // PmiSistemi (3B PMI/GD&T defteri) #include "fiko/sahne/sahne.hpp" // DugumPusula (+ Sahne tam tanımı) namespace fiko { // İleri bildirimler (referans üyeler — tam tanım .cpp include'larından gelir). class Cekirdek; class Sahne; class OrbitKamera; class SecimGpu; class SecimSistemi; class OlcumSistemi; class AlanSecim; class SahneRefSecim; namespace betik { class MakroMotor; } namespace kinematik { class Mekanizma; } namespace eklenti { class EklentiYonetici; } namespace cam { class CamSistemi; } namespace parca { class PartDesignSistemi; } namespace gsd { class GsdSistemi; } namespace analiz { class AnalizSistemi; } namespace zeka { class ZekaMotoru; } namespace eskiz { class EskizVeri; enum class KisitTip; } class Pencere; class VulkanBaglam; class ImGuiKatman; class SketchNesnesi; struct SketchUIDurum; struct HizliUIDurum; struct IsikDurum; // Modül arayüzü: main.cpp'deki yerel durumun/alt sistemlerin paylaşılan görünümü. // TÜM üyeler referans (main.cpp local'larına bağlı) → tek doğruluk kaynağı orada. struct UygulamaBaglam { // ---- Alt sistemler ---- Cekirdek& cekirdek; Sahne& sahne; OrbitKamera& kamera; SecimSistemi& secimSis; OlcumSistemi& olcum; AlanSecim& alan; SahneRefSecim& refSecim; betik::MakroMotor& makro; eklenti::EklentiYonetici& eklentiler; cam::CamSistemi& camSis; kinematik::Mekanizma& mekanizma; // kinematik mekanizma (belge verisi; KNMT) std::vector& caeKurulumlar; // FEM kurulumları (belge verisi; CAEK) parca::PartDesignSistemi& partD; gsd::GsdSistemi& gsdSis; analiz::AnalizSistemi& analizSis; zeka::ZekaMotoru& zekaSis; // Geometri Zekâ Motoru (belge verisi; feature tanıma grafı) PmiSistemi& pmiSis; // Malzeme/doku: belge verisi (kütüphane + gövde/yüz atamaları). malzeme::MalzemeKutuphanesi& malzemeKut; malzeme::MalzemeAtama& malzemeAta; Pencere& pencere; // Kalıcı yol/dizin dizeleri (main.cpp'deki const local'lar). const std::string& olayLogYol; const std::string& makroDizin; // ---- Paylaşılan panel/durum bayrakları (main.cpp local'larına bağlı) ---- bool& panelOzellik; bool& panelOlay; bool& panelMakro; bool& panelEklenti; bool& ozellikAcikOnceki; bool& ozellikUstte; bool& olayUstte; DugumPusula& ozellikEski; // ---- Ürün ağacı paneli durumu ---- bool& panelAgac; bool& agacUstte; bool& agacKaydirGerek; // K2: seçim değişti → seçili satırı görünür alana kaydır bool& agacIcinde; // CATIA spec tree: ağaç 3B görünümün İÇİNDE overlay f32& agacSahneOlcek; // sahne-içi (P2) ağaç yazı zoom ölçeği (wheel ile) f32& agacPanDelta; // sahne-içi ağaç sol-tık sürükle pan (bu kare dikey delta; panel tüketir) bool& agacSigdir; // sahne-içi ağaç "Sığdır" isteği (panel tüketir → ölçek/kaydırma reset) // ---- Aydınlatma (isik_penceresi.hpp / isik_durum.hpp) ---- IsikDurum& isik; bool& panelIsik; bool& isikUstte; // ---- Sketcher (2B eskiz) UI durumu (sketch_ui.hpp) ---- SketchUIDurum& sketch; // ---- "Hızlı 3D" widget durumu (hizli3d_penceresi.hpp) ---- HizliUIDurum& hizli; // ---- Viewport (MDI 3D pencere) kare-yerel konum/boyutu (Sketch Tools toolbar // 3D Görünüm üst kenarına snap'lenir). main.cpp local'larına referans. ---- f32& vpRectMinX; f32& vpRectMinY; u32& istenenVpG; u32& istenenVpY; // ---- Sahne hover bilgi kartı görünürlüğü (Görünüm menüsü + Ayarlar) ---- bool& hoverBilgiAcik; // ---- Modüller-arası paylaşılan yardımcılar (calistir() içinde bağlanır) ---- // Değer üye: main.cpp'deki [&] lambda'lar buraya kopyalanır (aynı davranış). std::function bilgiVer; // Son kullanılan dosyalar (MRU) kaydı: başarılı aç/kaydet sonrası çağrılır → // app-global FikoSonDosyalar'a ekler + ayar'a kalıcı yazar (universal palet "Dosya"). std::function sonDosyaEkle; // Belge adı süreç yöneticisi kaydına yaz (dosya aç/kaydet → heartbeat belge etiketi). std::function belgeAdiAyarla; std::function tumunuSigdir; std::function secimiSigdir; std::function gorunurDegistir; // seciliSil/boolIslem: MDI Alt-proje 3 — frame+setup pencere-başına çalışınca // bu yardımcılar da aktif belgeye bağlı olmalı (bglm üzerinden erişilir). std::function seciliSil; std::function boolIslem; // Bir sketch'e gir (önceki açıksa kapat + araç durumu temizle + normal view). std::function sketchGir; // Teknik resim (pafta) moduna gir/çık — ürün ağacı çift-tık + bağlam menüsü çağırır. // Girişte 3B bağlam (workbench + kamera) yedeklenir, çıkışta aynen geri yüklenir. std::function paftaGir; std::function paftaCik; // Bu pafta düğümü şu an açık mı (ağaç çift-tık toggle'ı için). std::function paftaAktifMi; // ---- Sketch mantık yardımcıları (calistir() içinde bağlanır) ---- // Sketcher paneli / Sketch Tools toolbar modüllerinin (sketch_ui.cpp) main.cpp // yerel lambda'larına dokunmadan çağırdığı saf-mantık delegeleri (sketchGir // pattern'i). main.cpp'deki bare lambda'lar AYNEN kalır (davranış birebir). std::function sketchNesne; // aktif sketch nesnesi (yoksa nullptr) std::function sketchDuzenMi; // araç 2B düzenleme kümesinde mi std::function sketchDikBak; // kamerayı sketch düzlemine dik getir std::function sketchAracSec; // çizim aracı seç (+ bekleyen tık temizle) std::function sketchDuzenSec; // düzenleme aracı seç (faz sıfırla) std::function sketchDuzenIlerlet; // düzenleme fazını ilerlet (Enter/Devam/ön-seçim) std::function sketchKisitUygula; // seçili geo'lara kısıt uygula std::function sketchOtoOlcu; // otomatik ölçülendirme std::function sketchTemasKisit; // temas kısıtı: 2 seçime tipine göre en uygun kısıt std::function sketchOtoKisit; // oto kısıt seti: H/V + ölçüler (seçili/tüm geo) std::function sketchAracTamamla; // biriken tıklardan araç geometrisi ekle std::function sketch3DGecir; // 3B→sketch: false=İzdüşüm(seçili kenarlar), true=Arakesit(görünür gövdeler) // ---- İmleç/koordinat yardımcıları (frame'in kullandığı setup-yerel lambda'lar; // per-window belge penceresi için bglm üzerinden erişilir — MDI ayrı-pencere). std::function imlecDunya; // ekran px → dünya (zemin/derinlik) std::function imlecYuzey; // ekran px → yüzey vuruş noktası std::function imlecMerkez; // ekran px → merkezleme pivotu (yüzey ∨ gövde merkezi) std::function imlecVurus; // ekran px → ışın vuruş std::function uvDunya; // sketch düzlem UV → dünya std::function ekranUV; // ekran px → sketch UV std::function sketchEnYakin; // UV'ye en yakın sketch geo id std::function sketchAracTikSayi; // aktif araç için biriken tık sayısı std::function sketchSecimYay; // seçili sketch geo'ları yayınla // ---- Ekran görüntüsü (geri bildirim) ---- // Aktif viewport'un renk hedefini PNG olarak belleğe yakalar (senkron readback). // VulkanBaglam bglm'de yok (yaşam döngüsü main.cpp'de) → delege ile bağlanır. // UYARI: senkron GPU readback — YALNIZ kullanıcı jesti ile çağrılır, sıcak yolda ASLA. std::function&)> ekranYakala; // ---- Montaj Kısıtları: Mesafe/Açı sayısal değer diyaloğu (belge_penceresi.cpp). // "Mesafe"/"Açı" komutu tıklanınca montajDegerUygula bağlanır + montajDegerAcik // set edilir (setup-yerel montajKisitUygula lambda'sını sarar); popup ayrı bir // çerçevede (frame döngüsü) render edilir → bglm üzerinden iki nokta paylaşır // (bilgiVer/tumunuSigdir ile AYNI kalıp: değer üye, referans DEĞİL). ---- bool montajDegerAcik = false; // true olunca popup açılır (tüketen taraf false'a çeker) bool montajDegerAci = false; // etiket/birim: true=Açı(derece), false=Mesafe(mm) f32 montajDegerDeger = 0.0f; // kullanıcının girdiği ham değer (mm veya derece) std::function montajDegerUygula; // Uygula'ya basınca çağrılır (SI birim: mm/radyan) // ---- Bekleyen IJK hedefi: DM (ana pencere) ↔ Kafa penceresi (Diagonal/Ozmo) arası // tek-seferlik "yapıştır" kanalı (montajDeger* ile AYNI kalıp: değer üye, referans // DEĞİL). Bağlam menüsünden "Bu Yönü IJK Hedefine Gönder" tıklanınca seçili yüz // normali / düz kenar doğrultusu DÜNYA-uzayında (birim vektör) buraya yazılır // (belge_penceresi.cpp). Kafa penceresi her kafaGuncelle karesinde bakar, doluysa // I/J/K alanlarını doldurur ve TÜKETİR (bkz. kafa_penceresi.cpp). optional çünkü // "boş" durumu da anlamlı: gönderilecek bekleyen bir yön yok. ---- std::optional bekleyenIjkHedef; // ---- IJK yön seçim modu: Kafa penceresinin "🎯 3d Seç" butonu true'ya // çeker; ana viewport'taki (belge_penceresi.cpp) SIRADAKİ 3B tık normal seçim yerine // yakalanır (hizliYonSecim/refSecim ile AYNI "tık-yakalama modu" deseni) → yüz normali // ya da düz kenar doğrultusu bekleyenIjkHedef'e yazılır + bu bayrak false'a döner. ---- bool ijkSecimBekliyor = false; // Hangi kafa (KafaTip: 0=Diagonal, 1=Ozmo) bekliyor — İKİ kafa da açıkken tık // sonucu doğru pencereye gitsin diye. -1 = kafaGuncelle "açık ilk kafa" varsayılanına düşer. int ijkSecimKafaIndex = -1; // ---- Süreçler-arası "3d Seç": Kafa penceresi armlanınca (yerel // ijkSecimBekliyor'a EK olarak) tüm diğer fikocad.exe süreçlerine "ijk.mod_ac" IPC // yayınlanır. Bu değer o yayını alan sürecin belge_penceresi.cpp'sinde SET edilir — // kaynak süreç PID'i (0 = kimse beklemiyor). Sonraki 3B tıkta yerel ijkSecimBekliyor // YOKSA ve bu doluysa: yön hesaplanır ama bglm.bekleyenIjkHedef'e YAZILMAZ, bunun yerine // g_surecKopru.gonder(ijkUzakKaynakPid, "ijk.hedef", {i,j,k}) ile kaynak sürece yollanır // (o süreç kendi IPC drain'inde alır ve KENDİ bglm.bekleyenIjkHedef'ine yazar). ---- u32 ijkUzakKaynakPid = 0; }; } // namespace fiko