问题描述
在obj文件转化为pcb文件的代码中,需要先读取obj文件,在f(面face)行中数据格式为:
f Vertex1/Texture1/Normal1 Vertex2/Texture2/Normal2 Vertex3/Texture3/Normal3
属于这个面的顶点、纹理坐标和法向量的索引号,整数,也就是以上顶点、纹理坐标和法向量的顺序。这里使用的obj文件中f只含有其中两个坐标的信息,也就是
f Vertex1/Texture1 Vertex2/Texture2 Vertex3/Texture3,所以会出现‘1/1‘
定位错误代码
if strs[0] == "f":
faces.append((int(strs[1]), int(strs[2]), int(strs[3])))
报错的大致意思是字符串‘1/1’不能转化为int型数据,出现这种错误的原因大概是搬运的这个代码所使用的obj文件中f只有一个数字,也就是只有顶点坐标;而我使用的obj文件不仅有顶点索引号,还有纹理坐标、法向量等信息。
解决方法
看了网上的方法,大都是说要先把str转化为float,然后再int(),试了之后发现会报类似的错误:ValueError: could not convert string to float: ‘1/1’
一个可以消除错误的处理方式是:
if strs[0] == "f":
faces.append((int(eval(strs[1])), int(eval(strs[2])), int(eval(strs[3]))))
虽然这样可以消除error,但是会得到错误的结果:eval函数的功能是执行一个字符串表达式,并返回表达式的值,这里的字符串会被当成表达式处理,也就是序号相除得到一个数值,但这并不是我们期望提取的数据。
因此正确的解决方式就是只提取第一个数字,也就是顶点序号:
faces.append((int(strs[1].split('/')[0]), int(strs[2].split('/')[0]), int(strs[3].split('/')[0])))
借助split字符串分割函数,over。