API ile nasıl başlanır - Bir bağlantıdaki bileşenleri optimize etme 04

Bu makale aynı zamanda şu dillerde de mevcuttur:
İngilizceden yapay zeka tarafından çevrildi
Bu eğitimde, parametreler kullanarak bir bağlantıdaki bazı bileşenleri (kaynaklar, cıvatalar) nasıl optimize edeceğinizi öğreneceksiniz.

İ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.

inline image in article

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.

inline image in article
  • 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 ConCalculationParameter
from 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

inline image in article
  • 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)

inline image in article
  • 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 = []             

inline image in article
  • Ş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)

inline image in article
  • 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()

inline image in article

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.

inline image in article

Ekli İndirmeler

İlgili makaleler