# -*- coding: iso-8859-1 -*-
from __future__ import division # 1/2 == .5 (par defaut, 1/2 == 0)

######################################
#
#    FICHIER DE CONFIGURATION
#
######################################
#
#    WxGeometrie
#    Dynamic geometry, graph plotter, and more for french mathematic teachers.
#    Copyright (C) 2005-2007  Nicolas Pourcelot
#
#    This program is free software; you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation; either version 2 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program; if not, write to the Free Software
#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
#
######################################

# Note :
# eviter d'utiliser des listes au maximum, preferer les tuples.
# en effet, il est souvent utile de copier les parametres.
# Mais par defaut, une liste n'est pas reellement copiee (il faut faire l2 = l1[:]).
# Si de plus, on utilise des listes de listes, on a vite fait d'obtenir des bugs etranges...

# Les valeurs suivantes ne doivent pas être enregistrées dans les préférences de l'utilisateur :
# - soit parce qu'il n'y aurait aucun sens à les sauver (__builtins__ par exemple)
# - soit parce qu'elles doivent être générées dynamiquement

# Numéro de version (et date de sa sortie)
version = "0.130 beta 3"
date_version = (2009, 9, 22)

valeurs_a_ne_pas_sauver = (
"valeurs_a_ne_pas_sauver",
"os",
"platform",
"__builtins__",
"python_version",
"getdefaultlocale",
"pi",
"python_version",
"version",
"date_version",
"time_version",
"plateforme",
"repertoire",
"py2exe",
"EMPLACEMENT",
"emplacements",
"erreurs_initialisation",
"a_mettre_a_jour",
"old_matplotlib",
)

import os
import platform
from sys import version_info as python_version_info, version as python_version
from locale import getdefaultlocale
from math import pi
from time import mktime
python_version = float(python_version[:3])


time_version = mktime(date_version + (0, 0, 0) + (0, 0, 0))

# Dernière vérification d'une éventuelle mise à jour
time_verification = time_version




# Détection de la configuration
plateforme = platform.system() #'Windows' ou 'Linux' par exemple.
repertoire = os.getcwd() # memorise le repertoire de lancement

py2exe = False # le programme tourne-t-il en version "executable" ?

EMPLACEMENT = "" # le répertoire contenant wxgéométrie.pyw (sera détecté dynamiquement)

erreurs_initialisation = "" # contiendra les éventuelles erreurs détectées lors de l'initialisation (à afficher une fois la console crée)

# Si le parametre suivant a la valeur True, le mode securite est enclenche et les macros ne sont executees qu'apres confirmation.
# De plus, les erreurs n'apparaissent plus, et le bouton recharger les librairies est masque.
# Ce parametre devrait valoir True par defaut dans les versions ulterieures.
# Pour l'instant, en attendant la gestion des macros, il vaut mieux le laisser sur False.

securite = False


# debuguage (affichage des erreurs + diverses infos)
debug = True
# affichage ou non des avertissements
warning = debug
fermeture_instantanee = False # Utile en mode développement

# affichage de la ligne de commande (utile pour le développement)
ligne_commande = debug


version_wxpython = "2.8-unicode"

if plateforme == 'Windows':
    # WxGéométrie n'est pas compatible avec WxPython 2.6 sous Windows
    version_wxpython = "2.6-unicode"


#version_numerix = "numpy"
#version_numerix = None
latex = False
latex_unicode = None  # (si la valeur est fixée à None, elle sera défini ultérieurement, après l'import de wx)

#if version_numerix is None:
#    try:
#        import numpy
#        version_numerix = "numpy"
#    except ImportError:
#        version_numerix = "Numeric"

moteur_de_rendu = 'WXAgg' # ou 'Wx' pour supprimer l'anti-crénêlage

### WxGtk 2.6.1.2 ne gère pas correctement les wx.BoxSizer (entre autres nombreux bugs)
##BugWxSizerGtk = (plateforme == "Linux")


# jeu de caractère à utiliser
encodage = getdefaultlocale()[1] or "utf8"
unicode = None # sera défini ultérieurement, après l'import de wx

# Utiliser pysco si disponible (JIT compiler qui accélère le code python)
# True -> tout compiler : psyco.full()
# None -> compilation optimisée : psyco.profile()
# False -> ne pas essayer d'importer psyco
charger_psyco = False

