User Tools

Site Tools


lea_antunes:solution_homework1

Binome :

Lea Antunes
Mathieu Schaeffer

ps : Mathieu Schaeffer n'a toujours pas recu ses codes d'identifications. (mat.schaeff@gmail.com)

from tulip import *
import time
def main(graph): 
viewBorderColor =  graph.getColorProperty("viewBorderColor")
viewBorderWidth =  graph.getDoubleProperty("viewBorderWidth")
viewColor =  graph.getColorProperty("viewColor")
viewFont =  graph.getStringProperty("viewFont")
viewFontSize =  graph.getIntegerProperty("viewFontSize")
viewLabel =  graph.getStringProperty("viewLabel")
viewLabelBorderColor =  graph.getColorProperty("viewLabelBorderColor")
viewLabelBorderWidth =  graph.getDoubleProperty("viewLabelBorderWidth")
viewLabelColor =  graph.getColorProperty("viewLabelColor")
viewLabelPosition =  graph.getIntegerProperty("viewLabelPosition")
viewLayout =  graph.getLayoutProperty("viewLayout")
viewMetaGraph =  graph.getGraphProperty("viewMetaGraph")
viewMetric =  graph.getDoubleProperty("viewMetric")
viewRotation =  graph.getDoubleProperty("viewRotation")
viewSelection =  graph.getBooleanProperty("viewSelection")
viewShape =  graph.getIntegerProperty("viewShape")
viewSize =  graph.getSizeProperty("viewSize")
viewSrcAnchorShape =  graph.getIntegerProperty("viewSrcAnchorShape")
viewSrcAnchorSize =  graph.getSizeProperty("viewSrcAnchorSize")
viewTexture =  graph.getStringProperty("viewTexture")
viewTgtAnchorShape =  graph.getIntegerProperty("viewTgtAnchorShape")
viewTgtAnchorSize =  graph.getSizeProperty("viewTgtAnchorSize")

# —————- # FONCTIONS # —————-

# Fonctions Parcours_Profondeur et PP_Visit permettent un parcours en profondeur du graphe a partir de la racine (first) de maniere a recuperer le nombre d'extremites du graphe et le pere de chaque noeud

def PP_Visit(x,Pere,nb_extremite,vu):
	vu[x] = 1
	for node in graph.getInOutNodes(x):	# itere sur les voisins de node
		if vu[node]==0:
			Pere[node]=x		# enregistre x comme le pere de node
			PP_Visit(node,Pere,nb_extremite,vu)
	vu[x] = 2
	if x != first :					# lorsque tous les fils sont visites, si le noeud n'est pas la racine
		nb_extremite[Pere[x]]+=nb_extremite[x] # on ajoute au nombre d'extremite du pere le nombre d'extremites qu'il y a dans sa descendance du fils(x) 

def Parcours_Profondeur(graph, nb_extremite, Pere):
	vu={}
	for nod in graph.getNodes():			# initialise
		nb_extremite[nod]=0			# le nombre d'extremites dans la descendance de chaque noeud = 0
		vu[nod] = 0
		if graph.deg(nod)==1 and (nod != first): # si le noeud a un degre = 1, le noeud est une extremite,sauf la racine
			nb_extremite[nod]=1		# la valeur de l'extremite de ce noeud est donc de 1
	for nodd in graph.getInOutNodes(first): # itere sur les voisins de la racine (first)
		if vu[nodd]==0:
			Pere[nodd]=first
			PP_Visit(nodd,Pere,nb_extremite,vu)
def NodeColor(u,nb_extremite):			# Code Couleur du nombre d'extremites de la descandance
	if nb_extremite[u]==1:
		viewColor[u]=tlp.Color(255,255,0,100)
	if nb_extremite[u]==2:
		viewColor[u]=tlp.Color(255,150,50,100)
	if nb_extremite[u]==3:
		viewColor[u]=tlp.Color(255,50,50,100)
	if nb_extremite[u]==4:
		viewColor[u]=tlp.Color(255,50,150,100)
	if nb_extremite[u]==5:
		viewColor[u]=tlp.Color(255,0,255,100)
	if nb_extremite[u]==6:
		viewColor[u]=tlp.Color(150,50,255,100)
	if nb_extremite[u]==7:
		viewColor[u]=tlp.Color(50,0,100,100)
	return viewColor[u]

# ————————————— # ICYCLEPLOT # —————————————

# Initialisation

first = graph.getOneNode()			# recupere un noeud dans le graphe : la racine
nb_extremite={}					# initialisation d'un dictionnaire : pour chaque noeud, on recupere le nombre d'extremites contenues dans la descendance
Pere={}						# initialisation d'un dictionnaire : pour chaque noeud, on recupere son pere
Parcours_Profondeur(graph, nb_extremite, Pere)	# parcours en profondeur du graphe pour recuperer les peres et le nombre d'extremites dans la descendance de chaque noeud

