Hi, I’d also like to provide the code I’m using. It covers the process of reconstructing the new particles and then warping them to generate a VTK file.
import shapeworks as sw
import pyvista as pv
import numpy as np
import os
# --------- Creating file for new mesh particles ((256, 3)) ------------
# Mean particles file loading
particles = np.loadtxt(r'C:\Users\Paula\Desktop\ARCHIVOS INVESTIGACION\Shapeworks_modelos\Etiqueta_1\creacion_modelo_base\mean_particles_2.particles')
# Eigenvectors folder path
folder = r"C:\Users\Paula\Desktop\ARCHIVOS INVESTIGACION\Shapeworks_modelos\Etiqueta_1\creacion_modelo_base\eigenvectors"
# Quantity of modes to use for reconstruction
n_modes = 64
# PCA Reconstructed image values (extracted from PCA component scores)
scores = np.array([-8.44069,-4.13383,-2.72596,-0.314619,-5.89917,-3.7897,4.76785,0.977776,-0.00548887,4.79821,-0.152873,-0.62478,0.15278,-0.266,-0.0415944,-0.6508,0.0303715,-1.36541,0.958535,0.468263,-0.675527,-0.59803,0.702887,-0.457504,-0.0244962,0.174829,-0.904587,1.49348,-0.110434,-0.26424,-0.85749,-0.175538,0.447883,-0.391096,1.21641,-1.2457,1.03426,-0.112783,0.179361,-0.821864,-0.848623,-0.55011,0.200428,0.00659176,0.430744,1.02361,-0.71389,0.295296,0.0974082,0.318745,-0.356043,0.026103,-0.0132103,0.217473,0.0640542,-0.123777,-0.322119,-0.512522,-0.369095,0.069574,-0.0316704,0.111362,-0.0652447,0], dtype=float) # (n_modes,)
# Name for recreated image
name = "imagen1_reconstruida6"
# Path for reocntructed image particles
reconstructed_particles_path = r"C:\Users\Paula\Desktop\ARCHIVOS INVESTIGACION\Reconstrucciones\\"+name+".txt"
# Loading eigenvectors
eigenvecs = []
for i in range(n_modes):
vec = np.loadtxt(f"{folder}\\eigenvector{i}.eval")
vec = vec.reshape(256, 3) # assures (256,3)
eigenvecs.append(vec)
eigenvecs = np.stack(eigenvecs, axis=0) # (n_modes, 256, 3)
# Applying formula: new mesh = media particles + sum(scores * eigenvectors)
delta = (scores[:, None, None] * eigenvecs).sum(axis=0) # (256,3)
reconstructed = particles + delta
# Estas particulas se usan en el warp para reconstruir la malla
np.savetxt(reconstructed_particles_path, reconstructed, fmt='%.6f', delimiter=' ')
# ------ Creating new vtk file with reconstructed mesh particles -----
DATA = r"C:\Users\Paula\Desktop\ARCHIVOS INVESTIGACION\Reconstrucciones"
os.environ["DATA"] = DATA
def warpMesh():
#malla de referencia exportada desde Shapeworks
reference_mesh = sw.Mesh(os.environ["DATA"] + "/mesh_warp/mean_mesh.vtk")
# Particulas generadas desde el archivo reconstrucción imagenes
particles = sw.ParticleSystem([reconstructed_particles_path]).ShapeAsPointSet(0)
warper = sw.MeshWarper()
warper.generateWarp(reference_mesh, particles)
# Warp the mesh using the same particles as the reference --> warped mesh should be close to the reference mesh
warped_mesh = warper.buildMesh(particles)
warped_mesh.write(os.environ["DATA"] + "//" + name + ".vtk")
warpMesh()
print("done")