# Il n'est pas conseillé d'utiliser Psyco 1.5 sous Python 2.5 (cf. http://psyco.sourceforge.net/)
if python_version_info[:2]  == (2, 5) and charger_psyco is None:
    charger_psyco = False

# Modules a importer
# ----------------

modules = [
    "geometre",
    "traceur",
    "statistiques",
    "calculatrice",
    "probabilites",
    "surfaces",
    "scicalc",
        ]

try:
    import matplotlib
    old_matplotlib = not matplotlib.compare_versions(matplotlib.__version__, "0.98")
    very_old_matplotlib = not matplotlib.compare_versions(matplotlib.__version__, "0.91")
except Exception:
    old_matplotlib = True
    very_old_matplotlib = True
    print "Warning : param/__init__.py : matplotlib not found."

if not old_matplotlib and "surfaces" in modules:
    modules.remove("surfaces")


# Multi-threading pour les macros
# -------------------------------

multi_threading = False

# c'est assez instable...

if multi_threading is None:
    multi_threading = (plateforme == 'Windows') # ca ne marche pas avec le serveur X (sous Linux par ex.)


# Répertoires par défaut
# ----------------------


# Répertoire où on sauve les fichiers par défaut
rep_save = None
# rep_save = repertoire
# Répertoire où on ouvre les fichiers par défaut
rep_open = None
# rep_open = repertoire
# Répertoire où on exporte les fichiers par défaut
rep_export = None
# rep_export = repertoire

#if plateforme == 'Windows':
#    repertoire_donnees = os.path.join(os.environ["APPDATA"], ".wxgeometrie")
#elif plateforme == 'Linux':
#    repertoire_donnees = os.path.join(os.environ["HOME"], ".wxgeometrie")
#else:
#    repertoire_donnees = None


emplacements = {}
# % se réfère au dossier contenant WxGeometrie (indiqué par param.EMPLACEMENT)
# ~ se réfère au répertoire de l'utilisateur (ex: /home/BillG/ sous Linux, ou C:\Documents and Settings\LTorvald\ sous Windows)
emplacements["log"] = "%/log" # dans log/ par défaut
emplacements["preferences"] = "%/preferences" # dans preferences/ par défaut
emplacements["macros"] = "%/macros" # dans macros/ par défaut
# Activer les lignes suivantes pour que les preferences, fichiers log, etc... soient stockés dans le dossier de l'utilisateur.
#emplacements["log"] = "~/.wxgeometrie/log"
#emplacements["preferences"] = "~/.wxgeometrie/preferences"
#emplacements["macros"] = "~/.wxgeometrie/macros"


# % se réfère au dossier contenant WxGeometrie (indiqué par param.EMPLACEMENT)
# ~ se réfère au répertoire de l'utilisateur (ex: /home/BillG/ sous Linux, ou C:\Documents and Settings\LTorvald\ sous Windows)
#emplacement_log = "%/log" # dans log/ par défaut
#emplacement_preferences = "%/preferences" # dans preferences/ par défaut
#emplacement_macros_construction = "%/macros" # dans macros/ par défaut
# Activer les lignes suivantes pour que les preferences, fichiers log, etc... soient stockés dans le dossier de l'utilisateur.
#emplacement_log = "~/.wxgeometrie/log"
#emplacement_preferences = "~/.wxgeometrie/preferences"
#emplacement_macros_construction = "~/.wxgeometrie/macros"

# Paramètres généraux
# --------------------

utilisateur = "" # nom de l'utilisateur, pour inclure dans les documents créés

dimensions_fenetre = (890, 630)
confirmer_quitter = True
nbr_annulations = 50
historique_log = True # cree un fichier .log (conseille)
historique_log_continu = False # modifier ce fichier en temps reel (peu utile)
enregistrer_messages = True # enregistre les messages (notamment d'erreur) dans messages.log
sauvegarder_preferences = True # sauvegarder automatiquement les préférences à la fermeture du programme
charger_preferences = True # charger les préférences précédemment enregistrées au démarrage du programme

tolerance = 1e-8 # seuil de tolérance, utilisé en particulier par geolib pour savoir si 2 points sont confondus
# ce paramètre permet un compromis acceptable entre les faux negatifs
# (2 points confondus considérés à tort comme distincts, du fait d'imprécisions de calculs qui se cumulent)
# et les faux positifs (deux points proches considerés à tort comme confondus).

