Hoe te beginnen met API - Componenten optimaliseren in een verbinding 04
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.
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.
- 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 ConCalculationParameterfrom 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
- 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)
- 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 = []
- 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)
- 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()
Zoals u kunt zien, is in dit specifieke geval de meest economische verbinding die met een 6 mm las en drie rijen M14-bouten.
Toegevoegde downloads
- tutorial 04 - 3 optimize bolts and welds.py (PY, 9 kB)
- tutorial 03 with template-new.ideaCon (IDEACON, 59 kB)