#include "cam_urun_agaci.hpp" #include #include #include "cam_simulasyon_penceresi.hpp" #include "fiko/cam/cam_islem.hpp" #include "fiko/cam/cam_sistemi.hpp" #include "fiko/cam/part_operasyon.hpp" #include "fiko/cam/takim.hpp" #include "fiko/ui/tema.hpp" #include "imgui.h" namespace fiko { namespace { using cam::CamOperasyon; using cam::CamSistemi; using cam::PartOperasyon; using cam::Takim; // Op durum ikonu/rengi (cam_uretim_agaci.cpp'den taşındı). const char* opDurumIkon(const CamOperasyon& op) { if (op.bayat) return "⟳"; if (op.hesaplandi) return "✓"; return "⏳"; } // Takım özeti "T Ø". std::string takimOzet(CamSistemi& cam, int takimId) { const Takim* t = cam.takimBul(takimId); if (!t) return {}; char buf[128]; std::snprintf(buf, sizeof(buf), "T%d %s Ø%.1f", t->numara, t->ad.c_str(), t->cap); return buf; } void takimDegistirMenu(CamSistemi& cam, CamOperasyon& op) { if (!ImGui::BeginMenu("Takım Değiştir")) return; for (const Takim& t : cam.takimlar()) { char etiket[128]; std::snprintf(etiket, sizeof(etiket), "T%d %s Ø%.1f", t.numara, t.ad.c_str(), t.cap); if (ImGui::MenuItem(etiket, nullptr, t.numara == op.takimId)) op.takimId = t.numara; } ImGui::EndMenu(); } // Bir op alt-ağacını (takım + Nc Programlar) AgacDugum olarak kur. AgacDugum opDugumKur(CamSistemi& cam, const CamOperasyon& op) { AgacDugum d; char buf[160]; std::snprintf(buf, sizeof(buf), "%s %s %s", cam::islemTipCatiaSimge(op.tip), op.ad.c_str(), opDurumIkon(op)); d.etiket = buf; d.camTip = CAM_OP; d.camKimlik = op.kimlik; const std::string tk = takimOzet(cam, op.takimId); AgacDugum takim; takim.etiket = tk.empty() ? "🔧 takım atanmadı" : ("🔧 " + tk); takim.camTip = CAM_TAKIM; takim.camKimlik = op.kimlik; d.cocuklar.push_back(std::move(takim)); AgacDugum yol; const bool var = op.hesaplandi; yol.etiket = var ? "〰 Nc Programlar" : "〰 Nc Programlar — yol yok"; yol.camTip = CAM_YOL; yol.camKimlik = op.kimlik; d.cocuklar.push_back(std::move(yol)); return d; } // Manufacturing Program kökü: verilen op kimliklerini çocuk yapar. AgacDugum programKur(CamSistemi& cam, const std::vector& opKimlikler) { AgacDugum prog; prog.etiket = "🗂 Manufacturing Program"; prog.camTip = CAM_PROGRAM; for (u32 id : opKimlikler) if (CamOperasyon* op = cam.opBul(id)) prog.cocuklar.push_back(opDugumKur(cam, *op)); return prog; } } // namespace void camAgacTopla(Cekirdek& /*c*/, CamSistemi& cam, std::vector& kok) { const bool opVar = !cam.operasyonlar().empty(); std::vector& partOps = cam.parcaOperasyonlari(); if (partOps.empty() && !opVar) return; // hiç CAM yok → ağaç temiz if (partOps.empty()) { // PartOp yok → düz Manufacturing Program (tüm op'lar). std::vector hepsi; hepsi.reserve(cam.operasyonlar().size()); for (CamOperasyon& op : cam.operasyonlar()) hepsi.push_back(op.kimlik); kok.push_back(programKur(cam, hepsi)); return; } int sira = 0; for (PartOperasyon& pop : partOps) { AgacDugum pd; pd.etiket = "⚙ " + pop.ad; pd.camTip = CAM_PARTOP; pd.camKimlik = pop.kimlik; AgacDugum axis; char ax[96]; std::snprintf(ax, sizeof(ax), "✛ Machining Axis System (%s)", cam::workOffsetAdi(pop.workOffset)); axis.etiket = ax; axis.camTip = CAM_AXIS; axis.camKimlik = pop.kimlik; pd.cocuklar.push_back(std::move(axis)); AgacDugum stok; const cam::Stok& s = pop.stok; char sb[96]; if (s.tip == cam::StokTip::Silindir) std::snprintf(sb, sizeof(sb), "▦ Stok — Ø%.0f × %.0f", s.boyut.x, s.boyut.z); else std::snprintf(sb, sizeof(sb), "▦ Stok — %.0f×%.0f×%.0f", s.boyut.x, s.boyut.y, s.boyut.z); stok.etiket = sb; stok.camTip = CAM_STOK; stok.camKimlik = pop.kimlik; pd.cocuklar.push_back(std::move(stok)); // Op listesi: pop.operasyonlar boşsa aktif/ilk part-op altında TÜM op'lar. std::vector opKimlikler; if (!pop.operasyonlar.empty()) { opKimlikler = pop.operasyonlar; } else { const bool ilkVeyaAktif = (cam.aktifParcaOp == (int)pop.kimlik) || (cam.aktifParcaOp == 0 && sira == 0); if (ilkVeyaAktif) for (CamOperasyon& op : cam.operasyonlar()) opKimlikler.push_back(op.kimlik); } pd.cocuklar.push_back(programKur(cam, opKimlikler)); kok.push_back(std::move(pd)); sira++; } } void camDugumMenu(CamSistemi& cam, u8 camTip, u32 camKimlik, u32& silinecekOp, u32& silinecekPop, const std::function& opPencereAc, const std::function& parcaOpPencereAc) { const ImVec4 HATA_RENK = ui::tema().hata; if (camTip == CAM_OP || camTip == CAM_TAKIM || camTip == CAM_YOL) { CamOperasyon* op = cam.opBul(camKimlik); if (!op) return; cam.seciliOp = (int)op->kimlik; if (ImGui::MenuItem("Düzenle")) opPencereAc(op->kimlik); if (ImGui::MenuItem("Hesapla")) cam.opHesapla(op->kimlik); ImGui::BeginDisabled(op->yol.bosMu()); if (ImGui::MenuItem("Simüle Et")) camSimPencereAc(op->kimlik); ImGui::EndDisabled(); if (ImGui::MenuItem(op->bastirilmis ? "Aç (etkin)" : "Bastır (pasif)")) op->bastirilmis = !op->bastirilmis; ImGui::Separator(); takimDegistirMenu(cam, *op); ImGui::Separator(); ImGui::PushStyleColor(ImGuiCol_Text, HATA_RENK); if (ImGui::MenuItem("Sil")) silinecekOp = op->kimlik; ImGui::PopStyleColor(); } else if (camTip == CAM_PROGRAM) { // Manufacturing Program: TÜM alt aktiviteler tek programda ardışık simüle edilir // (opKimlik=0 → her operasyon timeline'da ayrı segment). Tek op'u simüle etmek // için o aktivitenin kendi sağ-tık menüsü kullanılır. int etkin = 0; for (const CamOperasyon& op : cam.operasyonlar()) if (!op.bastirilmis && op.yol.hamleler.size() >= 2) ++etkin; ImGui::BeginDisabled(etkin == 0); if (ImGui::MenuItem("▶ Tümünü Simüle Et")) camSimPencereAc(0); ImGui::EndDisabled(); ImGui::TextDisabled("%d aktivite simüle edilebilir", etkin); ImGui::Separator(); if (ImGui::MenuItem("Tümünü Hesapla")) cam.kirlileriHesapla(); } else if (camTip == CAM_PARTOP || camTip == CAM_AXIS || camTip == CAM_STOK) { PartOperasyon* pop = cam.parcaOpBul(camKimlik); if (!pop) return; cam.aktifParcaOp = (int)pop->kimlik; if (ImGui::MenuItem("Düzenle")) parcaOpPencereAc(pop->kimlik); ImGui::Separator(); ImGui::PushStyleColor(ImGuiCol_Text, HATA_RENK); if (ImGui::MenuItem("Sil")) silinecekPop = pop->kimlik; ImGui::PopStyleColor(); } } const char* camDugumIkon(CamSistemi& cam, u8 camTip, u32 camKimlik) { if (camTip == CAM_OP) if (CamOperasyon* op = cam.opBul(camKimlik)) return opDurumIkon(*op); return ""; } unsigned int camDugumRenk(CamSistemi& cam, u8 camTip, u32 camKimlik) { if (camTip == CAM_OP) if (CamOperasyon* op = cam.opBul(camKimlik)) { if (op->bastirilmis) return IM_COL32(140, 148, 160, 255); if (op->bayat) return IM_COL32(255, 204, 76, 255); if (op->hesaplandi) return IM_COL32(102, 230, 140, 255); return IM_COL32(140, 150, 165, 255); } return IM_COL32(255, 255, 255, 255); } } // namespace fiko