# Parametres d'affichage
# ----------------------

orthonorme = False
grille_aimantee = False # force les points à se placer sur le quadrillage

afficher_barre_outils = False
afficher_console_geolib = False
afficher_boutons = True  # Possibilité de ne pas afficher les boutons, pour obliger à une construction pas à pas.

zoom_texte = 1
zoom_ligne = 1

#bouger_curseur = None

#if bouger_curseur is None:
#    bouger_curseur = (platform.system() in ('Windows', 'Linux'))

#constantes
RIEN = 0
NOM = 1
TEXTE = 2
FIN = 1
MILIEU = 0.5
DEBUT = 0
NORMAL = 0
RAPIDE = 1

# Indique si geolib doit afficher les différents messages. Dans certaines consoles (ex: pyshell), cela provoque des comportements indésirables.
afficher_messages = True

styles_de_lignes = ['-', '--', '-.', ':', 'steps', 'None']
styles_de_polygones = ['-', '--', '-.', ':', 'None']
styles_de_points = ['+', 'x', 'o', '.', ',', '1', '2', '3', '4', '<', '>', '^', 'v', 'D', 'H', '_', '|', 'd', 'h', 'p', 's']
styles_de_textes = ["normal", "italic", "oblique"]
styles_de_angles = ['-', '--', '-.', ':', 'steps', 'None']
familles_de_textes = ["sans-serif", "serif", "cursive", "fantasy", "monospace"]
codage_des_lignes = ['', '/', '//', '///', 'x', 'o']
codage_des_polygones = ['', '/', '//', '///', 'x', 'o'] # ??
codage_des_angles = ['', '^', ')', '))', ')))', '/', 'x', 'o']

# Enumère les styles 'variables' :
# - soit parce qu'ils ont des significations assez différentes selon les objets
# - soit parce qu'ils ne peuvent pas prendre les mêmes valeurs suivant les objets
# Ces styles ne seront copiés d'un objet à l'autre que s'ils appartiennent à la même catégorie
styles_a_signification_variable = ("style", "codage", "famille", "taille", "angle")

# Ces styles ne seront pas copiés, quelque soit la catégorie de la cible
styles_a_ne_pas_copier = ("categorie", "niveau", "trace", "fixe", "label", "_rayon_", "_k_", "_angle_", "_noms_", "legende")



defaut_objets = {
    "legende": RIEN,
    "visible": True,
    "label": "",
    "niveau": 0,
    }
widgets = {"bidon":1,
    }

points = {
    "couleur": "b",
    "epaisseur": 1.,
    "style": "+",
    "categorie": "points",
    "taille": 8,
    "visible": True,
    "legende": NOM,
    "niveau": 6,
    "trace": False,
    }
points_deplacables = {
    "couleur": "r",
    "niveau": 10,
    "fixe": False,
    }
segments = {
    "couleur": "g",
    "epaisseur": 1.,
    "style": "-",
    "visible": True,
    "niveau": 3,
    "categorie": "lignes",
    "codage": codage_des_lignes[0],
    }
droites = {"couleur": "b",
    "epaisseur": 1.,
    "style": "-",
    "visible": True,
    "niveau": 2,
    "categorie": "lignes",
    }
courbes = {"couleur": "b",
    "epaisseur": 1.,
    "style": "-",
    "visible": True,
    "niveau": 2,
    "categorie": "lignes",
    "extremites": True,
    "extremites_cachees": (),
    }
vecteurs = {
    "couleur": "g",
    "epaisseur": 1.,
    "style": "-",
    "taille": 10,
    "visible": True,
    "niveau": 4,
    "categorie": "lignes",
    "angle": 60,
    "position": FIN,
    "double_fleche": False,
    }
cercles = {
    "couleur": "b",
    "epaisseur": 1.,
    "style": "-",
    "visible": True,
    "niveau": 1,
    "categorie": "lignes",
    }
arcs = {
    "couleur": "b",
    "epaisseur": 1.,
    "style": "-",
    "visible": True,
    "niveau": 1,
    "categorie": "lignes",
    "codage": codage_des_lignes[0],
    }
arcs_orientes = {
    "couleur": "g",
    "epaisseur": 1.,
    "style": "-",
    "taille": 10,
    "visible": True,
    "niveau": 4,
    "categorie": "lignes",
    "angle": 60,
    "position": FIN,
    "double_fleche": False,
    }
