binvox-rw-py icon indicating copy to clipboard operation
binvox-rw-py copied to clipboard

AttributeError: 'str' object has no attribute 'write'

Open tangaggie opened this issue 5 years ago • 4 comments

Hi, I modified some codes in 'write' of binvox_rw.py to resolve the error - 'AttributeError: 'str' object has no attribute 'write' , when executing the command - model.write('dilated.binvox'). Hope it helps.

def write(voxel_model, fp): """ Write binary binvox format.

Note that when saving a model in sparse (coordinate) format, it is first
converted to dense format.

Doesn't check if the model is 'sane'.

"""
if voxel_model.data.ndim==2:
    # TODO avoid conversion to dense
    dense_voxel_data = sparse_to_dense(voxel_model.data, voxel_model.dims)
else:
    dense_voxel_data = voxel_model.data
print('fp : ', fp)
with open(fp, 'w') as fw:
    fw.write('#binvox 1\n')
    fw.write('dim '+' '.join(map(str, voxel_model.dims))+'\n')
    fw.write('translate '+' '.join(map(str, voxel_model.translate))+'\n')
    fw.write('scale '+str(voxel_model.scale)+'\n')
    fw.write('data\n')
    if not voxel_model.axis_order in ('xzy', 'xyz'):
       raise ValueError('Unsupported voxel model axis order')

    if voxel_model.axis_order=='xzy':
       voxels_flat = dense_voxel_data.flatten()
    elif voxel_model.axis_order=='xyz':
       voxels_flat = np.transpose(dense_voxel_data, (0, 2, 1)).flatten()

# keep a sort of state machine for writing run length encoding
    state = voxels_flat[0]
    ctr = 0
    for c in voxels_flat:
       if c==state:
           ctr += 1
        # if ctr hits max, dump
           if ctr==255:
              fw.write(chr(state))
              fw.write(chr(ctr))
              ctr = 0
       else:
          # if switch state, dump
           fw.write(chr(state))
           fw.write(chr(ctr))
           state = c
           ctr = 1
# flush out remainders
       if ctr > 0:
         fw.write(chr(state))
         fw.write(chr(ctr))

tangaggie avatar Dec 22 '18 07:12 tangaggie

thanks so much! this helped me a lot!

JohnNesbit avatar Apr 24 '19 21:04 JohnNesbit

after using the new write function,I encounter another problem.

i try to run the demo

import scipy.ndimage
scipy.ndimage.binary_dilation(model.data.copy(), output=model.data)
model.write('dilated.binvox')

the error is that

UnicodeEncodeError: 'gbk' codec can't encode character '\x80' in position 0: illegal multibyte sequence File "binvox_rw.py", line 289, in write fw.write(chr(ctr))

i try to fix it by changing "with open(fp, 'w') as fw:" into “with open(fp, 'w', encoding) as fw:” but still failed because i can't read the saved binvox file by

with open('dilated.binvox', 'rb') as f: model = binvox_rw.read_as_3d_array(f)

the error is that

Traceback (most recent call last): File "", line 2, in File "binvox_rw.py", line 147, in read_as_3d_array data = data.reshape(dims) ValueError: cannot reshape array of size 2717486 into shape (32,32,32)

tianyilt avatar Jan 17 '20 07:01 tianyilt

@tianyilt 请问你是否解决了这个问题,能告诉我一下解决方法吗

zougougou avatar Aug 09 '21 13:08 zougougou

binvox_rw io in decor-gan plays well and you can refer to this repository. @zougougou

@tianyilt 请问你是否解决了这个问题,能告诉我一下解决方法吗

tianyilt avatar Oct 07 '21 15:10 tianyilt