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.
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.
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 :
Sap2000py gibi modern sarmalayıcı (wrapper) kütüphaneler en az Python 3.9.0 sürümüne ihtiyaç duymaktadır.
comtypes kütüphanesinin belirli işlevleri Python 3.8 ve 3.9 sürümlerinde hatalara yol açabilmekte, bu durum Python 3.10.10+ ve 3.11.2+ sürümlerinde çözülmüş bulunmaktadır.
Python 3.13 sürümü ile çalışabilmek için comtypes kütüphanesinin en az 1.4.8 sürümü kurulmalıdır; daha eski comtypes sürümleri Python 3.13 üzerinde çalışmamaktadır.
Python 3.15 sürümünden itibaren IntFlag (bayrak) enüm değerlerinin işlenme biçimi değişeceğinden, COM tip kütüphanelerinden türetilen enümlerin değerlendirilmesinde geliştiricilerin manuel müdahalelerde bulunması gerekebilecektir.
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 / Paket | Lisans / Geliştirici | Başlıca İşlevi ve Rolü | Önemli Bağımlılıkları |
|---|---|---|---|
| MIT Lisansı | Python ile Windows COM servisleri arasında düşük seviyeli FFI tabanlı bağlantı sağlar. |
|
| BSD Lisansı | Büyük matris işlemleri, koordinat dönüşümleri ve COM SAFEARRAY yapılarının optimize aktarımı. | - |
| BSD Lisansı | Analiz sonuçlarının tablo halinde yapılandırılması, filtrelenmesi ve dışa aktarımı. |
|
| GPL Lisansı / Lingyun Gou | Modelleme, kesit oluşturma, analiz ve Excel post-process adımlarını soyutlayan üst düzey sarmalayıcı. |
|
| Açık Kaynak | Tablo işlemleri, seçim yönetimi, yük paternleri ve Ritz/Eigen analizlerinin yönetimini kolaylaştıran API. |
|
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.
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.
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
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 Birimi | Uzunluk Birimi | Sıcaklık Birimi | Yaygın Kullanım Alanı / Standartlar |
|---|---|---|---|---|
| 1 | lbf | in | F | Amerikan US-Customary (İnç tabanlı) |
| 2 | lbf | ft | F | Amerikan US-Customary (Fit tabanlı) |
| 3 | kip | in | F | Amerikan Çelik Yapı Tasarım Standartları |
| 4 | kip | ft | F | Amerikan Betonarme ve Temel Tasarımı |
| 5 | kN | mm | C | Metrik Bölge Detaylı Donatı ve Kesit Hesapları |
| 6 | kN | m | C | Küresel Yapısal Analiz ve Sonlu Eleman Modelleme |
| 7 | kgf | mm | C | Eski Tip Metrik Mukavemet ve Laboratuvar Hesapları |
| 8 | kgf | m | C | Bölgesel Statik Hesaplar ve Temel Detayları |
| 9 | N | mm | C | 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.
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.
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 (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)
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")
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.
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")
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")
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.
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.")
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.")
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:
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.
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 :
Metot Ayrımı: COM nesneleri ile etkileşim kuran kod blokları ile çöp toplayıcıyı (GC) tetikleyen temizlik kodları kesinlikle aynı metot (skop) içinde bulunmamalıdır. COM referansı içeren fonksiyon sonlandığında, kapsam dışı kalan nesneler bir sonraki adımda rahatça toplanabilir.
Explicit RCW Releasing: C# ve.NET tabanlı istemcilerde Marshal.ReleaseComObject kullanıldığı gibi, Python tarafında da COM nesneleri None değerine çekilmeli ve çöp toplayıcı zorlanmalıdır.
Profilleme Araçları: Kod bloklarındaki sızıntıların kaynağını tespit etmek için tracemalloc ile bellek snapshot'ları alınmalı , objgraph yardımıyla bellekte biriken nesne tipleri ve referans zincirleri (show_backrefs) izlenmelidir. C kütüphanelerinin (örneğin NumPy, Numba) kendi yığınlarında oluşturduğu kaçaklar için ise memray, valgrind veya memleax gibi araçlar kullanılmalıdı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)
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 :
Kısa tamsayılar (h) -> VT_I2
Tamsayılar (i) -> VT_INT
Çift duyarlıklı ondalık sayılar (d) -> VT_R8
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.