#!BPY
""" Released under the Blender Artistic Licence (BAL)
Name: 'POVtree (remdoubles)'
Blender: 232
Group: 'Import'
Tooltip: 'Import POVtree mesh (.inc)'
"""
__author__ = "pat"
__version__ = "1.21 - 07/11/05 -"
__email__ = ('Author, pat:psycho3d*de')
__url__ = ("Author's website, www.psycho3d.de")
__bpydoc__ ="""\
This script imports POVtree generated trees.

Note:<br>
Removing doubles makes importing much slower,
the bigger the file the longer it takes.<br>
There might be some "doubles" left depending on the limit you set when
removing doubles in Blender's EditMode.
"""

from Blender import NMesh
from Blender.Window import FileSelector

#returns a list of coordinates
def str2vert(input):
  input = input.split(",")
  for i in range(3):
    input[i] = float(input[i].strip(", "))
  return input

### main procedure
def import_POVtree(filename):
  file = open(filename, "r")
  incfile = file.read()
  file.close()

  folStart = incfile.find("#declare FOLIAGE")
  folEnd = incfile.find("#declare", folStart + 1)
  blosStart = incfile.find("#declare BLOSSOM")
  blosEnd = incfile.find("#declare", blosStart + 1)
  woodStart = incfile.find("#declare WOOD")
  woodEnd = incfile.find("#declare", woodStart + 1)

  if folStart != -1:
    trilist = []
    vertlist = []
    triEnd = folStart + 15
    triStart = incfile.find("triangle", triEnd, folEnd)
    while triStart != -1:
      triEnd = incfile.find("}", triStart)
      tri = []
      e = triStart
      for i in range(3):
        s = incfile.find("<", e) + 1
        e = incfile.find(">", s)
        newVert = incfile[s:e]
        try: # to append an existing vertex
          tri.append(vertlist.index(newVert))
        except ValueError:
          #vert doesn't exist, create new one
          tri.append(len(vertlist)) #that's the index of the current vert
          vertlist.append(newVert)
      trilist.append(tri)
      triStart = incfile.find("triangle", triEnd, folEnd)

    #create verts and faces from lists of strings and indices
    for i in range(len(vertlist)):
      v = str2vert(vertlist[i])
      vertlist[i] = NMesh.Vert(v[0], -v[2], -v[1])
    foliage = NMesh.New()
    foliage.verts.extend(vertlist)
    for i in range(len(trilist)):
      foliage.faces.append(NMesh.Face([ \
        vertlist[trilist[i][0]], \
        vertlist[trilist[i][1]], \
        vertlist[trilist[i][2]]]))
    NMesh.PutRaw(foliage)
    del foliage

  if blosStart != -1:
    trilist = []
    vertlist = []
    triEnd = blosStart + 15
    triStart = incfile.find("triangle", triEnd, blosEnd)
    while triStart != -1:
      triEnd = incfile.find("}", triStart)
      tri = []
      e = triStart
      for i in range(3):
        s = incfile.find("<", e) + 1
        e = incfile.find(">", s)
        newVert = incfile[s:e]
        try:
          tri.append(vertlist.index(newVert))
        except ValueError:
          tri.append(len(vertlist))
          vertlist.append(newVert)
      trilist.append(tri)
      triStart = incfile.find("triangle", triEnd, blosEnd)

    for i in range(len(vertlist)):
      v = str2vert(vertlist[i])
      vertlist[i] = NMesh.Vert(v[0], -v[2], -v[1])
    blossom = NMesh.New()
    blossom.verts.extend(vertlist)
    for i in range(len(trilist)):
      blossom.faces.append(NMesh.Face([ \
        vertlist[trilist[i][0]], \
        vertlist[trilist[i][1]], \
        vertlist[trilist[i][2]]]))
    NMesh.PutRaw(blossom)
    del blossom

  if woodStart != -1:
    trilist = []
    vertlist = []
    triEnd = woodStart + 12
    triStart = incfile.find("triangle", triEnd, woodEnd)
    while triStart != -1:
      triEnd = incfile.find("}", triStart)
      tri = []
      e = triStart
      for i in range(3):
        s = incfile.find("<", e) + 1
        e = incfile.find(">", s)
        newVert = incfile[s:e]
        try:
          tri.append(vertlist.index(newVert))
        except ValueError:
          tri.append(len(vertlist))
          vertlist.append(newVert)
      trilist.append(tri)
      triStart = incfile.find("triangle", triEnd, woodEnd)

    for i in range(len(vertlist)):
      v = str2vert(vertlist[i])
      vertlist[i] = NMesh.Vert(v[0], -v[2], -v[1])
    wood = NMesh.New()
    wood.verts.extend(vertlist)
    for i in range(len(trilist)):
      wood.faces.append(NMesh.Face([ \
        vertlist[trilist[i][0]], \
        vertlist[trilist[i][1]], \
        vertlist[trilist[i][2]]]))
    NMesh.PutRaw(wood)

### fileSelector callback
def f(filename):
  import_POVtree(filename)

##### script start #####
FileSelector(f, "Select POVtree .inc")
