[docs]classMem3dgConverter(TrajectoryConverter):def__init__(self,input_data:Mem3dgData,):""" Parameters ---------- input_data : Mem3dgData An object containing info for reading Mem3DG simulation trajectory output """self._data=self._read(input_data)
[docs]defwrite_to_obj(self,filepath,data,frame):# Extract XYZ coordinates for verticescoordinates=np.array(data.groups["Trajectory"].variables["coordinates"][frame])coordinates=np.reshape(coordinates,(-1,3))# Extract indices of vertices to make faces (all triangles)topology=np.array(data.groups["Trajectory"].variables["topology"][frame])topology=np.reshape(topology,(-1,3))# change indices to be 1 indexed instead of 0 indexed for .obj filestopology+=1# Generate one .obj file per framewithopen(filepath,"w")asfile:file.write(f"# Frame {frame}\n")forvincoordinates:file.write(f"v {v[0]}{v[1]}{v[2]}\n")fortintopology:file.write(f"f {t[0]}{t[1]}{t[2]}\n")
def_read_traj_data(self,input_data:Mem3dgData)->AgentData:try:data=Dataset(input_data.input_file_path,"r")n_frames=np.size(data.groups["Trajectory"].variables["time"])exceptExceptionase:raiseInputDataError(f"Error reading input Mem3DG data: {e}")# for now, we are representing converted Mem3DG trajectories as one# unique mesh agent per framedimensions=DimensionData(total_steps=n_frames,max_agents=1)agent_data=AgentData.from_dimensions(dimensions)agent_data.n_timesteps=n_framesbase_agent_name=input_data.agent_nameor"object"forframeinrange(n_frames):agent_data.times[frame]=data.groups["Trajectory"].variables["time"][frame]agent_data.n_agents[frame]=1output_file_path=Path(input_data.output_obj_file_path)/f"{frame}.obj"self.write_to_obj(output_file_path,data,frame)agent_data.radii[frame][0]=input_data.meta_data.scale_factoragent_data.unique_ids[frame][0]=framename=str(frame)agent_data.types[frame].append(name)object_display_data=DisplayData(name=f"{base_agent_name}#frame{frame}",display_type=DISPLAY_TYPE.OBJ,url=f"{frame}.obj",color=input_data.agent_color,)agent_data.display_data[name]=object_display_datareturnagent_datadef_read(self,input_data:Mem3dgData)->TrajectoryData:""" Return a TrajectoryData object containing the Mem3DG data """print("Reading Mem3DG Data -------------")ifinput_data.meta_data.scale_factorisNone:input_data.meta_data.scale_factor=1.0agent_data=self._read_traj_data(input_data)input_data.spatial_units.multiply(1.0/input_data.meta_data.scale_factor)input_data.meta_data._set_box_size()result=TrajectoryData(meta_data=input_data.meta_data,agent_data=agent_data,time_units=input_data.time_units,spatial_units=input_data.spatial_units,plots=input_data.plots,)returnresult