// 3B Project (CATIA Project 3D Elements MVP) — kenar3DSketchGecir saf cevirici: // govde kenari → sketch duzlem uzayina dik IZDUSUM → tip-uygun eskiz geometrisi // (dogru→cizgi, duzleme-paralel kapali cember→daire, digerleri→spline). #include #include "fiko/geometri/brep.hpp" #include "fiko/sahne/sketch_nesne.hpp" #include "fiko/sketch/eskiz_veri.hpp" #include "fiko_test.hpp" using namespace fiko; // Kutu kenari (dogru) → cizgi; kimlik donusumleri (sketch duzlemi = dunya XY). FIKO_TEST(izdusum_dogru_kenar_cizgi) { const geometri::BrepGovde kutu = geometri::kutu(10, 6, 4); eskiz::EskizVeri ev; // Bir dogru kenar bul (hepsi dogru zaten). geometri::KenarBilgi kb; u32 ord = 0; for (u32 o = 1;; ++o) { if (!kutu.kenarBilgi(o, kb)) break; if (kb.dogruMu) { ord = o; break; } } FIKO_KONTROL(ord != 0); const u32 k = kenar3DSketchGecir(ev, kutu, ord, Donusumd{}, Donusumd{}); FIKO_KONTROL(k != 0); const eskiz::Geometri* g = ev.geoBul(k); FIKO_KONTROL(g && g->tip == eskiz::GeoTip::Cizgi); // Uzunluk korunur (duzleme dik izdusumda XY bileseni; kutu kenarlari eksene // hizali → izdusum uzunlugu ya tam kenar ya 0'dir; 0 olmayan kenar sectik mi // bilmiyoruz — en azindan uclar sonlu ve gecerli olmali). FIKO_KONTROL(std::isfinite(ev.noktaX(k, 0)) && std::isfinite(ev.noktaY(k, 1))); } // Silindir ust cemberi: duzleme paralel + kapali → DAIRE (yaricap birebir). FIKO_TEST(izdusum_cember_daire) { const geometri::BrepGovde sil = geometri::silindir(5.0, 8.0); eskiz::EskizVeri ev; geometri::KenarBilgi kb; u32 ord = 0; for (u32 o = 1;; ++o) { if (!sil.kenarBilgi(o, kb)) break; if (kb.cemberMi) { ord = o; break; } } FIKO_KONTROL(ord != 0); const u32 k = kenar3DSketchGecir(ev, sil, ord, Donusumd{}, Donusumd{}); FIKO_KONTROL(k != 0); const eskiz::Geometri* g = ev.geoBul(k); FIKO_KONTROL(g && g->tip == eskiz::GeoTip::Daire); FIKO_YAKIN(ev.px(g->ir), 5.0, 1e-6); } // 3B Arakesit (Intersect): govdenin sketch duzlemiyle kesit egrileri sketch'e gecer. // Silindir (r=5, h=8, taban z=0..8 varsayimi degil — kesit z=4'ten) + XY-paralel duzlem // → kapali cember benzeri egri (spline zinciri); nokta yaricaplari ~5. FIKO_TEST(arakesit_silindir_duzlem) { const geometri::BrepGovde sil = geometri::silindir(5.0, 8.0); eskiz::EskizVeri ev; Donusumd duzlem; // sketch duzlemi: XY, z=4 (silindirin ortasi) duzlem.konum = {0, 0, 4.0}; const std::vector eklenen = arakesit3DSketchGecir(ev, sil, Donusumd{}, duzlem, /*yapi*/ false); FIKO_KONTROL(!eklenen.empty()); // Eklenen geometrilerin TUM gecis noktalari merkeze ~5 uzaklikta (kesit cemberi). int nokta = 0; for (const u32 k : eklenen) { const eskiz::Geometri* g = ev.geoBul(k); FIKO_KONTROL(g != nullptr); const auto uzak = [&](const eskiz::Nokta& n) { if (!n.gecerli()) return; const f64 r = std::hypot(ev.px(n.ix), ev.px(n.iy)); FIKO_KONTROL(std::abs(r - 5.0) < 0.05); // ayriklastirma toleransi ++nokta; }; uzak(g->a); uzak(g->b); for (const eskiz::Nokta& n : g->ekNoktalar) uzak(n); } FIKO_KONTROL(nokta >= 8); // anlamli ornekleme // Kesmeyen duzlem → bos. eskiz::EskizVeri ev2; Donusumd uzakD; uzakD.konum = {0, 0, 100.0}; FIKO_KONTROL(arakesit3DSketchGecir(ev2, sil, Donusumd{}, uzakD, false).empty()); } // Egik govde (45° dondurulmus silindir cemberi): duzleme paralel DEGIL → SPLINE. FIKO_TEST(izdusum_egik_cember_spline) { const geometri::BrepGovde sil = geometri::silindir(5.0, 8.0); eskiz::EskizVeri ev; geometri::KenarBilgi kb; u32 ord = 0; for (u32 o = 1;; ++o) { if (!sil.kenarBilgi(o, kb)) break; if (kb.cemberMi) { ord = o; break; } } FIKO_KONTROL(ord != 0); Donusumd don; // govdeyi X ekseni etrafinda 45° dondur → cember duzleme egik don.yonelim = Quatd::eksenAci({1, 0, 0}, 0.785398163); const u32 k = kenar3DSketchGecir(ev, sil, ord, don, Donusumd{}); FIKO_KONTROL(k != 0); const eskiz::Geometri* g = ev.geoBul(k); FIKO_KONTROL(g && g->tip == eskiz::GeoTip::Spline); FIKO_KONTROL(!g->ekNoktalar.empty()); // yapi bayragi: construction olarak gecirme. const u32 k2 = kenar3DSketchGecir(ev, sil, ord, don, Donusumd{}, /*yapi*/ true); const eskiz::Geometri* g2 = ev.geoBul(k2); FIKO_KONTROL(g2 && g2->yapi); }