Logo ZADAX.NET
Store Library Hive Blog Contact
Return to Blog
Yazılım

SAP2000 API Development Guide with Python: Automation and Performance Optimization from Beginner to Professional Level

miraç miraç
2026-07-07
26 Views
SAP2000 API Development Guide with Python: Automation and Performance Optimization from Beginner to Professional Level - Yazılım | ZadaX Blog

1. CSI OAPI Mimari Yapısı ve Sistem Entegrasyon Prensipleri

Yapısal analiz ve tasarım süreçlerinde, Computers and Structures, Inc. (CSI) bünyesindeki yazılımların (SAP2000, ETABS, CSiBridge) entegrasyonu ve otomasyonu, mühendislik verimliliğini artıran kritik bir unsur haline gelmiştir. CSI yazılımlarının sunduğu Açık Uygulama Programlama Arayüzü (OAPI), geleneksel grafiksel kullanıcı arayüzü (GUI) tabanlı modelleme ve analiz süreçlerindeki tekrarlı iş yükünü ortadan kaldırmakta ve parametrik çalışmaların önünü açmaktadır. SAP2000 API yapısı, temelde Microsoft Windows işletim sistemine özgü olan Component Object Model (COM) teknolojisine dayanmaktadır. Python programlama dili, sunduğu geniş kütüphane desteği ve COM köprüleri sayesinde SAP2000 OAPI ile kusursuz bir entegrasyon sağlamaktadır.   

SAP2000 API mimarisi, sürümler arasında yüksek geriye dönük uyumluluğa sahiptir. Geliştiriciler, SAP2000v1 veya CSiAPIv1 gibi kütüphane referanslarını kullanarak tek bir script ile farklı CSI ürünleri arasında geçiş yapabilmektedir. Yazılımın modern sürümlerinde (v17.2.0 ve sonrası), 32-bit ve 64-bit istemcilerin aynı sözdizimiyle bağlanabilmesi ve harici olarak açılmış aktif SAP2000 oturumlarına dinamik olarak tutunulabilmesi (attach), otomasyon süreçlerine büyük bir esneklik kazandırmıştır.   

Geleneksel COM mimarisinin yanı sıra, SAP2000 v23.1.0 sürümüyle birlikte doğrudan.NET nesneleri üzerinden iletişim kurabilen yeni bir Python API örneği kullanıma sunulmuştur. Bu doğrudan entegrasyon, COM katmanını aradan kaldırarak doğrudan.NET kütüphaneleriyle haberleştiği için çok daha kararlı ve yüksek performanslı bir çalışma ortamı sunmaktadır. Windows Registry kayıtlarının temizlenmesi ve çoklu lisanslama altyapılarındaki uzaktan bağlantı sınırlamaları da modern API sürümleriyle daha stabil bir yapıya kavuşturulmuştur.   

2. Ortam Kurulumu, Sürüm Uyumluluğu ve Bağımlılık Yönetimi

Python ile SAP2000 API geliştirmeye başlarken ilk aşama, Windows tabanlı çalışma ortamının ve COM köprülerinin kurulmasıdır. Python'un Windows platformunda COM sunucularıyla haberleşmesini sağlayan en kararlı kütüphane comtypes kütüphanesidir. API otomasyon projelerinde sürüm uyumlulukları, sanal ortam yönetimi ve harici kütüphane entegrasyonları kritik rol oynamaktadır.   

Python Sürüm Uyumluluğu ve Kritik Sınırlar

SAP2000 API ile çalışırken kullanılacak Python sürümü, tercih edilen yan kütüphanelerin kararlılığı için titizlikle seçilmelidir. CSI OAPI entegrasyonu için genel olarak Python 3.7+ önerilmektedir. Ancak, gelişmiş kütüphaneler ve comtypes paketinin kararlı çalışması için daha spesifik sürüm sınırlamaları mevcuttur :   

Sanal Ortam Kurulumu ve Paket Yönetimi

