// fiko.komut.* + fiko.workbench.* + fiko.ui.* Lua bağlama katmanı. #include "fiko/betik/makro_motor.hpp" #include "fiko/cekirdek/cekirdek.hpp" #include "fiko/cekirdek/olay.hpp" #include "fiko/ui/simge.hpp" #include "fiko/ui/tema.hpp" extern "C" { #include "lauxlib.h" #include "lua.h" } namespace fiko::betik { int MakroMotor::l_komutListesi(lua_State* L) { MakroMotor* m = kendisi(L); const auto& ogeler = m->cekirdek_.menuler().hepsi(); lua_createtable(L, static_cast(ogeler.size()), 0); int i = 1; for (const MenuOge& o : ogeler) { lua_createtable(L, 0, 2); lua_pushlstring(L, o.grup.c_str(), o.grup.size()); lua_setfield(L, -2, "grup"); lua_pushlstring(L, o.ad.c_str(), o.ad.size()); lua_setfield(L, -2, "ad"); lua_rawseti(L, -2, i++); } return 1; } int MakroMotor::l_komutCalistir(lua_State* L) { MakroMotor* m = kendisi(L); const char* ad = luaL_checkstring(L, 1); for (const MenuOge& o : m->cekirdek_.menuler().hepsi()) { if (o.ad != ad) continue; // Merkezi dispatch (lisans gate + etkinMi + KomutCalisti audit) — doğrudan calistir // DEĞİL: makrolar da lisans/denetimden geçer (bypass = lisans deliği). Dönen = çalıştı mı. const bool ok = m->cekirdek_.komutCalistir(o, "makro"); lua_pushboolean(L, ok ? 1 : 0); return 1; } lua_pushnil(L); return 1; } int MakroMotor::l_workbenchAktif(lua_State* L) { MakroMotor* m = kendisi(L); const std::string& k = m->cekirdek_.workbenchler().aktif(); lua_pushlstring(L, k.c_str(), k.size()); return 1; } int MakroMotor::l_workbenchAyarla(lua_State* L) { MakroMotor* m = kendisi(L); const char* kimlik = luaL_checkstring(L, 1); if (!m->cekirdek_.workbenchler().bul(kimlik)) { lua_pushnil(L); return 1; } m->cekirdek_.workbenchler().aktifAyarla(m->cekirdek_, kimlik); lua_pushboolean(L, 1); return 1; } int MakroMotor::l_workbenchListe(lua_State* L) { MakroMotor* m = kendisi(L); const auto& ogeler = m->cekirdek_.workbenchler().hepsi(); lua_createtable(L, static_cast(ogeler.size()), 0); int i = 1; for (const WorkbenchOge& o : ogeler) { lua_pushlstring(L, o.kimlik.c_str(), o.kimlik.size()); lua_rawseti(L, -2, i++); } return 1; } // ---- fiko.ui.*: FikoUi tema erişimi (makro+plugin+olay doğuştan ilkesi) ---- int MakroMotor::l_uiTema(lua_State* L) { MakroMotor* m = kendisi(L); const char* ad = luaL_checkstring(L, 1); if (!ui::temaSec(ad)) { lua_pushnil(L); return 1; } m->cekirdek_.olaylar().yayinla(TemaDegisti{}, ui::tema().ad); lua_pushboolean(L, 1); return 1; } int MakroMotor::l_uiTemaAktif(lua_State* L) { lua_pushstring(L, ui::tema().ad); return 1; } int MakroMotor::l_uiTemalar(lua_State* L) { lua_createtable(L, ui::temaSayisi(), 0); for (int i = 0; i < ui::temaSayisi(); ++i) { lua_pushstring(L, ui::temaAl(i).ad); lua_rawseti(L, -2, i + 1); } return 1; } int MakroMotor::l_uiSimgeYukle(lua_State* L) { const char* ad = luaL_checkstring(L, 1); const char* yol = luaL_checkstring(L, 2); const int boyut = (int)luaL_optinteger(L, 3, 0); lua_pushboolean(L, ui::kitaplik::yukle(ad, yol, boyut) != 0); return 1; } int MakroMotor::l_uiVurgu(lua_State* L) { MakroMotor* m = kendisi(L); ui::Tema t = ui::tema(); t.vurgu.x = (float)luaL_checknumber(L, 1); t.vurgu.y = (float)luaL_checknumber(L, 2); t.vurgu.z = (float)luaL_checknumber(L, 3); ui::temaUygula(t); m->cekirdek_.olaylar().yayinla(TemaDegisti{}, t.ad); lua_pushboolean(L, 1); return 1; } // fiko.belge.kaydet(yol) — .fikocad olarak DİYALOGSUZ kaydet (otomasyon/MCP). int MakroMotor::l_belgeKaydet(lua_State* L) { MakroMotor* m = kendisi(L); const char* yol = luaL_checkstring(L, 1); if (!m->belgeIoCb_ || !yol || !*yol) { lua_pushnil(L); return 1; } m->belgeIoCb_("kaydet", yol); lua_pushboolean(L, 1); return 1; } // fiko.belge.ac(yol) — dosyayı aç (.fikocad/.stp/.step/.FikoApt/.FikoOp/.wrl). // Uzantıya göre içe aktarıcı seçimi + LİSANS kapısı uygulama katmanındadır. int MakroMotor::l_belgeAc(lua_State* L) { MakroMotor* m = kendisi(L); const char* yol = luaL_checkstring(L, 1); if (!m->belgeIoCb_ || !yol || !*yol) { lua_pushnil(L); return 1; } m->belgeIoCb_("ac", yol); lua_pushboolean(L, 1); return 1; } // fiko.perf.metrik() → {fps, kareMs, cpu, ramMB, gpu, vramMB} · köprü yoksa nil. // Yapay zeka/makro kendi değişikliğinin ETKİSİNİ ölçebilsin diye açıldı: "ölç, sonra // dokun" ilkesinin makro tarafındaki karşılığı. int MakroMotor::l_perfMetrik(lua_State* L) { MakroMotor* m = kendisi(L); MakroMotor::PerfOlcum o; if (!m->perfCb_ || !m->perfCb_(o)) { lua_pushnil(L); return 1; } lua_createtable(L, 0, 6); lua_pushnumber(L, o.fps); lua_setfield(L, -2, "fps"); lua_pushnumber(L, o.kareMs); lua_setfield(L, -2, "kareMs"); lua_pushnumber(L, o.cpuYuzde); lua_setfield(L, -2, "cpu"); lua_pushnumber(L, o.ramMB); lua_setfield(L, -2, "ramMB"); lua_pushnumber(L, o.gpuYuzde); lua_setfield(L, -2, "gpu"); lua_pushnumber(L, o.vramMB); lua_setfield(L, -2, "vramMB"); return 1; } // fiko.gorev.liste() → { {kimlik, baslik, oran, durum, mesaj}, ... } // Arka plan işleri (belge kaydet/aç, STEP içe aktar, ağır recompute...). MCP/makro // tarafı "iş bitti mi" diye SORABİLSİN diye açıldı: `fiko.belge.kaydet` gibi çağrılar // KUYRUĞA girer ve HEMEN döner — dönüş süresi işin süresi DEĞİLDİR (ölçüldü 07-21). // durum: 0=bekliyor 1=koşuyor 2=bitti 3=hata 4=iptal (GorevDurum sırası). int MakroMotor::l_gorevListe(lua_State* L) { MakroMotor* m = kendisi(L); const auto isler = m->cekirdek_.gorevler().anlik(); lua_createtable(L, (int)isler.size(), 0); int i = 1; for (const GorevGorunum& g : isler) { lua_createtable(L, 0, 5); lua_pushinteger(L, (lua_Integer)g.kimlik); lua_setfield(L, -2, "kimlik"); lua_pushstring(L, g.baslik.c_str()); lua_setfield(L, -2, "baslik"); lua_pushnumber(L, g.oran); lua_setfield(L, -2, "oran"); lua_pushinteger(L, (int)g.durum); lua_setfield(L, -2, "durum"); lua_pushstring(L, g.mesaj.c_str()); lua_setfield(L, -2, "mesaj"); lua_rawseti(L, -2, i++); } return 1; } // fiko.gorev.mesgul() → arka planda süren iş sayısı (0 = her şey bitti). int MakroMotor::l_gorevMesgul(lua_State* L) { MakroMotor* m = kendisi(L); lua_pushinteger(L, (lua_Integer)m->cekirdek_.gorevler().adet()); return 1; } } // namespace fiko::betik