// Geometriden mafsal önerisi (mafsal_oneri.hpp) — SAF app-katmanı testleri. // "Kısıttan otomatik joint": montaj kısıtı yok, GEOMETRİDEN çıkarılır. #include #include "fiko_test.hpp" #include "fiko/montaj/mafsal_oneri.hpp" using namespace fiko; using namespace fiko::geometri; namespace { // Z ekseni boyunca silindir, merkezi (x,y,0)'dan başlayarak. BrepGovde milZ(f64 r, f64 h, f64 x = 0, f64 y = 0) { BrepGovde g = silindir(r, h); Donusumd d; d.konum = {x, y, 0}; return donusumUygula(g, d); } } // namespace FIKO_TEST(mafsal_oneri_mil_delik_doner) { // Aynı eksende, aynı yarıçapta iki silindir → DÖNER mafsal önerilmeli. const BrepGovde mil = milZ(10, 40); const BrepGovde yatak = milZ(10, 20); const auto o = mafsalOner(mil, yatak); FIKO_KONTROL(!o.empty()); FIKO_KONTROL(o[0].tip == kinematik::MafsalTip::Doner); FIKO_YAKIN(o[0].yaricap, 10.0, 1e-6); FIKO_KONTROL(o[0].guven > 0.9); // birebir eşleşme FIKO_KONTROL(o[0].yuzA > 0 && o[0].yuzB > 0); // Çapa ekseni +Z olmalı: çapanın yönelimi Z'yi silindirin eksenine taşır. const Vec3d z = o[0].capaA.yonelim.dondur({0, 0, 1}); FIKO_KONTROL(std::fabs(std::fabs(z.z) - 1.0) < 1e-6); } FIKO_TEST(mafsal_oneri_yaricap_uyusmazsa_oneri_yok) { const BrepGovde mil = milZ(10, 40); const BrepGovde buyukYatak = milZ(14, 20); // 4 mm fark → tolerans dışı const auto o = mafsalOner(mil, buyukYatak); int donerSayi = 0; for (const auto& x : o) if (x.tip == kinematik::MafsalTip::Doner) ++donerSayi; FIKO_KONTROL(donerSayi == 0); // boş liste de olsa AÇIKÇA doğrula } FIKO_TEST(mafsal_oneri_eksen_kaymissa_oneri_yok) { const BrepGovde mil = milZ(10, 40); const BrepGovde kayik = milZ(10, 20, /*x*/ 25); // eksen 25 mm yanda const auto o = mafsalOner(mil, kayik); int donerSayi = 0; for (const auto& x : o) if (x.tip == kinematik::MafsalTip::Doner) ++donerSayi; FIKO_KONTROL(donerSayi == 0); // eksen kaymışsa mil–delik ÖNERİLMEZ } FIKO_TEST(mafsal_oneri_yuzey_temasi_duzlemsel) { // İki kutu üst üste: A'nın ÜST yüzü ile B'nin ALT yüzü çakışık ve karşı bakıyor. BrepGovde a = kutu(40, 40, 10); BrepGovde b = kutu(40, 40, 10); Donusumd d; d.konum = {0, 0, 10}; // B tam A'nın üstünde b = donusumUygula(b, d); const auto o = mafsalOner(a, b); FIKO_KONTROL(!o.empty()); bool duzlemselVar = false; for (const auto& x : o) if (x.tip == kinematik::MafsalTip::Duzlemsel) duzlemselVar = true; FIKO_KONTROL(duzlemselVar); } FIKO_TEST(mafsal_oneri_ayrik_govdeler_bos) { BrepGovde a = kutu(10, 10, 10); BrepGovde b = kutu(10, 10, 10); Donusumd d; d.konum = {500, 0, 0}; // çok uzakta b = donusumUygula(b, d); FIKO_KONTROL(mafsalOner(a, b).empty()); } FIKO_TEST(mafsal_oneri_gecersiz_govde_cokmez) { const BrepGovde bos; const BrepGovde g = kutu(10, 10, 10); FIKO_KONTROL(mafsalOner(bos, g).empty()); FIKO_KONTROL(mafsalOner(g, bos).empty()); FIKO_KONTROL(mafsalOner(bos, bos).empty()); } FIKO_TEST(mafsal_oneri_silindirik_duzlemselden_once) { // Mil–delik hem silindirik hem düzlemsel eşleşme üretebilir; silindirik ÖNCE gelmeli // (güven sıralaması) — otomasyon ilk öneriyi alacak. const BrepGovde mil = milZ(10, 40); const BrepGovde yatak = milZ(10, 40); // aynı boy → alt/üst düzlemler de çakışık const auto o = mafsalOner(mil, yatak); FIKO_KONTROL(!o.empty()); FIKO_KONTROL(o[0].tip == kinematik::MafsalTip::Doner); for (std::size_t i = 1; i < o.size(); ++i) FIKO_KONTROL(o[i - 1].guven >= o[i].guven); }