#include "kinematik_agac.hpp" #include #include #include "fiko/kinematik/mekanizma.hpp" namespace fiko { void kinematikAgacTopla(Cekirdek&, kinematik::Mekanizma& mek, std::vector& kok) { const std::vector& uzuvlar = mek.uzuvlar(); const std::vector& mafsallar = mek.mafsallar(); // GÖVDE uzvunu MEKANİZMA DEĞİL, ÇAĞIRAN ekler (`fiko.kinematik.sifirla`) → varsayılan // kurulmuş bir mekanizmada indeks 0 GERÇEK bir parça olabilir. Ölçüldü 07-21: körlemesine // "0'ı atla" ilk parçayı ağaçtan siliyordu. Ölçüt: sahne bağı OLMAYAN 0. uzuv = gövde. const bool govdeVar = !uzuvlar.empty() && uzuvlar[0].sahne == 0; const std::size_t ilkUzuv = govdeVar ? 1u : 0u; if (uzuvlar.size() <= ilkUzuv && mafsallar.empty()) return; // yalnız GÖVDE → dal görünmez AgacDugum grup; grup.etiket = "Mekanizma (DOF " + std::to_string(mek.serbestlikDerecesi()) + ")"; grup.simge = "⚙"; grup.arketip = Arketip::Grup; AgacDugum gUzuv; gUzuv.etiket = "Uzuvlar"; gUzuv.simge = "🔧"; gUzuv.arketip = Arketip::Grup; for (std::size_t i = ilkUzuv; i < uzuvlar.size(); ++i) { AgacDugum n; n.etiket = uzuvlar[i].ad.empty() ? ("Uzuv." + std::to_string(i)) : uzuvlar[i].ad; n.simge = "🔩"; // Sahne düğümüne bağlı uzuv GERÇEK varlıktır → ağaçtan seçim sahnede parçayı seçer. // Bağsız uzuv (sahne=0) sanal düğüm kalır; camKimlik disambiguator olur. if (uzuvlar[i].sahne != 0) n.varlik = (Varlik)uzuvlar[i].sahne; n.camKimlik = (u32)i; gUzuv.cocuklar.push_back(std::move(n)); } if (!gUzuv.cocuklar.empty()) grup.cocuklar.push_back(std::move(gUzuv)); AgacDugum gMafsal; gMafsal.etiket = "Mafsallar"; gMafsal.simge = "🔗"; gMafsal.arketip = Arketip::Grup; const auto uzuvAdi = [&uzuvlar, govdeVar](std::size_t i) -> std::string { if (i == 0 && govdeVar) return "Gövde"; return (i < uzuvlar.size() && !uzuvlar[i].ad.empty()) ? uzuvlar[i].ad : ("Uzuv." + std::to_string(i)); }; for (std::size_t i = 0; i < mafsallar.size(); ++i) { const kinematik::Mafsal& mf = mafsallar[i]; AgacDugum n; n.etiket = (mf.ad.empty() ? std::string(kinematik::mafsalTipAdi(mf.tip)) : mf.ad) + " " + uzuvAdi(mf.ana) + " → " + uzuvAdi(mf.cocuk); n.simge = "🔗"; n.camKimlik = (u32)(i + 1); // 0 = "yok" ile karışmasın gMafsal.cocuklar.push_back(std::move(n)); } if (!gMafsal.cocuklar.empty()) grup.cocuklar.push_back(std::move(gMafsal)); kok.push_back(std::move(grup)); } } // namespace fiko