Système de documentation - point d'étape

This commit is contained in:
Philippe Roy 2022-12-15 06:20:48 +01:00
parent 8c03abc7db
commit 58533d5503
7 changed files with 431 additions and 520 deletions

View File

@ -21,10 +21,10 @@ scene = bge.logic.getCurrentScene()
# Couleurs # Couleurs
couleur_magenta = [0.800, 0.005, 0.315,1] # bouton non activable : magenta couleur_magenta = (0.800, 0.005, 0.315,1) # bouton non activable : magenta
couleur_orange = [0.799, 0.130, 0.063,1] # bouton activable : orange couleur_orange = (0.799, 0.130, 0.063,1) # bouton activable : orange
couleur_blanc = [0.8, 0.8, 0.8, 1] # bouton focus : blanc couleur_blanc = (0.8, 0.8, 0.8, 1) # bouton focus : blanc
couleur_jaune = [0.8, 0.619, 0.021, 1] # bouton activé : jaune couleur_jaune = (0.8, 0.619, 0.021, 1) # bouton activé : jaune
# Constantes UPBGE # Constantes UPBGE

View File

@ -1,436 +1,106 @@
import bge # Bibliothèque Blender Game Engine (UPBGE)
import bpy # Blender
import random
from rp_lib import * # Bibliothèque Ropy
import os
############################################################################### ###############################################################################
# rp_map1.py # porcou_doc.py
# @title: Carte 1 pour Ropy # @title: Documentation du portail coulissant
# @project: Ropy (Blender-EduTech) # @project: Blender-EduTech
# @lang: fr # @lang: fr
# @authors: Philippe Roy <philippe.roy@ac-grenoble.fr> # @authors: Philippe Roy <philippe.roy@ac-grenoble.fr>
# @copyright: Copyright (C) 2020-2022 Philippe Roy # @copyright: Copyright (C) 2020-2022 Philippe Roy
# @license: GNU GPL # @license: GNU GPL
############################################################################### ###############################################################################
scene = bge.logic.getCurrentScene() ################################################################################
# Documentation du système
################################################################################
color_text = (0, 0, 0, 1) # Noir system_card=["forward-card", "turn-card", "delineate-card", "detect-card", "radar-card", "twins-card"]
color_text_red = (0.799, 0.031, 0.038, 1) system_card=system_card+["speed-card", "paint-card", "battery-card", "beacon-card"]
color_text_orange = (0.799, 0.176, 0.054, 1) card_description ={}
color_text_yellow = (0.799, 0.617, 0.021, 1)
color_text_white = (1, 1, 1, 1)
############################################################################### # Avancer et reculer
# Missions rp_forward_title="Avancer et reculer"
############################################################################### rp_forward_text=" rp_avancer() \n -> Avance d'un pas en avant. \n \n rp_reculer() \n -> Recule d'un pas."
rp_forward_type="standard"
card_description.update({"forward-card" : [rp_forward_title, rp_forward_text, rp_forward_type]})
missions_card_description ={} # Tourner
missions_conf ={} rp_turn_title="Tourner"
missions_task ={} rp_turn_text=" rp_gauche() \n -> Tourne à gauche (90°).\n \n rp_droite() \n -> Tourne à droite (90°)."
rp_turn_type="standard"
card_description.update({"turn-card" : [rp_turn_title, rp_turn_text, rp_turn_type]})
############################################################################### # Baliser
# Initialisation du niveau : rp_delineate_title="Baliser"
# Niveau 1 : Les premiers pas de Ropy rp_delineate_text=" rp_marquer() \n -> Place une balise sur la case. \n \n Ropy possède que 20 balises, il ne \n peut pas en poser une de plus.\n\n Avec l'amélioration \"Balise +\", le \n nombre de balise transportées est \n étendu à 200."
# Niveau 2 : Ma première fonction rp_delineate_type="standard"
# Niveau 3 : Sécuriser Ropy card_description.update({"delineate-card" : [rp_delineate_title, rp_delineate_text, rp_delineate_type]})
# Niveau 4 : Partir au bout du monde
# Niveau 5 : Faire face à l'inconnu
# Niveau 6 : Se rendre utile
###############################################################################
missions_card=["mission_1-card", "mission_2-card", "mission_3-card", "mission_4-card", "mission_5-card", "mission_6-card"] # Détecter
# missions_card=["mission_1-card", "mission_2-card", "mission_3-card", "mission_4-card", "mission_5-card", "mission_6-card", "mission_7-card", "mission_8-card"] rp_detect_title="Détecter"
rp_detect_text=" rp_detect() \n -> Détecte un obstacle.\n \n La fonction retourne : \n - \"True\" si il a un obstacle, \n - \"False\" si il n'y a pas d'obstacle."
rp_detect_type="standard"
card_description.update({"detect-card" : [rp_detect_title, rp_detect_text, rp_detect_type]})
# Mission 1 # Radar
mission_1_title="Mission 1\n Premiers pas" rp_radar_title="Radar"
mission_1_text="""\n\n Il faut aider Ropy à atteindre la case \n de l'objectif (à l'est de la station). \n rp_radar_text=" Le radar n'est toujours pas \n opérationnel ! \n \n Mais où est donc encore passé Thomas !"
-> Voir onglet Rover, page \"Avancer\" \n -> Voir onglet Rover,page \"Tourner\" \n\n rp_radar_type="mission"
Afin de visualiser le trajet, il faudra \n marquer les cases. \n -> Voir onglet Rover, page \"Baliser\"""" card_description.update({"radar-card" : [rp_radar_title, rp_radar_text, rp_radar_type]})
mission_1_task = "- Atteindre l'objectif \n\n- Poser 6 balises \n minimum"
mission_1_init=[-11.0,3.0, "e"] # Rover init position (x,y), orientation ("n|s|e|w")
mission_1_aim=[-7.0,2.0] # Aim position (x,y)
missions_card_description.update({"mission_1-card" : [mission_1_title, mission_1_text]})
missions_conf.update({"1" : [mission_1_init, mission_1_aim]})
missions_task.update({"1" : [mission_1_task]})
# Mission 2 # Jumeau numérique
mission_2_title="Mission 2\n Ma première fonction" rp_twins_title="Jumeau numérique"
mission_2_text="""\n\n La case à atteindre est toujours la \n même (à l'est de la station).\n\n Pour faciliter le codage, vous devez \n créer et utiliser la fonction \n \"mrp_avancer()\" regroupant avancer \n et marquer. \n -> Voir onglet Python, page \"Fonction\".""" rp_twins_text=""" Via une liaison série, Ropy peut être \n le jumeau numérique d'un robot réel. \n
mission_2_task = "- Atteindre l'objectif \n\n- Poser 6 balises \n minimum\n\n- 40 lignes de code \n maximum\n\n- Définition de la \n fonction \n \"mrp_avancer()\"" rp_jumeau(port, vitesse=115200) \n -> Active le jumeau réel par la liaison \n série. Si le port n'est pas spécifié, il \n est recherché automatiquement. \n
mission_2_init=[-11.0,3.0, "e"] rp_serie_msg(texte) \n -> Envoi un message \n \n texte=rp_serie_rcpt() \n -> Reçoit un message"""
mission_2_aim=[-7.0,2.0]
missions_card_description.update({"mission_2-card" : [mission_2_title, mission_2_text]})
missions_conf.update({"2" : [mission_2_init, mission_2_aim]})
missions_task.update({"2" : [mission_2_task]})
# Mission 3 # Message envoyé (asynchrone) : \n avancer : a, reculer : r, droite : d, \n gauche g, marquer : m et forer : f \n\n\n """
mission_3_title="Mission 3\n Apprendre le danger" rp_twins_type="standard"
mission_3_text="""\n\n Tout d'abords, il faut provoquer une \n collision avec un obstacle (pente \n ou station) et observer ce qui se \n passe.\n card_description.update({"twins-card" : [rp_twins_title, rp_twins_text, rp_twins_type]})
Il faut donc sécuriser Ropy en \n utilisant une structure alternative. \n -> Voir onglet Python, page \"Si alors\" \n -> Voir onglet Rover, page \"Détecter\""""
mission_3_task = "- Utilisation de \n \"rp_detect()\" dans \n une structure \n alternative \"if\"."
mission_3_init=[-11.0,3.0, "e"] # Rover init position (x,y), orientation ("n|s|e|w")
mission_3_aim=[100.0,100.0] # Aim caché -> pas de de position objectif
missions_card_description.update({"mission_3-card" : [mission_3_title, mission_3_text]})
missions_conf.update({"3" : [mission_3_init, mission_3_aim]})
missions_task.update({"3" : [mission_3_task]})
# Mission 4 # Speed - Vitesse
mission_4_title="Mission 4\n Partir au bout du monde" rp_speed_title="Vitesse"
mission_4_text="""\n\n Ropy est maintenant prêt pour \n l'aventure soit atteindre la case \n du nouvel objectif (loin, très loin ...). \n \n Pour un tel voyage, l'utilisation d'une\n boucle du type \"for\" s'impose. rp_speed_text=" L'amélioration \"Vitesse\" permet de \n changer la vitesse des déplacements \n par l'interface (en bas à gauche).\n\n"
-> Voir onglet Python, page \"Boucle\" \n\n Dans un deuxième temps, il faut créer \n la fonction \"mrp_avancer_nbpas(pas)\"\n afin d'avancer d'un nombre de pas.""" rp_speed_text=rp_speed_text + " La vitesse est modifiable par codage : \n"
mission_4_task = "- Atteindre l'objectif \n\n- 40 lignes de code \n maximum\n\n- Utilisation de \n boucle \"for\" \n\n- En bonus : création \n de la fonction \"mrp_\n avancer_nbpas(pas)\"" rp_speed_text=rp_speed_text + " rp_vitesse(nouvelle_vitesse), où \n la vitesse est une valeur de 0,1 à 10.\n\n La fonction rp_vitesse() retourne la \n vitesse actuelle."
mission_4_init=[-7.0,4.0, "e"] rp_speed_store="Permet de modifier\nla vitesse des \ndéplacements."
mission_4_aim=[12.0,9.0] rp_speed_purchased="Je vois ... \n l'efficacité, hein ! \n Vous verrez avec \n ces moteurs,\n c'est autre vie."
missions_card_description.update({"mission_4-card" : [mission_4_title, mission_4_text]}) rp_speed_type="upgrade"
missions_conf.update({"4" : [mission_4_init, mission_4_aim]}) card_description.update({"speed-card" : [rp_speed_title, rp_speed_text, rp_speed_store, rp_speed_purchased, rp_speed_type]})
missions_task.update({"4" : [mission_4_task]})
# Mission 5 # Paint - Peinture
mission_5_title="Mission 5\n Faire face à l'inconnu" rp_paint_title="Peinture"
mission_5_text="""\n\n La case à atteindre est toujours la \n même, mais le lieu de départ change \n à chaque fois. \n\n Pour pallier à l\'aléatoire, vous \n utiliserez les pentes comme obstacle. \n rp_paint_text=" rp_couleur(objets, couleur) \n -> Change la couleur du groupe \n d'objets 3d. \n"
Il faut alors créer une fonction \n avec une boucle \"while\" (tant que) \n qui permet d'avancer jusqu'à un \n obstacle : \"mrp_avancer_mur()\".""" rp_paint_text=rp_paint_text + " - La couleur est un tuple au format \n (R,V,B,Alpha) avec des valeurs de 0 à 1.\n"
mission_5_task = "- Atteindre l'objectif \n\n- 40 lignes de code \n maximum\n\n- Utilisation de \n boucle \"while\" \n\n- En bonus : création \n de la fonction \"mrp_\n avancer_mur()\"" rp_paint_text=rp_paint_text + " - objets peut être : \"Rover 1\",\n \"Rover 2\", \"Rover 3\", \"Station 1\", \n \"Station 2\", \"Station 3\", \"Station 4\", \n \"Balises\" ou \"Balise 1\" à \"Balise 200\".\n\n"
mission_5_init=[0.0,0.0, "e"] # Position aléatoire tourné vers l'est -> défini dans le reset rp_paint_text=rp_paint_text + " rp_couleur_init(objets) \n -> Réinitialise la couleur des objets.\n rp_couleur_init() réinitialise tout !"
mission_5_aim=[12.0,9.0] rp_paint_store="On refait la déco ?"
missions_card_description.update({"mission_5-card" : [mission_5_title, mission_5_text]}) rp_paint_purchased="Rien de tel qu'un \n peu de couleur \n dans ce monde \n de brute !"
missions_conf.update({"5" : [mission_5_init, mission_5_aim]}) rp_paint_type="upgrade"
missions_task.update({"5" : [mission_5_task]}) card_description.update({"paint-card" : [rp_paint_title, rp_paint_text, rp_paint_store, rp_paint_purchased, rp_paint_type]})
# Mission 6 # Battery + - Batterie +
mission_6_title="Mission 6\n Se rendre utile" rp_battery_title="Batterie +"
mission_6_text="""\n\n Une zone du terrain doit être explorée.\n Il faut procéder à des carottages afin \n d'analyser la roche. \n\n Les lieux de forage (affichés ici en \n permanence) sont définis de manière \n aléatoire (encore !), pour les \n réaliser, Ropy doit donc passer sur \n toutes les cases de la zone.""" rp_battery_text=" L'amélioration \"Batterie +\" permet \n d'augmenter la capacité de la batterie \n du Rover à 200 pas (contre 20 pas). \n\n"
mission_6_task = "- Passer sur les 10 \n lieux de forage" rp_battery_text=rp_battery_text + " La fonction rp_batterie() retourne \n la charge actuelle de la batterie \n (valeur de 0 à 100 %)."
mission_6_init=[0.0,0.0, "e"] # Position aléatoire tourné vers l'est -> défini dans le reset rp_battery_store="Augmente la capacité \nde la batterie à 200 \nmouvements (contre \n20, plutôt faible ...).\n\n"
mission_6_aim=[100.0,100.0] # Aim caché -> ramassage de pierre rp_battery_purchased="Très bon choix ! \n Cette batterie \n vous va comme \n un gant."
missions_card_description.update({"mission_6-card" : [mission_6_title, mission_6_text]}) rp_battery_type="upgrade"
missions_conf.update({"6" : [mission_6_init, mission_6_aim]}) card_description.update({"battery-card" : [rp_battery_title, rp_battery_text, rp_battery_store, rp_battery_purchased, rp_battery_type]})
missions_task.update({"6" : [mission_6_task]})
# Mission 7 # Beacon + - Balise +
# mission_7_title="Mission 7\n FIXME" rp_beacon_title="Balise +"
# mission_7_text="\n \n FIXME" rp_beacon_text=" L'amélioration \"Balise +\" permet \n d'augmenter le nombre de balises \n pouvant être posées à 200 (contre 20). \n\n"
# mission_7_task = "FIXME" rp_beacon_text=rp_beacon_text + " La fonction rp_balise() retourne \n le nombre de balises dejà posées \n lors du trajet."
# missions_card_description.update({"mission_7-card" : [mission_7_title, mission_7_text]}) rp_beacon_store="Porte le nombre de \nbalises transportées\nà 200 (contre 20)."
# missions_conf.update({"7" : [mission_7_init, mission_7_aim]}) rp_beacon_purchased="Les colis viennent \n tout juste d'être \n livrés. Un vrai sapin de Noël, \nce terrain !"
# missions_task.update({"7" : [mission_7_task]}) rp_beacon_type="upgrade"
card_description.update({"beacon-card" : [rp_beacon_title, rp_beacon_text, rp_beacon_store, rp_beacon_purchased, rp_beacon_type]})
# Mission 8
# mission_8_title="Mission 8\n FIXME"
# mission_8_text="\n \n FIXME"
# mission_8_task = "FIXME"
# missions_card_description.update({"mission_8-card" : [mission_8_title, mission_8_text]})
# missions_conf.update({"8" : [mission_8_init, mission_8_aim]})
# missions_task.update({"8" : [mission_8_task]})
# Description des cartes missions
def get_missions_card():
return missions_card
def get_missions_description():
return missions_card_description
###############################################################################
# Map
###############################################################################
## ##
# Initialization # Envoi des données
## ##
def map_init(): def get_system_card():
return system_card
# Terrain def get_card_description():
scene.objects['Terrain']['size'] = [-15,-11,15,10] # Map size return card_description
scene.objects['Terrain']['map_tile_montain']= []
scene.objects['Terrain']['map_tile_station']= [[-9,2],[-9,3]]
for obj_i in scene.objects:
if "terrain_sideCliff" in obj_i.name or "terrain_sideCorner" in obj_i.name or "terrain_sideCornerInner" in obj_i.name:
scene.objects['Terrain']['map_tile_montain'].append([round(obj_i.worldPosition.x), round(obj_i.worldPosition.y)])
# Couleurs
rp_couleur_init()
# Cacher les zones
scene.objects['Aim'].setVisible(False,True)
scene.objects['Initzone-mission-5'].setVisible(False,True)
scene.objects['Aimzone-mission-6'].setVisible(False,True)
# print (scene.objects['Terrain']['map_tile_montain'])
# i=0
# for i_xy in scene.objects['Terrain']['map_tile_montain']:
# beacon= scene.addObject("Beacon", scene.objects['Terrain'])
# beacon.worldPosition=[i_xy[0],i_xy[1],0.2]
# beacon.setVisible(True, True)
# i+=1
# Landscape
# file_path = 'asset/map/map1-landscape.blend'
# inner_path = 'Object'
# object_name = 'Landscape'
# bpy.ops.wm.append(
# filepath=os.path.join(file_path, inner_path, object_name),
# directory=os.path.join(file_path, inner_path),
# filename=object_name)
##
# Reset de la map
##
def map_reset():
scene.objects['Points']['step']=0
scene.objects['Points']['nbligne']=0
scene.objects['Points']['battery']=100
scene.objects['Points-Battery'].color = color_text_white
scene.objects['Points-Battery-text'].color = color_text
mission_init = missions_conf[str(scene.objects['Points']['mission'])][0]
mission_aim = missions_conf[str(scene.objects['Points']['mission'])][1]
# Reterasser le terrain (mission 6)
for obj_i in scene.objects:
if "tile_dirtHigh" in obj_i.name:
if obj_i.visible == False:
obj_i.setVisible(True, True)
for i in range (10):
scene.objects["Drill_tile-"+str(i)].setVisible(False, True)
# Cacher les balises
scene.objects['Terrain']['map_tile_beacon']= []
for i in range (200):
beacon = scene.objects["Beacon-"+str(i)]
beacon.worldPosition=[29,1+i,0.2]
beacon.setVisible(False,True)
beacon['activated']=False
# Initialisation du rover
obj = scene.objects['Rover']
obj.worldPosition.x = mission_init[0]
obj.worldPosition.y = mission_init[1]
obj.worldPosition.z = 0.2
applyRotationTo(obj, 0, 0, 0, True)
if mission_init[2] == "n":
obj.applyRotation((0, 0, math.pi), True)
if mission_init[2] == "e":
obj.applyRotation((0, 0, math.pi/2), True)
if mission_init[2] == "w":
obj.applyRotation((0, 0, -math.pi/2), True)
# Initialisation du rover pour les missions 5 et 6 : position aléatoire entre -3 ; 5 et 1 ; -10
if scene.objects['Points']['mission']==5 or scene.objects['Points']['mission']==6:
position_ok=False
while position_ok==False: # Exclusion de certaines cases
obj.worldPosition.x = random.randint(-3,1)
obj.worldPosition.y = random.randint(-10,5)
position_ok=True
if obj.worldPosition.x== 0 and obj.worldPosition.y== -10:
position_ok=False
if obj.worldPosition.x== 1 and obj.worldPosition.y== -8:
position_ok=False
if obj.worldPosition.x== 1 and obj.worldPosition.y== -9:
position_ok=False
if obj.worldPosition.x== 1 and obj.worldPosition.y== -10:
position_ok=False
# Initialisation de l'objectif (mission de 1 à 5)
if scene.objects['Points']['mission']!=6:
scene.objects['Terrain']['map_aim']= [[mission_aim[0],mission_aim[1]]]
obj_aim = scene.objects['Aim']
obj_aim.worldPosition.x = mission_aim[0]
obj_aim.worldPosition.y = mission_aim[1]
obj_aim.worldPosition.z = 0.5
# Initialisation des 10 lieux de forage pour la mission 6 : position aléatoire entre 3 ; 0 et 12 ; 9
if scene.objects['Points']['mission']==6:
obj_aim = scene.objects['Aim'] # Cacher l'objectif unique
obj_aim.worldPosition.x = mission_aim[0]
obj_aim.worldPosition.y = mission_aim[1]
obj_aim.worldPosition.z = 0.5
scene.objects['Terrain']['map_aim']=[] # Liste des cibles
scene.objects['Terrain']['map_aim_hit']=[] # Liste des cibles atteintes
for i in range (10):
position_ok=False
while position_ok==False: # Exclusion de certaines cases
x1= random.randint(3,12)
y1= random.randint(0,9)
if [x1,y1] in scene.objects['Terrain']['map_aim']:
position_ok=False
else:
scene.objects['Drill_aim-'+str(i)].worldPosition.x = x1
scene.objects['Drill_aim-'+str(i)].worldPosition.y = y1
scene.objects['Drill_aim-'+str(i)].worldPosition.z = 0.5
scene.objects['Terrain']['map_aim'].append([x1,y1])
scene.objects['Drill_aim-'+str(i)].setVisible(True,True)
position_ok=True
else:
for i in range (10):
if scene.objects['Drill_aim-'+str(i)].visible:
scene.objects['Drill_aim-'+str(i)].setVisible(False,True)
###############################################################################
# Objectif
###############################################################################
##
# Afficher l'objectif
##
def aim_show():
# Zone de départ
if scene.objects['Points']['mission']==5 or scene.objects['Points']['mission']==6:
scene.objects['Initzone-mission-5'].setVisible(True,True)
else:
scene.objects['Initzone-mission-5'].setVisible(False,True)
# Cible
if scene.objects['Points']['mission']==3 or scene.objects['Points']['mission']==6:
scene.objects['Aim'].setVisible(False,True)
else:
scene.objects['Aim'].setVisible(True,True)
# Zone cible
if scene.objects['Points']['mission']==6:
scene.objects['Aimzone-mission-6'].setVisible(True,True)
else:
scene.objects['Aimzone-mission-6'].setVisible(False,True)
##
# Cacher l'objectif
##
def aim_hide():
scene.objects['Aim'].setVisible(False,True)
scene.objects['Aimzone-mission-6'].setVisible(False,True)
scene.objects['Initzone-mission-5'].setVisible(False,True)
##
# Affichage des tâches
##
def task():
scene.objects['Task_text']['Text']=missions_task[str(scene.objects['Points']['mission'])][0]
##
# Validation de l'objectif atteint
##
def objectif_control(x,y):
# Mission 1
if scene.objects['Points']['mission']==1:
if [x,y] in scene.objects['Terrain']['map_aim']: # Aim
if len(scene.objects['Terrain']['map_tile_beacon'])>=6: # 6 balises posées mini
return True
# Mission 2 (fonction)
if scene.objects['Points']['mission']==2:
if [x,y] in scene.objects['Terrain']['map_aim']: # Aim
if len(scene.objects['Terrain']['map_tile_beacon'])>=6: # 6 balises posées mini
if scene.objects['Points']['nbligne'] <=40: # 40 lignes de code maxi
txt=["def mrp_avancer():", "def mrp_avancer() :", "def mrp_avancer ():", "def mrp_avancer () :"] # Présence de "def mrp_avancer():"
if rp_cmd_txtcount(txt, 1):
return True
# Mission 3 (structure alternative)
# Le controle de l'objectif est dans la fonction rp_detect().
# Mission 4 (boucle en for)
if scene.objects['Points']['mission']==4:
if [x,y] in scene.objects['Terrain']['map_aim']: # Aim
if scene.objects['Points']['nbligne'] <=40: # 40 lignes de code maxi
txt=["for" ] # Présence de "for i in range" 2x
if rp_cmd_txtcount(txt, 2):
txt=["in range" ]
if rp_cmd_txtcount(txt, 2):
return True
else:
txt=["def mrp_avancer_nbpas"] # Présence de "def mrp_avancer_nbpas"
if rp_cmd_txtcount(txt, 1):
txt=["for" ] # Présence de "for i in range" 1x
if rp_cmd_txtcount(txt, 1):
txt=["in range" ]
if rp_cmd_txtcount(txt, 1):
return True
# Mission 5 (boucle en while)
if scene.objects['Points']['mission']==5:
if [x,y] in scene.objects['Terrain']['map_aim']: # Aim
if scene.objects['Points']['nbligne'] <=40: # 40 lignes de code maxi
txt=["while" ] # Présence de "while" 2x
if rp_cmd_txtcount(txt, 2):
return True
else:
txt=["def mrp_avancer_mur():", "def mrp_avancer_mur() :", "def mrp_avancer_mur ():", "def mrp_avancer_mur () :"] # Présence de "def mrp_avancer_mur():"
if rp_cmd_txtcount(txt, 1):
txt=["while" ] # Présence de "while" 1x
if rp_cmd_txtcount(txt, 1):
return True
# Mission 6 (passer sur tout le terrain)
if scene.objects['Points']['mission']==6:
if [x,y] in scene.objects['Terrain']['map_aim']: # Cibles
if [x,y] not in scene.objects['Terrain']['map_aim_hit']: # Cibles atteintes
rover_drill(x,y)
scene.objects['Terrain']['map_aim_hit'].append([x,y])
if len (scene.objects['Terrain']['map_aim_hit'])==10 : # Toutes les cibles atteintes
return True
return False
###############################################################################
# Fonction bas niveau
###############################################################################
##
# Recherche de texte dans le script
##
def rp_cmd_txtcount (text_list, n):
# print (os.getcwd())
file = open('rp_cmd.py', 'r')
file_txt = file.read()
for text in text_list:
if file_txt.count (text) >= n:
file.close()
return True
file.close()
return False
##
# Atteindre une orientation
##
def applyRotationTo(obj, rx=None, ry=None, rz=None, Local=True):
rres=0.001 # resolution rotation
# x
if rx is not None:
while (abs(rx-obj.worldOrientation.to_euler().x) > rres) :
if obj.worldOrientation.to_euler().x-rx > rres:
obj.applyRotation((-rres, 0, 0), Local)
if rx-obj.worldOrientation.to_euler().x > rres:
obj.applyRotation((rres, 0, 0), Local)
# print ("delta x ",rx-obj.worldOrientation.to_euler().x)
# y
if ry is not None:
while (abs(ry-obj.worldOrientation.to_euler().y) > rres) :
if obj.worldOrientation.to_euler().y-ry > rres:
obj.applyRotation((0, -rres, 0), Local)
if ry-obj.worldOrientation.to_euler().y > rres:
obj.applyRotation((0, rres, 0), Local)
# print ("delta y ",ry-obj.worldOrientation.to_euler().y)
# z
if rz is not None:
while (abs(rz-obj.worldOrientation.to_euler().z) > rres) :
if obj.worldOrientation.to_euler().z-rz > rres:
obj.applyRotation((0, 0, -rres), Local)
if rz-obj.worldOrientation.to_euler().z > rres:
obj.applyRotation((0, 0, rres), Local)
# print ("delta z ",rz-obj.worldOrientation.to_euler().z)

