Python
Python은 인터프리터 방식으로 동작하는 프로그래밍 언어입니다. 1989년 Guido van Rossum에 의해 개발되었으며, 간결하고 읽기 쉬운 문법으로 많은 개발자들에게 사랑받고 있습니다. Python의 주요 특징과 활용 목적은 다음과 같습니다.
- 가독성: Python은 간결하고 직관적인 문법을 제공하여 코드의 가독성이 뛰어나며, 프로그래밍을 처음 배우는 사용자에게도 적합합니다.
- 범용성: Python은 웹 개발, 데이터 분석, 인공지능, 게임 개발, 시스템 관리, 자동화, 과학·공학 연구 등 다양한 분야에서 활용될 수 있습니다.
- 크로스 플랫폼: Python은 Windows, macOS, Linux 등 다양한 운영체제에서 실행됩니다. 한 번 작성한 코드를 여러 플랫폼에서 동일하게 사용할 수 있습니다.
- 풍부한 라이브러리와 프레임워크: Python은 다양한 작업을 효율적으로 수행할 수 있는 방대한 라이브러리와 프레임워크를 제공합니다. 예를 들어 NumPy와 Pandas는 데이터 분석과 수치 계산에 유용하며, Django와 Flask는 웹 개발을 간편하게 만들어 줍니다.
- 인터프리터 언어: Python은 코드를 작성하는 즉시 실행할 수 있는 인터프리터 방식으로 동작하여, 빠른 프로토타이핑과 테스트가 가능합니다.
- 활발한 커뮤니티와 지원: Python은 전 세계적으로 활발한 사용자 커뮤니티를 보유하고 있어, 온라인 자료와 도움을 쉽게 찾을 수 있습니다.
- 객체 지향 프로그래밍: Python은 객체 지향 프로그래밍(OOP)을 지원하여 클래스와 객체를 활용한 구조적이고 모듈화된 코드 작성이 가능합니다.
- 동적 타이핑: 변수의 자료형을 미리 선언하지 않아도 되며, 실행 시점에 자료형이 결정되어 보다 유연한 프로그래밍이 가능합니다.
Python은 프로그래밍 입문자부터 전문 개발자까지 폭넓게 사용되고 있으며, 다양한 분야에 적용 가능한 범용 언어입니다. 이러한 특성 덕분에 MIDAS Open API를 다루는 데에도 매우 적합합니다.
Welcome to Python
Python은 아래의 공식 웹사이트를 통해 제공됩니다.
Python 설치 및 사용 방법은 사용하는 IDE(통합 개발 환경)에 따라 달라질 수 있습니다. 본 예제는 Visual Studio Code를 기준으로 작성되었습니다.
Requests
Python에서 REST API를 요청하기 위해서는 Requests 모듈을 설치해야 합니다.
자세한 내용은 아래 링크를 참고하시기 바랍니다.
https://pypi.org/project/requests/
Requests: HTTP for Humans™ — Requests 공식 문서
아래 예시는 Visual Studio Code에서 Requests 모듈을 설치하는 방법을 보여줍니다.
- Visual Studio Code를 실행한 후 메뉴에서 Terminal → New Terminal을 선택합니다.
- 터미널이 열리면 아래 명령어를 복사하여 붙여넣고 실행합니다.
py -3 -m pip install requests
Requests 모듈 설치 (Visual Studio Code)
Requests 모듈 설치 완료
Python에서 JSON 다루기
Python에서는 기본 라이브러리 및 다양한 외부 라이브러리를 활용하여 JSON 데이터를 손쉽게 처리할 수 있습니다. 아래에서는 JSON 데이터를 파싱하거나 생성하는 방법을 설명합니다.
- JSON 데이터 파싱
Python에서 JSON 데이터를 파싱하려면 기본 라이브러리인 json을 사용합니다. 아래는 JSON 문자열을 Python 데이터로 변환하는 예제입니다.
import json
# JSON 문자열을 Python 데이터로 변환
json_data = '{"name": "John", "age": 30, "city": "New York"}'
data = json.loads(json_data)
# 결과 출력
print(data) # {'name': 'John', 'age': 30, 'city': 'New York'}
print(data['name']) # 'John'
- JSON 데이터 생성
Python 데이터를 JSON 형식으로 변환하려면 json.dumps() 함수를 사용합니다. 아래 예제는 Python 딕셔너리를 JSON 문자열로 변환하는 방법을 보여줍니다.
import json
# Python 딕셔너리를 JSON 문자열로 변환
data = {
"name": "John",
"age": 30,
"city": "New York"
}
json_data = json.dumps(data)
# 결과 출력
print(json_data) # '{"name": "John", "age": 30, "city": "New York"}'
아래 예제에서는 딕셔너리를 그대로 사용하며, Requests 모듈이 요청 과정에서 자동으로 JSON 형식으로 변환해 주므로 별도의 변환 과정이 필요하지 않습니다.
실습 예제
Python을 이용하여 직사각형 단면을 갖는 단순보를 생성하는 예제입니다.
- 첫 단계로 API 요청을 함수로 작성합니다. 이후 여러 번 사용할 예정이기 때문입니다.
5~6번째 줄에 제품에서 제공된 base_url과 mapi_key를 확인하여 입력해 주세요.
import requests
# function for MIDAS Open API
def MidasAPI(method, command, body=None):
base_url = "base_url_here"
mapi_key = "your_api_key_here"
url = base_url + command
headers = {
"Content-Type": "application/json",
"MAPI-Key": mapi_key
}
if method == "POST":
response = requests.post(url=url, headers=headers, json=body)
elif method == "PUT":
response = requests.put(url=url, headers=headers, json=body)
elif method == "GET":
response = requests.get(url=url, headers=headers)
elif method == "DELETE":
response = requests.delete(url=url, headers=headers)
print(method, command, response.status_code)
return response.json()
- 입력값을 지정합니다. 보의 형상(Geometry) 변수, 재료, ID 등의 값을 변수로 설정합니다.
# Unit Setting
unit_dist = "M" # M, CM, MM, IN, FT
unit_force = "KN" # KN, N, KGF, TONF, LBF, KIPS
# Input Data
length : float = 10.0
height : float = 1.0
width : float = 0.8
add_vertical_load : float = -30.0
# Material Data
mat_standard = "AS17(RC)"
mat_grade = "C32"
# ID (integer)
material_ID : int = 1
section_ID : int = 1
start_node_ID : int = 1
start_elem_ID : int = 1
- 단위(Unit) 설정을 위한 딕셔너리 데이터를 생성합니다.
# Create Unit Body
unit_json = {"Assign" : {
"1" : {
"DIST" : unit_dist,
"FORCE" : unit_force
}
}}
- 재료(Material) 설정을 위한 딕셔너리 데이터를 생성합니다.
# Create Material Body
matl_json = {"Assign" : {
material_ID : {
"TYPE" : "CONC",
"NAME" : mat_grade,
"PARAM" : [
{
"P_TYPE":1,
"STANDARD" : mat_standard,
"DB" : mat_grade
}
]
}
}}
- 단면(Section) 설정을 위한 딕셔너리 데이터를 생성합니다.
# Create Section Body
sect_json = {"Assign" : {
section_ID : {
"SECTTYPE" : "DBUSER",
"SECT_NAME" : "Rectangular",
"SECT_BEFORE" : {
"USE_SHEAR_DEFORM" : True,
"SHAPE": "SB",
"DATATYPE": 2,
"SECT_I": {
"vSIZE" : [height, width]
}
}
}
}}
- 입력한 값을 이용하여 노드 좌표를 계산하고, 그 결과로 딕셔너리 데이터를 생성합니다.
# Create Node Body
num_divisions = 20
interval = length / int(num_divisions)
x_list = [i * interval for i in range(num_divisions + 1)]
node_json = {"Assign" : {}}
for i, x in enumerate(x_list) :
node_json["Assign"][start_node_ID + i] = {
"X" : x,
"Y" : 0.0,
"Z" : 0.0
}
- 생성된 노드를 순서대로 연결하여 요소(Element)로 구성하는 딕셔너리 데이터를 생성합니다.
# Create Element Body
elem_json = {"Assign" : {}}
for i in range(num_divisions):
elem_json["Assign"][start_elem_ID + i] = {
"TYPE" : "BEAM",
"MATL" : material_ID,
"SECT" : section_ID,
"NODE" : [start_node_ID + i, start_node_ID + i + 1]
}
- 보 양 끝단에 경계조건을 적용합니다.
# Create Boundary Body
cons_json = {"Assign" : {
start_node_ID : {
"ITEMS" : [
{
"ID":1,
"CONSTRAINT" : "1111000"
}
]
},
start_node_ID + num_divisions : {
"ITEMS" : [
{
"ID":1,
"CONSTRAINT" : "0111000"
}
]
}
}}
- 정적 하중 해석을 위한 2개의 하중 케이스를 생성합니다.
# Create LoadCase Body
load_case_name = ["DL", "SIDL"]
load_case_desc = ["Dead Load", "Super Imposed Dead Load"]
stld_json = {"Assign" : {}}
for i in range(len(load_case_name)) :
stld_json["Assign"][i + 1] = {
"NAME" : load_case_name[i],
"TYPE" : "USER",
"DESC" : load_case_desc[i],
}
- 첫 번째 하중 케이스에 자중(Self-weight)을 적용합니다.
# Create Self-Weight Load Body
bodf_json = {"Assign" : {
"1" : {
"LCNAME" : load_case_name[0],
"FV" :[
0,
0,
-1
]
}
}}
- 추가 하중 케이스를 보에 적용합니다.
# Create Beam Load Body
bmld_json = {"Assign" : {}}
for i in range(num_divisions) :
bmld_json["Assign"][start_elem_ID + i] = {
"ITEMS" :[
{
"ID" : 1,
"LCNAME" : load_case_name[1],
"CMD" : "BEAM",
"TYPE" : "UNILOAD",
"DIRECTION" : "GZ",
"D" : [
0,
1
],
"P" : [
add_vertical_load,
add_vertical_load
]
}
]
}
- 하중 조합(Load Combination)을 생성합니다.
# Create Load Combination Body
load_factor = [1.2, 1.5]
lcom_gen_json = {"Assign": {
"1": {
"NAME": "Comb1",
"ACTIVE": "ACTIVE",
"iTYPE": 0,
"vCOMB": [
{
"ANAL": "ST",
"LCNAME": load_case_name[0],
"FACTOR": load_factor[0]
},
{
"ANAL": "ST",
"LCNAME": load_case_name[1],
"FACTOR": load_factor[1]
}
]
}
}
}
- 위 과정에서 생성한 딕셔너리 데이터를 "MidasAPI" 함수를 통해 API로 요청합니다.
# SEND DATA TO MIDAS CIVIL NX
# Create New file
file_res = MidasAPI("POST", "/doc/new", {})
# Sending Request
unit_res = MidasAPI("PUT", "/db/unit", unit_json)
matl_res = MidasAPI("POST", "/db/matl", matl_json)
sect_res = MidasAPI("POST", "/db/sect", sect_json)
node_res = MidasAPI("POST", "/db/node", node_json)
elem_res = MidasAPI("POST", "/db/elem", elem_json)
cons_res = MidasAPI( "POST", "/db/cons", cons_json)
stld_res = MidasAPI("POST", "/db/stld", stld_json)
bodf_json = MidasAPI("POST", "/db/bodf", bodf_json)
bmld_res = MidasAPI("POST", "/db/bmld", bmld_json)
lcom_gen_res = MidasAPI("POST", "/db/lcom-gen", lcom_gen_json) 이제 위의 코드 조각을 하나의 파일로 모두 합친 뒤 실행합니다.
Python 코드를 실행하면 각 요청에 대한 응답 코드가 아래와 같이 표시됩니다.
이후 Python 코드에서 의도한 대로 MIDAS CIVIL NX에 단순보가 생성됩니다.
추가 Python 예제
Python을 이용한 선형(Alignment) 기반 노드/요소 생성
본 예제는 입력한 선형 정보(직선, 원호, 스플라인, 포물선)를 바탕으로 Python을 이용해 노드와 요소를 생성하는 방법을 보여줍니다.
사용자는 선형 데이터(형식, 길이)와 구간 정보(각 요소 간 거리)만 입력하면 됩니다.
Python을 이용한 스플라인의 노드 국부축 생성
본 예제는 노드 국부축을 생성합니다. 평면상에서 임의의 노드를 지정하면, 접선 각도를 얻기 위해 가상의 스플라인을 생성합니다.
- X-Y 평면에서만 유효합니다.
- 스플라인은 X축 증가(+) 방향으로 생성됩니다.
Python을 이용한 보 요소 분할
이 스크립트는 선택된 보 요소를 동일 또는 서로 다른 길이로 분할하는 기능을 제공합니다.
구조 엔지니어를 위한 최고의 도구
Python은 구조 엔지니어에게 가장 적합한 도구로 여겨집니다. 배우기 쉽고, 사용자 친화적이며, 접근성이 좋고, 수학/공학 라이브러리 지원도 훌륭합니다. 또한 사용자 커뮤니티가 매우 활발하여 온라인에서 다양한 도움을 받을 수 있습니다.
Python과 함께 MIDAS Open API의 첫걸음을 시작해 보시기 바랍니다.