🔑
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