#pragma once // ── Mekanizma ⇄ .fikocad (KNMT) çevirisi — UYGULAMA katmanı ───────────────── // `motor/io` bilerek `motor/kinematik`e BAĞLI DEĞİL (saf format çekirdeği ilkesi): // io yalnız POD ayna (FikoUzuv/FikoMafsal/FikoYasa) taşır, çeviri BURADA yapılır. // // KRİTİK: `Uzuv.sahne` bir sahne düğümü Varlik'idir ve YÜKLEMEDE DEĞİŞİR // (belgeUygula yeni kimlikler üretir) → uygulamada `dugumHarita` ile REMAP edilmeli, // yoksa mekanizma yanlış (ya da silinmiş) düğümleri sürer. #include #include #include "fiko/io/fiko_format.hpp" #include "fiko/kinematik/mekanizma.hpp" namespace fiko { // Mekanizma → .fikocad POD'ları (kaydetme yolu). inline void mekanizmaCikar(const kinematik::Mekanizma& mek, io::FikoBelge& belge) { belge.uzuvlar.clear(); belge.mafsallar.clear(); belge.yasalar.clear(); for (const kinematik::Uzuv& u : mek.uzuvlar()) { io::FikoUzuv fu; fu.ad = u.ad; fu.sahne = u.sahne; fu.tabanKonum[0] = u.taban.konum.x; fu.tabanKonum[1] = u.taban.konum.y; fu.tabanKonum[2] = u.taban.konum.z; fu.tabanYon[0] = u.taban.yonelim.x; fu.tabanYon[1] = u.taban.yonelim.y; fu.tabanYon[2] = u.taban.yonelim.z; fu.tabanYon[3] = u.taban.yonelim.w; fu.tabanOlcek[0] = u.taban.olcek.x; fu.tabanOlcek[1] = u.taban.olcek.y; fu.tabanOlcek[2] = u.taban.olcek.z; belge.uzuvlar.push_back(std::move(fu)); } for (const kinematik::Mafsal& m : mek.mafsallar()) { io::FikoMafsal fm; fm.ad = m.ad; fm.tip = (u8)m.tip; fm.ana = (u32)m.ana; fm.cocuk = (u32)m.cocuk; fm.capaKonum[0] = m.capa.konum.x; fm.capaKonum[1] = m.capa.konum.y; fm.capaKonum[2] = m.capa.konum.z; fm.capaYon[0] = m.capa.yonelim.x; fm.capaYon[1] = m.capa.yonelim.y; fm.capaYon[2] = m.capa.yonelim.z; fm.capaYon[3] = m.capa.yonelim.w; fm.capaCocukKonum[0] = m.capaCocuk.konum.x; fm.capaCocukKonum[1] = m.capaCocuk.konum.y; fm.capaCocukKonum[2] = m.capaCocuk.konum.z; fm.capaCocukYon[0] = m.capaCocuk.yonelim.x; fm.capaCocukYon[1] = m.capaCocuk.yonelim.y; fm.capaCocukYon[2] = m.capaCocuk.yonelim.z; fm.capaCocukYon[3] = m.capaCocuk.yonelim.w; fm.q = m.q; fm.q2 = m.q2; fm.q3 = m.q3; fm.vidaAdim = m.vidaAdim; fm.altSinir = m.altSinir; fm.ustSinir = m.ustSinir; belge.mafsallar.push_back(std::move(fm)); } for (const kinematik::MafsalYasa& y : mek.yasalar()) { io::FikoYasa fy; fy.mafsal = (u32)y.mafsal; fy.tip = (u8)y.tip; fy.degisken = y.degisken; fy.deger = y.deger; fy.hiz = y.hiz; fy.genlik = y.genlik; fy.periyot = y.periyot; fy.faz = y.faz; fy.anahtarlar = y.anahtarlar; belge.yasalar.push_back(std::move(fy)); } } // .fikocad POD'ları → Mekanizma (yükleme yolu). `dugumHarita` eski→yeni Varlik // eşlemesi; boş verilirse kimlikler AYNEN alınır (test/tek-belge yolu). inline void mekanizmaUygula(kinematik::Mekanizma& mek, const std::vector& uzuvlar, const std::vector& mafsallar, const std::vector& yasalar, const std::unordered_map& dugumHarita = {}) { mek = kinematik::Mekanizma{}; const auto yeniKimlik = [&](u32 eski) -> u32 { if (!eski || dugumHarita.empty()) return eski; const auto it = dugumHarita.find(eski); return it != dugumHarita.end() ? it->second : 0; // eşleşmeyen düğüm → bağsız uzuv }; for (const io::FikoUzuv& fu : uzuvlar) { Donusumd t; t.konum = {fu.tabanKonum[0], fu.tabanKonum[1], fu.tabanKonum[2]}; t.yonelim = {fu.tabanYon[0], fu.tabanYon[1], fu.tabanYon[2], fu.tabanYon[3]}; t.olcek = {fu.tabanOlcek[0], fu.tabanOlcek[1], fu.tabanOlcek[2]}; mek.uzuvEkle(fu.ad, yeniKimlik(fu.sahne), t); } for (const io::FikoMafsal& fm : mafsallar) { kinematik::Mafsal m; m.ad = fm.ad; m.tip = (kinematik::MafsalTip)fm.tip; m.ana = fm.ana; m.cocuk = fm.cocuk; m.capa.konum = {fm.capaKonum[0], fm.capaKonum[1], fm.capaKonum[2]}; m.capa.yonelim = {fm.capaYon[0], fm.capaYon[1], fm.capaYon[2], fm.capaYon[3]}; m.capaCocuk.konum = {fm.capaCocukKonum[0], fm.capaCocukKonum[1], fm.capaCocukKonum[2]}; m.capaCocuk.yonelim = {fm.capaCocukYon[0], fm.capaCocukYon[1], fm.capaCocukYon[2], fm.capaCocukYon[3]}; m.q = fm.q; m.q2 = fm.q2; m.q3 = fm.q3; m.vidaAdim = fm.vidaAdim; m.altSinir = fm.altSinir; m.ustSinir = fm.ustSinir; mek.mafsalEkle(std::move(m)); } for (const io::FikoYasa& fy : yasalar) { kinematik::MafsalYasa y; y.mafsal = fy.mafsal; y.tip = (kinematik::YasaTip)fy.tip; y.degisken = fy.degisken; y.deger = fy.deger; y.hiz = fy.hiz; y.genlik = fy.genlik; y.periyot = fy.periyot; y.faz = fy.faz; y.anahtarlar = fy.anahtarlar; mek.yasaEkle(std::move(y)); } } } // namespace fiko