#pragma once // FikoPost — FikatiaV2024/FikoPost Python modulunun saf-mantik C++ portu. // COM/CATIA bagimliligi yok: Python'da CATIA'dan (anaProgram/processDokuman) // beslenen girdiler duz veri struct'lari olarak modellendi. Dosya calistirma / // FTP gibi yan etkiler "plan/komut uret" fonksiyonlarina indirgendi; komutu // calistirmak cagirana kalir (Python IFikoPost da dis programa delege ediyordu). // // .fikoDB / .fikodb / .fikoPostVT dosyalari SQLite3 formatidir. fikodb alt // modulu bu formati Python sqlite3 ciktisiyla GERIYE UYUMLU okur/yazar // (alan eklenebilir; silme/yeniden adlandirma yok). #include #include #include #include #include #include namespace fikatia::post { // ---------------------------------------------------------------- fikodb ---- namespace fikodb { struct Deger { enum class Tip { Bos, Tam, Gercek, Metin, Ikili }; Tip tip = Tip::Bos; std::int64_t tam = 0; double gercek = 0.0; std::string metin; std::vector ikili; static Deger bos(); static Deger tamYap(std::int64_t v); static Deger gercekYap(double v); static Deger metinYap(std::string v); static Deger ikiliYap(std::vector v); bool bosMu() const { return tip == Tip::Bos; } std::int64_t tamDeger() const; std::string metinDeger() const; bool operator==(const Deger& o) const; }; struct Satir { std::int64_t rowid = 0; std::vector degerler; }; struct Tablo { std::string isim; std::string sql; // CREATE TABLE metni birebir saklanir (sema geriye uyumu) std::vector kolonlar; int ipkKolon = -1; // INTEGER PRIMARY KEY kolonu = rowid takma adi std::vector satirlar; int kolonIndeksi(std::string_view ad) const; const Deger* deger(const Satir& s, std::string_view kolon) const; }; struct VeriTabani { std::vector tablolar; Tablo* tablo(std::string_view isim); const Tablo* tablo(std::string_view isim) const; Tablo& tabloEkle(std::string isim, std::string sql); // rowid atar; sema AUTOINCREMENT iceriyorsa sqlite_sequence'i gunceller. std::int64_t ekle(Tablo& t, std::vector degerler); }; // CREATE TABLE metninden kolon adlarini ayiklar (ipkKolon istege bagli cikti). std::vector kolonAyikla(std::string_view createSql, int* ipkKolon); VeriTabani coz(const std::uint8_t* veri, std::size_t boyut); // hata: runtime_error VeriTabani dosyadanCoz(const std::string& yol); std::vector yaz(const VeriTabani& vt); void dosyayaYaz(const VeriTabani& vt, const std::string& yol); } // namespace fikodb // ------------------------------------------------------------ yardimcilar ---- // Python os.path.join (ntpath) esdegeri — komut dizgileri byte-uyumlu kalsin diye. std::string yolBirlestir(std::string_view a, std::string_view b); std::string tumunuDegistir(std::string metin, std::string_view eski, std::string_view yeni); // str(datetime.datetime) esdegeri: "YYYY-MM-DD HH:MM:SS[.ffffff]" std::string zamanMetni(const std::tm& t, long mikrosaniye); std::string simdiMetni(); // ------------------------------------------------- IFikoPostDosya portu ---- enum class FikoHedef { Klasor = 0, Program = 1, FTP = 2 }; struct FikoPostDosya { std::string klasoru; std::string dosya; double maksimum = 0.0; double minimum = 0.0; double mevcutIlerleme = 0.0; FikoHedef hedef = FikoHedef::Klasor; }; // ------------------------------------------------------- ITezgah portu ---- enum class TezgahKlasorDurumu { klasorYok = 0, aktifYontemYok = 1, tezgahProgramiYok = 2, tamam = 3, // Python None donuyordu }; enum class GonderimYolu { KlasoreKopyala = 0, ProgramlaGonder = 1, FtpYukle = 2 }; struct Tezgah { std::int64_t id = 0; std::string ismi; std::string kuralDosyasi; std::int64_t kureMerkezi = 0; std::string postUzantisi = "H"; std::optional postDuzenlemeProgrami; std::int64_t tezgahKlasoruAktif = 0; std::optional tezgahKlasoru; std::int64_t tezgahProgramiAktif = 0; std::optional tezgahProgrami; std::optional ncGondermeProgrami; std::optional tezgahTemizleProgrami; std::int64_t tezgahFtpAktif = 0; std::optional ftpSunucuAdresi; std::optional ftpPortNo; std::optional ftpKullaniciAdi; std::optional ftpSifresi; std::optional siraNo; bool operator==(const Tezgah& o) const; // ITezgah.guncellenmis: orijinal kayda gore alan degisti mi bool guncellenmis(const Tezgah& orijinal) const { return !(*this == orijinal); } // ITezgah.dosyaGonder'in karar mantigi: aktif bayraklara gore islem sirasi std::vector gonderimPlani() const; // ITezgah.tezgahAc'in karar mantigi (dosya sistemi sorgulari caller'dan) TezgahKlasorDurumu acilisKontrol(bool klasorVarMi, bool programVarMi) const; }; // ----------------------------------------------------- ITezgahlar portu ---- class Tezgahlar { public: static Tezgahlar veriden(const std::uint8_t* veri, std::size_t boyut); static Tezgahlar dosyadan(const std::string& yol); int sayisi() const { return static_cast(tumu_.size()); } const std::vector& tezgahlarTumu() const { return tumu_; } // siraNo sirali std::optional item(std::string_view ismi) const; std::string metin() const; // __str__: "['a', 'b']" private: std::vector tumu_; }; // ------------------------------------------------------ IFikoPost portu ---- // anaProgram.fikoSistem.ayarlar'dan gelen degerler (duz veri). struct PostAyarlari { std::string scriptYolu; std::string ncKuralDosyasiKlasoru; std::string ncCeviriciProgram; std::string ncCeviriciParametreler; std::string aptUzantisi = "aptsource"; bool ncCiktiKlasoruVarsayilan = true; // Python: ayar 0 ise apt'nin yanina std::string ncCiktiKlasoru; }; struct NcDonusumKomut { std::string komut; // cevirici program + parametreler (Python birebir) std::string ncDosyasi; // cift tirnakli haliyle (Python birebir) }; class FikoPost { public: FikoPost(std::string processKlasoru, std::string ismi, Tezgahlar tezgahlar); std::vector aptler; const Tezgahlar& tezgahlar() const { return tezgahlar_; } // Kalici tezgah secimi — /Fikomantasyon/Fikomantasyon.fikodb // (hareketler tablosu). Dosya yoksa yaratir ve ilk tezgahi secer. std::optional tezgah(); void tezgahSec(const std::string& ismi); // uretilenApteleriNcKodaCevir'in saf kismi: apt basina cevirici komutu. std::vector ncDonusumKomutlari(const PostAyarlari& a, const Tezgah& t) const; static std::optional postDuzenlemeKomutu(const PostAyarlari& a, const Tezgah& t, const std::string& sonNcDosyasi); static std::vector donusumSonrasiTemizlik(); // {"log","FikoApt_LOG","LOG"} private: std::string hareketlerYolu() const; std::string processKlasoru_; std::string ismi_; Tezgahlar tezgahlar_; }; // ----------------------------------------------------- IFikoDBNC portu ---- struct NcProgram { // IProgram'in kullanilan alanlari std::string ismi; std::string aciklama; std::string apt; // apt dosya yolu }; class FikoDBNC { public: FikoDBNC(std::string dbKlasoru, std::string processIsmi); const std::string& dbKlasoru() const { return dbKlasoru_; } void dbKlasoru(std::string v) { dbKlasoru_ = std::move(v); } static std::string dosyaIsmi(const std::string& processIsmi, const std::tm& t); void veriTabaniYarat(); void veriEkle(const std::optional& ismi, const std::optional& aciklama, const std::vector& kod, const std::optional& ekBilgiler); bool programEkle(const NcProgram& prg, const Tezgah& tezgah); // false: apt okunamadi const std::string& dosyaYolu() const { return dosyaYolu_; } static std::vector programSonrasiTemizlik(); // {"FikoApt","log","FikoApt_LOG","LOG"} private: std::string dbKlasoru_; std::string processIsmi_; std::string dosyaYolu_; fikodb::VeriTabani vt_; bool acik_ = false; }; // ------------------------------------------------------------- APT / NC ---- // Python tarafinda APT→NC donusumu dis FikoPost.exe'ye (sifreli .Fikural kural // dosyalari) delege ediliyordu; port edilemedigi icin buradaki ayristirici + // uretici saf-mantik yeniden gerceklemedir (cikti bicimi ADE_1.NC ornegine gore). enum class AptTip { Partno, Pprint, Insert, Rapid, Goto, Fedrat, Spindl, Loadtl, Coolnt, End, Fini, Yorum, Diger, }; struct AptKomut { AptTip tip = AptTip::Diger; std::string kelime; // slash oncesi buyuk harf ("GOTO") std::string metin; // PARTNO/PPRINT/INSERT/yorum govdesi std::vector secenekler; // sayisal olmayan parametreler (buyuk harf) std::vector sayilar; // sayisal parametreler (sirali) }; AptKomut aptSatirAyristir(std::string_view satir); // "$" satir devamini birlestirir, "$$" yorumlarini Yorum olarak isaretler. std::vector aptAyristir(std::string_view icerik); struct NcBicim { std::string satirSonu = "\r\n"; // ADE_1.NC birebir CRLF std::string baslik = "G90 G17 G80 G94 G54 G49 G40 G98"; std::string islemciNotu = "FIKO SYNTEC PROCESSOR"; int koordinatHane = 3; }; class NcUretici { public: explicit NcUretici(NcBicim bicim = {}) : bicim_(std::move(bicim)) {} std::string uret(const std::vector& komutlar); private: NcBicim bicim_; }; } // namespace fikatia::post