Geliştirme sürecinde projeye özgü bağımlılıkları izole etmek amacıyla sanal ortam (virtual environment) kullanılması standart bir mühendislik uygulamasıdır. Terminal üzerinden sanal ortamın oluşturulması ve paketlerin yüklenmesi şu adımlarla gerçekleştirilir :   

# Proje dizininde sanal ortam oluşturma
py -m venv.venv

# Sanal ortamı aktifleştirme (Windows)
.venv\Scripts\activate

# Gerekli temel kütüphanelerin pip aracılığıyla yüklenmesi
pip install numpy pandas comtypes matplotlib openpyxl

Aşağıdaki tabloda, Python ile SAP2000 API geliştirmede kullanılan temel ve yardımcı kütüphanelerin lisans, bağımlılık ve işlevsel detayları karşılaştırmalı olarak sunulmaktadır :   

Kütüphane / PaketLisans / GeliştiriciBaşlıca İşlevi ve RolüÖnemli Bağımlılıkları

comtypes 

MIT Lisansı 

Python ile Windows COM servisleri arasında düşük seviyeli FFI tabanlı bağlantı sağlar.

ctypes (Standart Kütüphane) 

numpy 

BSD Lisansı

Büyük matris işlemleri, koordinat dönüşümleri ve COM SAFEARRAY yapılarının optimize aktarımı.

-

pandas 

BSD Lisansı

Analiz sonuçlarının tablo halinde yapılandırılması, filtrelenmesi ve dışa aktarımı.

numpy 

Sap2000py 

GPL Lisansı / Lingyun Gou 

Modelleme, kesit oluşturma, analiz ve Excel post-process adımlarını soyutlayan üst düzey sarmalayıcı.

numpy, openpyxl, comtypes, sectionproperties 

ak_sap 

Açık Kaynak 

Tablo işlemleri, seçim yönetimi, yük paternleri ve Ritz/Eigen analizlerinin yönetimini kolaylaştıran API.

pandas 

Sistem bağımlılıklarının yanı sıra, SAP2000'in dinamik bağlantı kitaplıklarını (DLL) bulabilmesi için, kurulum dizininin (örneğin C:\Program Files\Computers and Structures\SAP2000 24) sistemin "PATH" çevre değişkenlerinde kayıtlı olması gerekir. Aksi takdirde Python çalışma zamanında "DLL not found" veya COM başlatma hataları meydana gelecektir.   

3. Başlangıç Seviyesi: İlk Bağlantı ve Model Başlatma Algoritmaları

SAP2000 ile Python arasındaki ilk teması kurmak için öncelikle API yardımcı (helper) nesnesinin oluşturulması ve bu yardımcı üzerinden ana SapObject arayüzünün başlatılması gerekmektedir.   

Uygulamayı Başlatma ve Aktif Oturuma Bağlanma Protokolü

Geliştiriciler, uygulamayı sıfırdan arka planda (veya görünür şekilde) başlatabilecekleri gibi, mühendisin halihazırda ekranda açık tuttuğu aktif bir SAP2000 modeline de bağlanabilirler. Aktif oturuma bağlanmak (attach), özellikle büyük modellerde zaman alan yükleme sürelerini ortadan kaldırmak ve görsel denetim sağlamak açısından büyük avantaja sahiptir.   

import os
import sys
import comtypes.client

# Adım 1: COM Helper nesnesinin oluşturulması ve cHelper arayüzüne sorgulanması
try:
    helper = comtypes.client.CreateObject('SAP2000v1.Helper')
    helper = helper.QueryInterface(comtypes.gen.SAP2000v1.cHelper)
except Exception as e:
    print(f"Helper nesnesi oluşturulamadı, API kitaplıkları kayıtlı olmayabilir: {e}")
    sys.exit()

# Adım 2: Aktif oturuma bağlanma veya yeni oturum başlatma döngüsü
sap_object = None
attach_to_instance = True  # Aktif modele bağlanma tercihi

if attach_to_instance:
    try:
        # Çalışan aktif SAP2000 nesnesine tutunma
        sap_object = helper.GetObject("CSI.SAP2000.API.SapObject")
        print("Aktif SAP2000 oturumuna başarıyla bağlanıldı.")
    except Exception:
        print("Aktif bir SAP2000 oturumu bulunamadı. Yeni bir oturum başlatılıyor...")
        
