2015-05-09 2 views
0

Я хочу, чтобы кодировать 3D-модели с помощью этого текстового синтаксиса-структуры в Blender:Encode сетки из текстового файла

<p> 
c(255,84,22) 
fs(-1) 
p(-9,-8,27) 
p(-9,-23,27) 
p(-7,-24,63) 
p(-7,-11,63) 
</p> 

Что релевантно для создания сетки являются следующие:

  • <p> отмечает лицо-контейнер (например, в HTMLs)

  • c маркирует цвет

  • p отмечает координаты вершин (мин. 3 в каждой грани-контейнера)
  • </p> отмечает конец лица
  • fs: игнорировать это

Очевидно, что сетка содержит много этих граней контейнеров, так что это будет на самом деле нужно потратить время на создание этой сетки вручную. Я написал уже рабочий скрипт, но он извлекает только координаты и не содержит лиц.

Теперь я хочу, чтобы реализовать это лицо, так что я расширил сценарий, но он не работает:

faces = [] #Array, where all the vertex Indecies from curFace are stored 
verts = [] #Array, where all the vertex coordinates from coords are stored 
vertIndex = 0 
with open(filepath, 'r') as file: 
for line in file: 
    if not line.startswith('<p>'): 
     continue #Skip lines which don't contain a <p> 
    if line.startswith('<p>'): 
     curFace = [] 
     for container in line: #Do a loop while </p> is reached 
      if container.startswith('p'): 
       coords = container.strip('\np()/ ').split(',') #Remove certain characters and split line into 3 parts (XYZ) 
       coords = list(map(float, coords)) 
       verts.append(coords) #Send the vertex coordinates from the current face to verts[] 
       curFace.append(vertIndex) 
       vertIndex += 1 
      elif container.startswith('</p>'): 
       faces.append(curFace) #Send the vertex Indecies from the current face to faces[] 
       break #Stop the face-for-loop and return to main line-for-loop 
      elif not container.startswith('p') or not container.startswith('</p>'): 
       continue #Skip lines in the container which don't start with 'p' or '</p>' 
mesh.from_pydata(verts,[],faces) #Create the entire mesh with the arrays 

P.S .: Это лишь выдержка из основной части. Консоль не показывает ошибок. Может ли кто-нибудь помочь мне здесь?

ответ

0

Если ваши данные образца соответствуют вашему файлу, основная логика ваших циклов отсутствует.

Логика ваших циклов зависит от всех данных лица, находящихся на одной линии.

with open(filepath, 'r') as file: 
    for line in file: 
     # the following is done for each line 
     if not line.startswith('<p>'): 
      # if the line doesn't start with <p> go to next line 
      continue 
     if line.startswith('<p>'): 
      # if line starts with <p> do the following with 
      # the rest of the line 
      curFace = [] 
      for face in line: # here your are still on the line with <p> 
       if line.startswith('p'): # your still on the first line 
        # before this you need to get the next line from the file 
        coords = line.strip('\np()/ ').split(',')