bubbleTreeParams = tlp.getDefaultPluginParameters("Bubble Tree", graph) #Application du plugin "Bubble Tree" pour un meilleur visuel
graph.applyLayoutAlgorithm("Bubble Tree", viewLayout, bubbleTreeParams)
updateVisualization(centerViews = True) #Mise a jour du visuel
time.sleep(0.5) 				#Ajout d'un temps de latence pour l'animation

for e in graph.getEdges():			#Reset des parametres graphiques des arretes en cas de relance du script
	viewLayout[e]=viewLayout.getEdgeDefaultValue()
	viewColor[e]=viewColor.getEdgeDefaultValue()
	viewBorderColor[e]=viewColor.getEdgeDefaultValue()
	
bbb=tlp.computeBoundingBox(graph) #Creation d'une bounding box encadrant le graphe, permettant de trouver le milieu pour placer notre Icicle 
largeur=bbb.width() 					#Largeur
X=(bbb[0][0]+bbb[1][0])/2				#Milieu des X
Y=(bbb[0][1]+bbb[1][1])/2				#Milieu des Y
larg=largeur/nb_extremite[first]			#Recuperation de la future taille d'une extremite en fonction de la largeur du graphe
hauteur=larg						#Future hauteur d'une extremite

# Parcours en Largeur # l'utilisation d'un algorithme de parcours en largeur pour la realisation d'un icicle plot permet de positionner chaque noeud l'un apres l'autre a chaque generation

for n in graph.getNodes():				# itere sur tous les noeuds du graphe
	viewColor[n]=tlp.Color.Black			# tous les noeuds passent a black (pas encore visite)
	viewBorderColor[n]=tlp.Color(0,0,0) # Ajout d'une bordure pour bien delimiter les noeuds
	viewBorderWidth[n]=2
	viewLabel[n]= str(n.id)				#Ajout du numero des noeuds au graphique
	
	
viewShape[first] = tlp.NodeShape.Square	# forme de la racine
viewLayout[first]= tlp.Coord(X,Y,0)			# coordonnees de la racine
viewSize[first]=tlp.Size(nb_extremite[first]*larg,hauteur,0)	# taille de la racine qui est fonction du nb d'extremites contenues dans sa descendance

updateVisualization(centerViews = True)

viewColor[first]= tlp.Color(0,255,0,100)
Q = [first]						# utilisation d'une file contenant les noeuds "en cours de visite" (les noeuds "green")
Q2 = [first]						# Utilisation d'une file pour identifier les noeuds d'une meme generation
couche=1						# Identification de la generation

while Q :
	node = Q[0]					# recupere le noeud en haut de la file
	cpt = 0						# Compte le cumul de la taille prises par les fils deja d?couverts
	for v in graph.getInOutNodes(node):
		if viewColor[v] == tlp.Color.Black: # si le noeud n'a pas ete visite
			viewColor[v] = tlp.Color(0,255,0,100)	# on le colorie en "green" (en cours de visite)
			X = viewSize[Pere[v]][0]	# taille du pere
			X2 = viewLayout[Pere[v]][0]	# coordonnee X du pere
			taille = nb_extremite[v]*larg	#taille d'un fils en fonction du nombre d'extremite de la descandance
			x = X2 - X/2 + taille/2 +cpt	# calcul de la coordonnee x 
			y = Y-couche*hauteur		# calcul de la coordonee y
			viewLayout[v]= tlp.Coord(x,y,0)	# place le noeud aux nouvelles coordonnees
			viewSize[v]=tlp.Size(taille,hauteur,0)	# applique la taille adequate
			viewShape[v] = tlp.NodeShape.Square #applique une forme rectangulaire
			cpt+=taille			# Incrementation de la taille du nouveau fils
			Q.append(v)			# ajoute le noeud a la file
			updateVisualization(centerViews = True)
			time.sleep(0.3)
	Q.pop(0)					# lorsque tous les fils du noeud ont ete visite (en cours de visite "green") on l'enleve de la liste
	viewColor[node]=tlp.Color(0,0,255,100)	# noeud de couleur "blue" (visite)
	viewColor[node]=NodeColor(node,nb_extremite)
	if not (set(Q2) & set(Q)) :		# Lorsque tous les fils d'une generation(Q2) ont ete visites et ne sont plus present dans la liste des noeuds decouvert(Q), on passe a la generation (couche) suivante
		Q2=list(Q)							
		couche+=1							
	updateVisualization(centerViews = True)
	time.sleep(0.3)
	
for e in graph.getEdges():				#Arretes rendues invisibles
	viewBorderColor[e]=tlp.Color(255,255,255)
	viewColor[e]=tlp.Color(255,255,255)
/net/html/perso/melancon/Visual_Analytics_Course/data/pages/lea_antunes/solution_homework1.txt · Last modified: 2014/10/20 17:48 by antunes