polygones = {
    "couleur": "y",
    "epaisseur": 1.,
    "style": "-",
    "visible": True,
    "alpha": .2,
    "niveau": 0.1,
    "categorie": "polygones",
    }
cotes = {
    "couleur": "y",
    "epaisseur": 1.,
    "style": "-",
    "visible": True,
    "alpha": 1,
    "niveau": 0,
    "categorie": "lignes",
    "codage": codage_des_lignes[0],
    }
polyedres = {
    "couleur": "y",
    "epaisseur": 1.,
    "style": "None",
    "visible": True,
    "alpha": .2,
    "niveau": 0,
    "categorie": "polygones",
    }
aretes = {
    "couleur": "y",
    "epaisseur": 1.,
    "style": "-",
    "visible": True,
    "niveau": 0.5,
    "categorie": "polygones",
    }
textes = {
    "couleur": "k",
    "epaisseur": 5, # 1 -> 9
    #"largeur": ("normal", "narrow", "condensed", "wide")[0],  # mal gere par matploltib (version 0.87)
    "taille": 18.,
    "style": "normal",
    "famille": familles_de_textes[1],
    "visible": True,
    "angle": 0,
    "legende": TEXTE,
    "fixe": False,
    "categorie": "textes",
    "niveau": 7,
    "alignement_vertical": "center",
    "alignement_horizontal": "center",
    }
labels = {
    "couleur": "k",
    "epaisseur": 6, # 1 -> 9
    #"largeur": ("normal", "narrow", "condensed", "wide")[0],  # mal gere par matploltib (version 0.87)
    "taille": 18.,
    "style": "normal",
    "famille": familles_de_textes[1],
    "visible": True,
    "angle": 0,
    "legende": TEXTE,
    "fixe": False,
    "categorie": "textes",
    "niveau": 7,
    "alignement_vertical": "left",
    "alignement_horizontal": "bottom",
    }
angles = {
    "couleur": "b",
    "epaisseur": 1.,
    "style": "-",
    "visible": True,
    "niveau": 5,
    "categorie": "angles",
    "codage": codage_des_angles[0],
    "alpha": .2,
}

# Note: en interne, ce sont toujours les radians qui sont utilisés.
unite_angle = ("r", "d", "g")[0] # radian, degré ou grad

# le parametre niveau est utilisé pour détecter l'objet sur la feuille :
# en cas de conflit entre deux objets proches, il permet de savoir l'objet à sélectionner.
# les petits objets (points, ...) doivent être au dessus des plus gros, et avoir un niveau supérieur.
# Rq: les objets modifiables devraient etre "au dessus" des autres, indépendamment de leur taille.
# Attention, ce parametre n'influe pas sur l'affichage des objets (pour cela, c'est le parametre "zorder" de matplotlib)

# le parametre "categorie" indique quelle liste de styles est à appliquer.
# par défaut, on applique souvent 'styles_de_lignes'.





# Options de style pour les objets geometriques :
#   couleur:      str
#   epaisseur:    float
#   taille:       float
#   style:        str
#   visible:      bool
#   fixe:         bool
#   label:        str
#   extra:       dict
# 'extra' est un dictionnaire d'options de matplotlib
# attention, ces options seront appliquees a toutes les composantes (plot, fill, text) de la representation graphique

codage = {"angle": pi/3, "taille": 6, "rayon": 20}
codage_automatique_angle_droits = True

##class _Dict_codage(dict):
##    def __getitem__(self, key):
##        if key == "taille-zoom":
##            return dict.__getitem__(self, "taille")*zoom_ligne
##        return dict.__getitem__(self, key)
##
##codage = _Dict_codage(angle = pi/3, taille = 6, rayon = 20)
##
##del _Dict_codage


# taille de differents elements graphiques

taille = {"o" : 3, "(" : 5, ">" : 10, "|" : 8}


# IMPORTANT !
# les dictionnaires pouvant comporter de nouvelles clés lors de la sortie d'une nouvelle version doivent être mis à jour :
a_mettre_a_jour = (
"defaut_objets",
"widgets",
"points",
"points_deplacables",
"segments",
"droites",
"vecteurs",
"cercles",
"arcs",
"arcs_orientes",
"polygones",
"textes",
"labels",
"angles",
"codage",
"taille",
)

