Các bước đầu tiên
Chúng tôi khuyến nghị bạn xem qua hướng dẫn Cách bắt đầu với API - Cơ bản 01, hướng dẫn này sẽ giúp bạn tìm hiểu về API và cách thiết lập môi trường.
Tệp Connection
Ví dụ này dựa trên các tệp được tạo trong hướng dẫn Cách bắt đầu với API - Nhập mẫu và chạy tính toán 03.
Vui lòng tải xuống tệp tutorial 03 with template-new.ideaCon.

Chúng ta muốn tối ưu hóa các thành phần của liên kết (mối hàn, đường kính và số lượng bu lông). Kết quả của quá trình tối ưu hóa là chi phí của nút liên kết, được trình bày rõ ràng trên biểu đồ.
Python client
Chạy "IdeaStatiCa.ConnectionRestApi.exe" trong CMD trong thư mục IDEA StatiCa phù hợp và mở công cụ IDE mà bạn chọn.

- Tạo một tệp mới và nhập các gói sẽ cho phép sử dụng tính toán và liên kết với URL localhost.
Mã nguồn:
## Import of API package
from ideastatica_connection_api.models.con_calculation_parameter import ConCalculationParameterfrom ideastatica_connection_api.models.idea_parameter_update import IdeaParameterUpdate
## Link with 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
#additional packages
import matplotlib.pyplot as plt
import numpy as np
from typing import Concatenate

- Cấu hình ghi nhật ký thông qua biến "baseUrl," sẽ kéo lên localhost của bạn. Ở bước thứ hai, ghép nối đường dẫn tuyệt đối của tệp IDEA StatiCa Connection của bạn.
## Configure logging
baseUrl = "http://localhost:5000"
## Absolute path into folder with your python script and connection module
project_file_path = r"C:\Users\AlexanderSzotkowski\Documents\IDEA\API\Tutorial 04\tutorial 03 with template -new.ideaCon"
print(project_file_path)
- Ghép nối client với một dịch vụ đang chạy. Sử dụng khối try/except - vì khối try phát sinh lỗi, khối except sẽ được thực thi. Trong giai đoạn đầu, cần mở dự án và tìm ID dự án của bạn, ID này là duy nhất cho mỗi dự án IDEA StatiCa. Sau đó chúng ta chọn liên kết đầu tiên được lưu trong tệp của mình.
# Create a client attached to an already running service
with connection_api_service_attacher.ConnectionApiServiceAttacher(baseUrl).create_api_client() as api_client:
try:
# Open project
print("Opening project %s" % project_file_path)
#api_client.project.active_project_id - ID of opened 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)

- Lấy tất cả các tham số cần thiết từ ideaCon (số lượng bu lông, đường kính, kích thước mối hàn, cụm bu lông)
#get parameters from ideaCon file
include_hidden = True
parameters = api_client.parameter.get_parameters(activeProjectId, firstConId, include_hidden=include_hidden)
#get default values from the ideaCon file
#Diameter of the bolt
boltParameter = parameters[3]
#print('bolt ',boltParameter.value)
#Number of bolt rows
rowParameter = parameters[11]
#print('row ',rowParameter.value)
#Weld size
weldParameter = parameters[28]
#print('weld ',weldParameter.value)
#Bolt assembly
boltAssemblyParameter = parameters[29]
#print('bolt assembly ',boltAssemblyParameter.value)
- Chúng ta muốn nhận kết quả chỉ khi tính toán đạt 100% cho tất cả các bộ phận (bản thép, mối hàn, bu lông), vì vậy chúng ta phải đặt Dừng tại biến dạng giới hạn thành True. Kết quả sẽ được lưu trong một danh sách gọi là matrix, sau đó chúng ta sử dụng để hiển thị biểu đồ.
#setup
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)
#Final results database
matrix = []

- Bây giờ, chúng ta bắt đầu một vòng lặp bằng cách thay đổi mối hàn (từ t = 8 đến 5 mm), đường kính bu lông (từ M16 đến M12) và số hàng (từ 3 đến 1). Các số 8, M16 và 3 là các giá trị lấy từ tệp ideaCon. Kết quả đang diễn ra được in trên màn hình và cũng được thêm vào danh sách kết quả.
#cycling through welds with given rows and bolts
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() # Create a new instance
par_row.key = rowParameter.key
par_row.expression = str(row)
par_bolt = IdeaParameterUpdate() # Create a new instance
par_bolt.key = boltParameter.key
par_bolt.expression = str(bolt/1000) # Decrement the expression
par_boltAssembly = IdeaParameterUpdate() # Create a new instance
par_boltAssembly.key = boltAssemblyParameter.key
par_boltAssembly.expression = str('M'+ str(bolt) + ' 8.8')
par_weld = IdeaParameterUpdate() # Create a new instance
par_weld.key = weldParameter.key
par_weld.expression = str(weld/1000) # Decrement the expression
updateResponse = api_client.parameter.update(activeProjectId, firstConId, [par_row, par_bolt, par_boltAssembly, par_weld] )
updateResponse.set_to_model
# Check if the parameters were updated successfully
if updateResponse.set_to_model == False:
print('Parameters failed: %s' % ', '.join(updateResponse.failed_validations))
#set the type of analysis
ConCalculationParameter.analysis_type = "stress_strain"
conParameter = ConCalculationParameter()
conParameter.connection_ids = [ firstConId ]
summary = api_client.calculation.calculate(activeProjectId, conParameter.connection_ids)
# Get results after calculation, store it in separate file and print the actual results
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)

- Phần cuối cùng là tạo biểu đồ với kết quả của chúng ta.
#Create graph with results
# Extracting values from the 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( )
# Use a loop to plot each point with a different marker based on diameter and number of rows
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()

Như bạn có thể thấy, trong trường hợp cụ thể này, nút liên kết kinh tế nhất là nút có mối hàn 6 mm và ba hàng bu lông M14.