if sap_object is None:
    try:
        # Yeni bir SAP2000 örneği oluşturma
        sap_object = helper.CreateObjectProgID("CSI.SAP2000.API.SapObject")
        # Uygulamayı görünür şekilde başlatma
        sap_object.ApplicationStart()
        print("Yeni SAP2000 uygulaması başarıyla başlatıldı.")
    except Exception as e:
        print(f"SAP2000 başlatılamadı: {e}")
        sys.exit()

# Adım 3: Ana Model arayüzünün elde edilmesi
sap_model = sap_object.SapModel

İlk Birim Sisteminin Tanımlanması

Model nesnesi elde edildikten sonra, parametrik girdilerin hatalı yorumlanmaması için birim sisteminin kesin olarak belirtilmesi zorunludur. SAP2000 API, birimleri tamsayı kodları ile kontrol etmektedir. Aşağıdaki tabloda, API kapsamında kullanılan birim kodları ve bunların fiziksel karşılıkları listelenmiştir :   

Kod (ID)Kuvvet BirimiUzunluk BirimiSıcaklık BirimiYaygın Kullanım Alanı / Standartlar
1lbfinF

Amerikan US-Customary (İnç tabanlı) 

2lbfftF

Amerikan US-Customary (Fit tabanlı) 

3kipinF

Amerikan Çelik Yapı Tasarım Standartları 

4kipftF

Amerikan Betonarme ve Temel Tasarımı 

5kNmmC

Metrik Bölge Detaylı Donatı ve Kesit Hesapları 

6kNmC

Küresel Yapısal Analiz ve Sonlu Eleman Modelleme 

7kgfmmC

Eski Tip Metrik Mukavemet ve Laboratuvar Hesapları 

8kgfmC

Bölgesel Statik Hesaplar ve Temel Detayları 

9NmmC

Mekanik Kesit Analizi ve Gerilme Değerlendirmeleri 

  

Birim sistemini ayarlamak için SetPresentUnits fonksiyonu şu şekilde çağrılmaktadır :   

# Birim sistemini kN, m, C olarak ayarla (Kod: 6)
ret = sap_model.SetPresentUnits(6)
if ret!= 0:
    print("Birim sistemi ayarlanamadı.")

Birimlerin ayarlanmasının ardından sıfırdan bir şablon başlatmak için sap_model.InitializeNewModel() ve yeni bir boş dosya açmak için sap_model.File.NewBlank() metotları kullanılır.

4. Orta Seviye: Parametrik Geometri, Malzeme Özellikleri ve Yük Girdileri

Modelleme aşamasında parametrik programlamanın gücünden yararlanılarak, Excel veya harici veritabanlarından okunan kesit ve malzeme verileri döngüler yardımıyla modele otomatik olarak aktarılabilir.   

Malzeme ve Kesit Tanımlama Döngüleri

Tasarım standartlarına uygun betonarme kesitler oluşturulurken, malzemenin elastisite modülü (E) karakteristik basınç dayanımına (fc′​) bağlı olarak ampirik olarak hesaplanabilmektedir. Örneğin, Türk Standartları veya ACI kurallarına göre beton elastisite modülü kgf/m² cinsinden şu formülle elde edilebilir :   

