

#S4 app3 - Modelisation et simulation mecanique pour realite virtuelle
#Developpeur - Brian Compagnat - comb2301
#            - Adriatik Sermaxhaj - sera1901
#
#Date creation: 2016-07-01
#Derniere modification: 2016-07-02

# Description: Script ajoutant les objets neccessaires et effectuant l'animation d'un train
# à suspension magnétique dans son environnement cible (la Suisse) à partir des données de 
# simulation numériques.

import bpy  
import math
import os

os.system('cls')

#Variables Globals
frameTotal = 330

ballPath = "C:\\Users\\adri_\\Desktop\\projects4\\Blender\\TetaTrainP4.txt" 
IncPath = "C:\\Users\\adri_\\Desktop\\projects4\\Blender\\TrajectoireP4.txt" 
train = bpy.data.objects["train"]
#-----------------------------------------------------

#Insert un keyframe pour l'objet au frame, a la position et rotation desiree
def insertKeyFrame(ob,frame,pos,rot):
        bpy.context.scene.frame_set(frame)
        ob.location = (pos[0],pos[1],pos[2])
        ob.rotation_euler = (rot[0],rot[1],rot[2])  
        ob.keyframe_insert(data_path="location", index=-1)
        ob.keyframe_insert("rotation_euler", index=-1)

def animeBall(pathName, ob):
    with open(pathName) as f: #Lecture du fichier ligne par ligne
        lines = f.readlines()
        frame=0
        for l in lines:
            l = l.replace(';',',')
            r = l.split(",")
            rot = (0,0,0)
            pos = [float(r[1])/5,float(r[0])/5 - 6,0.1]
            print('xpos',float(r[0]), '| zpos',float(r[1]))
            insertKeyFrame(ob,frame,pos,rot)
            frame+=1
            
def animeInclinaison(pathName, ob):
    with open(pathName) as f: #Lecture du fichier ligne par ligne
        lines = f.readlines()
        frame=0
        for l in lines:
            l = l.replace(';',',')
            r = l.split(",")
            rot = (0,0,0)
            pos = [0,0,0]
            print('xpos',float(r[0]), '| zpos',float(r[1]))
            insertKeyFrame(ob,frame,pos,rot)
            frame+=1
		

#Lecture du fichier Simulink genere et insertion de keyframe pour l'objet selectionne
def animeSimulink(pathName, ob):
    with open(pathName) as f: #Lecture du fichier ligne par ligne
        lines = f.readlines()
        frame=0
        for l in lines:
            l = l.replace(';',',')
            r = l.split(",")
            pos = [float(r[0]), 0, float(r[1])]
            rot = [0,float(r[2]),0]
            print('xpos',float(r[0]), '| zpos',float(r[1]), '| theta', float(r[2]))
            insertKeyFrame(ob,frame,pos,rot)
            frame+=1

def addSphere(name,rayon,x,y,z):
    bpy.ops.object.select_all(action='DESELECT')
    #Efface l'objet s'il y en a un du meme nom
    if name in bpy.data.objects:
        bpy.data.objects[name].select = True
        bpy.ops.object.delete()    
    #Ajout de la sphere et attribution du nom      
    bpy.ops.mesh.primitive_uv_sphere_add(size=rayon, location=(x,y,z))
    ob = bpy.context.object
    ob.name = name
    return ob
		

def main():
    train.location = (0,0,0)
    #insertKeyFrame(ob=train,frame=0,pos=(0,0,0),rot=(0,0,0))
    #insertKeyFrame(ob=train,frame=100,pos=(0,100,0),rot=(0,0,0))
    
    ballex = addSphere('ball1', 0.1 ,0, -6, 0.1)
    ballex.parent = train
    animeBall(ballPath,ballex)
    animeInclinaison(pathName, ob)
    
if __name__ == "__main__":
    main()