1. 程式人生 > >Abaqus obj inp 檔案內部讀取點座標並統計

Abaqus obj inp 檔案內部讀取點座標並統計

任務描述:對一個三維的帶網格的模型,生成一個二維平面的影象描述,其中每個空格內部顯示這個座標下在z方向具有多少網格,類似於三維模型的深度圖
方法:有兩個方法
1.從網格檔案OBJ內部讀取點座標,統計(x,y)的個數
2.從Inp檔案內部讀取點座標,統計(x,y)的個數
在實驗過程中,發現方法1 的obj檔案內部的點的資訊比較雜,可能包含除了網格以外的其他的點的資訊,所以放棄了這種方法。這裡主要介紹方法2

inp檔案讀取

writenode = []
#writenode 點集
write_flag = False
input = open("new_1.inp","r")
#讀取inp檔案
astring = input.readlines() #這裡這種讀入方式的好處是astring是list型別,其餘方式可能是str型別 for i,line in enumerate(astring): if line =="*Node\n": #找到inp檔案內部開始記錄點資訊的地方 write_flag = True #寫入檔案標誌位開始 continue #跳出當前迴圈,執行下一次迴圈,這樣*Node就不會寫入檔案內部 print(i) if line =="*Element, type=C3D8R\n"
: break #點描述資訊結束後是描述單元資訊,正好這裡截止,挑出for迴圈 if write_flag ==True: writenode.append(line.replace(",",""))

點集寫出

接下來可以將我們的點資訊輸出另一個檔案:

f=open('point.txt','w') 
for i in writenode:
    f.write(i)
f.close()

重新讀入生成numpy array

a = np.loadtxt('zz.txt') 
a = np.around(a)
#四捨五入,可能出現一些不準的點,防止出問題 

刪除無關資訊

c= np.delete(a,0,axis=1)
#刪除第一列:各個點的標號[1,2,3,4,5...]
c= np.delete(c,2,axis=1)
#刪除Z座標,只需要統計xy座標

統計xy相同的點的個數

e = []
for (x,y) in (c):
#這裡如果直接統計列表是會報錯的,無法生成hash表所以要先生成這樣的陣列的型別,後面才好統計
    e.append((x,y))

然後做一個字典,記錄各個點的個數

h = {}
for i in e:
    h[i] = e.count(i)
print()

這樣就可以看到各個點的座標的個數了

{(-139.0, -18.0): 23,
 (199.0, -96.0): 23,
 (-199.0, -60.0): 23,
 (-182.0, -150.0): 23,
 (251.0, -60.0): 23,
 (-243.0, -102.0): 23,
 (208.0, 66.0): 23,...