メインコンテンツへスキップ
Example 作成 編集

例:Python

shutterstock_2326625677-20231115-062024.jpg

Python

Python は、インタープリタ モードで動作する高度なプログラミング言語です。1989 年に Guido van Rossum によって開発された Python は、簡潔で読みやすい構文で知られており、多くのプログラマーに愛され、広く使用されています。Python の主な機能と目的は次のとおりです。

 

  1. 読みやすさ:Python の簡潔で直感的な構文により、プログラマーはコードを読みやすく理解できるため、Python を学習する初心者に最適です。
  2. 汎用性:Python は、Web 開発、データ分析、人工知能、ゲーム開発、システム管理、自動化、科学研究など、さまざまな目的に使用できます。
  3. クロスプラットフォーム:Python は、Windows、macOS、Linux などのさまざまなオペレーティング システムで動作します。つまり、コードを一度記述すれば、複数のプラットフォームで実行できます。
  4. 豊富なライブラリとフレームワーク:Python は幅広いライブラリとフレームワークを提供しており、ユーザーはさまざまなタスクを効率的に実行できます。たとえば、NumPy と Pandas はデータ サイエンスと数学計算のための強力なツールであり、Django と Flask は Web 開発を簡素化します。
  5. ンタープリタ言語:Python はインタープリタ モードで動作し、コードをすぐに記述して実行できます。これにより、迅速なプロトタイピングとテストが可能になります。
  6. コミュニティとサポート:Python には、豊富なオンライン リソースとヘルプを備えたアクティブなコミュニティがあり、問題を解決したり、質問に対する回答を見つけたりすることが容易になります。
  7. オブジェクト指向プログラミング:Python はオブジェクト指向プログラミング (OOP) をサポートしており、クラスとオブジェクトを使用してコードを構造化およびモジュール化できます。
  8. 動的型付け:Python では変数のデータ型を宣言する必要がなく、実行時に変数の型が決定されます。これにより、プログラミングの柔軟性が向上します。

Pythonは、プログラミングを学ぶ初心者からプロの開発者まで、さまざまなレベルのプログラマーに人気があります。さまざまな分野に適用できる汎用性の高い言語であるため、MIDAS Open APIの取り扱いにも便利です。

 

Pythonへようこそ

Pythonは下記の公式サイトで提供されています。

Welcome to Python.org

Python のインストールと使用は、ユーザーの IDE (統合開発環境) によって異なります。この例は Visual Studio Code を使用して作成されました。

 

リクエスト

Python で REST API をリクエストするには、リクエストモジュールをインストールする必要があります。

詳細については以下をご覧ください。

https://pypi.org/project/requests/

Requests: HTTP for Humans™ — Requests 2.31.0 documentation


次の例は、Visual Studio Code にリクエストモジュールをインストールする方法を示しています。

 

  • Visual Studio Codeを開き、メニュー→ターミナル→新しいターミナルを実行します。
  • ターミナルが開いたら、以下のテキストをコピーしてターミナルに貼り付けます。

 

py -3 -m pip install requests

image-20220422-072358.png

リクエストモジュールのインストール(Visual Studio Code)

image-20220422-081837.png

リクエストモジュールのインストール完了

 

JSON in Python

Python で JSON を扱うのは簡単で、組み込みライブラリとさまざまな外部ライブラリを使用して行うことができます。Python で JSON データを解析または生成する方法を説明します。

 

  • JSON Data Parsing

PythonでJSONデータを解析するには、基本ライブラリ JSON を使用します。次の例は JSON データの解析です。

import json

# Converting Python data through parsing JSON string
json_data = '{"name": "John", "age": 30, "city": "New York"}'
data = json.loads(json_data)

# Print result
print(data)  # {'name': 'John', 'age': 30, 'city': 'New York'}
print(data['name'])  # 'John'

 

  • Creating JSON data

Python で Python データを JSON に変換するには、json.dumps() 関数を使用します。次の例では、Python 辞書を JSON 文字列に変換しています。

import json

# Converting Python dictionary to JSON string
data = {
    "name": "John",
    "age": 30,
    "city": "New York"
}
json_data = json.dumps(data)

# Print result
print(json_data)  # '{"name": "John", "age": 30, "city": "New York"}' 

以下の例では辞書を利用しており、Request モジュールは実行時に辞書データをJSON形式に自動的に変換します。そのため、別途変換処理は必要ありません。

 

Exercise Examples

Python を使用して長方形断面の単純な梁の例を作成します。

  • 複数回使用されるため、最初のステップでは API リクエストを関数として作成します。

 

製品の base_url と mapi_key を確認して、5 行目と 6 行目に入力してください。

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() 

 

  • 入力値を割り当てます。梁や材料のジオメトリ変数、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 

 

  • 単位の辞書データを作成します。
# Create Unit Body
unit_json = {"Assign" : {
    "1" : {
        "DIST" : unit_dist,
        "FORCE" : unit_force
    }
}} 

 

  • 材料の辞書データを作成します。
# Create Material Body
matl_json = {"Assign" : {
    material_ID : {
        "TYPE" : "CONC",
        "NAME" : mat_grade,
        "PARAM" : [
            {
                "P_TYPE":1,
                "STANDARD" : mat_standard,
                "DB" : mat_grade
            }
        ]
    }
}} 

 

  • 断面の辞書データを作成します。
# 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
    } 

 

  • 与えられた節点を要素として順番に繋ぐ辞書データを作成します。
# 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],
    }

 

  • 最初の荷重ケースとして自重を割り当てます。
# 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
                ]
            }
        ]
    }

 

  • 荷重の組み合わせを作成します。
# 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) 

次に、全てのコード スニペットを1つのファイルに結合し、コードを実行します。

 

Python を実行すると、各リクエストに対する応答コードが次のように表示されます。

image-20231019-081828.png

次に、Python コードの意図どおりに、MIDAS CIVIL NX に単純な梁が作成されます。

image-20231019-082255.png

 

追加のPythonの例

Pythonでアライメントによる節点/要素の作成

この例では、Python を使用して、入力されたアライメント情報 (直線、円弧、スプライン、放物線) に基づいて節点と要素を作成します。

ユーザーは、アライメント データ (タイプ、長さ) とセグメント情報 (各要素の距離) を入力するだけで済みます。

 

Python によるスプラインの節点座標系

この例では、節点座標系を作成します。平面上の任意の節点が指定されている場合は、接線角を取得するための仮想スプラインが作成されます。

  • X-Y 平面でのみ有効
  • X軸増分(+)方向にスプラインが作成されます。

 

Python で梁要素を分割

このスクリプトは、選択した梁要素を等分または不等分に分割する機能を提供します。

 

構造エンジニアのための最高のツール


Python は構造エンジニアにとって最高のツールと考えられています。習得しやすく、ユーザーフレンドリーで、アクセスしやすく、数学/エンジニアリング ライブラリで十分にサポートされています。さらに、ユーザー コミュニティは広範で、オンラインで豊富なヘルプを利用できます。

Python から始めて、MIDAS Open API への第一歩を踏み出すことを楽しみにしています。

 

1
コンテンツが役に立ちましたか?