10
twin.py
View File

@ -41,8 +41,8 @@ twin_config = ET.parse('twin_config.xml')
twin_config_tree = twin_config.getroot() twin_config_tree = twin_config.getroot()
# Couleurs # Couleurs
color_cmd = [0.8, 0.8, 0.8, 1] # Blanc color_cmd = (0.8, 0.8, 0.8, 1) # Blanc
color_cmd_hl = [0.8, 0.619, 0.021, 1] # Jaune color_cmd_hl = (0.8, 0.619, 0.021, 1) # Jaune
# Constantes # Constantes
JUST_ACTIVATED = bge.logic.KX_INPUT_JUST_ACTIVATED JUST_ACTIVATED = bge.logic.KX_INPUT_JUST_ACTIVATED
@ -125,6 +125,12 @@ def cmd_init():
scene.objects['Doc-cmd-Hl'].setVisible(False,False) scene.objects['Doc-cmd-Hl'].setVisible(False,False)
scene.objects['About-cmd-Hl'].setVisible(False,False) scene.objects['About-cmd-Hl'].setVisible(False,False)
# Windows
windows=("Doc", "Doc_chap-general", "Doc_chap-system", "Doc_chap-python", "About")
for window in windows:
scene.objects[window].setVisible(False,True)
twin_doc.init()
## ##
# Highlight des commandes # Highlight des commandes
## ##

