// Mekanizma ⇄ .fikocad POD çevirisi (kinematik_io.hpp) — SAF app-katmanı testleri. // Kaydet/aç yolunun doğruluğu buna bağlı: çeviri bozuksa mekanizma sessizce kaybolur // ya da YANLIŞ düğümleri sürer (uzuv.sahne yüklemede DEĞİŞEN bir Varlik'tir). #include #include #include "fiko_test.hpp" #include "kinematik_io.hpp" using namespace fiko; using namespace fiko::kinematik; namespace { Mekanizma ornekMekanizma() { Mekanizma m; m.uzuvEkle("Gövde"); Donusumd t; t.konum = {1.5, -2.0, 3.25}; t.yonelim = Quatd::eksenAci({0, 0, 1}, 0.5); const auto kol = m.uzuvEkle("Kol", 101, t); const auto slayt = m.uzuvEkle("Slayt", 202); Mafsal d; d.ad = "M1"; d.tip = MafsalTip::Doner; d.ana = 0; d.cocuk = kol; d.capa.konum = {60, 0, 0}; d.capaCocuk.konum = {12.5, 0, -4}; // çift taraflı çapa (montaj mate) d.q = 0.75; d.altSinir = -1.5; d.ustSinir = 1.5; m.mafsalEkle(d); Mafsal k; k.tip = MafsalTip::Vida; k.ana = kol; k.cocuk = slayt; k.q = 2.0; k.q2 = -1.0; k.q3 = 0.5; k.vidaAdim = 4.25; m.mafsalEkle(k); MafsalYasa y; y.mafsal = 1; y.tip = YasaTip::AnahtarKare; y.degisken = 2; y.anahtarlar = {{0.0, 0.0}, {2.0, 40.0}, {4.0, 0.0}}; m.yasaEkle(y); return m; } } // namespace FIKO_TEST(kinematik_io_gidis_donus) { const Mekanizma ilk = ornekMekanizma(); io::FikoBelge belge; mekanizmaCikar(ilk, belge); FIKO_KONTROL(belge.uzuvlar.size() == 3); FIKO_KONTROL(belge.mafsallar.size() == 2); FIKO_KONTROL(belge.yasalar.size() == 1); Mekanizma geri; mekanizmaUygula(geri, belge.uzuvlar, belge.mafsallar, belge.yasalar); FIKO_KONTROL(geri.uzuvlar().size() == 3); FIKO_KONTROL(geri.uzuvlar()[1].ad == "Kol"); FIKO_KONTROL(geri.uzuvlar()[1].sahne == 101); FIKO_YAKIN(geri.uzuvlar()[1].taban.konum.x, 1.5, 1e-12); FIKO_YAKIN(geri.uzuvlar()[1].taban.konum.z, 3.25, 1e-12); FIKO_YAKIN(geri.uzuvlar()[1].taban.olcek.x, 1.0, 1e-12); FIKO_KONTROL(geri.mafsallar().size() == 2); FIKO_KONTROL(geri.mafsallar()[0].tip == MafsalTip::Doner); FIKO_KONTROL(geri.mafsallar()[0].ad == "M1"); FIKO_YAKIN(geri.mafsallar()[0].capa.konum.x, 60.0, 1e-12); FIKO_YAKIN(geri.mafsallar()[0].capaCocuk.konum.x, 12.5, 1e-12); FIKO_YAKIN(geri.mafsallar()[0].capaCocuk.konum.z, -4.0, 1e-12); FIKO_YAKIN(geri.mafsallar()[0].q, 0.75, 1e-12); FIKO_KONTROL(geri.mafsallar()[0].sinirVar()); FIKO_KONTROL(geri.mafsallar()[1].tip == MafsalTip::Vida); FIKO_YAKIN(geri.mafsallar()[1].vidaAdim, 4.25, 1e-12); FIKO_YAKIN(geri.mafsallar()[1].q2, -1.0, 1e-12); FIKO_YAKIN(geri.mafsallar()[1].q3, 0.5, 1e-12); FIKO_KONTROL(geri.yasalar().size() == 1); FIKO_KONTROL(geri.yasalar()[0].tip == YasaTip::AnahtarKare); FIKO_KONTROL(geri.yasalar()[0].degisken == 2); FIKO_KONTROL(geri.yasalar()[0].anahtarlar.size() == 3); FIKO_YAKIN(geri.yasalar()[0].anahtarlar[1].second, 40.0, 1e-12); // Davranış korunuyor mu: aynı DOF + aynı ileri kinematik sonucu. FIKO_KONTROL(geri.serbestlikDerecesi() == ilk.serbestlikDerecesi()); const auto a = const_cast(ilk).ileriKinematik(); const auto b = geri.ileriKinematik(); FIKO_KONTROL(a.size() == b.size()); for (std::size_t i = 0; i < a.size(); ++i) { FIKO_YAKIN(a[i].konum.x, b[i].konum.x, 1e-12); FIKO_YAKIN(a[i].konum.y, b[i].konum.y, 1e-12); FIKO_YAKIN(a[i].konum.z, b[i].konum.z, 1e-12); } } FIKO_TEST(kinematik_io_dugum_remap) { // YÜKLEMEDE düğüm Varlik'leri DEĞİŞİR → uzuv.sahne remap edilmeli. const Mekanizma ilk = ornekMekanizma(); io::FikoBelge belge; mekanizmaCikar(ilk, belge); const std::unordered_map harita{{101, 900}, {202, 901}}; Mekanizma geri; mekanizmaUygula(geri, belge.uzuvlar, belge.mafsallar, belge.yasalar, harita); FIKO_KONTROL(geri.uzuvlar()[0].sahne == 0); // gövde bağsızdı, öyle kaldı FIKO_KONTROL(geri.uzuvlar()[1].sahne == 900); // 101 → 900 FIKO_KONTROL(geri.uzuvlar()[2].sahne == 901); // 202 → 901 } FIKO_TEST(kinematik_io_eslesmeyen_dugum_bagsiz_kalir) { // Silinmiş/eşleşmeyen düğüm: uzuv YANLIŞ bir düğümü sürmemeli → bağsız (0) olmalı. const Mekanizma ilk = ornekMekanizma(); io::FikoBelge belge; mekanizmaCikar(ilk, belge); const std::unordered_map eksik{{101, 900}}; // 202 haritada YOK Mekanizma geri; mekanizmaUygula(geri, belge.uzuvlar, belge.mafsallar, belge.yasalar, eksik); FIKO_KONTROL(geri.uzuvlar()[1].sahne == 900); FIKO_KONTROL(geri.uzuvlar()[2].sahne == 0); // eşleşmedi → bağsız } FIKO_TEST(kinematik_io_bos_mekanizma) { const Mekanizma bos; io::FikoBelge belge; mekanizmaCikar(bos, belge); FIKO_KONTROL(belge.uzuvlar.empty() && belge.mafsallar.empty() && belge.yasalar.empty()); Mekanizma geri = ornekMekanizma(); // dolu mekanizma mekanizmaUygula(geri, {}, {}, {}); // boş yükleme → TAMAMEN temizlenmeli FIKO_KONTROL(geri.uzuvlar().empty()); FIKO_KONTROL(geri.mafsallar().empty()); FIKO_KONTROL(geri.yasalar().empty()); }