mirror of
https://forge.apps.education.fr/blender-edutech/jumeaux-numeriques.git
synced 2024-01-27 06:56:18 +01:00
Système de documentation - point d'étape
This commit is contained in:
parent
8c03abc7db
commit
58533d5503
@ -21,10 +21,10 @@ scene = bge.logic.getCurrentScene()
|
||||
|
||||
# Couleurs
|
||||
|
||||
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_blanc = [0.8, 0.8, 0.8, 1] # bouton focus : blanc
|
||||
couleur_jaune = [0.8, 0.619, 0.021, 1] # bouton activé : jaune
|
||||
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_blanc = (0.8, 0.8, 0.8, 1) # bouton focus : blanc
|
||||
couleur_jaune = (0.8, 0.619, 0.021, 1) # bouton activé : jaune
|
||||
|
||||
# Constantes UPBGE
|
||||
|
||||
|
@ -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
|
||||
# @title: Carte 1 pour Ropy
|
||||
# @project: Ropy (Blender-EduTech)
|
||||
# porcou_doc.py
|
||||
# @title: Documentation du portail coulissant
|
||||
# @project: Blender-EduTech
|
||||
# @lang: fr
|
||||
# @authors: Philippe Roy <philippe.roy@ac-grenoble.fr>
|
||||
# @copyright: Copyright (C) 2020-2022 Philippe Roy
|
||||
# @license: GNU GPL
|
||||
###############################################################################
|
||||
|
||||
scene = bge.logic.getCurrentScene()
|
||||
################################################################################
|
||||
# Documentation du système
|
||||
################################################################################
|
||||
|
||||
color_text = (0, 0, 0, 1) # Noir
|
||||
color_text_red = (0.799, 0.031, 0.038, 1)
|
||||
color_text_orange = (0.799, 0.176, 0.054, 1)
|
||||
color_text_yellow = (0.799, 0.617, 0.021, 1)
|
||||
color_text_white = (1, 1, 1, 1)
|
||||
system_card=["forward-card", "turn-card", "delineate-card", "detect-card", "radar-card", "twins-card"]
|
||||
system_card=system_card+["speed-card", "paint-card", "battery-card", "beacon-card"]
|
||||
card_description ={}
|
||||
|
||||
###############################################################################
|
||||
# Missions
|
||||
###############################################################################
|
||||
# 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]})
|
||||
|
||||
missions_card_description ={}
|
||||
missions_conf ={}
|
||||
missions_task ={}
|
||||
# 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]})
|
||||
|
||||
###############################################################################
|
||||
# Initialisation du niveau :
|
||||
# Niveau 1 : Les premiers pas de Ropy
|
||||
# Niveau 2 : Ma première fonction
|
||||
# Niveau 3 : Sécuriser Ropy
|
||||
# Niveau 4 : Partir au bout du monde
|
||||
# Niveau 5 : Faire face à l'inconnu
|
||||
# Niveau 6 : Se rendre utile
|
||||
###############################################################################
|
||||
# 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]})
|
||||
|
||||
missions_card=["mission_1-card", "mission_2-card", "mission_3-card", "mission_4-card", "mission_5-card", "mission_6-card"]
|
||||
# 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"]
|
||||
# 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]})
|
||||
|
||||
# Mission 1
|
||||
mission_1_title="Mission 1\n Premiers pas"
|
||||
mission_1_text="""\n\n Il faut aider Ropy à atteindre la case \n de l'objectif (à l'est de la station). \n
|
||||
-> Voir onglet Rover, page \"Avancer\" \n -> Voir onglet Rover,page \"Tourner\" \n\n
|
||||
Afin de visualiser le trajet, il faudra \n marquer les cases. \n -> Voir onglet Rover, page \"Baliser\""""
|
||||
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]})
|
||||
# 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]})
|
||||
|
||||
# Mission 2
|
||||
mission_2_title="Mission 2\n Ma première fonction"
|
||||
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\"."""
|
||||
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()\""
|
||||
mission_2_init=[-11.0,3.0, "e"]
|
||||
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]})
|
||||
# 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"""
|
||||
|
||||
# Mission 3
|
||||
mission_3_title="Mission 3\n Apprendre le danger"
|
||||
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
|
||||
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]})
|
||||
# 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]})
|
||||
|
||||
# Mission 4
|
||||
mission_4_title="Mission 4\n Partir au bout du monde"
|
||||
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.
|
||||
-> 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."""
|
||||
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)\""
|
||||
mission_4_init=[-7.0,4.0, "e"]
|
||||
mission_4_aim=[12.0,9.0]
|
||||
missions_card_description.update({"mission_4-card" : [mission_4_title, mission_4_text]})
|
||||
missions_conf.update({"4" : [mission_4_init, mission_4_aim]})
|
||||
missions_task.update({"4" : [mission_4_task]})
|
||||
# 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]})
|
||||
|
||||
# Mission 5
|
||||
mission_5_title="Mission 5\n Faire face à l'inconnu"
|
||||
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
|
||||
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()\"."""
|
||||
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()\""
|
||||
mission_5_init=[0.0,0.0, "e"] # Position aléatoire tourné vers l'est -> défini dans le reset
|
||||
mission_5_aim=[12.0,9.0]
|
||||
missions_card_description.update({"mission_5-card" : [mission_5_title, mission_5_text]})
|
||||
missions_conf.update({"5" : [mission_5_init, mission_5_aim]})
|
||||
missions_task.update({"5" : [mission_5_task]})
|
||||
# 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]})
|
||||
|
||||
# Mission 6
|
||||
mission_6_title="Mission 6\n Se rendre utile"
|
||||
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."""
|
||||
mission_6_task = "- Passer sur les 10 \n lieux de forage"
|
||||
mission_6_init=[0.0,0.0, "e"] # Position aléatoire tourné vers l'est -> défini dans le reset
|
||||
mission_6_aim=[100.0,100.0] # Aim caché -> ramassage de pierre
|
||||
missions_card_description.update({"mission_6-card" : [mission_6_title, mission_6_text]})
|
||||
missions_conf.update({"6" : [mission_6_init, mission_6_aim]})
|
||||
missions_task.update({"6" : [mission_6_task]})
|
||||
# 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]})
|
||||
|
||||
# Mission 7
|
||||
# mission_7_title="Mission 7\n FIXME"
|
||||
# mission_7_text="\n \n FIXME"
|
||||
# mission_7_task = "FIXME"
|
||||
# missions_card_description.update({"mission_7-card" : [mission_7_title, mission_7_text]})
|
||||
# missions_conf.update({"7" : [mission_7_init, mission_7_aim]})
|
||||
# missions_task.update({"7" : [mission_7_task]})
|
||||
|
||||
# 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
|
||||
###############################################################################
|
||||
# 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]})
|
||||
|
||||
##
|
||||
# Initialization
|
||||
# Envoi des données
|
||||
##
|
||||
|
||||
def map_init():
|
||||
def get_system_card():
|
||||
return system_card
|
||||
|
||||
# Terrain
|
||||
scene.objects['Terrain']['size'] = [-15,-11,15,10] # Map size
|
||||
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)
|
||||
def get_card_description():
|
||||
return card_description
|
||||
|
Binary file not shown.
10
twin.py
10
twin.py
@ -41,8 +41,8 @@ twin_config = ET.parse('twin_config.xml')
|
||||
twin_config_tree = twin_config.getroot()
|
||||
|
||||
# Couleurs
|
||||
color_cmd = [0.8, 0.8, 0.8, 1] # Blanc
|
||||
color_cmd_hl = [0.8, 0.619, 0.021, 1] # Jaune
|
||||
color_cmd = (0.8, 0.8, 0.8, 1) # Blanc
|
||||
color_cmd_hl = (0.8, 0.619, 0.021, 1) # Jaune
|
||||
|
||||
# Constantes
|
||||
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['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
|
||||
##
|
||||
|
@ -16,9 +16,13 @@ import numpy as np
|
||||
scene = bge.logic.getCurrentScene()
|
||||
|
||||
# Colors
|
||||
color_link = [0.051, 0.270, 0.279,1] # Turquoise
|
||||
# color_link = [0.024, 0.006, 0.8, 1] # Bleu
|
||||
color_link_hl = [0.8, 0.005, 0.315, 1] # Magenta
|
||||
color_link = (0.198, 0.109, 0.8, 1) # Violet
|
||||
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
|
||||
JUST_ACTIVATED = bge.logic.KX_INPUT_JUST_ACTIVATED
|
||||
|
@ -1,6 +1,6 @@
|
||||
<data>
|
||||
<screen>
|
||||
<width>1375</width>
|
||||
<height>774</height>
|
||||
<width>1565</width>
|
||||
<height>928</height>
|
||||
</screen>
|
||||
</data>
|
425
twin_doc.py
425
twin_doc.py
@ -1,5 +1,6 @@
|
||||
import bge # Bibliothèque Blender Game Engine (UPBGE)
|
||||
import importlib
|
||||
import webbrowser
|
||||
|
||||
###############################################################################
|
||||
# twin_doc.py
|
||||
@ -15,16 +16,14 @@ import importlib
|
||||
scene = bge.logic.getCurrentScene()
|
||||
|
||||
# Colors
|
||||
color_link = [0.051, 0.270, 0.279,1] # Turquoise
|
||||
# color_link = [0.024, 0.006, 0.8, 1] # Bleu
|
||||
color_link_hl = [0.8, 0.005, 0.315, 1] # Magenta
|
||||
# color_link = (0.198, 0.109, 0.8, 1) # Violet
|
||||
# color_link_hl = (0.8, 0.005, 0.315, 1) # Magenta
|
||||
|
||||
# Colors
|
||||
color_doc_chap = (0, 1, 0.857,1) # Turquoise
|
||||
color_doc_fct = (0, 1, 0.857,1) # Turquoise
|
||||
color_doc_hl = (0.799, 0.617, 0.021, 1) # Jaune
|
||||
color_doc_activate = (0.936, 0.033, 1, 1) # Rose
|
||||
color_doc_mission = (1, 0.192, 0.03, 1) # Orange
|
||||
color_doc_chap = (0.198, 0.109, 0.8, 1) # Violet
|
||||
color_doc_fct = (0.198, 0.109, 0.8, 1) # Violet
|
||||
color_doc_hl = (0.8, 0.005, 0.315, 1) # Magenta
|
||||
color_doc_activate = (0.936, 0.033, 1, 1) # Activé : Rose
|
||||
|
||||
# UPBGE constants
|
||||
JUST_ACTIVATED = bge.logic.KX_INPUT_JUST_ACTIVATED
|
||||
@ -34,94 +33,11 @@ ACTIVATE = bge.logic.KX_INPUT_ACTIVE
|
||||
|
||||
# Cards description
|
||||
card_description ={}
|
||||
system=importlib.import_module(scene.objects['System']['name']) # Système
|
||||
card_description.update(system.get_system_card())
|
||||
|
||||
################################################################################
|
||||
# Documentation System
|
||||
################################################################################
|
||||
|
||||
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 du sytème
|
||||
system=importlib.import_module(scene.objects['System']['name']+'_doc') # Système
|
||||
system_card = system.get_system_card()
|
||||
card_description.update(system.get_card_description())
|
||||
|
||||
###############################################################################
|
||||
# Documentation Python
|
||||
@ -217,16 +133,331 @@ card_description.update({"sleep-card" : [rp_sleep_title, rp_sleep_text, rp_sleep
|
||||
# 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
|
||||
|
Loading…
x
Reference in New Issue
Block a user