View File

@ -16,9 +16,13 @@ import numpy as np
scene = bge.logic.getCurrentScene() scene = bge.logic.getCurrentScene()
# Colors # Colors
color_link = [0.051, 0.270, 0.279,1] # Turquoise color_link = (0.198, 0.109, 0.8, 1) # Violet
# color_link = [0.024, 0.006, 0.8, 1] # Bleu color_link_hl = (0.8, 0.005, 0.315, 1) # Magenta
color_link_hl = [0.8, 0.005, 0.315, 1] # Magenta
# color_link = (0.051, 0.270, 0.279,1) # Turquoise
# color_link = (0.024, 0.006, 0.8, 1) # Bleu
# color_link = (0.8, 0.005, 0.315, 1) # Magenta
# UPBGE constants # UPBGE constants
JUST_ACTIVATED = bge.logic.KX_INPUT_JUST_ACTIVATED JUST_ACTIVATED = bge.logic.KX_INPUT_JUST_ACTIVATED

View File

@ -1,6 +1,6 @@
<data> <data>
<screen> <screen>
<width>1375</width> <width>1565</width>
<height>774</height> <height>928</height>
</screen> </screen>
</data> </data>

View File

@ -1,5 +1,6 @@
import bge # Bibliothèque Blender Game Engine (UPBGE) import bge # Bibliothèque Blender Game Engine (UPBGE)
import importlib import importlib
import webbrowser
############################################################################### ###############################################################################
# twin_doc.py # twin_doc.py
@ -15,16 +16,14 @@ import importlib
scene = bge.logic.getCurrentScene() scene = bge.logic.getCurrentScene()
# Colors # Colors
color_link = [0.051, 0.270, 0.279,1] # Turquoise # color_link = (0.198, 0.109, 0.8, 1) # Violet
# color_link = [0.024, 0.006, 0.8, 1] # Bleu # color_link_hl = (0.8, 0.005, 0.315, 1) # Magenta
color_link_hl = [0.8, 0.005, 0.315, 1] # Magenta
# Colors # Colors
color_doc_chap = (0, 1, 0.857,1) # Turquoise color_doc_chap = (0.198, 0.109, 0.8, 1) # Violet
color_doc_fct = (0, 1, 0.857,1) # Turquoise color_doc_fct = (0.198, 0.109, 0.8, 1) # Violet
color_doc_hl = (0.799, 0.617, 0.021, 1) # Jaune color_doc_hl = (0.8, 0.005, 0.315, 1) # Magenta
color_doc_activate = (0.936, 0.033, 1, 1) # Rose color_doc_activate = (0.936, 0.033, 1, 1) # Activé : Rose
color_doc_mission = (1, 0.192, 0.03, 1) # Orange
# UPBGE constants # UPBGE constants
JUST_ACTIVATED = bge.logic.KX_INPUT_JUST_ACTIVATED JUST_ACTIVATED = bge.logic.KX_INPUT_JUST_ACTIVATED
@ -34,94 +33,11 @@ ACTIVATE = bge.logic.KX_INPUT_ACTIVE
# Cards description # Cards description
card_description ={} card_description ={}
system=importlib.import_module(scene.objects['System']['name']) # Système
card_description.update(system.get_system_card())
################################################################################ # Documentation du sytème
# Documentation System system=importlib.import_module(scene.objects['System']['name']+'_doc') # Système
################################################################################ system_card = system.get_system_card()
card_description.update(system.get_card_description())
rover_card=["forward-card", "turn-card", "delineate-card", "detect-card", "radar-card", "twins-card"]
rover_card=rover_card+["speed-card", "paint-card", "battery-card", "beacon-card"]
# Avancer et reculer
rp_forward_title="Avancer et reculer"
rp_forward_text=" rp_avancer() \n -> Avance d'un pas en avant. \n \n rp_reculer() \n -> Recule d'un pas."
rp_forward_type="standard"
card_description.update({"forward-card" : [rp_forward_title, rp_forward_text, rp_forward_type]})
# Tourner
rp_turn_title="Tourner"
rp_turn_text=" rp_gauche() \n -> Tourne à gauche (90°).\n \n rp_droite() \n -> Tourne à droite (90°)."
rp_turn_type="standard"
card_description.update({"turn-card" : [rp_turn_title, rp_turn_text, rp_turn_type]})
# Baliser
rp_delineate_title="Baliser"
rp_delineate_text=" rp_marquer() \n -> Place une balise sur la case. \n \n Ropy possède que 20 balises, il ne \n peut pas en poser une de plus.\n\n Avec l'amélioration \"Balise +\", le \n nombre de balise transportées est \n étendu à 200."
rp_delineate_type="standard"
card_description.update({"delineate-card" : [rp_delineate_title, rp_delineate_text, rp_delineate_type]})
# Détecter
rp_detect_title="Détecter"
rp_detect_text=" rp_detect() \n -> Détecte un obstacle.\n \n La fonction retourne : \n - \"True\" si il a un obstacle, \n - \"False\" si il n'y a pas d'obstacle."
rp_detect_type="standard"
card_description.update({"detect-card" : [rp_detect_title, rp_detect_text, rp_detect_type]})
# Radar
rp_radar_title="Radar"
rp_radar_text=" Le radar n'est toujours pas \n opérationnel ! \n \n Mais où est donc encore passé Thomas !"
rp_radar_type="mission"
card_description.update({"radar-card" : [rp_radar_title, rp_radar_text, rp_radar_type]})
# Jumeau numérique
rp_twins_title="Jumeau numérique"
rp_twins_text=""" Via une liaison série, Ropy peut être \n le jumeau numérique d'un robot réel. \n
rp_jumeau(port, vitesse=115200) \n -> Active le jumeau réel par la liaison \n série. Si le port n'est pas spécifié, il \n est recherché automatiquement. \n
rp_serie_msg(texte) \n -> Envoi un message \n \n texte=rp_serie_rcpt() \n -> Reçoit un message"""
# Message envoyé (asynchrone) : \n avancer : a, reculer : r, droite : d, \n gauche g, marquer : m et forer : f \n\n\n """
rp_twins_type="standard"
card_description.update({"twins-card" : [rp_twins_title, rp_twins_text, rp_twins_type]})
# Speed - Vitesse
rp_speed_title="Vitesse"
rp_speed_text=" L'amélioration \"Vitesse\" permet de \n changer la vitesse des déplacements \n par l'interface (en bas à gauche).\n\n"
rp_speed_text=rp_speed_text + " La vitesse est modifiable par codage : \n"
rp_speed_text=rp_speed_text + " rp_vitesse(nouvelle_vitesse), où \n la vitesse est une valeur de 0,1 à 10.\n\n La fonction rp_vitesse() retourne la \n vitesse actuelle."
rp_speed_store="Permet de modifier\nla vitesse des \ndéplacements."
rp_speed_purchased="Je vois ... \n l'efficacité, hein ! \n Vous verrez avec \n ces moteurs,\n c'est autre vie."
rp_speed_type="upgrade"
card_description.update({"speed-card" : [rp_speed_title, rp_speed_text, rp_speed_store, rp_speed_purchased, rp_speed_type]})
# Paint - Peinture
rp_paint_title="Peinture"
rp_paint_text=" rp_couleur(objets, couleur) \n -> Change la couleur du groupe \n d'objets 3d. \n"
rp_paint_text=rp_paint_text + " - La couleur est un tuple au format \n (R,V,B,Alpha) avec des valeurs de 0 à 1.\n"
rp_paint_text=rp_paint_text + " - objets peut être : \"Rover 1\",\n \"Rover 2\", \"Rover 3\", \"Station 1\", \n \"Station 2\", \"Station 3\", \"Station 4\", \n \"Balises\" ou \"Balise 1\" à \"Balise 200\".\n\n"
rp_paint_text=rp_paint_text + " rp_couleur_init(objets) \n -> Réinitialise la couleur des objets.\n rp_couleur_init() réinitialise tout !"
rp_paint_store="On refait la déco ?"
rp_paint_purchased="Rien de tel qu'un \n peu de couleur \n dans ce monde \n de brute !"
rp_paint_type="upgrade"
card_description.update({"paint-card" : [rp_paint_title, rp_paint_text, rp_paint_store, rp_paint_purchased, rp_paint_type]})
# Battery + - Batterie +
rp_battery_title="Batterie +"
rp_battery_text=" L'amélioration \"Batterie +\" permet \n d'augmenter la capacité de la batterie \n du Rover à 200 pas (contre 20 pas). \n\n"
rp_battery_text=rp_battery_text + " La fonction rp_batterie() retourne \n la charge actuelle de la batterie \n (valeur de 0 à 100 %)."
rp_battery_store="Augmente la capacité \nde la batterie à 200 \nmouvements (contre \n20, plutôt faible ...).\n\n"
rp_battery_purchased="Très bon choix ! \n Cette batterie \n vous va comme \n un gant."
rp_battery_type="upgrade"
card_description.update({"battery-card" : [rp_battery_title, rp_battery_text, rp_battery_store, rp_battery_purchased, rp_battery_type]})
# Beacon + - Balise +
rp_beacon_title="Balise +"
rp_beacon_text=" L'amélioration \"Balise +\" permet \n d'augmenter le nombre de balises \n pouvant être posées à 200 (contre 20). \n\n"
rp_beacon_text=rp_beacon_text + " La fonction rp_balise() retourne \n le nombre de balises dejà posées \n lors du trajet."
rp_beacon_store="Porte le nombre de \nbalises transportées\nà 200 (contre 20)."
rp_beacon_purchased="Les colis viennent \n tout juste d'être \n livrés. Un vrai sapin de Noël, \nce terrain !"
rp_beacon_type="upgrade"
card_description.update({"beacon-card" : [rp_beacon_title, rp_beacon_text, rp_beacon_store, rp_beacon_purchased, rp_beacon_type]})
############################################################################### ###############################################################################
# Documentation Python # Documentation Python
@ -217,16 +133,331 @@ card_description.update({"sleep-card" : [rp_sleep_title, rp_sleep_text, rp_sleep
# Interface # Interface
############################################################################### ###############################################################################
## ##
# Initialisation # Initialisation de la documentation
## ##
def init():
# Mettre les couleurs sur les icones (chapitres et cartes)
chap=("general", "system", "python")
for page in chap:
scene.objects["Doc-"+page].color = color_doc_chap
scene.objects["Doc-"+page+"-text"].color = color_doc_chap
for i in range(len(system_card)):
scene.objects[system_card[i]].color = color_doc_fct
scene.objects[system_card[i]+"-icon"].color = color_doc_fct
scene.objects[system_card[i]+"-text"].color = color_doc_fct
for i in range(len(python_card)):
scene.objects[python_card[i]].color = color_doc_fct
scene.objects[python_card[i]+"-icon"].color = color_doc_fct
scene.objects[python_card[i]+"-text"].color = color_doc_fct
# Cacher et mettre les couleurs sur les liens (URL)
scene.objects['Doc_chap-system-url_title'].setVisible(False,True)
scene.objects['Doc_chap-python-url_title'].setVisible(False,True)
for i in range(3):
scene.objects['Doc_chap-python-url'+str(i)].setVisible(False,True)
scene.objects['Doc_chap-python-url'+str(i)].color = color_doc_chap
scene.objects['Doc_chap-system-url'+str(i)].setVisible(False,True)
scene.objects['Doc_chap-system-url'+str(i)].color = color_doc_chap
# Chargement du texte
text_load()
# Mémorisation de la position des pages
for page in chap:
scene.objects["Doc_chap-"+page]['init_lx']=scene.objects["Doc_chap-"+page].worldPosition.x
scene.objects["Doc_chap-"+page]['init_ly']=scene.objects["Doc_chap-"+page].worldPosition.y
scene.objects["Doc_chap-"+page]['init_lz']=scene.objects["Doc_chap-"+page].worldPosition.z
# Page par défaut
scene.objects['Doc']['page_chap'] = "general"
##
# Ouvrir la documentation
##
def open():
# Placer la tablette
# scene.objects['Doc'].worldPosition = [0, -21, 15.75]
# scene.objects['Doc'].worldPosition = [0, -21, 15.8]
# scene.objects['Doc_close'].color = color_doc_chap
# scene.objects['Doc'].setVisible(True,True)
scene.active_camera = scene.objects["Camera-Doc"]
scene.objects['Doc_close'].color= color_doc_fct
scene.objects['Doc'].setVisible(True,True)
text_hide()
# Placer le nouveau chapitre
name_chap = scene.objects['Doc']['page_chap']
scene.objects['Doc-'+name_chap].color = color_doc_activate
scene.objects['Doc-'+name_chap+'-text'].color = color_doc_activate
scene.objects['Doc_chap-'+name_chap].worldPosition = scene.objects['Doc'].worldPosition
scene.objects['Doc_chap-'+name_chap].setVisible(True,True)
# URL
if name_chap == "system" or name_chap == "python":
name_fct = scene.objects['Doc_chap-'+name_chap]['page_fct']
scene.objects['Doc_chap-'+name_chap+'-url_title'].setVisible(False,True)
for i in range(3):
scene.objects['Doc_chap-'+name_chap+'-url'+str(i)].setVisible(False,True)
if name_fct !="":
scene.objects['Doc_chap-'+name_chap+'-url_title'].setVisible(True,True)
for i in range(len(card_description[name_fct][2])):
scene.objects['Doc_chap-'+name_chap+'-url'+str(i)]['Text'] = card_description[name_fct][2][i][0]
scene.objects['Doc_chap-'+name_chap+'-url'+str(i)].setVisible(True,True)
# Afficher le texte de la carte active
if name_chap != "general" and scene.objects['Doc_chap-'+name_chap]['page_fct'] !="":
name_fct = scene.objects['Doc_chap-'+name_chap]['page_fct']
scene.objects['Doc_title']['Text'] = card_description[name_fct][0]
scene.objects['Doc_title'].setVisible(True, False)
text_show(name_fct)
else:
scene.objects['Doc_title']['Text'] = " "
scene.objects['Doc_title'].setVisible(False,True)
text_hide()
##
# Fermer la documentation
##
def close():
chap=("general", "system", "python")
for page in chap:
scene.objects["Doc_chap-"+page].setVisible(False,True)
scene.objects["Doc_chap-"+page].worldPosition.x = scene.objects["Doc_chap-"+page]['init_lx']
scene.objects["Doc_chap-"+page].worldPosition.y = scene.objects["Doc_chap-"+page]['init_ly']
scene.objects["Doc_chap-"+page].worldPosition.z = scene.objects["Doc_chap-"+page]['init_lz']
scene.objects['Doc'].setVisible(False,True)
scene.objects['Doc'].worldPosition = [35, -2, 2]
##
# Highlight
##
def hl (cont):
# Activation
if cont.sensors['MO'].status == JUST_ACTIVATED :
obj = cont.owner
name=obj.name[:-7]
name_text=name+"-text"
name_icon=name+"-icon"
# Close ou lien
if name == "Doc_close" :
scene.objects[name].color = color_doc_hl
elif name == "Doc_chap-python-url0" or name == "Doc_chap-python-url1" or name == "Doc_chap-python-url2":
scene.objects[name].color = color_doc_hl
elif name == "Doc_chap-system-url0" or name == "Doc_chap-system-url1" or name == "Doc_chap-system-url2":
scene.objects[name].color = color_doc_hl
else:
if "Doc-" in name : # Chapitre
if name[4:] == scene.objects['Doc']['page_chap']:
scene.objects[name].color = color_doc_activate
scene.objects[name_text].color = color_doc_activate
else:
scene.objects[name].color = color_doc_hl
scene.objects[name_text].color = color_doc_hl
else: # Carte
name_chap = scene.objects['Doc']['page_chap']
if name == scene.objects['Doc_chap-'+name_chap]['page_fct'] :
scene.objects[name].color = color_doc_activate
scene.objects[name_text].color = color_doc_activate
scene.objects[name_icon].color = color_doc_activate
else:
scene.objects[name].color = color_doc_hl
scene.objects[name_text].color = color_doc_hl
scene.objects[name_icon].color = color_doc_hl
# Désactivation
if cont.sensors['MO'].status == JUST_RELEASED :
obj = cont.owner
name=obj.name[:-7]
name_text=obj.name[:-7]+"-text"
name_icon=obj.name[:-7]+"-icon"
# Close ou lien
if name == "Doc_close" :
scene.objects[name].color = color_doc_hl
elif name == "Doc_chap-python-url0" or name == "Doc_chap-python-url1" or name == "Doc_chap-python-url2":
scene.objects[name].color = color_doc_hl
elif name == "Doc_chap-system-url0" or name == "Doc_chap-system-url1" or name == "Doc_chap-system-url2":
scene.objects[name].color = color_doc_hl
else:
if "Doc-" in name : # Chapitre
if name[4:] == scene.objects['Doc']['page_chap']:
scene.objects[name].color = color_doc_activate
scene.objects[name_text].color = color_doc_activate
else:
scene.objects[name].color = color_doc_fct
scene.objects[name_text].color = color_doc_fct
else: # Carte
name_chap = scene.objects['Doc']['page_chap']
if name == scene.objects['Doc_chap-'+name_chap]['page_fct'] :
scene.objects[name].color = color_doc_activate
scene.objects[name_text].color = color_doc_activate
scene.objects[name_icon].color = color_doc_activate
else:
scene.objects[name].color = color_doc_fct
scene.objects[name_text].color = color_doc_fct
scene.objects[name_icon].color = color_doc_fct
##
# Afficher le chapitre
##
def chapter(cont):
if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive and cont.sensors['Click'].positive:
obj = cont.owner
scene.objects['Doc_title']['Text'] = " "
# Enlever l'ancien chapitre
scene.objects['Doc-'+scene.objects['Doc']['page_chap']].color = color_doc_chap
scene.objects['Doc-'+scene.objects['Doc']['page_chap']+'-text'].color = color_doc_chap
scene.objects["Doc_chap-"+scene.objects['Doc']['page_chap']].worldPosition.x = scene.objects["Doc_chap-"+scene.objects['Doc']['page_chap']]['init_lx']
scene.objects["Doc_chap-"+scene.objects['Doc']['page_chap']].worldPosition.y = scene.objects["Doc_chap-"+scene.objects['Doc']['page_chap']]['init_ly']
scene.objects["Doc_chap-"+scene.objects['Doc']['page_chap']].worldPosition.z = scene.objects["Doc_chap-"+scene.objects['Doc']['page_chap']]['init_lz']
if scene.objects['Doc']['page_chap'] != "general" and scene.objects["Doc_chap-"+scene.objects['Doc']['page_chap']]['page_fct'] !="":
text_hide(scene.objects["Doc_chap-"+scene.objects['Doc']['page_chap']]['page_fct'])
# Placer le nouveau chapitre
name_chap= obj.name[4:-7]
scene.objects['Doc-'+name_chap].color = color_doc_activate
scene.objects['Doc-'+name_chap+'-text'].color = color_doc_activate
scene.objects['Doc']['page_chap'] = name_chap
scene.objects['Doc_chap-'+name_chap].worldPosition = scene.objects['Doc'].worldPosition
scene.objects['Doc_chap-'+name_chap].setVisible(True,True)
# URL
if name_chap == "system" or name_chap == "python":
name_fct = scene.objects['Doc_chap-'+name_chap]['page_fct']
scene.objects['Doc_chap-'+name_chap+'-url_title'].setVisible(False,True)
for i in range(3):
scene.objects['Doc_chap-'+name_chap+'-url'+str(i)].setVisible(False,True)
if name_fct !="":
scene.objects['Doc_chap-'+name_chap+'-url_title'].setVisible(True,True)
for i in range(len(card_description[name_fct][2])):
scene.objects['Doc_chap-'+name_chap+'-url'+str(i)]['Text'] = card_description[name_fct][2][i][0]
scene.objects['Doc_chap-'+name_chap+'-url'+str(i)].setVisible(True,True)
# Afficher le texte de la carte active
if name_chap != "general" and scene.objects['Doc_chap-'+name_chap]['page_fct'] !="":
name_fct = scene.objects['Doc_chap-'+name_chap]['page_fct']
scene.objects['Doc_title']['Text'] = card_description[name_fct][0]
scene.objects['Doc_title'].setVisible(True, False)
text_show(name_fct)
else:
scene.objects['Doc_title']['Text'] = " "
scene.objects['Doc_title'].setVisible(False,True)
text_hide()
##
# Cacher le texte
##
def text_hide(card=None):
if card is None:
for card in card_description:
for i in range (13):
scene.objects['Doc_text-l'+str(i+1)+'-'+str(card)].setVisible(False, False)
else:
for i in range (13):
scene.objects['Doc_text-l'+str(i+1)+'-'+card].setVisible(False, False)
##
# Afficher le texte
##
def text_show(card=None):
if card is None:
for card in card_description:
for i in range (13):
scene.objects['Doc_text-l'+str(i+1)+'-'+str(card)].setVisible(True, False)
else:
for i in range (13):
scene.objects['Doc_text-l'+str(i+1)+'-'+card].setVisible(True, False)
##
# Préchargement des textes
##
def text_load():
for i in range (13):
scene.objects['Doc_text-l'+str(i+1)+'-ref']['Text'] = ""
# Création des objets 3D
for card in card_description:
lines = card_description[card][1].split("\n")
for i in range (13):
doc_text= scene.addObject('Doc_text-l'+str(i+1), None, 0.00, True)
doc_text.setParent(scene.objects['Doc'])
doc_text.name = 'Doc_text-l'+str(i+1)+'-'+str(card)
print ("Création : "+'Doc_text-l'+str(i+1)+'-'+str(card))
doc_text.worldPosition.x = scene.objects['Doc_text-l'+str(i+1)+'-ref'].worldPosition.x
doc_text.worldPosition.y = scene.objects['Doc_text-l'+str(i+1)+'-ref'].worldPosition.y
doc_text.worldPosition.z = scene.objects['Doc_text-l'+str(i+1)+'-ref'].worldPosition.z
doc_text.setVisible(False, False)
if i >= len(lines):
scene.objects['Doc_text-l'+str(i+1)+'-'+str(card)]['Text']=""
else:
if len(lines[i]) ==0:
scene.objects['Doc_text-l'+str(i+1)+'-'+str(card)]['Text']=""
else:
scene.objects['Doc_text-l'+str(i+1)+'-'+str(card)]['Text']=lines[i]
##
# Afficher les details de la fonction à partir d'une carte
##
def card (cont):
if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive :
obj = cont.owner
name_chap = scene.objects['Doc']['page_chap']
name_fct= obj.name[:-7]
scene.objects['Doc_title']['Text'] = " "
# Enlever l'ancienne carte
if scene.objects['Doc_chap-'+name_chap]['page_fct'] !="":
text_hide(scene.objects['Doc_chap-'+name_chap]['page_fct'])
# Afficher le texte de la carte
scene.objects['Doc_chap-'+name_chap]['page_fct'] = name_fct
scene.objects[name_fct].color = color_doc_activate
scene.objects[name_fct+'-icon'].color = color_doc_activate
scene.objects[name_fct+'-text'].color = color_doc_activate
scene.objects['Doc_title']['Text'] = card_description[name_fct][0]
scene.objects['Doc_title'].setVisible(True, False)
text_show(name_fct)
# URL
if name_chap == "system" or name_chap == "python":
name_fct = scene.objects['Doc_chap-'+name_chap]['page_fct']
scene.objects['Doc_chap-'+name_chap+'-url_title'].setVisible(False,True)
for i in range(3):
scene.objects['Doc_chap-'+name_chap+'-url'+str(i)].setVisible(False,True)
if name_fct !="":
scene.objects['Doc_chap-'+name_chap+'-url_title'].setVisible(True,True)
for i in range(len(card_description[name_fct][2])):
scene.objects['Doc_chap-'+name_chap+'-url'+str(i)]['Text'] = card_description[name_fct][2][i][0]
scene.objects['Doc_chap-'+name_chap+'-url'+str(i)].setVisible(True,True)
##
# Aller à la page internet
##
def link (cont):
if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive :
name_chap = scene.objects['Doc']['page_chap']
name_fct = scene.objects['Doc_chap-'+name_chap]['page_fct']
if name_fct !="":
print (cont.owner.name[15:-7])
i= cont.owner.name[15:-7]
print (i)
webbrowser.open(card_description[name_fct][2][int(i)][1])
## ##
# Ouverture # Ouverture