% Utilitaires de visualisation de routes

:- module(util_visu,[ouvre_fen/0,cree/2,cree/3,visu_raz/0,deplace/2,deplace/3]).


:-dynamic(table_ref/3)
	.
ouvre_fen :- new(@p,picture('Route')), send(@p,open).

% Paramétrage
% Longueur et largeur des véhicules selon leur type
% div(Type,Longueur, Largeur)
dim(voiture, 30,18).
dim(moto,20,8).
dim(camion,40,25).
% longueur d'une "place" entre 2 véhicule et premiere place affichee au départ
dim(place,50).
premiere_place(50).
% Route : longueur, largeur et position en y du bord gauche (c'est à dire : haut)
dim(route,1000,80,100).
% Nom de la route
nom_route('RN13').



% Couleurs : traduction francais-anglais (pour xpce)
french2english(jaune,yellow).
french2english(rouge,red).
french2english(bleu,blue).
french2english(vert,green).

	       
% Création d'un véhicule. Il sera visualisé dans le bord haut gauche.
% Rem. on pourra donc avoir superposition de différents véhicules
cree(Nom,Type,Couleur) :-
  	dim(Type,W,H),
	member(Type,[voiture,camion, moto]),!,
	french2english(Couleur,Color),
  	new(Ref_box,box(W,H)),
  	new(Ref_tex,text(Nom)),
	assert(table_ref(Nom,Ref_box,Ref_tex)),
  	new(_,constraint(Ref_box,Ref_tex,identity(center))),
	send(@p,display,Ref_box),
	send(@p,display,Ref_tex),
	send(Ref_box,fill_pattern,colour(Color)).


% Création et visualisation de la route
cree(Nom,route) :-
	dim(route,Long,Larg,Pos),Y2 is Larg + Pos,
	new(@route,device),
	send(@route,display,
	     line(start_x := 0, start_y := Pos,end_x := Long, end_y:=Pos )),
	send(@route,display,
	     line(start_x := 0, start_y := Y2,end_x := Long, end_y:=Y2 )),
	send(@route,display,
	     text(Nom),point(10,Y2)),
	send(@p,display,@route).

% Remise à zero ("kill") des objets graphiques créés par les prédicats
% cree/2 (route) et cree/3 (véhicules).
visu_raz :-
	free(@route), fail.
visu_raz :-
	table_ref(_Nom,B,T),
	free(B), free(T),
	fail.
visu_raz :-
	retractall(table_ref(_,_,_)).


% Déplacement de l'objet B (donné par sa référence en tant qu'objet XPCE,
% pas paar son nom) à droite de N pixels

bouge(B,N) :-
	get(B,x,X),get(B,y,Y),
	X1 is X+N,
	send(B,move,point(X1,Y)).

% Déplacement "standard" de N places (N positif ou negatif) du véhicule de nom Nom 

deplace(Nom,N) :-
	dim(place,P),
	N1 is N*P,
	table_ref(Nom, B,_),
	bouge(B,N1).

% Positionnement en (X,Y) du véhicule nommé Nom
deplace(Nom,X,Y) :-
	table_ref(Nom, B,_),
	send(B,move,point(X,Y)).



