上一期介紹了使用 Python 的 tkinter 庫來自由客製化複雜介面,可以根據實際需求創建任意類型的介面。 本期我們以差速器殼體強度分析為例,介紹如何根據 csv 格式的載荷數據,使用腳本自動快速創建載荷以及分析步。

 

注意:本文所有代碼都基於 Altair SimLab™ 2020.1 經典介面。

 

 
 

1. 分析工況介紹

 

差速器強度分析時要考慮螺栓預緊力,另外針對不同檔位有 37 個工況,每個工況中有 4 個載荷載入點,載入點上受力和轉矩。

 

1.png

圖1 差速器殼體模型

 

載荷資料來自實驗或者前期的多體動力學分析,保存為 csv 格式,可使用 Python 中的 pandas.read_csv 工具讀取數據。 csv 檔中每一行表示一個工況,每個工況都有 4 個載荷載入點,每個載入點都受 3 個方向的集中力和 3 個方向的轉矩。 (檔案下載見文末連結~)

 

2.png

圖2 載荷表(點擊圖片可查看高清大圖)

 

 
 

2. 代碼最終效果

 

根據不同的需求,在文末下載連結中提供兩個版本的代碼:初級版和高級版。

 

初級版可以認為是代碼初稿,邏輯結構簡單,但剛好能實現所需功能。 代碼將所有載荷步放到一個 Solution 中,且載荷和分析步都是自動編號,工況識別不方便。

3.png

圖3 初級版效果

 

高級版在初級版上經過一定的優化,考慮了更多可能存在的問題,結構邏輯相對更複雜,代碼可將分析步名稱自動設置為 csv 檔中對應的分析步名稱,以便識別工況,並且自動根據工況分組創建 6 個 Solution。

4.png

圖4 高級版效果

 

 
 

3. 程式碼使用方法

 

兩個版本的代碼都有 4 個修改點,使用代碼前需先修改,然後將代碼複製到 SimLab 中的 Python 視窗,按回車即可運行。

 

注意,修改代碼時請使用英文輸入法,否則可能會報錯。 (文末附帶兩個版本代碼使用方法小視頻,供您參考。 )

 

修改1

 

指定載荷資料 csv 檔絕對路徑。 Windows 系統預設是左斜杠,因此複製路徑後需使用轉義字元 r 進行轉義。

 

初級版:

loadcase_file=pd.read_csv(r'D:\technical document\SimLab\Automation\wechat_article\CH4_fastloadcase\force_moment_data.csv',encoding='gb18030')

 

進階版:

filepath = r'D:\technical document\SimLab\Automation\wechat_article\CH4_fastloadcase\force_moment_data.csv'

 

修改點2

 

指定載荷載入點節點編號,可指定任意多個載入點,若增加載入點,csv 檔中需指定相應的載荷資料列,每個載入點對應 6 列數據。

 

初級版:

nodeid = ['535410', '535409', '535406', '535405']

 

進階版:

nodeid = [535410,535409,535406,535405]

 

修改3

 

指定載荷步數量,當前共 37 個工況,若增加工況數量,需增加 csv 檔行數,每個工況一行數據。

 

初級版:

loadcase_count = 37

 

進階版:

LoadcaseCount = 37

 

修改點4

 

設置預緊力大小,當前預緊力為1000N

 

初級版:

pretension('1000',32)

 

進階版:

pretension_force = 1000

 

初級版和高級版兩個版本的代碼都不到 300 行,4 個修改點在代碼末尾有明確的註釋。

 

注意:Python 中以 # 開頭的行為註釋行,# 後面的內容都是註釋。

 

5.png

圖5 初級版修改點

 

6.png

圖6高級版修改點

 

 
 

4. 代碼撰寫思路

 

SimLab 中做二次開發的基本思路為:

 

1)將需要實現的功能在 SimLab 介面中手動操作一遍,錄製為宏代碼;

 

2)修改宏代碼,增強代碼通用性。 相當於 SimLab 提供了磚頭,只需用 Python 語言將磚頭按一定的結構疊在一起即可。

 

