Belirli bir geometrinin birim hücresini yaratan ve çoğaltabileceğim şekilde, onu kopyalayan oldukça karmaşık bir python programı yazdım. birim hücrenin 3x3x3 dizisi. Sonuç bir .stl olarak kaydedilir. Amaç, CAD kullanmak yerine bu yapıları doğrudan oluşturmaktı.Python ve VTK ile bellek yönetimi
Sorunum, hesaplama zamanının rahatsız edici olduğu (8x8x8 için ~ 2 dakika, genellikle ihtiyacım olandan daha küçüktür). En büyük sorun, 10x10x10'un bile mümkün olmadığıdır. VTK hemen bir hata atıyor "8 baytlık boyuttaki elemanların [büyük sayısının] atanması mümkün değil." Bu benim bellek yönetimimin yetersiz olduğuna (varolmayan) inanmamı sağlıyor.
vtkSmartPointer
hakkında okudum, ancak yalnızca C++ için açıklamalar bulabilir. vtkSmartPointer
python ile doğru şekilde nasıl kullanırım? C++ ile herhangi bir deneyimim olmadığını eklemeliyim. Program boyutundan dolayı bir MWE imkansızdır. İşte yerine benim algoritması boru hattının bir kısmının kısaltılmış örneğidir:
import vtk
appendFilter = vtk.vtkAppendPolyData()
# create all 12 struts and combine them into one object
for i in range(1, 13, 1):
tf = create_strut(i, node_dist, amp, d, sides, mode, render=False) # method that creates my unit cell out of 12 struts, parameters are irrelevant
appendFilter.AddInputData(tf.GetOutput())
appendFilter.Update()
# clean up poly data
cleanFilter = vtk.vtkCleanPolyData()
cleanFilter.SetInputConnection(appendFilter.GetOutputPort())
cleanFilter.Update()
# cut the cell to its right size
planes = plane_collection(node_dist) # method that generates 6 planes
clip = vtk.vtkClipClosedSurface()
clip.SetInputData(cleanFilter.GetOutput())
clip.SetClippingPlanes(planes)
clip.Update()
# assemble an array from the unit cell
array = duplicate_cells(clip, xyz[0], xyz[1], xyz[2], node_dist)
# save as .stl
data = array.GetOutputPort()
stlwriter = vtk.vtkSTLWriter()
stlwriter.SetInputConnection(data)
stlwriter.SetFileName("Z:/example.stl")
stlwriter.Update()
stlwriter.Write()
Bu benim filtrelerin çok kullanmak ve onları silme veya herhangi bir şey umurumda asla olduğunu göstermesi gerekmektedir. Belleğimi temizlemek için doğru/tercih edilen yol nedir?