#include #include #include #include #include #include "ana_panel.hpp" #include "com/fikom_sunucu.hpp" #include "fiko/platform/pencere.hpp" #include "fiko/render/vulkan_baglam.hpp" #include "fiko/ui/imgui_katman.hpp" #include "fiko/ui/tema.hpp" // Fikatia — CATIA otomasyon istemcisi (FikatiaV2024'un native C++ karsiligi). // fikatia-local motorunun platform/render/ui katmanlarini paylasan BAGIMSIZ exe; // 3D sahne/OCCT tasimaz, yalniz FikoUi + COM otomasyon. namespace { std::wstring cokmeLogYolu() { wchar_t exeYol[MAX_PATH]{}; GetModuleFileNameW(nullptr, exeYol, MAX_PATH); return std::filesystem::path(exeYol).replace_filename(L"cokme.log").wstring(); } LONG WINAPI cokmeYakala(EXCEPTION_POINTERS* bilgi) { FILE* f = nullptr; _wfopen_s(&f, cokmeLogYolu().c_str(), L"w"); if (f) { fprintf(f, "Fikatia cokme (yakalanmamis istisna)\n"); if (bilgi && bilgi->ExceptionRecord) { fprintf(f, "kod: 0x%08X\n", (unsigned)bilgi->ExceptionRecord->ExceptionCode); fprintf(f, "adres: %p\n", (void*)bilgi->ExceptionRecord->ExceptionAddress); } fclose(f); } return EXCEPTION_EXECUTE_HANDLER; } // ---- Tepsi simgesi (saat yani): Fikatia arka plan ana sistemi ---- constexpr UINT TEPSI_MESAJ = WM_APP + 41; constexpr UINT MENU_GOSTER = 1; constexpr UINT MENU_CIKIS = 2; bool g_cikis = false; NOTIFYICONDATAW g_tepsi{}; void tepsiKur(HWND hwnd) { g_tepsi.cbSize = sizeof(g_tepsi); g_tepsi.hWnd = hwnd; g_tepsi.uID = 1; g_tepsi.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; g_tepsi.uCallbackMessage = TEPSI_MESAJ; g_tepsi.hIcon = LoadIconW(nullptr, IDI_APPLICATION); wcscpy_s(g_tepsi.szTip, L"Fikatia — CATIA Otomasyon (arka planda)"); Shell_NotifyIconW(NIM_ADD, &g_tepsi); } void tepsiKaldir() { if (g_tepsi.hWnd) Shell_NotifyIconW(NIM_DELETE, &g_tepsi); } void tepsiBalon(const wchar_t* baslik, const wchar_t* metin) { g_tepsi.uFlags |= NIF_INFO; g_tepsi.dwInfoFlags = NIIF_INFO; wcscpy_s(g_tepsi.szInfoTitle, baslik); wcscpy_s(g_tepsi.szInfo, metin); Shell_NotifyIconW(NIM_MODIFY, &g_tepsi); g_tepsi.uFlags &= ~(UINT)NIF_INFO; } void pencereGoster(HWND hwnd) { ShowWindow(hwnd, SW_SHOW); if (IsIconic(hwnd)) ShowWindow(hwnd, SW_RESTORE); SetForegroundWindow(hwnd); } int calistir(bool gizliBasla) { fiko::PencereAyar ayar; ayar.baslik = L"Fikatia — CATIA Otomasyon"; ayar.genislik = 1500; ayar.yukseklik = 900; ayar.glass = true; // glassmorphism: başlık + arka planı saydam, DWM bulanıklık fiko::Pencere pencere(ayar); fiko::VulkanBaglam vulkan(pencere); fiko::ImGuiKatman arayuz(pencere, vulkan); fiko::ui::temaSec("Neon"); // futuristik HUD paleti HWND hwnd = (HWND)pencere.dogalTutamac(); tepsiKur(hwnd); // COM tarafindan baslatildiysa (-Embedding) dogrudan tepsiye in — pencere acilmaz. if (gizliBasla) ShowWindow(hwnd, SW_HIDE); // ImGuiKatman kendi hamMesaj'ini kurdu — zincirle (girdi yönlendirmesi bozulmasin). // Kapatma = gizle (arka plan ana sistemi); cikis yalniz tepsi menusunden. auto oncekiHam = pencere.hamMesaj; bool balonGosterildi = gizliBasla; pencere.hamMesaj = [hwnd, oncekiHam, &balonGosterildi](void* h, fiko::u32 mesaj, fiko::u64 w, fiko::i64 l) -> bool { if (mesaj == TEPSI_MESAJ) { if (l == WM_LBUTTONDBLCLK || l == WM_LBUTTONUP) pencereGoster(hwnd); else if (l == WM_RBUTTONUP) { HMENU menu = CreatePopupMenu(); AppendMenuW(menu, MF_STRING, MENU_GOSTER, L"Göster"); AppendMenuW(menu, MF_SEPARATOR, 0, nullptr); AppendMenuW(menu, MF_STRING, MENU_CIKIS, L"Çıkış"); SetForegroundWindow(hwnd); // menu disina tiklaninca kapanabilsin POINT konum{}; GetCursorPos(&konum); const int secim = TrackPopupMenu(menu, TPM_RETURNCMD | TPM_NONOTIFY, konum.x, konum.y, 0, hwnd, nullptr); DestroyMenu(menu); if (secim == MENU_GOSTER) pencereGoster(hwnd); else if (secim == MENU_CIKIS) g_cikis = true; } return true; } if (mesaj == WM_CLOSE) { ShowWindow(hwnd, SW_HIDE); if (!balonGosterildi) { tepsiBalon(L"Fikatia", L"Arka planda çalışmaya devam ediyor " L"(CATIA çağrıları açık)."); balonGosterildi = true; } return true; // kapatildi_ set edilmez — surec yasar } return oncekiHam ? oncekiHam(h, mesaj, w, l) : false; }; pencere.boyutDegisti = [&vulkan](fiko::u32, fiko::u32) { vulkan.anaYuzeyNesne().boyutlandirmaGerekli(); }; bool kareIcinde = false; auto kareCiz = [&]() -> bool { if (pencere.simgeDurumundaMi()) return true; arayuz.ctxAktif(); arayuz.kareBasla(); fikatia::anaPanelCiz(); VkCommandBuffer kb = vulkan.kareBasla(); if (!kb) { arayuz.kareIptal(); return true; } vulkan.anaGecisBasla(0.04f, 0.045f, 0.06f); arayuz.ciz(kb); vulkan.kareBitir(); arayuz.viewportPencereleriCiz(); return true; }; // Modal resize/move dongusu icinden kare ciz (ekran donmasin, fence beslensin). pencere.kareCiz = [&] { if (kareIcinde) return; kareIcinde = true; kareCiz(); kareIcinde = false; }; while (pencere.mesajlariIsle()) { if (g_cikis) break; // Gizli/simge durumunda render yok: WaitMessage ile uyu (0 CPU) — COM cagrilari // ve tepsi tiklari mesaj kuyruguna dusunce uyanir (STA pompasi canli kalir). if (!IsWindowVisible((HWND)pencere.dogalTutamac()) || pencere.simgeDurumundaMi()) { WaitMessage(); continue; } kareIcinde = true; kareCiz(); kareIcinde = false; } tepsiKaldir(); vulkan.bekle(); return 0; } } // namespace namespace { // CATIA'ya acilan otomasyon API'si — FikatiaV2024 win32com sunucusunun karsiligi. // Yeni komutlar buraya eklenir (ileride: dokuman ac, post islet, NC uret...). void sunucuApiKur() { fikatia::sunucuMetodEkle({L"Surum", [](const std::vector<_variant_t>&, _variant_t& d) { d = L"Fikatia Native 0.1"; return S_OK; }}); fikatia::sunucuMetodEkle({L"Ping", [](const std::vector<_variant_t>&, _variant_t& d) { d = L"pong"; return S_OK; }}); fikatia::sunucuMetodEkle({L"Mesaj", [](const std::vector<_variant_t>& a, _variant_t& d) { if (a.empty()) return E_INVALIDARG; _variant_t m = a[0]; try { m.ChangeType(VT_BSTR); } catch (const _com_error&) { return DISP_E_TYPEMISMATCH; } fikatia::sunucuGunlukEkle(std::wstring(L"CATIA → Mesaj: ") + (m.bstrVal ? m.bstrVal : L"")); d = true; return S_OK; }}); fikatia::sunucuMetodEkle({L"Goster", [](const std::vector<_variant_t>&, _variant_t& d) { // CATIA makrosundan Fikatia penceresini one getir HWND hwnd = FindWindowW(nullptr, L"Fikatia — CATIA Otomasyon"); if (hwnd) pencereGoster(hwnd); d = (hwnd != nullptr); return S_OK; }}); fikatia::sunucuIstemciKancasi([](bool bagli, int toplam) { fikatia::sunucuGunlukEkle(std::wstring(bagli ? L"İstemci bağlandı" : L"İstemci ayrıldı") + L" (toplam: " + std::to_wstring(toplam) + L")"); }); } } // namespace int WINAPI wWinMain(HINSTANCE, HINSTANCE, PWSTR komutSatiri, int) { SetUnhandledExceptionFilter(cokmeYakala); // COM kayit bayraklari (yonetici gerekmez — HKCU): /RegServer, /UnregServer std::wstring args = komutSatiri ? komutSatiri : L""; for (auto& c : args) c = (wchar_t)towlower(c); if (args.find(L"regserver") != std::wstring::npos) { const bool sil = args.find(L"unregserver") != std::wstring::npos; const bool ok = sil ? fikatia::sunucuKayitSil() : fikatia::sunucuKayitYaz(); MessageBoxW(nullptr, ok ? (sil ? L"Fikatia.Sistem COM kaydi silindi." : L"Fikatia.Sistem COM sunucusu kaydedildi.") : L"COM kayit islemi BASARISIZ.", L"Fikatia", ok ? MB_ICONINFORMATION : MB_ICONERROR); return ok ? 0 : 1; } // COM STA: CATIA otomasyonu ana thread'den suruluyor. CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); sunucuApiKur(); fikatia::sunucuBaslat(); // CreateObject/GetObject("Fikatia.Sistem") bu surece baglanir // COM tarafindan baslatildiysa (CreateObject → -Embedding) tepsiye gizli basla. const bool gizliBasla = args.find(L"embedding") != std::wstring::npos; int sonuc = 3; try { sonuc = calistir(gizliBasla); } catch (const std::exception& e) { FILE* f = nullptr; _wfopen_s(&f, cokmeLogYolu().c_str(), L"w"); if (f) { fprintf(f, "Fikatia cokme (C++ istisnasi)\nwhat: %s\n", e.what()); fclose(f); } } fikatia::sunucuDurdur(); CoUninitialize(); return sonuc; }