E = 15100* sqrt{f'_c} * 10000

Bu matematiksel ilişki Python üzerinde şu şekilde kodlanarak SAP2000'e aktarılır :   

 

import math

# Beton basınç dayanımları (kgf/cm2 cinsinden) ve karşılık gelen isimler
f_prime_c_list = 
materials_dict = {fc: f"fc_{fc}" for fc in f_prime_c_list}

for fc, mat_name in materials_dict.items():
    # Beton malzeme türü ekleme (ID: 2 -> Concrete)
    sap_model.PropMaterial.SetMaterial(mat_name, 2)
    
    # Elastisite modülü hesabı (kgf/m2 cinsinden)
    E_kgf_m2 = 15100 * math.sqrt(fc) * 10000
    
    # Poisson oranı (0.2) ve termal katsayı (9.9e-6) ile izotropik özellik atama
    sap_model.PropMaterial.SetMPIsotropic(mat_name, E_kgf_m2, 0.2, 9.90E-06)
    
    # Malzeme birim hacim ağırlığının kgf/m3 cinsinden atanması (2400 kgf/m3)
    sap_model.PropMaterial.SetWeightAndMass(mat_name, 1, 2400)

Kesit geometrileri tanımlanırken dikdörtgen, dairesel veya hazır çelik profiller sisteme eklenebilmektedir. Kesit tanımlandıktan hemen sonra, çatlamış kesit rijitliklerini (cracked section modifiers) yansıtmak amacıyla atalet momenti ve alan çarpanları matrisi uygulanmalıdır.

# Kiris kesitinin tanımlanması (Genlik, Derinlik, Malzeme)
# SetRectangle parametreleri: KesitAdı, MalzemeAdı, T3 (Derinlik), T2 (Genişlik)
sap_model.PropFrame.SetRectangle("R_KIRIS_30X60", "fc_280", 0.60, 0.30)

# Çatlamış kesit rijitlik çarpanları dizisi:
#
# Eğilme kirişlerinde I33 rijitliği 0.35 ile çarpılır (deprem yönetmelikleri gereği)
modifiers = [1.0, 1.0, 1.0, 1.0, 0.35, 0.35, 1.0, 1.0]
sap_model.PropFrame.SetModifiers("R_KIRIS_30X60", modifiers)

Çerçeve Elemanlarının Çizilmesi ve Sınır Koşulları

Çerçeve elemanlarının (Frame) düğüm koordinatları belirlenerek sisteme eklenmesi FrameObj.AddByCoord fonksiyonu ile gerçekleştirilir. Eleman uçlarındaki sınır koşulları (ankastre, mafsal vb.) ise doğrudan ilgili düğüm noktasının serbestlik derecelerini kısıtlayan bir Boolean dizi yardımıyla tanımlanmaktadır.   

# Kolon ve kiriş elemanlarının 3 boyutlu koordinatlarla çizilmesi
# Çıktı olarak fonksiyon, işlemin başarı durumunu (ret) ve elemanın benzersiz ismini döndürür
[ret, col1_name] = sap_model.FrameObj.AddByCoord(0, 0, 0, 0, 0, 4.0, "R_KIRIS_30X60", "C1")
[ret, col2_name] = sap_model.FrameObj.AddByCoord(5.0, 0, 0, 5.0, 0, 4.0, "R_KIRIS_30X60", "C2")
[ret, beam1_name] = sap_model.FrameObj.AddByCoord(0, 0, 4.0, 5.0, 0, 4.0, "R_KIRIS_30X60", "B1")

# Elemanların düğüm noktalarının benzersiz isimlerini alma
point_start, point_end = "", ""
[point_start, point_end, ret] = sap_model.FrameObj.GetPoints(col1_name, point_start, point_end)

# Ankastre mesnet kısıtlama matrisi: (True: Sabit, False: Serbest)
ankastre_restraints =

# İlk kolonun taban düğüm noktasına ankastre mesnet atanması
sap_model.PointObj.SetRestraint(point_start, ankastre_restraints)

Yük Paternleri ve Dağıtılı Yüklerin Uygulanması

Yapısal analizlerin temelini oluşturan yüklerin atanmasında öncelikle yük desenlerinin (Load Patterns) oluşturulması gerekir. Elemanlara uygulanacak yükler, global eksenlerde veya elemanın kendi lokal koordinat sisteminde uygulanabilir.   

# Ölü ve Hareketli yük desenlerinin eklenmesi
# Add parametreleri: YükDeseniAdı, YükTipi (1: DEAD, 2: LIVE, vb.), Kendi Ağırlık Çarpanı
sap_model.LoadPatterns.Add("G_DEAD", 1, 1.0)
sap_model.LoadPatterns.Add("Q_LIVE", 2, 0.0)

# Kiriş elemanına (B1) yerel z doğrultusunda (lokal 2 ekseninde) üniform dağıtılı hareketli yük atama
# SetLoadDistributed parametreleri: FrameAdı, YükDeseni, YükTipi (1: Kuvvet), Doğrultu, 
# Mesafe1, Mesafe2, Değer1, Değer2, KoordinatSistemi
sap_model.FrameObj.SetLoadDistributed(beam1_name, "Q_LIVE", 1, 10, 0.0, 1.0, 15.0, 15.0, "Global")

5. İleri Seviye: Analiz Yönetimi ve Sonuç Verilerinin Çıkarılması

Model tamamlandığında dosyanın kaydedilmesi ve analiz motorunun çağrılması gerekir. Çözücü, yapı matrislerini kurarak doğrusal statik durum için aşağıdaki temel denklemi çözer :   

Ku=r

Burada K sistem rijitlik matrisini, u düğüm noktası yer değiştirme vektörünü ve r dış yük vektörünü temsil etmektedir.   

Analizin Koşturulması ve Sonuçların Süzülmesi

Gereksiz yük durumlarının analiz edilmesini engellemek, işlem süresini ve bellek tüketimini ciddi oranda azaltır. Bu nedenle, analize başlamadan önce sadece ilgilenilen yük kombinasyonları veya durumları çıktı için aktif hale getirilmelidir.   

 

# Model dosyasını diske kaydet
sap_model.File.Save(model_path)

# Analizi koştur
sap_model.Analyze.RunAnalysis()
print("Analiz başarıyla tamamlandı.")

# Çıktı sonuçlarını süzme protokolü
sap_model.Results.Setup.DeselectAllCasesAndCombosForOutput()
sap_model.Results.Setup.SetCaseSelectedForOutput("G_DEAD")
sap_model.Results.Setup.SetCaseSelectedForOutput("Q_LIVE")

Sonuçların DataFrame Yapısına Aktarılması ve Analitiği

Analiz bittikten sonra düğüm noktası yer değiştirmeleri (JointDispl) veya çerçeve elemanı iç kuvvetleri (FrameForce) gibi kritik veriler diziler halinde çekilir. Python ile veri işlemede en verimli yöntem, gelen ham veriyi Pandas DataFrame yapısına dönüştürerek analiz etmektir.   

 

import pandas as pd

# Kiriş elemanı için iç kuvvetlerin çekilmesi (0: Tüm kesit noktalarını çeker)
# FrameForce fonksiyon çıktısı: (ret, NumberResults, Obj, Elm, LoadCase, StepType, StepNum, P, V2, V3, T, M2, M3)
forces = sap_model.Results.FrameForce(beam1_name, 0)

# İlgi duyulan veri sütunlarının indeksleri
# İndekslerin karşılıkları: 1: Elemanİsmi, 2: Kesit Noktası, 4: Yük Durumu, 7: Eksenel Kuvvet (P), 
#                         8: Kayma Kuvveti (V2), 12: Eğilme Momenti (M3)
target_indices = 
headers =

# Ham listelerin yapılandırılmış tabloya dönüştürülmesi
data_block = [forces[idx] for idx in target_indices]
df_forces = pd.DataFrame(data_block).T
df_forces.columns = headers

# Veri filtreleme: Maksimum moment değerine sahip satırın bulunması
max_moment_idx = df_forces["Egilme_M3"].astype(float).idxmax()
critical_design_row = df_forces.loc[max_moment_idx]
print(f"Kritik Kesit Eğilme Tasarım Momenti: {critical_design_row['Egilme_M3']} kNm")

6. Profesyonel ve Uzman Seviye: İnteraktif Veritabanı Düzenleme, Otomatik Tasarım ve Bellek Yönetimi

Profesyonel seviyedeki otomasyon projelerinde, tekil API fonksiyonlarının performans darboğazı oluşturduğu durumlarda veritabanı tablolarına toplu müdahale edilmeli, çelik tasarım döngüleri kontrol edilmeli ve Windows COM bellek sızıntıları proaktif olarak engellenmelidir.   

İnteraktif Veritabanı Tablolarının Toplu Düzenlenmesi (Bulk Edit)

SAP2000 içerisinde binlerce elemanın geometrik verisini, kesit atamasını veya yük kombinasyonlarını tek tek değiştirmek yerine, interaktif veritabanı tabloları üzerinden toplu yazma ve okuma işlemleri gerçekleştirilir. Bu işlem, veritabanına doğrudan bir işlem (transaction) gibi yansıtılarak commit edilir.   

 

# Yük kombinasyon verilerinin toplu düzenlenmesi
table_name = "Load Combination Definitions"
group_all = "All"
table_ver = 0
fields_included =
num_records = 0
table_array =

# Adım 1: Mevcut kombinasyon tablosunun belleğe çekilmesi
[ret, fields_included, num_records, table_array] = (
    sap_model.DatabaseTables.GetTableForEditingArray(
        table_name, group_all, table_ver, fields_included, num_records, table_array
    )
)

# Adım 2: Tablo verisi üzerinde toplu güncelleme (Dizi manipülasyonu)
table_list = list(table_array)
# Yeni kombinasyon verilerinin dizi sonuna eklenmesi
new_combo_record =
table_list.extend(new_combo_record)
updated_record_count = num_records + 1

# Adım 3: Güncellenen verinin veritabanı tampon belleğine (buffer) yazılması
sap_model.DatabaseTables.SetTableForEditingArray(
    table_name, table_ver, fields_included, updated_record_count, table_list
)

# Adım 4: Değişikliklerin modele uygulanması (Commit transaction)
import_log = ""
[ret, num_fatal, num_err, num_warn, num_info, import_log] = (
    sap_model.DatabaseTables.ApplyEditedTables(True, 0, 0, 0, 0, import_log)
)
if ret == 0:
    print("Veritabanı tabloları toplu olarak başarıyla güncellendi.")

Otomatik Çelik Tasarımı ve Optimizasyon Döngüleri

Tasarım optimizasyonu, bir yapının güvenli sınırda kalırken malzeme miktarını en aza indirmeyi hedefler. Matematiksel olarak bu problem, kesit ağırlığına bağlı bir amaç fonksiyonunun (F) kısıtlar altında minimize edilmesine dayanır :   

minF(pm​,pc​,ps​)

Burada pm​ malzeme özelliklerini, pc​ mukavemet kapasite kısıtlarını ve ps​ ise deplasman/yer değiştirme sınırlarını temsil etmektedir. Optimizasyon döngülerinde çelik elemanların kapasite oranları API aracılığıyla denetlenerek otomatik kesit ataması gerçekleştirilebilir.   

 

# Çelik tasarım şartnamesinin ve tasarım sürecinin tetiklenmesi
sap_model.DesignSteel.StartDesign()

# Tasarım sonuçlarının (kapasite oranlarının) eleman bazlı sorgulanması
frame_to_check = "C1"
(ret, num_results, frame_names, combos, ratios, statuses, _) = \
    sap_model.DesignSteel.GetSummaryResults(frame_to_check)

if num_results > 0:
    utilization_ratio = ratios
    print(f"Eleman {frame_to_check} Kapasite Oranı: {utilization_ratio:.2f}")
    
    # Kapasite aşımı durumunda kesit büyütme veya optimizasyon kararı verilmesi
    if utilization_ratio > 1.0:
        print("UYARI: Kapasite aşılmıştır, kesit büyütülmelidir.")
    elif utilization_ratio < 0.50:
        print("BİLGİ: Eleman aşırı güvenli tasarlanmıştır, kesit küçültülerek optimize edilebilir.")

COM Bellek Sızıntısı Teşhisi, Önleme ve Çöp Toplayıcı Optimizasyonu

Uzun süreli parametrik analizlerde ve çok döngülü optimizasyonlarda en büyük teknik engel, sistem belleğinin aşırı şişmesi (leak) ve işletim sisteminin süreci sonlandırmasıdır (OOM - Out Of Memory). Bellek sızıntıları temelde iki kaynaktan beslenir:   

  1. Python Referans Döngüleri: Python'un referans sayacı (reference counting) döngüsel referansları (circular references) hemen yakalayamaz. Nesne referans sayısının sıfıra inmemesi nedeniyle COM nesneleri bellekten silinemez.   

  2. Hatalı COM Yaşam Döngüsü Yönetimi: Geliştiriciler yerel değişkenler üzerinden COM nesnelerine eriştiğinde, bu referanslar özellikle hata ayıklama (debugging) modlarında veya yerel lexical kapsamlarda zorla hayatta tutulur..NET karşılıklarındaki Runtime Callable Wrapper (RCW) yapıları ancak tam bir Garbage Collection (GC) döngüsünden sonra serbest kalır.   

Bu durumun önüne geçmek için geliştiricilerin uyması gereken mimari standartlar şunlardır :

Aşağıdaki şablon, profesyonel seviyede bir bellek yönetim mimarisini göstermektedir :   

 

import gc
import tracemalloc

def execute_com_modeling(sap_model_ref):
    """COM işlemlerini izole bir kapsam içinde tutarak referansların yok edilmesini kolaylaştırır."""
    # Sadece bu fonksiyon kapsamında yaşayacak geçici COM nesneleri oluşturulur
    temp_frame = sap_model_ref.FrameObj
    # Modelleme adımları gerçekleştirilir...
    # Fonksiyon sonlandığında temp_frame yerel referansı düşecektir.

def run_garbage_collection_routine():
    """Çöp toplayıcıyı tetikleyerek COM Runtime Callable Wrapper'larını temizler."""
    # Python çöp toplayıcısını çalıştır
    gc.collect()
    # COM bağlantılarını sıfırlayarak işletim sistemine RAM iadesini garanti eder

# Bellek analizi için tracemalloc başlatılması
tracemalloc.start()

# Modelleme sürecinin başlatılması
execute_com_modeling(sap_model)

# Temizlik rutininin çağrılması
run_garbage_collection_routine()

# Snapshot alarak sızıntı kontrolü gerçekleştirilmesi
snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('filename')
print(f"En yüksek bellek tüketen modüller:")
for stat in top_stats[:3]:
    print(stat)

NumPy SAFEARRAY Optimizasyonu ile Ultra Hızlı Veri Transferi

Düğüm noktası koordinatları veya analiz sonuçları gibi büyük veri paketlerinin COM arayüzü üzerinden Python listelerine dönüştürülmesi ciddi bir performans kaybı yaratır. comtypes.safearray altyapısı, dönen dizileri doğrudan C tabanlı NumPy dizilerine (ndarray) dönüştürecek optimize edilmiş bir bellek haritalandırmasına sahiptir. Bu sayede, veriler Python seviyesinde döngülere girmeden doğrudan bellek kopyalaması (memmove) ile transfer edilir.

Bu mekanizma arka planda çalışırken, comtypes kütüphanesi veri tiplerini _arraycode_to_vartype sözlüğü üzerinden eşleştirir :   

Geliştirici seviyesinde bu özelliği aktif hale getirerek performansı en üst seviyeye çıkarmak için safearray_as_ndarray bağlam yöneticisi (context manager) kullanılır :   

 

from comtypes.safearray import safearray_as_ndarray
import numpy as np

# safearray_as_ndarray bağlamı içinde yapılan tüm COM dizi çağrıları 
# Geriye otomatik olarak numpy.ndarray döndürür.
with safearray_as_ndarray:
    # Çok sayıda düğüm noktasının yer değiştirmelerinin çekilmesi
    # Örnek: 'ALL' düğüm grubu için deplasmanların toplu okunması
    # Ham COM dizisi doğrudan numpy dizisi olarak okunur, işlem hızı 100 kattan fazla artar
    # coordinates = sap_model.PointObj.GetAllPoints()
    pass

Bu optimize edilmiş veri transfer mimarisi, büyük ölçekli ve çok girdili parametrik projelerde analiz süresinden bağımsız olarak otomasyon katmanında harcanan süreyi neredeyse sıfıra indirerek projelerin toplam çalışma zamanını minimize eder.   


 

Share This Post

v2026.07.20.2118