This is a very simple issue but I am making it needlessly complex and continue to hit road blocks.
I am trying to parse a simple text file which contains point cloud information, x, y, z.
It looks like this:
vertices:
v -543.243 -494.262 1282
v -538.79 -494.262 1282
v -536.422 -496.19 1287
v -531.951 -496.19 1287
v -527.481 -496.19 1287
v -213.909 -223.999 581
v -212.255 -224.384 582
v -209.15 -223.228 579
v -207.855 -223.999 581
v -205.482 -223.613 580
v -203.468 -223.613 580
v -201.106 -223.228 579
v -199.439 -223.613 580
v -197.765 -223.999 581
v -195.41 -223.613 580
v -193.062 -223.228 579
v -190.721 -222.842 578
v -189.04 -223.228 579
v -187.998 -224.384 582
v -185.976 -224.384 582
v -183.955 -224.384 582
v -181.621 -223.999 581
v -179.293 -223.613 580
v -177.279 -223.613 580
v -175.264 -223.613 580
v -173.549 -223.999 581
v -171.531 -223.999 581
v -169.513 -223.999 581
v -167.495 -223.999 581
v -165.761 -224.384 582
v -163.74 -224.384 582
v -161.718 -224.384 582
v -159.697 -224.384 582
v -157.946 -224.77 583
v -155.921 -224.77 583
v -153.896 -224.77 583
v -151.871 -224.77 583
v -149.847 -224.77 583
v -147.568 -224.384 582
Right okay. Not so bad.
Next I am using python in blender to convert these points into vertices:
It looks like so: `
#Open the file
try:
f=open(path, 'r')
except:
print ("Path is not Valid")
#Create an array of
verts = []
#verts=[float(e) for e in verts if e]
#values = []
for line in f:
lines = f.readline()
#values = ([c for c in lines if c in '-1234567890.'])
if line.startswith("v "): #Go through file line by line
read = lines.strip(' v\n').split(',') #remove the v,split@,
#read = values.split(',')
#loop over all stuff in read, remove non-numerics
for d in read:
d= d.strip('-').split(' ')
print("d:", (d))
for n in d:
n = n.strip('-')
verts = verts.append(float(n[0]))
#verts = verts.append(float(n[2]))
#verts = verts.append(float(n[3]))
print("vertsloops", d[0])
print("read1", read[0])
print(read)
print("oo1verts", verts)
##################
#Extend the array#
#print ("Could not use the line reading: %s"%read)
# Create a new mesh, it is now empty
mesh = bpy.data.meshes.new("Cube")
# Create empty vertices field in the mesh
mesh.vertices.add(len(verts))
# Add vertices
mesh.vertices.foreach_set("co", verts)
#Add a new empty object named "Read the PointCloud Data"
obj = bpy.data.objects.new("Read the PointCloud Data", mesh)
# Link object to current scene
bpy.context.scene.objects.link(obj)
`
Somehow, I have tried many different combinations of splitting the string, but still getting errors. I know this is a simple task!?! Any Advice please!
The errors I get look at first like:
d: ['-536.422', '-496.19', '1287']
Traceback (most recent call last):
File "/Users/.../importpoints.blend/importpoints", line 37, in <module>
ValueError: could not convert string to float: '-'
Error: Python script fail, look in the console for now...
And Then like so :
d: ['536.422', '-496.19', '1287']
vertsloops 536.422
Traceback (most recent call last):
File "/Users/.../importpoints.blend/importpoints", line 37, in <module>
AttributeError: 'NoneType' object has no attribute 'append'
Error: Python script fail, look in the console for now...
One thing is, how come float('-531') won't be handled as a negative number. As it stands, it hits the '-' sting and considers it non-numeric so it cannot convert it. But its negative, so how can I indicate that???
Thanks.
Make your reading a bit shorter:
This should replace your full
for line in f:
loop. Make sure there is no other line later starting withv
in your file. Maybe there is an empty line after the values, so you can stop reading there.Now
verts
looks like this: