Let's plot random numbers
g_MAPI_key = "eyJ1ciI6Imx1Y2lvbGE3IiwicGciOiJnZW4iLCJjbiI6IldlMzY2Ujd3UkEifQ.bde05702fbfc12032d4c768bfe506780f6f20f48dd1ac0cc879d90aab337009f"
g_base_uri = "moa-engineers.midasit.com"
g_base_port = "443"
# from javascript import globalThis
# fetch = globalThis.fetch
# JSON = globalThis.JSON
from js import fetch, JSON, XMLHttpRequest
import json
class requests_json:
@staticmethod
def post(url, headers, jsonObj):
xhr = XMLHttpRequest.new()
xhr.open("POST", url, False)
for key, value in headers.items():
xhr.setRequestHeader(key, value)
xhr.send(json.dumps(jsonObj))
return json.loads(xhr.responseText)
def get(url, headers):
xhr = XMLHttpRequest.new()
xhr.open("GET", url, False)
for key, value in headers.items():
xhr.setRequestHeader(key, value)
xhr.send()
return json.loads(xhr.responseText)
def put(url, headers, jsonObj):
xhr = XMLHttpRequest.new()
xhr.open("PUT", url, False)
for key, value in headers.items():
xhr.setRequestHeader(key, value)
xhr.send(json.dumps(jsonObj))
return json.loads(xhr.responseText)
def delete(url, headers):
xhr = XMLHttpRequest.new()
xhr.open("DELETE", url, False)
for key, value in headers.items():
xhr.setRequestHeader(key, value)
xhr.send()
return json.loads(xhr.responseText)
class Product:
CIVIL = 1,
GEN = 2,
def get_base_url(product, country="KR"):
country_code = country.upper()
base_url = ""
if(product == Product.CIVIL):
base_uri = g_base_uri
base_port = g_base_port
base_url = f"https://{base_uri}:{base_port}/civil"
elif(product == Product.GEN):
base_uri = g_base_uri
base_port = g_base_port
base_url = f"https://{base_uri}:{base_port}/gen"
else:
print(f"Error: Unable to find the registry key or value for {product}")
return base_url
def get_MAPI_Key(product, country="KR"):
country_code = country.upper()
mapikey = ""
if(product == Product.CIVIL):
mapikey = g_MAPI_key
elif(product == Product.GEN):
mapikey = g_MAPI_key
else:
print(f"Error: Unable to find the registry key or value for {product}")
return mapikey
class MidasAPI:
def __init__(self, product, country="KR") -> None:
self.product = product
self.base_url = get_base_url(product, country)
self.headers = {
'MAPI-Key': get_MAPI_Key(product, country),
'Content-Type': 'application/json'
}
# def __init__(self, product, base_url, mapikey) -> None:
# self.product = product
# self.base_url = base_url
# self.headers = {
# 'MAPI-Key': mapikey,
# 'Content-Type': 'application/json'
# }
## doc #############################################################################################################
def doc_open(self, file_path):
url = f'{self.base_url}/doc/open'
return requests_json.post(url, headers=self.headers, jsonObj={'Argument': file_path})
def doc_anal(self):
url = f'{self.base_url}/doc/anal'
return requests_json.post(url, headers=self.headers, jsonObj={})
## db #############################################################################################################
def db_create(self, item_name, items):
url = f'{self.base_url}/db/{item_name}'
return requests_json.post(url, headers=self.headers, jsonObj={'Assign': items})
def db_create_item(self, item_name, item_id, item):
url = f'{self.base_url}/db/{item_name}/{item_id}'
return requests_json.post(url, headers=self.headers, jsonObj={'Assign': item})
def db_read(self, item_name):
url = f'{self.base_url}/db/{item_name}'
responseJson = requests_json.get(url, headers=self.headers)
# check response.json()[item_name] is Exist
if item_name not in responseJson:
print(f"Error: Unable to find the registry key or value for {item_name}")
return None
keyVals = responseJson[item_name]
return { int(k): v for k, v in keyVals.items() }
def db_read_item(self, item_name, item_id):
item_id_str = str(item_id)
url = f'{self.base_url}/db/{item_name}/{item_id_str}'
responseJson = get(url, headers=self.headers)
# check responseJson[item_name] is Exist
if item_name not in responseJson:
print(f"Error: Unable to find the registry key or value for {item_name}")
return None
if item_id_str not in responseJson[item_name]:
print(f"Error: Unable to find the registry key or value for {item_id}")
return None
return responseJson[item_name][item_id_str]
def db_update(self, item_name, items):
url = f'{self.base_url}/db/{item_name}'
return requests_json.put(url, headers=self.headers, jsonObj={'Assign': items})
def db_update_item(self, item_name, item_id, item):
url = f'{self.base_url}/db/{item_name}/{item_id}'
return requests_json.put(url, headers=self.headers, jsonObj={'Assign': item})
def db_delete(self, item_name):
url = f'{self.base_url}/db/{item_name}'
return requests_json.delete(url, headers=self.headers)
def db_get_next_id(self, item_name):
res_all = self.db_read(item_name)
if not res_all:
return 1
next_id = max(map(int, res_all.keys()))
return next_id + 1
def db_get_max_id(self, item_name):
res_all = self.db_read(item_name)
if not res_all:
return 0
return max(map(int, res_all.keys()))
def db_get_min_id(self, item_name):
res_all = self.db_read(item_name)
if not res_all:
return 1
return min(map(int, res_all.keys()))
## view ############################################################################################################
def view_select_get(self):
url = f'{self.base_url}/view/select'
return requests_json.get(url, headers=self.headers)
## Steel Code Check (Gen Only) ########################################################################################################
def post_steelcodecheck(self):
url = f'{self.base_url}/post/steelcodecheck'
return requests_json.post(url, headers=self.headers, jsonObj={})
## input number of iteration
num_iter = 2
## Set the target ratio range --> max ratio(comb ratio & slenderness ratio)
Target_rat_min = 0.6
Target_rat_max = 0.95
## Set the available section list to be changed
sect_able_map = {
1: [1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115],
2: [1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115],
3: [1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115],
4: [1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115],
5: [1201,1202,1203,1204,1205,1206,1207,1208],
}
## --------------------------------------------------------------------------------------------------------------
genApp = MidasAPI(Product.GEN, "KR")
def get_min_max_rat(check_result, min_boundary, max_boundary):
rat_max = None
rat_min = None
for result_item in check_result:
if( result_item['RAT'] > max_boundary ):
if rat_max == None:
rat_max = result_item
elif rat_max['RAT'] < result_item['RAT']:
rat_max = result_item
if( result_item['RAT'] < min_boundary ):
if rat_min == None:
rat_min = result_item
elif rat_min['RAT'] > result_item['RAT']:
rat_min = result_item
# {'ELEM': 10, 'RAT': 0.12739954944771265, 'SLN': 0.10501474926253693, 'DEF': -0.00045659359797293856, 'DEFA': 0.023666666666666666}
return { 'min':rat_min, 'max':rat_max }
def find_group_id_by_elem_id(elem_id, grup_all):
for grup_id, group_item in grup_all.items():
# if grup['E_LIST'] has elem_id
if elem_id in group_item['E_LIST']:
return grup_id
return None
def get_apply_sect_id(size, sect_id, sect_able_list):
if( size == "small" ):
for index in range(len(sect_able_list)):
if sect_able_list[index] == sect_id:
if index > 0:
return sect_able_list[index-1]
elif( size == "large" ):
for index in range(len(sect_able_list)):
if sect_able_list[index] == sect_id:
if index < len(sect_able_list)-1:
return sect_able_list[index+1]
return None
def make_sect_info_dict(target_elem_id_list, sect_id):
change_elem_sect = {}
for elem_id in target_elem_id_list:
change_elem_sect[elem_id] = {}
change_elem_sect[elem_id]['SECT'] = sect_id
return change_elem_sect
def make_grup_sect_update_info(elem_id, elem_all, grup_all, sect_able_tb, size_direction):
change_elem_sect = {}
grup_id = find_group_id_by_elem_id(elem_id, grup_all)
sect_id = elem_all[elem_id]['SECT']
sect_apply_id = get_apply_sect_id(size_direction, sect_id, sect_able_tb[grup_id])
target_elem_id_list = grup_all[grup_id]['E_LIST']
change_elem_sect = make_sect_info_dict(target_elem_id_list, sect_apply_id)
return change_elem_sect
def run_sect_steel_optimization(sect_able_tb, Target_rat_min, Target_rat_max, max_iter):
if(sect_able_tb == None or sect_able_tb == {}):
## make sect_able_tb
sect_able_tb = {}
grup_list = genApp.db_read("GRUP")
sect_list = genApp.db_read("SECT")
# sect_list key to array
sect_list_key = []
for sect_id, sect_item in sect_list.items():
sect_list_key.append(sect_id)
for grup_id, grup_item in grup_list.items():
sect_able_tb[grup_id] = sect_list_key
genApp.doc_anal()
check_result = genApp.post_steelcodecheck()
min_max_rat = get_min_max_rat(check_result['vELEM'], Target_rat_min, Target_rat_max)
while (min_max_rat['max'] or min_max_rat['min']) and max_iter > 0:
elem_all = genApp.db_read("ELEM")
grup_all = genApp.db_read("GRUP")
elems_update_all = {}
while (min_max_rat['max'] or min_max_rat['min']):
if( min_max_rat['max'] ):
elems_update = make_grup_sect_update_info(min_max_rat['max']['ELEM'], elem_all, grup_all, sect_able_tb, "large")
elems_update_all.update(elems_update)
for elem_id in elems_update:
for index in range(len(check_result['vELEM'])):
if check_result['vELEM'][index]['ELEM'] == elem_id:
check_result['vELEM'].pop(index)
break
if( min_max_rat['min'] ):
elems_update = make_grup_sect_update_info(min_max_rat['min']['ELEM'], elem_all, grup_all, sect_able_tb, "small")
elems_update_all.update(elems_update)
for elem_id in elems_update:
for index in range(len(check_result['vELEM'])):
if check_result['vELEM'][index]['ELEM'] == elem_id:
check_result['vELEM'].pop(index)
break
min_max_rat = get_min_max_rat(check_result['vELEM'], Target_rat_min, Target_rat_max)
# remove elems_update_all[index] == None
elems_update_buffer = {}
for elem_id, elem_info in elems_update_all.items():
if elem_info['SECT'] != None:
elems_update_buffer[elem_id] = elem_info
genApp.db_update("ELEM", elems_update_buffer)
genApp.doc_anal()
check_result = genApp.post_steelcodecheck()
min_max_rat = get_min_max_rat(check_result['vELEM'], Target_rat_min, Target_rat_max)
max_iter = max_iter - 1
min_max_rat = get_min_max_rat(check_result['vELEM'], Target_rat_min, Target_rat_max)
return min_max_rat
# run_sect_steel_optimization(sect_able_map, Target_rat_min, Target_rat_max, num_iter)