Hoe te beginnen met API - Componenten optimaliseren in een verbinding 04

Dit artikel is ook beschikbaar in:
Vertaald door AI vanuit het Engels
In deze tutorial leert u hoe u enkele componenten (lassen, bouten) in een verbinding kunt optimaliseren met behulp van parameters.

Eerste stappen

We raden aan de tutorial Hoe te beginnen met API - Basis 01 te doorlopen, waarin u leert over de API en hoe u de omgeving instelt.

Verbindingsbestand 

Dit voorbeeld is gebaseerd op bestanden die zijn aangemaakt in de tutorial Hoe te beginnen met API - Een template importeren en berekening uitvoeren 03.

Download het bestand tutorial 03 with template-new.ideaCon.

inline image in article

We willen de componenten van de verbinding optimaliseren (lassen, diameter en aantal bouten). Het resultaat van de optimalisatie zijn de kosten van de verbinding, die overzichtelijk worden weergegeven in een grafiek.

Python client

Voer "IdeaStatiCa.ConnectionRestApi.exe" uit in CMD vanuit de juiste IDEA StatiCa map en open de IDE-tool naar keuze.

inline image in article
  • Maak een nieuw bestand aan en importeer de pakketten die het gebruik van berekeningen en de koppeling met de localhost-URL mogelijk maken. 

Broncode:

## Import van API-pakket
from ideastatica_connection_api.models.con_calculation_parameter import ConCalculationParameter
from ideastatica_connection_api.models.idea_parameter_update import IdeaParameterUpdate

## Koppeling met baseUrl
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

#aanvullende pakketten
import matplotlib.pyplot as plt
import numpy as np
from typing import Concatenate

inline image in article
  • Configureer de logging via de variabele "baseUrl," die uw localhost opent. Koppel in de tweede stap het absolute pad van uw IDEA StatiCa Connection-bestand.

## Logging configureren
baseUrl = "http://localhost:5000"

## Absoluut pad naar de map met uw python-script en verbindingsmodule
project_file_path = r"C:\Users\AlexanderSzotkowski\Documents\IDEA\API\Tutorial 04\tutorial 03 with template -new.ideaCon"
print(project_file_path)

  • Koppel de client aan een reeds actieve service. Gebruik het blok try/except - wanneer het try-blok een fout genereert, wordt het except-blok uitgevoerd. In de eerste fase is het noodzakelijk het project te openen en de project-ID van uw project te vinden, die uniek is voor elk IDEA StatiCa-project. Vervolgens selecteren we de eerste verbinding die in ons bestand is opgeslagen.

# Maak een client aan die is gekoppeld aan een reeds actieve service
with connection_api_service_attacher.ConnectionApiServiceAttacher(baseUrl).create_api_client() as api_client:
    try:
        # Project openen
        print("Opening project %s" % project_file_path)
       #api_client.project.active_project_id  - ID van het geopende project
       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
  • Haal alle benodigde parameters op uit het ideaCon-bestand (aantal bouten, diameter, lasgrootte, boutsamenstelling)

       #parameters ophalen uit ideaCon-bestand
       include_hidden = True
       parameters = api_client.parameter.get_parameters(activeProjectId, firstConId, include_hidden=include_hidden)       
       #standaardwaarden ophalen uit het ideaCon-bestand
       #Diameter van de bout
       boltParameter = parameters[3]
       #print('bout ',boltParameter.value)
       #Aantal boutrijen
       rowParameter = parameters[11]
       #print('rij ',rowParameter.value)
       #Lasgrootte
       weldParameter = parameters[28]
       #print('las ',weldParameter.value)
       #Boutsamenstelling
       boltAssemblyParameter = parameters[29]
       #print('boutsamenstelling ',boltAssemblyParameter.value)

  • We willen alleen resultaten verkrijgen wanneer de berekening 100% positief is voor alle onderdelen (platen, lassen, bouten), dus moeten we Stop bij grensrek instellen op True. Resultaten worden opgeslagen in een lijst, genaamd matrix, die we vervolgens gebruiken om een grafiek weer te geven.

       #instellingen
      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)  

       #Definitieve resultatenlijst
       matrix = []             

inline image in article
  • Nu starten we een cyclus door de lassen te variëren (van t = 8 tot 5 mm), de boutdiameter (van M16 tot M12) en het aantal rijen (van 3 tot 1). De getallen 8, M16 en 3 zijn waarden afkomstig uit het ideaCon-bestand. De lopende resultaten worden op het scherm weergegeven en ook toegevoegd aan de resultatenlijst.

       #doorlopen van lassen met gegeven rijen en bouten
       for row in range(rowParameter.value,1, -1):
           #print ('Aantal boutrijen 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()            # Maak een nieuw exemplaar aan
                   par_row.key = rowParameter.key
                   par_row.expression = str(row)                    

                   par_bolt = IdeaParameterUpdate()            # Maak een nieuw exemplaar aan
                   par_bolt.key = boltParameter.key
                   par_bolt.expression = str(bolt/1000)  # Verlaag de expressie                                                        

                   par_boltAssembly = IdeaParameterUpdate()            # Maak een nieuw exemplaar aan  
                 par_boltAssembly.key = boltAssemblyParameter.key
                 par_boltAssembly.expression = str('M'+ str(bolt) + ' 8.8')                                 

                   par_weld = IdeaParameterUpdate()            # Maak een nieuw exemplaar aan
                   par_weld.key = weldParameter.key
                   par_weld.expression = str(weld/1000)  # Verlaag de expressie

                   updateResponse = api_client.parameter.update(activeProjectId, firstConId, [par_row, par_bolt, par_boltAssembly, par_weld]  )
                   updateResponse.set_to_model                                 

                   # Controleer of de parameters succesvol zijn bijgewerkt
                   if updateResponse.set_to_model == False:
                  print('Parameters mislukt: %s' % ', '.join(updateResponse.failed_validations))

                   #stel het type analyse in
                   ConCalculationParameter.analysis_type = "stress_strain"                        

                   conParameter = ConCalculationParameter()
                   conParameter.connection_ids = [ firstConId ]
                   summary = api_client.calculation.calculate(activeProjectId, conParameter.connection_ids)                    

                  # Resultaten ophalen na berekening, opslaan in apart bestand en de actuele resultaten weergeven          
                   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,'rijen van', bolt, 'bouten', 'en lasgrootte ',par_weld.expression,' resultaten zijn OK. Kosten: ', costs.total_estimated_cost)
                    values= [row, bolt,par_weld.expression,costs.total_estimated_cost]
                    #print(values)
                    matrix.append(values)                   

                   else:
                     print ('Iteratie %i mislukt' % weld)

               else:
                     print ('Iteratie %i voor las mislukt' % weld)                    

           else:
                  print ('Iteratie %i voor bouten mislukt' % bolt)                 

       else:
           print ('Iteratie %i voor rijen mislukt' % row)

inline image in article
  • Het laatste deel betreft het aanmaken van een grafiek met onze resultaten. 

           #Grafiek aanmaken met resultaten
           # Waarden extraheren uit de matrix          
           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( )
           # Gebruik een lus om elk punt te plotten met een ander markeertype op basis van diameter en aantal rijen
           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("Kosten")
           ax.set_ylabel('Kosten in €')
           ax.set_xlabel('Lassen in m')
           ax.axhline(0, color='grey', linewidth=0.8)
           ax.grid(True)
           plt.show()

inline image in article

Zoals u kunt zien, is in dit specifieke geval de meest economische verbinding die met een 6 mm las en drie rijen M14-bouten.

inline image in article

Toegevoegde downloads

Gerelateerde artikelen