#!/usr/bin/python3
#B. Vandeportaele 2022


import os
import sys

import re


debugActif=False

################################################################################
def loadVRMLFile(filename_in):    
    fin = open(filename_in, "r")
    filecontent=fin.read()
    fin.close()
    return filecontent
################################################################################
print('hello')
#filecontent=loadVRMLFile("Chariot_simplifie_sol.wrl")

#filecontent=loadVRMLFile("Chariot_simplifie_murs.wrl")
#filecontent=loadVRMLFile("Chariot_simplifie_murs_copies.wrl")
filecontent=loadVRMLFile("Chariot_simplifie_barre_haute.wrl")


#compte le nombre d'objets dans le fichier vrml:
nbobjects=filecontent.count("coordIndex")
print("nbobjects: "+str(nbobjects))

fileoutcontent=""

#print(filecontent)
ibegin=0
iend=len(filecontent)

nbobjects=1

for i in range(0,nbobjects):
##########################################################################""
    #ibegin=filecontent.find('coordIndex [')+len('coordIndex [')
    ibegin=filecontent.find('coordIndex [',ibegin)+len('coordIndex [') #chercher à partir de ibegin trouvé à l'objet précédent
    iend=filecontent.find(']',ibegin)

    print("objet numéro: "+str(i)+ " , traitement des caractères entre "+str(ibegin)+" et " +str(iend))

    coordIndex=filecontent[ibegin:iend];
    print('coordIndex:  '+coordIndex)


    ibegin=filecontent.find('point [',iend)+len('point [')
    iend=filecontent.find(']',ibegin)

    pointIndex=filecontent[ibegin:iend];
    #print('pointIndex:  '+pointIndex)


    #converti en une liste de int
    coords=coordIndex.split(',')
    print(type(coords))
    coordsint=[]  #liste des index des points utilisés
    facette=[]
    listefacette=[]
    for  c in coords:
        try:
        #if c.isdigit():
            intc=int(c)
            if intc not in coordsint:
                #print(str(intc)+" ajouté")
                coordsint.append(intc)
            if intc==-1: #fin de facette
                listefacette.append(facette)
                facette=[]
            else:
                facette.append(intc)
                
            #else:
                #print(str(intc)+" deja présent")
            #print((str(intc)))
        except ValueError:
            print("not an int")



    #converti en une liste de int

    #dégage les caractères \n
    #marche:
    #for x in range(len(pointIndex)):
    #    pointIndex = pointIndex.replace("\n","")

    #marche:
    #characters = "\n"
    #pointIndex = ''.join( x for x in pointIndex if x not in characters)

    pointIndex = re.sub("\\n"," ",pointIndex)

    #remplace plusieurs espaces par un seul
    #Au moins deux espaces" se note "[ ]{2,}" (les crochets sont facultatifs, mais ça permet de bien repérer l'espace)
    pointIndex= re.sub("[ ]{2,}", " ", pointIndex)

    points=pointIndex.split(',')

    newpoint=[]

    print("nombre de points initialement: "+str(len(points)))
          
    for  c in points:
        #print (c)
        #si c commence ou finit par un espace, les dégager
        if c[0]==' ': c=c[1:]
        if c[-1]==' ': c=c[:-1]    
        xyz=c.split(' ')
        #print(xyz)
        if len(xyz)==3:
            try:
                #la conversion en float ne marche pas si la chaine contient un int....
                #if 
                #print(c)
                #intc=float(c)
                newpoint.append([float(xyz[0]),float(xyz[1]),float(xyz[2])])
                #cptpoints=cptpoints+1
                #if cptpoints==3:
                #    cptpoints=0
                #pointsint.append(newpoint)
                #print(str(newpoint)+" ajouté")
                #    newpoint=[]            
            except ValueError:
                print("not an float")
        else:
            print("not a 3D point: " + c)


    coordsint.sort()
    valuemoins1=coordsint.pop(0) #remove the first value -1
    print(type(coordsint))
    newindex=0
    #génère une liste de tuple correspondance
    coorrespondances=[]
    #génère une liste de  correspondance
    print("max index: "+str(max(coordsint)))
    lstcorrrespondances = [-1] * (max(coordsint)+1)
    for  c in coordsint:
        coorrespondances.append((c,newindex))
        lstcorrrespondances[c]=newindex
        newindex=newindex+1
        
    print(coorrespondances)


    #https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Primitive_Solids#polyhedron
    #polyhedron( points = [ [X0, Y0, Z0], [X1, Y1, Z1], ... ], faces = [ [P0, P1, P2, P3, ...], ... ], convexity = N);   // 2014.03 & later
    #indice des points commence à 0
    '''
    exemple:

    polyhedron(
      points=[ [10,10,0],[10,-10,0],[-10,-10,0],[-10,10,0], // the four points at base
               [0,0,10]  ],                                 // the apex point 
      faces=[ [0,1,4],[1,2,4],[2,3,4],[3,0,4],              // each triangle side
                  [1,0,3],[2,1,3] ]                         // two triangles for square base
     );
    '''

    fileoutcontent+= """polyhedron(
      points=[ """

    for c in coordsint:
        print("traitement point: "+str(c))
        fileoutcontent+="[ "+str( newpoint[c][0]) +","+str( newpoint[c][1]) +","+str( newpoint[c][2]) +"],\n"
    #retire la dernière virgule et retour à la ligne en trop
    fileoutcontent=fileoutcontent[:-2]   +"""  ],   
      faces=[  """

    for  facette in listefacette:
        print("traitement facette: "+str(facette))
        #filecontent+="[ "+str( newpoint[c][0]) +","+str( newpoint[c][1]) +","+str( newpoint[c][2]) +"],\n"
        fileoutcontent+="[ "
        for p in facette:
            #fileoutcontent+=" " + str(p) + ", "
            fileoutcontent+=" " + str(lstcorrrespondances[p]) + ", "
        #retire la dernière virgule et espace en trop
        fileoutcontent=fileoutcontent[:-2]   +" ],\n"



    #retire la dernière virgule et retour à la ligne en trop
    fileoutcontent=fileoutcontent[:-2]   +"""   ]                        
     );"""
##########################################################################""
if len(fileoutcontent)<3000:
  print(fileoutcontent)


fout = open("exportedfromwrl2polyhedron.scad", "w")
fout.write(fileoutcontent)
fout.close()
    
