Repository navigation
convert x,y,z format from double to float #71
Copy link
Copy link
Closed
Description
Hi,
I'v been trying to use this library to convert my files' x, y, z, nx, ny, nz from double to float but I think i'm missing something.
- I tried to first make a copy of my input then use instance mutability but saving went wrong
- the second thing I was aiming for is iterating through those fields' columns and convert each to float but then I didn't know how to write the new data.
I hope you can help me with this 🙏
To clarify my questions after you read my script below:
- Is it possible to achieve the conversion?
- If so, How can I iterate through numpy.array to do it following 1st method?
- How can I save it following the second method?
- Which approach you would say is cleaner/faster/easier?
thank you in advance!
import numpy as np
from plyfile import PlyData, PlyElement, PlyProperty
input_mesh = PlyData.read('default.ply')
##################################### mutability approach #######################################
# copy input file
converted_mesh = input_mesh
vx = converted_mesh['vertex']
vx.properties = ()
vx.data.dtype.names = ['x', 'y', 'z', 'nx', 'ny', 'nz', 'red', 'green', 'blue']
# elements of vertex have to be float instead of double
vx.properties = (PlyProperty('x', 'float'), PlyProperty('y', 'float'), PlyProperty('z', 'float'),
PlyProperty('nx', 'float'), PlyProperty('ny', 'float'), PlyProperty('nz', 'float'),
PlyProperty('red', 'uchar'), PlyProperty('green', 'uchar'), PlyProperty('blue', 'uchar'))
xcol = input_mesh['vertex']['x']
ycol = input_mesh['vertex']['y']
zcol = input_mesh['vertex']['z']
nxcol = input_mesh['vertex']['nx']
nycol = input_mesh['vertex']['ny']
nzcol = input_mesh['vertex']['nz']
# convert double to float and append to new file
for i in range(len(xcol)):
x = np.format_float_positional(np.float32(xcol[i]), precision=6)
y = np.format_float_positional(np.float32(ycol[i]), precision=6)
z = np.format_float_positional(np.float32(zcol[i]), precision=6)
nx = np.format_float_positional(np.float32(nxcol[i]), precision=6)
ny = np.format_float_positional(np.float32(nycol[i]), precision=6)
nz = np.format_float_positional(np.float32(nzcol[i]), precision=6)
converted_mesh['vertex']['x'][i] = x
converted_mesh['vertex']['y'][i] = y
converted_mesh['vertex']['z'][i] = z
converted_mesh['vertex']['nx'][i] = nx
converted_mesh['vertex']['ny'][i] = ny
converted_mesh['vertex']['nz'][i] = nz
# RGB elements are kept the same
converted_mesh['vertex']['red'] = input_mesh['vertex']['red']
converted_mesh['vertex']['green'] = input_mesh['vertex']['green']
converted_mesh['vertex']['blue'] = input_mesh['vertex']['blue']
## I don't know how to save it this way
## and the other method below of PlyElement.describe() ends up in a TypeError: only numpy arrays are supported
# el = PlyElement.describe(converted_mesh['vertex'], 'vertex')
# el = PlyElement.describe(converted_mesh['face'], 'face')
# PlyData([el], text=True).write('converted_file.ply')
################################## make changes directly to the input file ######################################
for i in range(len(xcol)):
xcol[i] = np.format_float_positional(np.float32(xcol[i]), precision=6)
ycol[i] = np.format_float_positional(np.float32(ycol[i]), precision=6)
zcol[i] = np.format_float_positional(np.float32(zcol[i]), precision=6)
nxcol[i] = np.format_float_positional(np.float32(nxcol[i]), precision=6)
nycol[i] = np.format_float_positional(np.float32(nycol[i]), precision=6)
nzcol[i] = np.format_float_positional(np.float32(nzcol[i]), precision=6)
## I don't know where to go from here, how do I save it?
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels
Activity
dranjan commentedon Jul 29, 2023
Maybe this is oversimplified for your use case, but here's an example of what I think you want. In this one, I'm converting "x", "y", and "z" from float to double.
It should be enough simply to change the types in the
PlyPropertymetadata, which will force the data to be cast when writing. If that works for you, it's probably the simplest method.