#include "fiko/pmi/pmi.hpp" #include #include "fiko/core/birim_bicim.hpp" namespace fiko::pmi { u32 PmiDefteri::ekle(PmiOge o) { if (o.kimlik == 0) o.kimlik = sonrakiKimlik_++; else sonrakiKimlik_ = std::max(sonrakiKimlik_, o.kimlik + 1); const u32 k = o.kimlik; ogeler_.push_back(std::move(o)); return k; } bool PmiDefteri::sil(u32 kimlik) { const auto it = std::find_if(ogeler_.begin(), ogeler_.end(), [kimlik](const PmiOge& o) { return o.kimlik == kimlik; }); if (it == ogeler_.end()) return false; ogeler_.erase(it); return true; } PmiOge* PmiDefteri::bul(u32 kimlik) { for (PmiOge& o : ogeler_) if (o.kimlik == kimlik) return &o; return nullptr; } const PmiOge* PmiDefteri::bul(u32 kimlik) const { return const_cast(this)->bul(kimlik); } std::vector PmiDefteri::govdeninOgeleri(u32 govde) const { std::vector s; for (const PmiOge& o : ogeler_) for (const PmiHedef& h : o.hedefler) if (h.govde == govde) { s.push_back(o.kimlik); break; } return s; } char PmiDefteri::sonrakiDatumHarfi() const { bool kullanildi[26] = {}; for (const PmiOge& o : ogeler_) if ((o.tip == PmiTip::Datum || o.tip == PmiTip::DatumHedef) && o.datumHarf >= 'A' && o.datumHarf <= 'Z') kullanildi[o.datumHarf - 'A'] = true; for (int i = 0; i < 26; ++i) if (!kullanildi[i]) return (char)('A' + i); return 'Z'; } const char* karakterGlif(GdtKarakteristik k) { switch (k) { case GdtKarakteristik::Duzlemsellik: return "⏥"; case GdtKarakteristik::Dogrusallik: return "—"; case GdtKarakteristik::Yuvarlaklik: return "○"; case GdtKarakteristik::Silindiriklik: return "⌭"; case GdtKarakteristik::Diklik: return "⊥"; case GdtKarakteristik::Paralellik: return "∥"; case GdtKarakteristik::Acisallik: return "∠"; case GdtKarakteristik::CizgiProfili: return "⌒"; case GdtKarakteristik::YuzeyProfili: return "⌓"; case GdtKarakteristik::Konum: return "⌖"; case GdtKarakteristik::Eszamanlilik: return "◎"; case GdtKarakteristik::Simetri: return "⌯"; case GdtKarakteristik::DairesselSalgi: return "↗"; case GdtKarakteristik::ToplamSalgi: return "⌰"; } return "?"; } const char* karakterAdi(GdtKarakteristik k) { switch (k) { case GdtKarakteristik::Duzlemsellik: return "Düzlemsellik"; case GdtKarakteristik::Dogrusallik: return "Doğrusallık"; case GdtKarakteristik::Yuvarlaklik: return "Yuvarlaklık"; case GdtKarakteristik::Silindiriklik: return "Silindiriklik"; case GdtKarakteristik::Diklik: return "Diklik"; case GdtKarakteristik::Paralellik: return "Paralellik"; case GdtKarakteristik::Acisallik: return "Açısallık"; case GdtKarakteristik::CizgiProfili: return "Çizgi Profili"; case GdtKarakteristik::YuzeyProfili: return "Yüzey Profili"; case GdtKarakteristik::Konum: return "Konum"; case GdtKarakteristik::Eszamanlilik: return "Eşmerkezlilik"; case GdtKarakteristik::Simetri: return "Simetri"; case GdtKarakteristik::DairesselSalgi: return "Dairesel Salgı"; case GdtKarakteristik::ToplamSalgi: return "Toplam Salgı"; } return "?"; } const char* kosulGlif(MalzemeKosulu m) { switch (m) { case MalzemeKosulu::MMC: return "Ⓜ"; case MalzemeKosulu::LMC: return "Ⓛ"; case MalzemeKosulu::RFS: return "Ⓢ"; default: return ""; } } std::string gdtMetin(const GdtSatir& s) { std::string o(karakterGlif(s.karakter)); o += ' '; if (s.capsal) o += "Ø"; o += birim::bicim(s.tolerans, birim::Birim::Uzunluk, false); if (s.kosul != MalzemeKosulu::Yok) { o += ' '; o += kosulGlif(s.kosul); } if (s.projeksiyonlu) { o += " Ⓟ"; if (s.projeksiyonUzunluk > 0) { o += ' '; o += birim::bicim(s.projeksiyonUzunluk, birim::Birim::Uzunluk, false); } } for (int i = 0; i < 3; ++i) { if (!s.datum[i]) break; o += " | "; o += s.datum[i]; if (s.datumKosul[i] != MalzemeKosulu::Yok) o += kosulGlif(s.datumKosul[i]); } return o; } std::string ogeMetni(const PmiOge& o) { switch (o.tip) { case PmiTip::Gdt: { std::string m = gdtMetin(o.gdt[0]); if (o.gdtSatirSayi > 1) { m += '\n'; m += gdtMetin(o.gdt[1]); } return m; } case PmiTip::Datum: case PmiTip::DatumHedef: return std::string(1, o.datumHarf); default: return o.metin; } } void duzlemKoseleri(const PmiOge& o, f64 genislikMm, f64 yukseklikMm, f64 olcek, Vec3f kose[4], Vec3f& merkez) { const Vec3f n = o.duzlemNormal; const Vec3f sag = o.duzlemSag; const Vec3f yukari{n.y * sag.z - n.z * sag.y, n.z * sag.x - n.x * sag.z, n.x * sag.y - n.y * sag.x}; const f32 s = (f32)(olcek > 0 ? olcek : 1.0); merkez = {o.capa.x + (sag.x * o.ofsetYerel.x + yukari.x * o.ofsetYerel.y) * s, o.capa.y + (sag.y * o.ofsetYerel.x + yukari.y * o.ofsetYerel.y) * s, o.capa.z + (sag.z * o.ofsetYerel.x + yukari.z * o.ofsetYerel.y) * s}; const f32 yw = (f32)(genislikMm * 0.5) * s, yh = (f32)(yukseklikMm * 0.5) * s; const Vec3f sx{sag.x * yw, sag.y * yw, sag.z * yw}; const Vec3f sy{yukari.x * yh, yukari.y * yh, yukari.z * yh}; kose[0] = {merkez.x - sx.x - sy.x, merkez.y - sx.y - sy.y, merkez.z - sx.z - sy.z}; kose[1] = {merkez.x + sx.x - sy.x, merkez.y + sx.y - sy.y, merkez.z + sx.z - sy.z}; kose[2] = {merkez.x + sx.x + sy.x, merkez.y + sx.y + sy.y, merkez.z + sx.z + sy.z}; kose[3] = {merkez.x - sx.x + sy.x, merkez.y - sx.y + sy.y, merkez.z - sx.z + sy.z}; } std::vector niyetOnerileri(bool duzlemMi, bool silindirMi, int datumSayisi, bool& datumOner) { std::vector o; datumOner = duzlemMi || silindirMi; // datum ancak gerçek bir yüz özelliğinden tanımlanır if (duzlemMi) { o.push_back({GdtKarakteristik::Duzlemsellik}); if (datumSayisi > 0) { o.push_back({GdtKarakteristik::Diklik, true}); o.push_back({GdtKarakteristik::Paralellik, true}); o.push_back({GdtKarakteristik::Acisallik, true}); } o.push_back({GdtKarakteristik::YuzeyProfili, datumSayisi > 0}); } else if (silindirMi) { o.push_back({GdtKarakteristik::Silindiriklik}); o.push_back({GdtKarakteristik::Yuvarlaklik}); if (datumSayisi > 0) { o.push_back({GdtKarakteristik::Konum, true, true}); // delik konumu: Ø bölge + datum o.push_back({GdtKarakteristik::Diklik, true}); o.push_back({GdtKarakteristik::DairesselSalgi, true}); } } else { // kenar/diğer: profil + doğrusallık o.push_back({GdtKarakteristik::Dogrusallik}); o.push_back({GdtKarakteristik::CizgiProfili, datumSayisi > 0}); } return o; } } // namespace fiko::pmi