差速器強度分析需要用到創建 Solution、創建 loadcase、創建集中力和轉矩、施加預緊力、關聯預緊力工況等操作,撰寫代碼前需透過 Scripting - Record 工具錄製好相應的宏代碼。

 

錄製好宏代碼後,建議將每個功能對應的宏代碼轉換為函數,並對可能改變的物件進行替換,以備調用。

 

寫代碼時,建議開始位置導入需要使用的庫,中間位置定義各種工具函數,末尾定義主函數調用前面定義的工具函數,即函數式程式設計,這種結構容易保證代碼的邏輯清晰,可讀性強。

 

下面是初級版代碼中定義力/轉矩的函數,調用函數時需指定節點編號陣列 nodeid,節點載荷陣列 force,以及載荷步編號 forceid 三個變數。

 

7.png

圖7載荷創建函數

 

SimLab 宏代碼中所有物件都是字串,其修改方法為 '''+variable+''',如載荷創建函數圖中指定 Model 名稱對應的代碼,將模型名稱由:

A_transmissional_housing_v31_SM.gda 

修改為

'''+simlab.getModelName("FEM")+'''

 

simlab.getModelName("FEM/CAD") 為 SimLab 中取得模型名稱的介面,若括弧中為 "FEM" 則表示獲取網格模型名稱,若括弧中為 "CAD" 則表示獲取幾何模型名稱:

<Model>'''+simlab.getModelName("FEM")+'''</Model>

 

定義集中力對應的代碼中,將X方向的載荷大小由具體數值修改為 '''+str(force[6*num+0])+''',讀取 force 數位中的物件,並通過 str() 函數將其轉換為字串串:

 

<Force-Fx Value="'''+str(force[6*num+0])+'''"/>

 

 
 

5. SimLab二次開發介面

 

SimLab 2020.1中提供了五十多個介面,涉及到 Group、Entity、Parameters 以及後處理等方面,打開 SimLab 後按 F1 鍵可打開幫助文檔,其中有詳細介紹,每個介面都有示例代碼(Sample Script)與使用說明。

 

8.png

圖8 SimLab介面

 

本文對應的代碼中主要使用了三個介面:

 

% 1、取得模型名稱

 

SimLab 中很多操作都和模型名稱相關,可用該介面自動獲取模型名稱,從而提高模型通用性。

simlab.getModelName("FEM")

 

2、根據前後置辨識Body

 

該介面可用於識別螺栓體,SimLab 自動建立的螺栓名稱都以 「Body」 開頭,通過下面的代碼可將所有螺栓 Body 名稱保存到變數 BodyNameList 中。

modelname = simlab.getModelName("FEM")

substringlist = ['Bolt*']

BodyNameList = simlab.getBodiesWithSubString(modelname, substringlist)

 

位數編號之後的下一個節點編號

 

比如整個模型最大節點編號為 999,則下面代碼得到的編號為 1000。 該介面是SimLab 2020.1新功能,之前的版本中不支援該介面,在需要創建節點時使用該介面,可確保賦予的節點編號沒有被佔用。

 

simlab.getNextNodeID(modelname)

 

 
 

6.SimLab Python庫支援

 

Python 有大量的標準庫,另外還有豐富的第三方庫。 SimLab 已經支援了 Python 中大部分常用庫,如本文代碼中涉及到的 os、sys、numpy 以及 pandas 庫。 撰寫代碼之前如何確認想用的 Python 庫是否已經被 SimLab 支援了呢?

 

有兩種辦法可以進行確認:

 

%, 方法一:使用 import 方法直接導入庫,若導入後不報錯,即表示已經支援。

 

%, 方法二:使用 help("modules") 查詢,可輸出 SimLab 支援的所有庫,目前支援約 200 個庫。

9.png

 

本文所有操作可參考以下這個視頻,

建議大家跟著視頻一起實際操作一遍,

學習效果更好哦 ↓↓↓

 

 
 

7. 模型及代碼下載

 

本文模型及代碼下載連結:

Altair NAS網盤

檔案下載

建議使用電腦端打開連結

arrow
arrow
    創作者介紹
    創作者 Altair Taiwan 的頭像
    Altair Taiwan

    Altair Taiwan Blog

    Altair Taiwan 發表在 痞客邦 留言(0) 人氣()