#pragma once #include #include #include #include namespace fikatia { // COM hatası → Türkçe mesajlı istisna (HRESULT + hangi çağrı saklanır). struct FikomHata : std::runtime_error { FikomHata(const std::string& mesaj, long kod) : std::runtime_error(mesaj), hresult(kod) {} [[nodiscard]] long hresult = 0; }; // CATIA COM nesnesi late-binding sarmalayıcısı — IFikomObject'in C++ karşılığı. // IDispatch'i doğrudan kullanmaz: her CATIA kavramı Türkçe API ile sarılır. // COM kuralı: argüman dizisi Invoke'a TERS sıraDA verilir; Item indeksleri 1-tabanlıdır. class FikomNesne { public: FikomNesne() = default; // p sahiplenilir (AddRef çağrılmaz — Invoke/GetActiveObject'ten gelen ref devralınır). explicit FikomNesne(IDispatch* p) : p_(p) {} FikomNesne(const FikomNesne& o) : p_(o.p_) { if (p_) p_->AddRef(); } FikomNesne& operator=(const FikomNesne& o); FikomNesne(FikomNesne&& o) noexcept : p_(o.p_) { o.p_ = nullptr; } FikomNesne& operator=(FikomNesne&& o) noexcept; ~FikomNesne() { if (p_) p_->Release(); } [[nodiscard]] bool gecerli() const { return p_ != nullptr; } [[nodiscard]] explicit operator bool() const { return gecerli(); } [[nodiscard]] IDispatch* ham() const { return p_; } // Özellik oku/yaz + metod çağır (VARIANT tabanlı) [[nodiscard]] _variant_t ozellik(const wchar_t* ad) const; void ozellikAyarla(const wchar_t* ad, const _variant_t& deger); [[nodiscard]] _variant_t metod(const wchar_t* ad, std::vector<_variant_t> args = {}); // Kısayollar (Türkçe API) [[nodiscard]] FikomNesne nesne(const wchar_t* ad) const; // IDispatch dönen özellik [[nodiscard]] std::wstring metin(const wchar_t* ad) const; // string özellik [[nodiscard]] long sayi(const wchar_t* ad) const; // int özellik [[nodiscard]] long adet() const { return sayi(L"Count"); } [[nodiscard]] FikomNesne eleman(long indeks) const; // Item(i) — 1-tabanlı (CATIA kuralı) private: [[nodiscard]] _variant_t cagir(unsigned short tur, const wchar_t* ad, std::vector<_variant_t>* args) const; IDispatch* p_ = nullptr; }; // VT_DISPATCH varyantını sarmalayıcıya çevirir (ref devralır), değilse boş döner. [[nodiscard]] FikomNesne varyantNesne(_variant_t& v); } // namespace fikatia