#include "ui_ortak.hpp" #include #include namespace fiko { // Sınırlar: >=1 kg → kg · [1g,1kg) → g · <1g → mg. Negatif/az-üstü-sıfır değerler // de kg'de kalır (0.000 kg olarak gösterilir — özel durum kovalamaya değmez). f64 agirlikOlcekle(f64 kg, const char*& birimAd) { const f64 mutlak = std::fabs(kg); if (mutlak >= 1.0 || mutlak < 1e-9) { birimAd = "kg"; return kg; } if (mutlak >= 0.001) { birimAd = "g"; return kg * 1000.0; } birimAd = "mg"; return kg * 1.0e6; } std::string agirlikBicim(f64 kg) { const char* birim = "kg"; const f64 deger = agirlikOlcekle(kg, birim); char buf[48]; std::snprintf(buf, sizeof(buf), "%.3f %s", deger, birim); return buf; } // DİKKAT: diziler DugumTip enum'unun TAM sırasını izlemeli (sahne.hpp). Eksik bırakılırsa // yeni tip (ör. EksenSistemi=14) sınır-dışı çöp pointer → ImGui::Text UB/Vulkan deadlock. const char* tipAdi(DugumTip t) { static const char* adlar[] = {"Kutu", "Silindir", "Küre", "Koni", "Birleşim", "Çıkarma", "Kesişim","İthal Gövde", "Düzlem", "Eksen", "Sketch", "Takım Yolu", "Tel", "Yüzey", "Eksen Sistemi", "Nokta", "Çizgi", "Teknik Resim", "PMI"}; const int i = (int)t; return (i >= 0 && i < (int)(sizeof(adlar) / sizeof(adlar[0]))) ? adlar[i] : "?"; } const char* tipSimge(DugumTip t) { static const char* simgeler[] = {"◼", "▮", "●", "▲", "∪", "∖", "∩", "▣", "◇", "→", "✎", "⚙", "╱", "▱", "⊕", "•", "/", "📐", "⌖"}; const int i = (int)t; return (i >= 0 && i < (int)(sizeof(simgeler) / sizeof(simgeler[0]))) ? simgeler[i] : "•"; } // Olay Denetçi zaman çizelgesinde tür-başına renk (mutasyon türünü hızlı ayırt et). ImVec4 olayRengi(OlayTuru t) { switch (t) { case OlayTuru::VarlikEklendi: return {0.45f, 0.85f, 0.50f, 1.0f}; // yeşil case OlayTuru::VarlikSilindi: return {0.95f, 0.40f, 0.40f, 1.0f}; // kırmızı case OlayTuru::DonusumDegisti: return {0.45f, 0.70f, 1.00f, 1.0f}; // mavi case OlayTuru::BrepDegisti: return {1.00f, 0.65f, 0.25f, 1.0f}; // turuncu case OlayTuru::GorunurlukDegisti: return {0.60f, 0.68f, 0.80f, 1.0f}; // gri-mavi case OlayTuru::RenkDegisti: return {0.85f, 0.55f, 0.95f, 1.0f}; // mor case OlayTuru::SecimDegisti: return {0.35f, 0.85f, 0.90f, 1.0f}; // camgöbeği case OlayTuru::KipDegisti: return {0.95f, 0.85f, 0.35f, 1.0f}; // sarı case OlayTuru::GorevBasladi: return {0.30f, 0.75f, 0.95f, 1.0f}; // açık mavi case OlayTuru::GorevBitti: return {0.45f, 0.85f, 0.55f, 1.0f}; // yeşil case OlayTuru::OlcumEklendi: return {1.00f, 0.78f, 0.25f, 1.0f}; // kehribar case OlayTuru::OlcumSilindi: return {0.80f, 0.60f, 0.45f, 1.0f}; // soluk kehribar case OlayTuru::DokumanAcildi: case OlayTuru::DokumanKaydedildi: return {0.40f, 0.90f, 0.75f, 1.0f}; // teal default: return {0.60f, 0.62f, 0.66f, 1.0f}; // gri } } void donukMetinCiz(ImDrawList* ciz, ImVec2 merkez, float aciRad, unsigned renk, const char* metin, float boyPx) { // boyPx <= 0 → varsayılan font boyu (eski davranış birebir; PMI çağrıları böyle). // boyPx > 0 → istenen piksel boyu (pafta: metin SAYFA mm'siyle ölçeklenir). ImFont* font = ImGui::GetFont(); const float boy = boyPx > 0.0f ? boyPx : ImGui::GetFontSize(); const ImVec2 boyut = font->CalcTextSizeA(boy, FLT_MAX, 0.0f, metin); const ImVec2 pos{merkez.x - boyut.x * 0.5f, merkez.y - boyut.y * 0.5f}; if (aciRad > -1e-4f && aciRad < 1e-4f) { // düz yol: döndürme maliyeti yok ciz->AddText(font, boy, pos, renk, metin); return; } const int v0 = ciz->VtxBuffer.Size; ciz->AddText(font, boy, pos, renk, metin); const int v1 = ciz->VtxBuffer.Size; const float c = std::cos(aciRad), s2 = std::sin(aciRad); for (int i = v0; i < v1; ++i) { ImDrawVert& v = ciz->VtxBuffer[i]; const float dx = v.pos.x - merkez.x, dy = v.pos.y - merkez.y; // Ekran +y AŞAĞI: matematiksel (saat-tersi) açı için y bileşeni ters işlenir. v.pos.x = merkez.x + dx * c + dy * s2; v.pos.y = merkez.y - dx * s2 + dy * c; } } } // namespace fiko