API ile nasıl başlanır - Bir bağlantıdaki bileşenleri optimize etme 04
İlk adımlar
API hakkında bilgi edinmek ve ortamı nasıl kuracağınızı öğrenmek için API ile nasıl başlanır - Temel Bilgiler 01 eğitimini incelemenizi öneririz.
Connection dosyası
Bu örnek, API ile nasıl başlanır - Şablon içe aktarma ve hesap çalıştırma 03 eğitiminde oluşturulan dosyalara dayanmaktadır.
Lütfen tutorial 03 with template-new.ideaCon dosyasını indirin.
Bağlantının bileşenlerini (kaynaklar, çap ve cıvata sayısı) optimize etmek istiyoruz. Optimizasyonun sonucu, bir grafikte düzenli biçimde sunulan bağlantı maliyetleridir.
Python istemcisi
CMD'de uygun IDEA StatiCa klasörü içinde "IdeaStatiCa.ConnectionRestApi.exe" dosyasını çalıştırın ve tercih ettiğiniz IDE aracını açın.
- Yeni bir dosya oluşturun ve hesaplama kullanımını etkinleştirecek ve localhost URL'si ile bağlantı kuracak paketleri içe aktarın.
Kaynak kodu:
## API paketinin içe aktarılması
from ideastatica_connection_api.models.con_calculation_parameter import ConCalculationParameterfrom ideastatica_connection_api.models.idea_parameter_update import IdeaParameterUpdate
## baseUrl ile bağlantı
import ideastatica_connection_api.connection_api_service_attacher as connection_api_service_attacher
from ideastatica_connection_api.models.con_calculation_parameter import ConCalculationParameterfrom ideastatica_connection_api.models.con_production_cost import ConProductionCost
#ek paketler
import matplotlib.pyplot as plt
import numpy as np
from typing import Concatenate
- Localhost'unuzu çağıracak olan "baseUrl" değişkeni aracılığıyla günlük kaydını yapılandırın. İkinci adımda, IDEA StatiCa Connection dosyanızın mutlak yolunu eşleştirin.
## Günlük kaydını yapılandır
baseUrl = "http://localhost:5000"
## Python betiğinizin ve connection modülünüzün bulunduğu klasörün mutlak yolu
project_file_path = r"C:\Users\AlexanderSzotkowski\Documents\IDEA\API\Tutorial 04\tutorial 03 with template -new.ideaCon"
print(project_file_path)
- İstemciyi zaten çalışan bir servis ile eşleştirin. try/except bloğunu kullanın - try bloğu bir hata oluşturduğunda except bloğu çalıştırılacaktır. İlk aşamada projeyi açmak ve her IDEA StatiCa projesi için benzersiz olan proje kimliğini bulmak gereklidir. Ardından dosyamızda kayıtlı ilk bağlantıyı seçiyoruz.
# Zaten çalışan bir servise bağlı istemci oluştur
with connection_api_service_attacher.ConnectionApiServiceAttacher(baseUrl).create_api_client() as api_client:
try:
# Projeyi aç
print("Opening project %s" % project_file_path)
#api_client.project.active_project_id - Açık projenin kimliği
openedProject = api_client.project.open_project_from_filepath(project_file_path)
#openedProject.connections = [ {Con1}, {Con2}, {Con3} .... ]
firstConId = openedProject.connections[0].id
activeProjectId = api_client.project.active_project_id
print("Active project ID: %s" % activeProjectId)
- ideaCon dosyasından gerekli tüm parametreleri alın (cıvata sayısı, çap, kaynak boyutu, cıvata takımı)
#ideaCon dosyasından parametreleri al
include_hidden = True
parameters = api_client.parameter.get_parameters(activeProjectId, firstConId, include_hidden=include_hidden)
#ideaCon dosyasından varsayılan değerleri al
#Cıvata çapı
boltParameter = parameters[3]
#print('bolt ',boltParameter.value)
#Cıvata sırası sayısı
rowParameter = parameters[11]
#print('row ',rowParameter.value)
#Kaynak boyutu
weldParameter = parameters[28]
#print('weld ',weldParameter.value)
#Cıvata takımı
boltAssemblyParameter = parameters[29]
#print('bolt assembly ',boltAssemblyParameter.value)
- Sonuçları yalnızca hesaplama tüm parçalar (levhalar, kaynaklar, cıvatalar) için %100 olumlu olduğunda almak istiyoruz; bu nedenle Sınır gerinim değerinde durdur seçeneğini True olarak ayarlamamız gerekiyor. Sonuçlar, daha sonra grafik görüntülemek için kullandığımız matrix adlı bir listede saklanacaktır.
#kurulum
updateSettings = api_client.settings.get_settings(api_client.project.active_project_id)
from typing import Dict
updateSettings: Dict [str, object] = {
"calculationCommon/Analysis/AnalysisGeneral/Shared/StopAtLimitStrain@01" : True,
"calculationCommon/Checks/Shared/LimitPlasticStrain@01" : 0.05
}
api_client.settings.update_settings(api_client.project.active_project_id, updateSettings)
#Nihai sonuçlar veritabanı
matrix = []
- Şimdi kaynakları (t = 8'den 5 mm'ye), cıvata çapını (M16'dan M12'ye) ve sıra sayısını (3'ten 1'e) değiştirerek bir döngü başlatıyoruz. 8, M16 ve 3 sayıları ideaCon dosyasından alınan değerlerdir. Devam eden sonuçlar ekranda yazdırılır ve aynı zamanda sonuç listesine eklenir.
#belirli sıra ve cıvatalarla kaynaklar üzerinde döngü
for row in range(rowParameter.value,1, -1):
#print ('Number of bolt rows is', row)
for bolt in range(int(1000*boltParameter.value), 12,-2):
for weld in range(int(1000*weldParameter.value), 5,-1):
par_row = IdeaParameterUpdate() # Yeni bir örnek oluştur
par_row.key = rowParameter.key
par_row.expression = str(row)
par_bolt = IdeaParameterUpdate() # Yeni bir örnek oluştur
par_bolt.key = boltParameter.key
par_bolt.expression = str(bolt/1000) # İfadeyi azalt
par_boltAssembly = IdeaParameterUpdate() # Yeni bir örnek oluştur
par_boltAssembly.key = boltAssemblyParameter.key
par_boltAssembly.expression = str('M'+ str(bolt) + ' 8.8')
par_weld = IdeaParameterUpdate() # Yeni bir örnek oluştur
par_weld.key = weldParameter.key
par_weld.expression = str(weld/1000) # İfadeyi azalt
updateResponse = api_client.parameter.update(activeProjectId, firstConId, [par_row, par_bolt, par_boltAssembly, par_weld] )
updateResponse.set_to_model
# Parametrelerin başarıyla güncellenip güncellenmediğini kontrol et
if updateResponse.set_to_model == False:
print('Parameters failed: %s' % ', '.join(updateResponse.failed_validations))
#analiz türünü ayarla
ConCalculationParameter.analysis_type = "stress_strain"
conParameter = ConCalculationParameter()
conParameter.connection_ids = [ firstConId ]
summary = api_client.calculation.calculate(activeProjectId, conParameter.connection_ids)
# Hesaplamadan sonra sonuçları al, ayrı bir dosyada sakla ve mevcut sonuçları yazdır
results = api_client.calculation.get_results(activeProjectId, conParameter.connection_ids)
CheckResSummary = results[0].check_res_summary
costs = api_client.connection.get_production_cost(api_client.project.active_project_id, firstConId)
api_client.project.download_project(activeProjectId, r'C:\Users\AlexanderSzotkowski\Documents\IDEA\API\Tutorial 04\tutorial 03 with template-updated.ideaCon')
if CheckResSummary[0].check_status == False:
break
if CheckResSummary[0].check_status == True:
print (row,'rows of', bolt, 'bolts', 'and weld size ',par_weld.expression,' results are OK. Costs: ', costs.total_estimated_cost)
values= [row, bolt,par_weld.expression,costs.total_estimated_cost]
#print(values)
matrix.append(values)
else:
print ('Iteration %i failed' % weld)
else:
print ('Iteration %i for weld failed' % weld)
else:
print ('Iteration %i for bolts failed' % bolt)
else:
print ('Iteration %i for rows failed' % row)
- Son bölüm, sonuçlarımızla bir grafik oluşturmakla ilgilidir.
#Sonuçlarla grafik oluştur
# Matristen değerleri çıkar
flat = [x for row in matrix for x in row]
rows = flat[0::4]
#print('rows', rows)
diameter = flat[1::4]
#print('diammeter', diameter)
weld = flat[2::4]
#print('weld', weld)
costs = flat[3::4]
#print('costs', costs)
s = 50
fig, ax = plt.subplots( )
# Çap ve sıra sayısına göre her noktayı farklı bir işaretleyiciyle çizmek için döngü kullan
for weldi, costsi, rowsi, diameteri in zip(weld, costs, rows, diameter):
if diameteri == 16 and rowsi == 3:
marker_style = 'o'
col = 'blue'
elif diameteri == 16 and rowsi == 2:
marker_style = 'o'
col = 'red'
elif diameteri == 14 and rowsi == 3:
marker_style = '+'
col = 'blue'
elif diameteri == 14 and rowsi == 2:
marker_style = '+'
col = 'red'
else:
marker_style = 'D'
col = 'black'
ax.scatter(weldi, costsi, s, marker=marker_style, c=col)
ax.set_ylim([min(costs)-10, max(costs)+10])
#ax.legend()
plt.text(0, 90, 'red "x" 2 rows of M12', fontsize=10, color='red', ha='left', va='center')
plt.text(0, 92, 'blue "x" 3 rows of M12', fontsize=10, color='blue', ha='left', va='center')
plt.text(0, 94, 'red "+" 2 rows of M14', fontsize=10, color='red', ha='left', va='center')
plt.text(0, 96, 'blue "+" 3 rows of M14', fontsize=10, color='blue', ha='left', va='center')
plt.text(0, 98, 'red "dot" 2 rows of M16', fontsize=10, color='red', ha='left', va='center')
plt.text(0, 100, 'blue "dot" 3 rows of M16', fontsize=10, color='blue', ha='left', va='center')
ax.set_title("Costs")
ax.set_ylabel('Costs in €')
ax.set_xlabel('Welds in m')
ax.axhline(0, color='grey', linewidth=0.8)
ax.grid(True)
plt.show()
Görüldüğü üzere, bu özel durumda en ekonomik bağlantı 6 mm kaynak ve üç sıra M14 cıvata içeren bağlantıdır.
Ekli İndirmeler
- tutorial 04 - 3 optimize bolts and welds.py (PY, 9 kB)
- tutorial 03 with template-new.ideaCon (İDEACON, 59 kB)