🔑

CAEファイル内の部品ごとにグループ分けする

に公開

部品ごとにグループ分けしたい時は?

  • 板金部品や鋳物などの1つのPARTで1つの部品が構成されている物もあれば、
    樹脂部品(SHELLで作成する場合)のように板厚分布を再現するためPARTが場所ごとに異なり、
    1つの部品をPART群で表現するものもあります。
  • 樹脂部品のようにPART群で表現している部品の材料を問い合わせたり、ダブルチェックする際、
    preimerであれば、1つPARTを表示してAttatichで接点共有しているSHELLを表示するなどします。
  • この操作が2~3個であれば大したことはありませんが、大きめのASSYファイルだと
    100個近くざらにあります。
  • この操作を自動化しようというのが本記事の内容です。

プログラムの説明

  • 事前にファイル内のELEMENT_SHELLのデータを前回記事を参考にdataframe型で保存します。
    ※(dataframeのcloumは、ID,PID,N1,N2,N3,N4で作成する)
class Attatich:
    def Main(self,SHELL):
        BASE=SHELL
        S_PID=SHELL.loc[0,["PID"]].values
        Serch_DATA=SHELL.query(f"PID=={S_PID}").loc[:,["N1","N2","N3","N4"]]
        
        temp=[]
        while(BASE.shape[0]!=0):
            A_DATA,BASE=self.__Attach_Serch(BASE,Serch_DATA)
            S_PID=BASE.head(1)["PID"].values
            Serch_DATA=SHELL.query(f"PID=={S_PID}").loc[:,["N1","N2","N3","N4"]]
            temp.append(A_DATA)
        return temp
    
    def __Attach_Serch(self,BASE,Serch_DATA):
        temp=[]
        while (Serch_DATA.shape[0]!=0):
                Serch_B,BASE=self.__next_to_serch(BASE,Serch_DATA)
                Serch_DATA=Serch_B.loc[:,["N1","N2","N3","N4"]]
                temp.append(Serch_B)
        return pd.concat(temp[:-1]),BASE
    
    def __next_to_serch(self,SHELL,Serch_DATA):
        Serch_DATA=Serch_DATA.to_numpy().flatten()
        mask = SHELL[['N1', 'N2', 'N3', 'N4']].isin(Serch_DATA).any(axis=1)
        targetPID = SHELL[mask]["PID"]
        mask2 = SHELL[['PID']].isin(targetPID).any(axis=1)
        target=SHELL[mask2]
        other = SHELL[~mask2]
        return target,other
  • 処理を早くするために、共有接点があるSHELLのPIDごとにグループ化しています。
  • そのため、剛体部品など同一PART内でちぎれている部品がある場合、
    ちぎれているSHELLに結合しているSHELLをすべて選択します。

終わりに

  • 今回紹介した機能は、うまく使えば大きな業務効率化につながると思います。

Discussion