🌟

CAEのためのPython2(要素の移動)

2023/07/25に公開

動機

前回の記事でNastranファイルを読み込めたのでデータの加工に取り組んでいきます。
メッシュの作成をやっていると要素の移動をすることはよくあると思うので
今回はこの辺りに取り組んでいきます。

今回やること

指定したPIDのメッシュモデルを移動します。

プログラムの説明

  • pipで以下をインストール(回転移動で使用する四元数のライブラリ)
pip install pyquaternion
  • 以下をインポート
import CAE_File_Read_Write as RW #前回作成したNastranファイルの入出力ファイル
  • 指定したPID(PIDが2以上5以下などでも指定できる)を持つ要素から、構成する節点を取り出しています。(要は、移動したい節点を取り出しています)
class Move_CRD :
    def Use_Node_Serch_from_Element(self,DATA,Target_PIDs):
        temp=(t for i in (j.NID for j in DATA.EL.values() if Target_PIDs(j.PID)) for t in i)
        return (key for key,value in collections.Counter(temp).items() if value>1)
  • 部品のXYZ座標の最大値、最小値を求める関数から部品の全長(X)全幅(Y)全高(Z)と
    中心点を求めています。
    def XYZ_Max_Cal(self,DATA,Target_PIDs):
        return np.array([DATA.N[i].CRD for i in   self.Use_Node_Serch_from_Element(DATA,Target_PIDs)]).max(axis=0)
    def XYZ_Min_Cal(self,DATA,Target_PIDs):
        return np.array([DATA.N[i].CRD for i in self.Use_Node_Serch_from_Element(DATA,Target_PIDs)]).min(axis=0)
    def XYZ_Len_Cal(self,DATA,Target_PIDs):
        return self.XYZ_Max_Cal(DATA,Target_PIDs) - self.XYZ_Min_Cal(DATA,Target_PIDs)
    def XYZ_Center_Cal(self,DATA,Target_PIDs):
        return (self.XYZ_Max_Cal(DATA,Target_PIDs) + self.XYZ_Min_Cal(DATA,Target_PIDs)) / 2
  • 平行移動、回転移動、拡大縮小のコールバック関数(繰り返し呼び出される関数)
   def Tran_Func(self,CRD,axis,Baseaxis,Angle):
       return CRD + axis
   def Rot_Func(self,CRD,axis,Baseaxis,Angle):
       return Quaternion(axis=axis,degrees=Angle).rotate(CRD - Baseaxis)+Baseaxis
   def Scale_Func(self,CRD,axis,Baseaxis,Angle):
       return (CRD - Baseaxis)*axis + Baseaxis
  • 節点を移動させる関数
    def CRD_Move(self,DATA,axis,Target_PIDs,Func,Baseaxis=None,Angle=None):
        if(len(axis)==3): 
            for i in self.Use_Node_Serch_from_Element(DATA,Target_PIDs):
                DATA.N[i].CRD=Func(DATA.N[i].CRD,axis,Baseaxis,Angle)

使い方

    NAS_DATA=RW.File_NAS().Read_File(test_in)#RWは、前回記事で作成したNastranファイルを読み書きするライブラリ
  • 今回は下図のモデルで行います。赤色の円柱がPID=1、青色の直方体がPID=2になってます。

  • 平行移動

    M=Move_CRD()
    #平行移動 例:PID=1の部品(赤色の円柱)をX方向に500mm平行移動
    M.CRD_Move(NAS_DATA,[500,0,0],lambda i:i==1,M.Tran_Func)

  • 回転移動
    #回転移動 例:PIDが1の部品を部品の中心点を基準にX軸で90度回転移動
    Center=Move_CRD().XYZ_Center_Cal(NAS_DATA,lambda i:i==1)
    M.CRD_Move(NAS_DATA,[1,0,0],lambda i:i==1,M.Rot_Func,Center,90)

  • 拡大・縮小
    #拡大縮小 例:PIDが1の部品を部品の中心点を基準にY方向の長さを2倍に拡大
    Center=Move_CRD().XYZ_Center_Cal(NAS_DATA,lambda i:i==1)
    M.CRD_Move(NAS_DATA,[1,2,1],lambda i:i==1,M.Scale_Func,Center)

今後

今回記事を書いていて鏡面移動と移動でなく複製の仕方がわからなくて書けませんでした。
分かり次第追加しようと思っています。(お詳しい方いらしたら教えていただけると幸いです。)
今後も自分の思い付きになりますが必要かと思う機能を追加していこうと思います

Discussion