#include "fiko/girdi/baglam_politika.hpp" namespace fiko::girdi { namespace { MenuOgeSecim O(const char* kimlik, const char* etiket, const char* simge, int yon = -1) { return {kimlik, etiket, simge, true, yon, {}}; } // Ara-oge (alt-halka): kimlik yaprak degil, cocuklar tiklaninca acilir. MenuOgeSecim G(const char* etiket, const char* simge, std::vector cocuklar) { return {"", etiket, simge, true, -1, std::move(cocuklar)}; } } // namespace // Yuz hover: en zengin bağlam eylemleri (CATIA/Fusion contextual toolbar). PolitikaKarar BaglamPolitika::yuzMenusu(const std::string& wb) const { PolitikaKarar r; r.menu = MenuTur::AracHalkasi; r.radyal = true; r.ogeler = { O("fillet", "Yuvarlat", "◜"), O("chamfer", "Pah", "◺"), O("olc", "Ölç", "📏"), O("gizle", "Gizle", "🚫"), // Akıllı seçim alt-halkası: motor yayılımları (registry "Seçim" komutları) — // niyet seçili/hover yüzden çıkar, klavye kombinasyonu gerekmez. G("Seçim", "🎯", {O("sec_teget", "Teğet", "⌾"), O("sec_koplanar", "Koplanar", "▱"), O("sec_paralel", "Paralel", "∥"), O("sec_benzer", "Benzer", "⊘"), O("sec_ayni_renk", "Aynı Renk", "🎨")}), }; if (wb == "part") { r.ogeler.push_back(O("yuz_itcek", "İt/Çek", "⇕")); // numeric push/pull (Doğrudan Modelleme) r.ogeler.push_back(O("yuz_kaldir", "Yüz Kaldır", "⊘")); // Remove Face (defeaturing) r.ogeler.push_back(O("kesit", "Kesit", "◧")); // Split: seçili yüzün düzlemiyle böl r.ogeler.push_back(O("pocket", "Cep", "▢")); r.ogeler.push_back(O("sketch_yuz", "Eskiz Aç", "✎")); // Montaj Kısıtları: yalnız iki farklı gövdeden yüz seçiliyken görünür (madde 1, // "seçim=komut" — DM felsefesi, buton yok). Bayrak belge_penceresi.cpp'de // sahne.secililer() okunarak karar() ÇAĞRILMADAN ÖNCE set edilir. if (ikiYuzFarkliGovdeSecili) { r.ogeler.push_back( G("Montaj Kısıtları", "🔗", {O("montaj_sabit", "Sabit", "🔒"), O("montaj_es_eksenli", "Eş Eksenli", "⌾"), O("montaj_cakisik", "Çakışık", "▱"), O("montaj_mesafe", "Mesafe", "↔"), O("montaj_aci", "Açı", "∠")})); } } else if (wb == "cam") { r.ogeler.push_back(O("cam_kontur", "Kontur Seç", "🎯")); } return r; } PolitikaKarar BaglamPolitika::kenarMenusu(const std::string& wb) const { (void)wb; PolitikaKarar r; r.menu = MenuTur::AracHalkasi; r.radyal = true; r.ogeler = { O("fillet", "Yuvarlat", "◜"), O("chamfer", "Pah", "◺"), O("kenar_eg", "Kenardan Eğ", "⟀"), // Fikri 07-22: kenar menteşe → komşu yüz eğilir O("kenar_uzat", "Kenardan Uzat", "⇱"), // komşu düz yüz itilir → kenar uzar O("olc", "Ölç", "📏"), // Kenar akıllı seçimleri: zincir (loop) + aynı ölçü (bu R'deki filletler). G("Seçim", "🎯", {O("sec_zincir", "Zincir", "◠"), O("sec_benzer_kenar", "Benzer", "◯")}), }; return r; } PolitikaKarar BaglamPolitika::noktaMenusu(const std::string& wb) const { (void)wb; PolitikaKarar r; r.menu = MenuTur::AracHalkasi; r.radyal = true; r.ogeler = {O("olc", "Ölç", "📏")}; return r; } PolitikaKarar BaglamPolitika::govdeMenusu(const std::string& wb) const { PolitikaKarar r; r.menu = MenuTur::AracHalkasi; // govde → radyal araç halkası (işaret hissi korunur) r.radyal = true; // Hepsi main.cpp'de inline (seç/gizle/sil/yakınlaş/ağırlık) ya da registry (ölç) // üzerinden çalışır; pasif öğe bırakılmaz. yon → araç halkası PUSULA_SIRA slotlar. r.ogeler = { O("sec", "Seç", "🖈", 0), // K O("agirlik", "Ağırlık", "⚖", 1), // KD O("olc", "Ölç", "📏", 2), // D O("yakinlas", "Yakınlaş", "🔍", 3),// GD O("sil", "Sil", "🗑", 4), // G O("gizle", "Gizle", "🚫", 6), // B }; // Part'ta referans düzlem / düz yüz / gövde sağ-tık → Eskiz Aç (CATIA: düzlemsel yüzeye // sağ tık ile sketch). Govde kipinde de görünür; sketchDuzlemBul seçili düzlem/yüzü bulur. if (wb == "part") { r.ogeler.push_back(O("sketch_yuz", "Eskiz Aç", "✎", 5)); // GB slot // Keskin kenar analizi + pah/fillet önerisi: gövdeye sağ-tık → analiz paneli // (panelde tek tıkla "N dışbükeye pah / M içbükeye fillet" çipleri). r.ogeler.push_back(O("keskin_analiz", "Keskin Kenar", "◣", 7)); // KB slot // Zekâ Analizi: Geometri Zekâ Motoru feature tanıma (delik/cep/fillet/pah...). r.ogeler.push_back(O("zeka_analiz", "Zekâ Analizi", "🧠")); // serbest slot (oto yerleşim) } return r; } PolitikaKarar BaglamPolitika::bosMenu(const std::string& wb) const { PolitikaKarar r; r.menu = MenuTur::AracHalkasi; // boş sahne → radyal araç halkası (nested destekli) r.radyal = true; // Bosluk sag-tik → genel sahne komutlari (workbench'e gore degisir). if (wb == "sketcher") { // "Çizim" ara-öğesi → alt-halka (nested radial): çizim primitifleri. r.ogeler = { G("Çizim", "✎", {O("cizgi", "Çizgi", "/"), O("cember", "Çember", "◯"), O("dikdortgen", "Dikdörtgen", "▭")}), O("kisit", "Kısıt", "⟂"), }; } else { // "Ekle" ara-öğesi → alt-halka: temel primitifler. r.ogeler = { G("Ekle", "➕", {O("kutu_ekle", "Kutu", "◼"), O("silindir_ekle", "Silindir", "⬭")}), O("tumunu_sigdir", "Sığdır", "⤢"), O("gorunum", "Görünüm", "👁"), }; } return r; } PolitikaKarar BaglamPolitika::karar(const FareJesti& j, const std::string& aktifWb) const { PolitikaKarar bos; if (j.guiUstunde) return bos; // menu/panel uzerinde: politika devre disi // Menu ACAN jestler: Sag-tik (isaret), Sag-uzun-bas (arac halkasi/isaret), // Sol+Sag akor (alternatif hizli menu). Diger jestler menu acmaz. const bool sagTik = (j.tur == JestTur::Tik && j.dugme == Dugme::Sag); const bool sagUzun = (j.tur == JestTur::UzunBas && j.dugme == Dugme::Sag); const bool akorMenu = (j.tur == JestTur::AkorTik && ((j.dugme == Dugme::Sol && j.akorDugme == Dugme::Sag) || (j.dugme == Dugme::Sag && j.akorDugme == Dugme::Sol))); if (!sagTik && !sagUzun && !akorMenu) return bos; // Tek-workbench kipi: DM baglami part zenginligiyle (bkz. hpp — esleme yalniz ekler; // sketcher/cam/pafta gibi MOD baglamlarinda aktifWb zaten "dogrudan" degildir, etkilenmez). static const std::string kPart = "part"; const std::string& wb = (tekWorkbench && aktifWb == "dogrudan") ? kPart : aktifWb; switch (j.hedef.tur) { case HedefTur::Yuz: return yuzMenusu(wb); case HedefTur::Kenar: return kenarMenusu(wb); case HedefTur::Nokta: return noktaMenusu(wb); case HedefTur::Govde: return govdeMenusu(wb); case HedefTur::Hic: return bosMenu(wb); default: return bos; // Gui } } } // namespace fiko::girdi