2022-12-10 18:44:20 +01:00
import bge # Bibliothèque Blender Game Engine (UPBGE)
###############################################################################
2022-12-11 10:28:41 +01:00
# twin_doc.py
2022-12-13 02:42:31 +01:00
# @title: Documentation de l'environnement 3D pour jumeau numérique
2022-12-10 18:44:20 +01:00
# @project: Blender-EduTech
# @lang: fr
# @authors: Philippe Roy <philippe.roy@ac-grenoble.fr>
# @copyright: Copyright (C) 2020-2022 Philippe Roy
# @license: GNU GPL
###############################################################################
# UPBGE scene
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
2022-12-14 07:50:26 +01:00
# 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
2022-12-10 18:44:20 +01:00
# UPBGE constants
JUST_ACTIVATED = bge . logic . KX_INPUT_JUST_ACTIVATED
JUST_RELEASED = bge . logic . KX_INPUT_JUST_RELEASED
ACTIVATE = bge . logic . KX_INPUT_ACTIVE
# JUST_DEACTIVATED = bge.logic.KX_SENSOR_JUST_DEACTIVATED
2022-12-14 07:50:26 +01:00
# Cards description
card_description = { }
################################################################################
# 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 \n la vitesse des \n dé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é \n de la batterie à 200 \n mouvements (contre \n 20, 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 \n balises 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, \n ce 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
###############################################################################
# python_card=["function-card", "alternative-card", "loop-card", "flow-card", "text-card", "list-card", "dict-card", "oop-card", "console-card", "sleep-card"]
python_card = [ " function-card " , " alternative-card " , " loop-card " , " flow-card " , " console-card " , " sleep-card " ]
# Fonction
rp_function_title = " Fonction "
rp_function_text = " La définition d ' une fonction se fait \n avec \" def \" . La fonction peut \n renvoyer une valeur avec \" return \" . \n \n "
rp_function_text = rp_function_text + " def fonction_1 (arguments) : \n instruction_1 \n instruction_2 \n .... \n return valeurs_renvoyées \n \n "
rp_function_text = rp_function_text + " Les arguments sont des données \n transmises à la fonction. "
rp_function_url = [ [ " w3schools.com : functions " , " https://www.w3schools.com/python/python_functions.asp " ] ]
card_description . update ( { " function-card " : [ rp_function_title , rp_function_text , rp_function_url ] } )
# Alternative
rp_alternative_title = " Alternative "
rp_alternative_text = " L ' alternative permet d ' éxécuter des \n instructions en fonction d ' un test. \n "
rp_alternative_text = rp_alternative_text + " Elle se programme en suivant la \n suite : si ... alors ... sinon ... où \n "
rp_alternative_text = rp_alternative_text + " \" si \" est \" if \" et \" sinon \" est \" else \" . \n \n "
rp_alternative_text = rp_alternative_text + " if condition : \n "
rp_alternative_text = rp_alternative_text + " instruction_1 \n "
rp_alternative_text = rp_alternative_text + " else : \n "
rp_alternative_text = rp_alternative_text + " instruction_2 \n \n "
rp_alternative_text = rp_alternative_text + " Le sinon ( \" else \" ) est facultatif. "
rp_alternative_url = [ [ " w3schools.com : if ... else " , " https://www.w3schools.com/python/python_conditions.asp " ] ]
card_description . update ( { " alternative-card " : [ rp_alternative_title , rp_alternative_text , rp_alternative_url ] } )
# Boucles
rp_loop_title = " Boucles "
rp_loop_text = " Il y a deux types de boucle : \n - avec \" for \" pour définir un nombre \n de répétition (ici N), \n - avec \" while \" (tant que) pour \n prendre en compte une condition. \n \n "
rp_loop_text = rp_loop_text + " for i in range (n) : \n instruction \n \n "
rp_loop_text = rp_loop_text + " while condition : \n instruction "
rp_loop_url = [ [ " w3schools.com : for " , " https://www.w3schools.com/python/python_for_loops.asp " ] ,
[ " w3schools.com : while " , " https://www.w3schools.com/python/python_while_loops.asp " ] ]
card_description . update ( { " loop-card " : [ rp_loop_title , rp_loop_text , rp_loop_url ] } )
# Flux
rp_flow_title = " Contrôle du flux "
rp_flow_text = " Les structures (if, while, for) peuvent \n être gérées plus finement par les \n fonctions \" break \" , \" continue \" et \" pass \" . \n \n "
rp_flow_text = rp_flow_text + " - \" break \" : Termine l ' itération en cours \n et arrête la boucle. \n "
rp_flow_text = rp_flow_text + " - \" continue \" : Termine l ' itération en \n cours et reprend la boucle. \n "
rp_flow_text = rp_flow_text + " - \" pass \" : Instruction vide. "
rp_flow_url = [ [ " w3schools.com : break " , " https://www.w3schools.com/python/ref_keyword_break.asp " ] ,
[ " w3schools.com : continue " , " https://www.w3schools.com/python/ref_keyword_break.asp " ] ,
[ " w3schools.com : pass " , " https://www.w3schools.com/python/ref_keyword_pass.asp " ] ]
card_description . update ( { " flow-card " : [ rp_flow_title , rp_flow_text , rp_flow_url ] } )
# Chaine de caractère
rp_text_title = " Chaîne de caractères \n (texte) "
rp_text_text = " \n FIXME "
rp_text_url = [ [ " w3schools.com : strings " , " https://www.w3schools.com/python/python_strings.asp " ] ]
card_description . update ( { " text-card " : [ rp_text_title , rp_text_text , rp_text_url ] } )
# Liste
rp_list_title = " Liste "
rp_list_text = " FIXME "
rp_list_url = [ [ " w3schools.com : lists " , " https://www.w3schools.com/python/python_lists.asp " ] ]
card_description . update ( { " list-card " : [ rp_list_title , rp_list_text , rp_list_url ] } )
# Dictionnaire
rp_dict_title = " Dictionnaire "
rp_dict_text = " FIXME "
rp_dict_url = [ [ " w3schools.com : dictionaries " , " https://www.w3schools.com/python/python_dictionaries.asp " ] ]
card_description . update ( { " dict-card " : [ rp_dict_title , rp_dict_text , rp_dict_url ] } )
# Objet (POO)
rp_oop_title = " Programmation \n orientée objet (POO) "
rp_oop_text = " \n FIXME "
rp_oop_url = [ [ " w3schools.com : classes & objects " , " https://www.w3schools.com/python/python_classes.asp " ] ]
card_description . update ( { " oop-card " : [ rp_oop_title , rp_oop_text , rp_oop_url ] } )
# Console
rp_console_title = " Console "
rp_console_text = " Si vous avez executé Ropy dans un \n terminal avec l ' option \" -con \" , vous \n pouvez utiliser le terminal comme \n console de debuggage. \n \n "
rp_console_text = rp_console_text + " print( \" Bonjour ! \" ) \n -> Affiche le texte dans la console. \n \n "
rp_console_text = rp_console_text + " variable = input () \n -> Permet la saisie, par exemple : \n "
rp_console_text = rp_console_text + " entree = \" \" \n while entree == \" \" : \n entree = input () "
rp_console_url = [ [ " w3schools.com : print " , " https://www.w3schools.com/python/ref_func_print.asp " ] ,
[ " w3schools.com : input " , " https://www.w3schools.com/python/ref_func_input.asp " ] ]
card_description . update ( { " console-card " : [ rp_console_title , rp_console_text , rp_console_url ] } )
# Temps
rp_sleep_title = " Gestion du temps "
rp_sleep_text = " Vous pouvez créer des temporisations \n dans le déroulement du script. \n \n "
rp_sleep_text = rp_sleep_text + " time.sleep(x) \n -> Marque d ' un temps d ' arrêt de \n x secondes. \n \n "
rp_sleep_text = rp_sleep_text + " Il faudra préalablement importer la \n bibliothèque \" time \" avec \" import time \" . "
rp_sleep_url = [ [ " docs.python.org : sleep " , " https://docs.python.org/fr/3/library/time.html#time.sleep " ] ]
card_description . update ( { " sleep-card " : [ rp_sleep_title , rp_sleep_text , rp_sleep_url ] } )
###############################################################################
# Interface
###############################################################################
##
# Initialisation
##
2022-12-10 18:44:20 +01:00
##
# Ouverture
##
2022-12-14 07:50:26 +01:00
# def open():
# scene.active_camera = scene.objects["Camera-Doc"]
# scene.objects['Doc_close'].color= color_link
# scene.objects['Doc'].setVisible(True,True)
2022-12-10 18:44:20 +01:00
2022-12-14 07:50:26 +01:00
# def close(cont):
# if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive :
# scene.active_camera = scene.objects["Camera"]
# scene.objects['Doc'].setVisible(False,True)
2022-12-10 18:44:20 +01:00
##
# Highlight
##
2022-12-14 07:50:26 +01:00
# def hl(cont):
# if cont.sensors['MO'].status == JUST_ACTIVATED:
# obj = cont.owner
# name=obj.name[:-7]
# scene.objects[name].color = color_link_hl
2022-12-10 18:44:20 +01:00
2022-12-14 07:50:26 +01:00
# if cont.sensors['MO'].status == JUST_RELEASED:
# obj = cont.owner
# name=obj.name[:-7]
# scene.objects[name].color = color_link