// Montaj kısıtları (kisit.hpp) — SAF app-katmanı testleri. // "Kısıttan mafsal" yolu: kullanıcı SEÇTİĞİ iki yüzden KESİN kısıt kurar // (mafsal_oneri.hpp'nin aksine — o TARAR/ÖNERİR, bu SEÇİLENİ çözer). #include #include "fiko_test.hpp" #include "fiko/montaj/kisit.hpp" using namespace fiko; using namespace fiko::geometri; using namespace fiko::montaj; namespace { 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 namespace { // Testte ordinal hardcode ETME (OCCT TopExp sırası primitive kurucusuna bağlı) — // mafsal_oneri.hpp'deki tarama kalıbıyla predicate'e uyan İLK yüzü bul. u32 ilkYuz(const BrepGovde& g, bool (*uyar)(const YuzBilgi&)) { for (u32 i = 1;; ++i) { YuzBilgi f; if (!g.yuzBilgi(i, f)) return 0; // alanHesapla=true (varsayılan) — merkez şart if (uyar(f)) return i; } } bool silindirikMi(const YuzBilgi& f) { return f.silindirMi; } bool duzlemselMi(const YuzBilgi& f) { return f.duzlemMi; } } // namespace FIKO_TEST(kisit_sabit_iki_govdeyi_donusum_kaynagi_verir) { const BrepGovde a = kutu(20, 20, 20); const BrepGovde b = kutu(10, 10, 10); const u32 ya = ilkYuz(a, duzlemselMi), yb = ilkYuz(b, duzlemselMi); FIKO_KONTROL(ya > 0 && yb > 0); Kisit k; k.tip = KisitTip::Sabit; k.a = {1, ya}; k.b = {2, yb}; const auto m = kisitCoz(k, a, b); FIKO_KONTROL(m.has_value()); FIKO_KONTROL(m->tip == kinematik::MafsalTip::Sabit); // Sabit: capa == capaCocuk (rölatif konum donuk) — 0 DOF. FIKO_YAKIN(m->capa.konum.x, m->capaCocuk.konum.x, 1e-9); FIKO_KONTROL(kinematik::mafsalSerbestlik(m->tip) == 0); } FIKO_TEST(kisit_es_eksenli_mil_delik_doner_uretir) { const BrepGovde mil = milZ(10, 40); const BrepGovde yatak = milZ(10, 20); const u32 ya = ilkYuz(mil, silindirikMi), yb = ilkYuz(yatak, silindirikMi); FIKO_KONTROL(ya > 0 && yb > 0); Kisit k; k.tip = KisitTip::EsEksenli; k.a = {1, ya}; k.b = {2, yb}; const auto m = kisitCoz(k, mil, yatak); FIKO_KONTROL(m.has_value()); FIKO_KONTROL(m->tip == kinematik::MafsalTip::Doner); FIKO_KONTROL(kinematik::mafsalSerbestlik(m->tip) == 1); } FIKO_TEST(kisit_es_eksenli_duzlem_verilirse_reddeder) { const BrepGovde a = kutu(10, 10, 10); const BrepGovde b = kutu(10, 10, 10); const u32 ya = ilkYuz(a, duzlemselMi), yb = ilkYuz(b, duzlemselMi); Kisit k; k.tip = KisitTip::EsEksenli; k.a = {1, ya}; k.b = {2, yb}; FIKO_KONTROL(!kisitCoz(k, a, b).has_value()); // silindir değil → nullopt } FIKO_TEST(kisit_cakisik_iki_kutu_duzlemsel_uretir) { // kutu() MERKEZLİ primitif (brep.hpp): kutu(40,40,10) yerelde z∈[-5,5], üst yüz z=5. // B'yi +10 ötelersek B'nin ALT yüzü (yerel z=-5) dünyada z=5'e gelir → A'nın üstüyle çakışık. const BrepGovde a = kutu(40, 40, 10); BrepGovde b = kutu(40, 40, 10); Donusumd d; d.konum = {0, 0, 10}; b = donusumUygula(b, d); u32 ya = 0; for (u32 i = 1;; ++i) { YuzBilgi f; if (!a.yuzBilgi(i, f)) break; if (f.duzlemMi && f.normal.z > 0.9 && std::fabs(f.merkez.z - 5.0) < 1e-6) { ya = i; break; } } u32 yb = 0; for (u32 i = 1;; ++i) { YuzBilgi f; if (!b.yuzBilgi(i, f)) break; if (f.duzlemMi && f.normal.z < -0.9 && std::fabs(f.merkez.z - 5.0) < 1e-6) { yb = i; break; } } FIKO_KONTROL(ya > 0 && yb > 0); Kisit k; k.tip = KisitTip::Cakisik; k.a = {1, ya}; k.b = {2, yb}; const auto m = kisitCoz(k, a, b); FIKO_KONTROL(m.has_value()); FIKO_KONTROL(m->tip == kinematik::MafsalTip::Duzlemsel); FIKO_KONTROL(kinematik::mafsalSerbestlik(m->tip) == 3); FIKO_YAKIN(m->capa.konum.z, 5.0, 1e-6); } FIKO_TEST(kisit_mesafe_ana_capayi_normal_yonunde_oteler) { // A üst yüzü z=5 (merkezli kutu). B'yi +15 ötele → B alt yüzü (yerel z=-5) dünyada // z=10 → aralarında 5 mm gerçek montaj boşluğu (Mesafe kısıtının doğrulaması). const BrepGovde a = kutu(40, 40, 10); BrepGovde b = kutu(40, 40, 10); Donusumd d; d.konum = {0, 0, 15}; b = donusumUygula(b, d); u32 ya = 0; for (u32 i = 1;; ++i) { YuzBilgi f; if (!a.yuzBilgi(i, f)) break; if (f.duzlemMi && f.normal.z > 0.9 && std::fabs(f.merkez.z - 5.0) < 1e-6) { ya = i; break; } } u32 yb = 0; for (u32 i = 1;; ++i) { YuzBilgi f; if (!b.yuzBilgi(i, f)) break; if (f.duzlemMi && f.normal.z < -0.9 && std::fabs(f.merkez.z - 10.0) < 1e-6) { yb = i; break; } } FIKO_KONTROL(ya > 0 && yb > 0); Kisit k; k.tip = KisitTip::Mesafe; k.deger = 5.0; k.a = {1, ya}; k.b = {2, yb}; const auto m = kisitCoz(k, a, b); FIKO_KONTROL(m.has_value()); FIKO_YAKIN(m->capa.konum.z, 10.0, 1e-6); // 5 (A üst yüz) + 5 mm ofset } FIKO_TEST(kisit_gecersiz_yuz_ordinali_cokmez) { const BrepGovde a = kutu(10, 10, 10); const BrepGovde b = kutu(10, 10, 10); Kisit k; k.tip = KisitTip::Cakisik; k.a = {1, 9999}; k.b = {2, 1}; FIKO_KONTROL(!kisitCoz(k, a, b).has_value()); }