0

次のビューを呼び出し可能なピラミッド/Pythonアプリケーションがあります。

@view_config(route_name='home_page', renderer='templates/edit.pt')
def home_page(request):
    if 'form.submitted' in request.params:
        name= request.params['name']

        input_file=request.POST['stl'].file
        vertices, normals = [],[]
        if input_file.read(5) == b'solid':
            for line in input_file:
                parts = line.split()
                if parts[0] == 'vertex':
                    vertices.append(map(float, parts[1:4]))
                elif parts[0] == 'facet':
                    normals.append(map(float, parts[2:5]))

            ordering=[]
            N=len(normals)
            for i in range(0,N):
                ordering.append([3*i,3*i+1,3*i+2])
            data=[vertices,ordering]
        else:
            f=input_file
            points=[]
            triangles=[]
            normals=[]
            def unpack (f, sig, l):
                s = f.read (l)
                fb.append(s)
                return struct.unpack(sig, s)

            def read_triangle(f):
                n = unpack(f,"<3f", 12)
                p1 = unpack(f,"<3f", 12)
                p2 = unpack(f,"<3f", 12)
                p3 = unpack(f,"<3f", 12)
                b = unpack(f,"<h", 2)

                normals.append(n)
                l = len(points)
                points.append(p1)
                points.append(p2)
                points.append(p3)
                triangles.append((l, l+1, l+2))
                #bytecount.append(b[0])


            def read_length(f):
                length = struct.unpack("@i", f.read(4))
                return length[0]

            def read_header(f):
                f.seek(f.tell()+80)


            read_header(f)
            l = read_length(f)

            try:
                while True:
                   read_triangle(f)
            #except Exception, e:
                #print "Exception",e[0]

            #write_as_ascii(outfilename)
            data=[points,triangles]


        jsdata=json.dumps(data)
        renderer_dict = dict(name=name,data=jsdata)

        path=shortuuid.uuid()
        html_string = render('tutorial:templates/view.pt', renderer_dict, request=request)
        s3=boto.connect_s3(aws_access_key_id = 'AKIAIJB6L7Q', aws_secret_access_key = 'sId01dYCMhl0wX' )
        bucket=s3.get_bucket('cubes.supercuber.com')
        k=Key(bucket)
        k.key='%(path)s' % {'path':path}
        k.set_contents_from_string(html_string, headers={'Content-Type': 'text/html'})
        k.set_acl('public-read')

        return HTTPFound(location="http://cubes.supercuber.com/%(path)s" % {'path':path})

    return {}  

ご覧のとおり、コードはアップロードされたstlファイルがASCII(「solid」という単語で始まる場合)かバイナリかをチェックします。そのASCIIの場合、すべてが正常に機能し、データ変数は頂点と順序で埋められます。ただし、solidで始まっておらず、バイナリstlファイルである場合、データ変数が入力されることはありません。どうしてこれなの?

4

1 に答える 1

1

最初の5バイトを読み取ってファイルタイプを確認しますが、ファイルの位置を先頭にリセットすることはありません。

に呼び出しを追加します.seek(0)

f=input_file
f.seek(0)

あなたはいつでも:への呼び出しなしで比較的求めることができますf.tell()

f.seek(80, 1)  # relative seek, you can use `os.SEEK_CUR` as well.
于 2013-03-19T17:19:01.437 に答える