0

コードは次のとおりです。

import math
with open("test.stl") as file:
    vertices = [map(float, line.split()[1:4])
                for line in file
                if line.lstrip().startswith('vertex')]

    normals = [map(float, line.split()[2:5])
                for line in file
                if line.lstrip().startswith('facet')]

V=len(vertices)
ordering=[]
N=len(normals)

for i in range(0,N):
    p1=vertices[3*i]
    p2=vertices[3*i+1]
    p3=verticies[3*i+2]
    print p1

    x1=p1[0]
    y1=p1[1]
    z1=p1[2]

    x2=p2[0]
    y2=p2[1]
    z2=p2[2]

    x3=p3[0]
    y3=p3[1]
    z3=p3[2]

    a=[x2-x1,y2-y1,z2-z1]
    b=[x3-x1,y3-y1,z3-z1]

    a1=x2-x1
    a2=y2-y1
    a3=z2-z1
    b1=x3-x1
    b2=y3-y1
    b3=z3-z1

    normal=normals[i]

    cross_vector=[a2*b3-a3*b2,a3*b1-a1*b3,a1*b2-a2*b1]

    if cross_vector==normal:
        ordering.append([i,i+1,i+2])
    else:
        ordering.append([i,i+2,i+1])
print ordering
print cross_vector

for ループ内に print p1 (または cross_vector などの他の変数) を追加しようとすると、エラーは発生しませんが出力はありません。 「(変数名)」が定義されていません。したがって、これらの変数が定義されていない場合、明らかに、順序付け配列は [] (空白) として出力されます。どうすればこれを変更できますか。変数は、定義する前に宣言する必要がありますか?

編集:上記のコードを実行したときのエラー出力は次のとおりです。

Traceback (most recent call last):
  File "convert.py", line 52, in <module>
    print cross_vector
NameError: name 'cross_vector' is not defined

上記で説明したように、これは for ループで定義された変数で発生します。例として cross_vector を使用しています。

4

3 に答える 3

6

この行:

vertices = [map(float, line.split()[1:4])
            for line in file
            if line.lstrip().startswith('vertex')]

ファイル内のすべての行を読み取ります。その後、ファイルの最後に到達し、読み取るものは何も残っていません。そう

normals = [map(float, line.split()[2:5])
            for line in file
            if line.lstrip().startswith('facet')]

空です ( normals == [])。したがって

N=len(normals)

0 に設定Nします。これは、次のループを意味します。

for i in range(0,N):

実行されることはありません。そのため、内部から印刷しても何もしません。ループは実行されていません。

于 2013-01-13T20:24:43.230 に答える
3

DSM によって診断された問題を解決するには、次を使用します。

import math
import itertools
with open("test.stl") as file:
    i1, i2 = itertools.tee(file)
    vertices = [map(float, line.split()[1:4])
                for line in i1
                if line.lstrip().startswith('vertex')]

    normals = [map(float, line.split()[2:5])
                for line in i2
                if line.lstrip().startswith('facet')]

また、大きなファイルのメモリを節約するために、リスト内包表記を試して削除し、全体でイテレータを操作することもできます。


編集:

現時点では、ファイル全体をメモリにロードしてから、さらに 2 つの完全なサイズのリストをメモリに作成します。代わりに、必要に応じてメモリ内のファイルからのみ読み取る方法で書き込むことができます。例として、リスト内包表記をジェネレーター内包表記に置き換えることができます。

import math
import itertools
with open("test.stl") as file:
    i1, i2 = itertools.tee(file)
    vertexIter = (map(float, line.split()[1:4])
                  for line in i1
                  if line.lstrip().startswith('vertex'))

    normalIter = (map(float, line.split()[2:5])
                  for line in i2
                  if line.lstrip().startswith('facet'))

ここでは、メモリの使用をまったく避けています。

これが役立つようにするには、ループを次のように置き換えることができる必要があります。

for i in range(0,N):
    p1=vertices[3*i]
    p2=vertices[3*i+1]
    p3=verticies[3*i+2]
    normal = normals[i]

    # processing

単一のイテレータに:

for normal, p1, p2, p3 in myMagicIterator:
    # processing

私がこれを行うと考えることができる1つの方法は次のとおりです。

myMagicIterator = itertools.izip(
    normalIter,
    itertools.islice(vertexIter, 0, 3),
    itertools.islice(vertexIter, 1, 3),
    itertools.islice(vertexIter, 2, 3)
)

以下に相当するイテレータは次のとおりです。

myNormalList = zip(normals, vertices[0::3], vertices[1::3], vertices[2::3])
于 2013-01-13T20:27:17.320 に答える
0

その外側 (for ループの前) に宣言して、何が起こるかを確認します。for ループでそれらを宣言しても問題ない場合でも、ループが実行されないときは、おそらくそれらの「デフォルト」値が必要です。

必要に応じて、もっと小さな例を投稿してみてください。

于 2013-01-13T20:25:05.347 に答える