# Distance maximale entre une etiquette et son objet associé :
distance_max_etiquette = 50

# DÉSUET :
##chiffres_significatifs = 4 # intervient dans l'affichage des propriétés des objets essentiellement.

decimales = 2


liste_axes = (0, 1)
# 0 -> axe des abscisses ;  1 -> axe des ordonnees

afficher_axes = True
afficher_fleches = True # fleches au bout des axes.

# Pour se reperer, deux possibilites :
# 1. Un repere proprement dit
repere = ("O", "I", "J") # en majuscule, ce sont des points ; en minuscule, des vecteurs.
# 2. Deux axes gradues
origine_axes = (0, 0)
# Pour choisir le mode :
utiliser_repere = True
# -> utiliser ou non un repère (même origine sur chaque axe...)
# -> si on n'utilise pas le repère, on affiche deux valeurs distinctes à l'intersection des axes

gradu = (1, 1) # espacement entre deux graduations pour chaque axe. (0 => pas de graduations).
saturation =  0.3 # valeur de saturation pour le coefficient pas()/gradu
# au dela du coefficient de saturation, les graduations ne sont plus affichees
# cela evite de bloquer le programme...

# Couleur de fond des figures.
couleur_fond = "w"

afficher_quadrillage = True # affiche un quadrillage a la place des graduations
quadrillages = (((None, None), ":", .5, "k"),)
# Chaque couple correspond a un quadrillage.
# Le format est : ([espacement horizontal, espacement vertical], style, epaisseur, couleur).
# On peut omettre des elements :
# quadrillages = ((),)
# Si un espacement vaut None, la valeur de gradu correspondante sera utilisee.
# Valeurs possibles pour le style : (cf http://matplotlib.sourceforge.net/matplotlib.pylab.html#-plot)
# "--" tirets
# "-" lignes continues
# ":" points
# "-." alternance de points et de tirets
# On peut superposer plusieurs quadrillages :
# quadrillages = (((1, 1), "-", 0.25, "k"), ((0.25, 0.25), ":", .25, "k"),)
# ou encore :
# quadrillages = (((1, 1), ":", 1, "k"), ((0.2, 0.2), ":", .125, "k"),)
couleur_papier_millimetre = '#aa7733' # couleur à utiliser pour le papier millimétré entre autres

resolution = 1000 # resolution utilisee pour le tracage des courbes (plus la valeur est importante, plus la courbe est lisse)
fenetre = (origine_axes[0]-8, origine_axes[0]+8, origine_axes[1]-5, origine_axes[1]+5)   # xmin, xmax, ymin, ymax

zoom_in = 1.1 # coefficient d'agrandissement des objets lors d'un zoom.
zoom_out = 0.9 # coefficient de reduction des objets lors d'un zoom.

zoom_texte_in = 1.05
zoom_texte_out = 0.95

zoom_ligne_in = 1.07
zoom_ligne_out = 0.93

dpi_export = 200 # resolution utilisee lors de l'exportation des images

afficher_coordonnees = True # affiche en permanence les coordonnees

afficher_objets_caches = False # affiche en grisé les objets masqués

precision_selection = 10 # plus la precision est importante, plus il faut etre pres d'un objet pour pouvoir le saisir
# Si le chiffre est trop petit, ca devient fastidieux de selectionner un objet
# A l'inverse, s'il est trop grand, il devient difficile de selectionner celui qu'on veut entre deux objets proches


nom_multiple = False # autorise à 'nommer' plusieurs objets avec le même nom
# (en fait, un seul objet aura le nom 'A' par exemple, les autres auront 'A' comme étiquette).

# Tranformation linéaire appliquée au graphique : (EXPERIMENTAL !)
transformation = None
# Couple de la forme (a, b, c, d) tel que :
# |x'|     |a b| |x|
# |y'|  =  |c d| |y|
# Exemple (permutation des axes) :
#transformation = (0, 1, 1, 1)

afficher_barre_outils = False
afficher_console_geolib = False

try:
    from personnaliser import * # permet de générer un fichier personnaliser.py lors de l'installation, ou de la première utilisation, et dont les parametres remplaceront ceux-ci.
except ImportError:
    pass

del os, platform, personnaliser, matplotlib

