// fiko.cam.* — CAM sistemi makro erişimi (undo/redo uyumlu Islem yolu). // MakroMotor'un l_cam* static üyeleri burada tanımlanır (davranış değişikliği SIFIR). #include "fiko/betik/makro_motor.hpp" #include #include #include "fiko/cam/cam_islemleri.hpp" #include "fiko/cam/cam_secim.hpp" #include "fiko/cam/cam_sistemi.hpp" #include "fiko/cekirdek/cekirdek.hpp" #include "makro_ic.hpp" extern "C" { #include "lauxlib.h" #include "lua.h" } namespace fiko::betik { using makroic::alanYaz; namespace { bool camTip(const char* s, cam::CamIslemTip& t) { if (std::strcmp(s, "profil") == 0) t = cam::CamIslemTip::Profil; else if (std::strcmp(s, "cep") == 0) t = cam::CamIslemTip::Cep; else if (std::strcmp(s, "delik") == 0) t = cam::CamIslemTip::Delik; else if (std::strcmp(s, "kaba3d") == 0) t = cam::CamIslemTip::Kaba3D; else if (std::strcmp(s, "finis3d") == 0) t = cam::CamIslemTip::Finis3D; else return false; return true; } } // namespace // fiko.cam.islemEkle("profil"|"cep"|"delik"|"kaba3d"|"finis3d") -> kimlik | nil int MakroMotor::l_camIslemEkle(lua_State* L) { MakroMotor* m = kendisi(L); cam::CamIslemTip tip; if (!m->cam_ || !camTip(luaL_checkstring(L, 1), tip)) { lua_pushnil(L); return 1; } m->cekirdek_.uygula(std::make_unique(*m->cam_, tip)); lua_pushinteger(L, m->cam_->seciliKimlik); return 1; } // fiko.cam.islemSil(kimlik) -> bool int MakroMotor::l_camIslemSil(lua_State* L) { MakroMotor* m = kendisi(L); const u32 kimlik = (u32)luaL_checkinteger(L, 1); if (!m->cam_ || !m->cam_->bul(kimlik)) { lua_pushboolean(L, 0); return 1; } m->cekirdek_.uygula(std::make_unique(*m->cam_, kimlik)); lua_pushboolean(L, 1); return 1; } // fiko.cam.islemler() -> { {kimlik, ad, tip, kirli, hamle}, ... } int MakroMotor::l_camIslemler(lua_State* L) { MakroMotor* m = kendisi(L); if (!m->cam_) { lua_newtable(L); return 1; } const auto& liste = m->cam_->hepsi(); lua_createtable(L, (int)liste.size(), 0); int i = 1; for (const cam::CamIslem& op : liste) { lua_createtable(L, 0, 5); alanYaz(L, "kimlik", (lua_Integer)op.kimlik); lua_pushlstring(L, op.ad.c_str(), op.ad.size()); lua_setfield(L, -2, "ad"); lua_pushstring(L, cam::islemTipAdi(op.tip)); lua_setfield(L, -2, "tip"); lua_pushboolean(L, op.kirli ? 1 : 0); lua_setfield(L, -2, "kirli"); alanYaz(L, "hamle", (lua_Integer)op.yol.hamleler.size()); lua_rawseti(L, -2, i++); } return 1; } // fiko.cam.geometriAta(kimlik) -> bool (aktif 3D secimden hedef geometri baglar) int MakroMotor::l_camGeometriAta(lua_State* L) { MakroMotor* m = kendisi(L); cam::CamIslem* op = m->cam_ ? m->cam_->bul((u32)luaL_checkinteger(L, 1)) : nullptr; if (!op) { lua_pushboolean(L, 0); return 1; } m->cam_->geometridenAta(*op); lua_pushboolean(L, op->hata.empty() ? 1 : 0); return 1; } // fiko.cam.hesapla(kimlik) -> bool (arka planda; CamYoluHesaplandi olayini dinle) int MakroMotor::l_camHesapla(lua_State* L) { MakroMotor* m = kendisi(L); if (!m->cam_) { lua_pushboolean(L, 0); return 1; } lua_pushboolean(L, m->cam_->hesapla((u32)luaL_checkinteger(L, 1)) ? 1 : 0); return 1; } // fiko.cam.gkodYaz(yol) -> bool int MakroMotor::l_camGkodYaz(lua_State* L) { MakroMotor* m = kendisi(L); if (!m->cam_) { lua_pushboolean(L, 0); return 1; } lua_pushboolean(L, m->cam_->gkodYaz(luaL_checkstring(L, 1)) ? 1 : 0); return 1; } // fiko.cam.aptYaz(opId, yol) -> bool (operasyon takim yolunu .FikoApt yazar) int MakroMotor::l_camAptYaz(lua_State* L) { MakroMotor* m = kendisi(L); if (!m->cam_) { lua_pushboolean(L, 0); return 1; } const u32 kimlik = (u32)luaL_checkinteger(L, 1); const char* yol = luaL_checkstring(L, 2); lua_pushboolean(L, m->cam_->aptDisariAktar(kimlik, yol) ? 1 : 0); return 1; } // fiko.cam.takimlar() -> { {numara, ad, cap, agiz}, ... } int MakroMotor::l_camTakimlar(lua_State* L) { MakroMotor* m = kendisi(L); if (!m->cam_) { lua_newtable(L); return 1; } const auto& liste = m->cam_->takimlar(); lua_createtable(L, (int)liste.size(), 0); int i = 1; for (const cam::Takim& t : liste) { lua_createtable(L, 0, 4); alanYaz(L, "numara", t.numara); lua_pushlstring(L, t.ad.c_str(), t.ad.size()); lua_setfield(L, -2, "ad"); lua_pushnumber(L, t.cap); lua_setfield(L, -2, "cap"); alanYaz(L, "agiz", t.agizSayisi); lua_rawseti(L, -2, i++); } return 1; } // ---- CATIA-tarzi operasyon + parca operasyonu makro erisimi (FAZ 1.1) ---- namespace { // String → CamIslemTipCatia (web tip anahtarlariyla ayni; nil ise false). bool camTipCatia(const char* s, cam::CamIslemTipCatia& t) { using T = cam::CamIslemTipCatia; struct E { const char* s; T t; }; static const E harita[] = { {"facing", T::Facing}, {"pocketing", T::Pocketing}, {"contouring", T::Contouring}, {"curveFollow", T::CurveFollow}, {"pointToPoint", T::PointToPoint}, {"circularMill", T::CircularMill}, {"spotDrill", T::SpotDrill}, {"drilling", T::Drilling}, {"deepHole", T::DeepHole}, {"breakChips", T::BreakChips}, {"tapping", T::Tapping}, {"reverseTap", T::ReverseTap}, {"threadNoTap", T::ThreadNoTap}, {"boring", T::Boring}, {"boringChamfer", T::BoringChamfer}, {"boringStop", T::BoringStop}, {"reaming", T::Reaming}, {"counterBore", T::CounterBore}, {"counterSink", T::CounterSink}, {"chamfer2", T::Chamfer2}, {"backBore", T::BackBore}, {"tslotting", T::TSlotting}, {"threadMilling", T::ThreadMilling}}; for (const E& e : harita) if (std::strcmp(s, e.s) == 0) { t = e.t; return true; } return false; } } // namespace // fiko.cam.opEkle("pocketing"|"drilling"|...) -> kimlik | nil int MakroMotor::l_camOpEkle(lua_State* L) { MakroMotor* m = kendisi(L); cam::CamIslemTipCatia tip; if (!m->cam_ || !camTipCatia(luaL_checkstring(L, 1), tip)) { lua_pushnil(L); return 1; } lua_pushinteger(L, (lua_Integer)m->cam_->opEkle(tip)); return 1; } // fiko.cam.opSil(kimlik) -> bool int MakroMotor::l_camOpSil(lua_State* L) { MakroMotor* m = kendisi(L); const u32 kimlik = (u32)luaL_checkinteger(L, 1); lua_pushboolean(L, (m->cam_ && m->cam_->opSil(kimlik)) ? 1 : 0); return 1; } // fiko.cam.opHesapla(kimlik) -> bool (arka planda; CamOpYoluHesaplandi olayini dinle) int MakroMotor::l_camOpHesapla(lua_State* L) { MakroMotor* m = kendisi(L); if (!m->cam_) { lua_pushboolean(L, 0); return 1; } lua_pushboolean(L, m->cam_->opHesapla((u32)luaL_checkinteger(L, 1)) ? 1 : 0); return 1; } // fiko.cam.oplar() -> { {kimlik, ad, tip, takimId}, ... } int MakroMotor::l_camOplar(lua_State* L) { MakroMotor* m = kendisi(L); if (!m->cam_) { lua_newtable(L); return 1; } const auto& liste = m->cam_->operasyonlar(); lua_createtable(L, (int)liste.size(), 0); int i = 1; for (const cam::CamOperasyon& op : liste) { lua_createtable(L, 0, 4); alanYaz(L, "kimlik", (lua_Integer)op.kimlik); lua_pushlstring(L, op.ad.c_str(), op.ad.size()); lua_setfield(L, -2, "ad"); lua_pushstring(L, cam::islemTipCatiaAdi(op.tip)); lua_setfield(L, -2, "tip"); alanYaz(L, "takimId", (lua_Integer)op.takimId); lua_rawseti(L, -2, i++); } return 1; } // fiko.cam.parcaOpEkle() -> kimlik int MakroMotor::l_camParcaOpEkle(lua_State* L) { MakroMotor* m = kendisi(L); if (!m->cam_) { lua_pushnil(L); return 1; } lua_pushinteger(L, (lua_Integer)m->cam_->parcaOpEkle()); return 1; } // fiko.cam.parcaOplar() -> { {kimlik, ad, kontrolcu, kinematik}, ... } int MakroMotor::l_camParcaOplar(lua_State* L) { MakroMotor* m = kendisi(L); if (!m->cam_) { lua_newtable(L); return 1; } const auto& liste = m->cam_->parcaOperasyonlari(); lua_createtable(L, (int)liste.size(), 0); int i = 1; for (const cam::PartOperasyon& pop : liste) { lua_createtable(L, 0, 4); alanYaz(L, "kimlik", (lua_Integer)pop.kimlik); lua_pushlstring(L, pop.ad.c_str(), pop.ad.size()); lua_setfield(L, -2, "ad"); lua_pushstring(L, cam::kontrolcuAdi(pop.kontrolcu)); lua_setfield(L, -2, "kontrolcu"); lua_pushstring(L, cam::makineKinematikAdi(pop.kinematik)); lua_setfield(L, -2, "kinematik"); lua_rawseti(L, -2, i++); } return 1; } namespace { bool camSecimKip(const char* s, cam::CamSecimKip& k) { if (std::strcmp(s, "kontur") == 0) k = cam::CamSecimKip::Kontur; else if (std::strcmp(s, "ada") == 0) k = cam::CamSecimKip::Ada; else if (std::strcmp(s, "nokta") == 0) k = cam::CamSecimKip::Nokta; else if (std::strcmp(s, "kenar") == 0) k = cam::CamSecimKip::Kenar; else if (std::strcmp(s, "ustz") == 0) k = cam::CamSecimKip::DuzlemUst; else if (std::strcmp(s, "altz") == 0) k = cam::CamSecimKip::DuzlemAlt; else if (std::strcmp(s, "toolaxis") == 0) k = cam::CamSecimKip::ToolAxis; else return false; return true; } } // namespace // fiko.cam.secimBaslat(opId, "kontur"|"ada"|"nokta"|"kenar"|"ustz"|"altz"|"toolaxis") -> bool int MakroMotor::l_camSecimBaslat(lua_State* L) { MakroMotor* m = kendisi(L); const u32 kimlik = (u32)luaL_checkinteger(L, 1); cam::CamSecimKip kip; cam::CamOperasyon* op = m->cam_ ? m->cam_->opBul(kimlik) : nullptr; if (!op || !camSecimKip(luaL_checkstring(L, 2), kip)) { lua_pushboolean(L, 0); return 1; } m->cam_->secim().baslat(*op, kip, [] {}); lua_pushboolean(L, 1); return 1; } // fiko.cam.secimBitir() -> nil int MakroMotor::l_camSecimBitir(lua_State* L) { MakroMotor* m = kendisi(L); if (m->cam_) m->cam_->secim().bitir(); return 0; } // fiko.cam.takimEkseniPencere(opId) -> bool (op'un Tool Axis triad penceresini acar) int MakroMotor::l_camTakimEkseniPencere(lua_State* L) { MakroMotor* m = kendisi(L); const u32 kimlik = (u32)luaL_checkinteger(L, 1); const bool var = m->cam_ && m->cam_->opBul(kimlik); if (var && m->pencereAcCb_) m->pencereAcCb_("takimEkseni", kimlik); lua_pushboolean(L, var && (bool)m->pencereAcCb_); return 1; } } // namespace fiko::betik