Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 24/10/2014, à 22:11

ourobolos

[python]Mon premier script : multijeux

Bonjour|soir,

Un peu de contexte : je me suis pas mal aux jeux de société il y a quelques temps, et j'aime bien en avoir sur moi « au cas où » (apéro impromptu au hasard) sauf que trimballer des boites et des boites ça fait vite du volume et du poids.
Du coup j'ai préparé un tableur avec les jeux que je souhaitais intégrer, quelques formules pour concaténer/rassembler tout ça sur une seule page et un export csv.

Viens ensuite ce script python qui transforme tout ça en code LaTeX que je compile par la suite pour imprimer mes cartes personnalisées, pour obtenir un truc comme ça :
mini_141024095259577096.png

Le script fonctionne, sauf que c'est mon premier script python, que du coup j'ai probablement fait des trucs pas optimisés / mauvaises pratiques. En particulier je « sens » bien qu'il doit y avoir une manière de généraliser la gestion des quartiers (Q1,Q2 …)

#!/usr/bin/env python
import csv

carte_largeur	=	6.8
carte_hauteur	=	12
décalage		=	0.
bande_largeur	=	0.6
marge_encart =	0.15
marge_texte	=	0.15
divisions = 4
div=(carte_hauteur-marge_encart)/divisions
#nom_jeu		=	"nom du jeu"
#nom_carte	=	"nom de la carte"
#desc_carte = "description"
#couleur = "gray!20"

########################################################################
########################################################################
########################################################################

def carte_div(couleur,nom_jeu,nom_carte,desc_carte,place,x,y):
	# définit une subdivision de carte avec une couleur, un nom de jeu 
	# vertical sur le côté, un nom de carte et une description de la carte
	# place contrôle à quel endroit de la carte est placé la subdivision
	# x,y contrôle le placement dans la carte x,y
	#
	# rectangle coloré
	# titre jeu
	# encadrement de la subdivision
	# placement du
	# nom et description
	divier = r"""
	\fill[%s,rounded corners=0.1cm] (%s,%s) rectangle (%s,%s)
	node[rotate=90,above left,black,font=\large] {\textsc{%s}};
	\draw[rounded corners=0.1cm] (%s,%s) rectangle (%s,%s);
	\node[text width=(%s)*1cm,below right] at (%s,%s) 
	{{\Large %s}\\{\scriptsize\raggedleft %s\\}};
	""" % (couleur,    marge_encart+x*carte_largeur,marge_encart+place*div+y*carte_hauteur,    marge_encart+bande_largeur+x*carte_largeur-décalage,(place+1)*div+y*carte_hauteur-décalage,
			nom_jeu,
			marge_encart+x*carte_largeur,marge_encart+place*div+y*carte_hauteur,    carte_largeur-marge_encart+x*carte_largeur-décalage,(place+1)*div+y*carte_hauteur-décalage,
			carte_largeur-marge_encart-bande_largeur-2*marge_texte-0.3,   marge_texte+marge_encart+bande_largeur+x*carte_largeur-décalage,div-marge_texte+place*div+y*carte_hauteur-décalage+.1,
			nom_carte,desc_carte
			)
	return divier

def carte_pleine(num,x,y):
	# assemble 4 divisions pour une carte pleine à la position x,y
	# voir à généraliser l'import csv pour des divisions (nom de variable)
	#rounded corners=0.2cm,
	carte = r"""
	%% Carte numéro %s
	\draw[] (%s,%s) rectangle (%s,%s);
	""" % (num,x*carte_largeur,y*carte_hauteur,(x+1)*carte_largeur-décalage,(y+1)*carte_hauteur-décalage)
	#num = 0
	#for i in range(divisions):
	carte += carte_div(Q1_couleur[num],Q1_nom_jeu[num],Q1_nom_carte[num],Q1_desc_carte[num],3,x,y)
	carte += carte_div(Q2_couleur[num],Q2_nom_jeu[num],Q2_nom_carte[num],Q2_desc_carte[num],2,x,y)
	carte += carte_div(Q3_couleur[num],Q3_nom_jeu[num],Q3_nom_carte[num],Q3_desc_carte[num],1,x,y)
	carte += carte_div(Q4_couleur[num],Q4_nom_jeu[num],Q4_nom_carte[num],Q4_desc_carte[num],0,x,y)

	return carte

def pages(total_cartes,a,b):
	# distribue le total des cartes pour impression sur format A4
	pl = ""
	i,j=0,0
	for num_carte in range(total_cartes):
		pl += carte_pleine(num_carte,i%a,j%b)
		i+=1
		j+=1
		if (num_carte+1)%6 == 0 and num_carte > 0:
			if num_carte < total_cartes-6:
			#print(num_carte)
				pl+= r"""\end{tikzpicture}
			
	\begin{tikzpicture}	"""
	return pl


########################################################################
########################################################################
########################################################################


f = open("multicartes.csv")
# import des données, en faire une fonction avec des noms de variables généralisés ?
numero_carte 	= []

Q1_couleur		= []
Q1_nom_jeu		= []
Q1_nom_carte	= []
Q1_desc_carte	= []

Q2_couleur		= []
Q2_nom_jeu		= []
Q2_nom_carte	= []
Q2_desc_carte	= []

Q3_couleur		= []
Q3_nom_jeu		= []
Q3_nom_carte	= []
Q3_desc_carte	= []

Q4_couleur		= []
Q4_nom_jeu		= []
Q4_nom_carte	= []
Q4_desc_carte	= []

for row in csv.reader(f):
	numero_carte.append(row[0])
	
	Q1_couleur.append(row[1])
	Q1_nom_jeu.append(row[2])
	Q1_nom_carte.append(row[3])
	Q1_desc_carte.append(row[4])
	
	Q2_couleur.append(row[5])
	Q2_nom_jeu.append(row[6])
	Q2_nom_carte.append(row[7])
	Q2_desc_carte.append(row[8])
	
	Q3_couleur.append(row[9])
	Q3_nom_jeu.append(row[10])
	Q3_nom_carte.append(row[11])
	Q3_desc_carte.append(row[12])
	
	Q4_couleur.append(row[13])
	Q4_nom_jeu.append(row[14])
	Q4_nom_carte.append(row[15])
	Q4_desc_carte.append(row[16])
	
total_cartes=len(numero_carte)


########################################################################
########################################################################
########################################################################

with open("multicartes.tex","w") as variable:			# remise à zéro du fichier
    variable.write("")
    
with open("multicartes.tex","r+") as variable:		# en-tête latex
    variable.write(r"""
\documentclass[parskip]{scrartcl}
\usepackage[top=15mm,left=03mm,right=03mm]{geometry}
\usepackage[usenames, dvipsnames]{xcolor}
\usepackage{tikz}
\usepackage[utf8]{inputenc}
\usepackage{libertine}
\usepackage{pifont}
\usepackage{frcursive}

\begin{document}
	\begin{tikzpicture}
""")

with open("multicartes.tex","a") as variable:
	variable.write(pages(total_cartes,3,2))



with open("multicartes.tex","a") as variable:			# fin de fichier
	variable.write(r"""
	\end{tikzpicture}
\end{document}
""")

À vos critiques !

Hors ligne