mirror of
https://forge.apps.education.fr/blender-edutech/jumeaux-numeriques.git
synced 2024-01-27 06:56:18 +01:00
Paramétrisation du nom du système
This commit is contained in:
parent
4ad306a158
commit
8df093059d
@ -1,5 +1,5 @@
|
||||
import bge # Bibliothèque Blender Game Engine (UPBGE)
|
||||
import twin # Bibliothèque l'environnement 3D des jumeaux numériques
|
||||
import twin # Bibliothèque de l'environnement 3D des jumeaux numériques
|
||||
import math
|
||||
import time
|
||||
|
||||
@ -12,7 +12,7 @@ import time
|
||||
# @copyright: Copyright (C) 2020-2022 Philippe Roy
|
||||
# @license: GNU GPL
|
||||
#
|
||||
# Commandes déclenchées par le simulateur (sml) pour le modèle du portail coulissant (sml_*)
|
||||
# Commandes déclenchées par/sur le simulateur (sml_*)
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
@ -34,7 +34,7 @@ ACTIVATE = bge.logic.KX_INPUT_ACTIVE
|
||||
# JUST_DEACTIVATED = bge.logic.KX_SENSOR_JUST_DEACTIVATED
|
||||
|
||||
###############################################################################
|
||||
# Initialisation
|
||||
# Initialisation de la scène
|
||||
###############################################################################
|
||||
|
||||
def init(cont):
|
||||
@ -55,7 +55,10 @@ def init(cont):
|
||||
# Actionneurs
|
||||
###############################################################################
|
||||
|
||||
# Action du simulateur pour le clignotant
|
||||
##
|
||||
# Action du simulateur pour le clignotant
|
||||
##
|
||||
|
||||
def sml_clignotant (cont):
|
||||
if scene.objects['System']['run']:
|
||||
obj = cont.owner
|
||||
@ -68,7 +71,10 @@ def sml_clignotant (cont):
|
||||
scene.objects['Led allumee'].setVisible(False,False)
|
||||
# print ("Clignotant éteint")
|
||||
|
||||
##
|
||||
# Action du simulateur pour le moteur
|
||||
##
|
||||
|
||||
def sml_moteur (cont):
|
||||
if scene.objects['System']['run']:
|
||||
obj = cont.owner
|
||||
@ -91,7 +97,10 @@ def sml_moteur (cont):
|
||||
# Capteurs fin de course
|
||||
###############################################################################
|
||||
|
||||
##
|
||||
# Etat capteur fin de course portail ouvert
|
||||
##
|
||||
|
||||
def sml_fdc_ouvert (cont):
|
||||
if scene.objects['System']['run'] :
|
||||
obj = cont.owner
|
||||
@ -113,8 +122,11 @@ def sml_fdc_ouvert (cont):
|
||||
obj_microrupteur.color =couleur_blanc
|
||||
if obj_microrupteur['MO'] == False and obj_microrupteur.color !=couleur_orange:
|
||||
obj_microrupteur.color =couleur_orange
|
||||
|
||||
|
||||
##
|
||||
# Etat capteur fin de course portail fermé
|
||||
##
|
||||
|
||||
def sml_fdc_ferme (cont):
|
||||
if scene.objects['System']['run'] :
|
||||
obj = cont.owner
|
||||
@ -137,16 +149,22 @@ def sml_fdc_ferme (cont):
|
||||
if obj_microrupteur['MO'] == False and obj_microrupteur.color !=couleur_orange:
|
||||
obj_microrupteur.color =couleur_orange
|
||||
|
||||
##
|
||||
# Forçage capteur fin de course avec la souris
|
||||
##
|
||||
|
||||
def sml_microrupteur (cont):
|
||||
if scene.objects['System']['run'] :
|
||||
sml_click(cont, cont.owner)
|
||||
system_click(cont, cont.owner)
|
||||
|
||||
###############################################################################
|
||||
# Capteurs barrage
|
||||
# Capteur barrage
|
||||
###############################################################################
|
||||
|
||||
##
|
||||
# Emetteur IR
|
||||
##
|
||||
|
||||
def sml_emet_ir (cont):
|
||||
if scene.objects['System']['run'] :
|
||||
obj = cont.owner
|
||||
@ -163,11 +181,14 @@ def sml_emet_ir (cont):
|
||||
obj_emetteur_ir.color = couleur_magenta
|
||||
obj_recepteur_ir.color = couleur_magenta
|
||||
|
||||
# Recepteur IR
|
||||
##
|
||||
# Récepteur IR
|
||||
##
|
||||
|
||||
def sml_recep_ir (cont):
|
||||
if scene.objects['System']['run'] and scene.objects['Module emetteur IR']['actif'] :
|
||||
obj = cont.owner
|
||||
sml_click(cont, scene.objects['Module recepteur IR'])
|
||||
system_click(cont, scene.objects['Module recepteur IR'])
|
||||
if scene.objects['Module recepteur IR']['actif']==True :
|
||||
scene.objects['Emetteur IR'].color = couleur_jaune
|
||||
scene.objects['Recepteur IR'].color = couleur_jaune
|
||||
@ -176,44 +197,31 @@ def sml_recep_ir (cont):
|
||||
# Boutons poussoirs
|
||||
###############################################################################
|
||||
|
||||
# Gestion du click sur les éléments cliquables
|
||||
def sml_click(cont, obj_activation):
|
||||
obj = cont.owner
|
||||
if cont.sensors['MO'].status == JUST_ACTIVATED :
|
||||
obj.color = couleur_blanc
|
||||
obj['MO']=True
|
||||
if cont.sensors['Click'].status == JUST_ACTIVATED and scene.objects['System']['manip_mode']==0:
|
||||
if obj['MO']:
|
||||
obj_activation['actif'] = True
|
||||
obj.color = couleur_jaune
|
||||
if cont.sensors['MO'].status == JUST_RELEASED :
|
||||
obj['MO']=False
|
||||
if cont.sensors['Click'].status == ACTIVATE :
|
||||
obj.color = couleur_jaune
|
||||
else:
|
||||
obj.color = couleur_orange
|
||||
if cont.sensors['Click'].status == JUST_RELEASED:
|
||||
obj_activation['actif'] = False
|
||||
obj.color = couleur_blanc
|
||||
if cont.sensors['MO'].status != ACTIVATE :
|
||||
obj.color = couleur_orange
|
||||
|
||||
##
|
||||
# Bouton pousssoir coté rue
|
||||
##
|
||||
|
||||
def sml_bp_rue (cont):
|
||||
if scene.objects['System']['run'] :
|
||||
sml_click(cont, scene.objects['Module bouton cote rue'])
|
||||
system_click(cont, scene.objects['Module bouton cote rue'])
|
||||
|
||||
##
|
||||
# Bouton pousssoir coté cour
|
||||
##
|
||||
|
||||
def sml_bp_cour (cont):
|
||||
if scene.objects['System']['run'] :
|
||||
sml_click(cont, scene.objects['Module bouton cote cour'])
|
||||
system_click(cont, scene.objects['Module bouton cote cour'])
|
||||
|
||||
###############################################################################
|
||||
# Système
|
||||
###############################################################################
|
||||
|
||||
##
|
||||
# Initialisation du système
|
||||
# Le moteur est géré en continue.
|
||||
##
|
||||
|
||||
def system_init ():
|
||||
|
||||
# Clignotant
|
||||
@ -228,7 +236,10 @@ def system_init ():
|
||||
scene.objects['Emetteur IR'].color = couleur_magenta
|
||||
scene.objects['Recepteur IR'].color = couleur_magenta
|
||||
|
||||
##
|
||||
# Réinitialisation du système
|
||||
##
|
||||
|
||||
def system_reset ():
|
||||
|
||||
# Grille à l'état initial
|
||||
@ -265,3 +276,28 @@ def system_reset ():
|
||||
scene.objects['Module recepteur IR']['actif'] =False
|
||||
scene.objects['Module bouton cote rue']['actif'] =False
|
||||
scene.objects['Module bouton cote cour']['actif'] =False
|
||||
|
||||
##
|
||||
# Click sur les éléments cliquables du systèmes
|
||||
##
|
||||
|
||||
def system_click(cont, obj_activation):
|
||||
obj = cont.owner
|
||||
if cont.sensors['MO'].status == JUST_ACTIVATED :
|
||||
obj.color = couleur_blanc
|
||||
obj['MO']=True
|
||||
if cont.sensors['Click'].status == JUST_ACTIVATED and scene.objects['System']['manip_mode']==0:
|
||||
if obj['MO']:
|
||||
obj_activation['actif'] = True
|
||||
obj.color = couleur_jaune
|
||||
if cont.sensors['MO'].status == JUST_RELEASED :
|
||||
obj['MO']=False
|
||||
if cont.sensors['Click'].status == ACTIVATE :
|
||||
obj.color = couleur_jaune
|
||||
else:
|
||||
obj.color = couleur_orange
|
||||
if cont.sensors['Click'].status == JUST_RELEASED:
|
||||
obj_activation['actif'] = False
|
||||
obj.color = couleur_blanc
|
||||
if cont.sensors['MO'].status != ACTIVATE :
|
||||
obj.color = couleur_orange
|
||||
|
@ -9,14 +9,14 @@ from porcou_lib import * # Bibliothèque portail coulissant
|
||||
# Instructions élémentaires pour le portail coulissant
|
||||
#
|
||||
# Actions (ordre = True ou False) :
|
||||
# - Gyrophare : gyr (True|False)
|
||||
# - Gyrophare : pc_gyr (True|False)
|
||||
# - Ouvrir le portail (moteur sens trigo) : mot_o (True|False)
|
||||
# - Fermer le portail (moteur sens horaire) : mot_f (True|False)
|
||||
# - Emetteur pour le capteur barrage IR : ir_emet(True|False)
|
||||
#
|
||||
# Capteurs (valeur retournée = True ou False) :
|
||||
# - Capteur fin de course portail ouvert : fc_o()
|
||||
# - Capteur fin de course portail fermé : fc_f()
|
||||
# - Capteur fin de course portail ouvert : fdc_o()
|
||||
# - Capteur fin de course portail fermé : fdc_f()
|
||||
# - Capteur barrage IR (absence d'obstacle) : ir_recep()
|
||||
#
|
||||
# Pupitre (valeur retournée = True ou False) :
|
||||
@ -39,7 +39,7 @@ from porcou_lib import * # Bibliothèque portail coulissant
|
||||
def commandes():
|
||||
|
||||
# Mise en place : Fermeture
|
||||
while (fc_f() ==False) :
|
||||
while (fdc_f() ==False) :
|
||||
gyr(True)
|
||||
mot_f(True)
|
||||
mot_f(False)
|
||||
@ -50,7 +50,7 @@ def commandes():
|
||||
|
||||
# Ouverture
|
||||
if bp_int() or bp_ext() :
|
||||
while fc_o() ==False:
|
||||
while fdc_o() ==False:
|
||||
gyr(True)
|
||||
mot_o(True)
|
||||
gyr(False)
|
||||
@ -59,7 +59,7 @@ def commandes():
|
||||
tempo(2) # Temporisation
|
||||
|
||||
# Fermeture
|
||||
while fc_f() ==False:
|
||||
while fdc_f() ==False:
|
||||
gyr(True)
|
||||
mot_f(True)
|
||||
gyr(False)
|
||||
@ -70,7 +70,7 @@ def commandes():
|
||||
# while True:
|
||||
# pass
|
||||
|
||||
porcou_fin() # A garder
|
||||
fin() # A garder
|
||||
|
||||
|
||||
###############################################################################
|
||||
|
@ -9,7 +9,7 @@ import time
|
||||
|
||||
###############################################################################
|
||||
# porcou_lib.py
|
||||
# @title: Bibliothèque utilisateur du portail coulissant (pcl_*)
|
||||
# @title: Bibliothèque utilisateur du portail coulissant (pc_*)
|
||||
# @project: Blender-EduTech
|
||||
# @lang: fr
|
||||
# @authors: Philippe Roy <philippe.roy@ac-grenoble.fr>
|
||||
@ -115,7 +115,7 @@ def thread_cmd_start(fct):
|
||||
def thread_cmd_stop():
|
||||
thread_stop(threads_cmd, "commands")
|
||||
|
||||
def porcou_end():
|
||||
def end():
|
||||
|
||||
# Jumeau numérique
|
||||
# if scene.objects['Commands']['twins']:
|
||||
@ -130,11 +130,11 @@ def porcou_end():
|
||||
scene.objects['System']['thread_cmd']=False
|
||||
time.sleep(0.125)
|
||||
|
||||
def porcou_fin():
|
||||
porcou_end()
|
||||
def fin():
|
||||
end()
|
||||
|
||||
def porcou_quit():
|
||||
porcou_end()
|
||||
def quit():
|
||||
end()
|
||||
|
||||
###############################################################################
|
||||
# Actionneurs
|
||||
@ -160,11 +160,11 @@ def ir_emet(ordre):
|
||||
###############################################################################
|
||||
|
||||
# Compte-rendu utilisateur du capteur fin de course portail ouvert
|
||||
def fc_o ():
|
||||
def fdc_o ():
|
||||
return scene.objects['Capteur fdc ouvert']['actif']
|
||||
|
||||
# Compte-rendu utilisateur du capteur fin de course portail ouvert
|
||||
def fc_f ():
|
||||
def fdc_f ():
|
||||
return scene.objects['Capteur fdc ferme']['actif']
|
||||
|
||||
# Compte-rendu utilisateur du capteur barrage IR
|
||||
|
Binary file not shown.
39
twin.py
39
twin.py
@ -2,7 +2,9 @@ import bge # Blender Game Engine (UPBGE)
|
||||
import bpy # Blender
|
||||
import sys
|
||||
import math
|
||||
import time
|
||||
import xml.etree.ElementTree as ET # Creating/parsing XML file
|
||||
import importlib
|
||||
import runpy # Exécution de script Python légère (sans import)
|
||||
from pylint import epylint as lint # Mesure de la qualité d'un code Python
|
||||
|
||||
@ -24,6 +26,7 @@ import twin_about # About
|
||||
|
||||
# UPBGE scene
|
||||
scene = bge.logic.getCurrentScene()
|
||||
system=importlib.import_module(scene.objects['System']['name']) # Système
|
||||
# scene.objects['Commands']['debug_fps']=False
|
||||
|
||||
# Memory
|
||||
@ -131,7 +134,8 @@ def cmd_hl(cont):
|
||||
|
||||
# Activation
|
||||
if cont.sensors['MO'].status == JUST_ACTIVATED and scene.objects['System']['manip_mode']==0:
|
||||
if obj.name!="Run" and obj.name!="Pause" and obj.name!="Run-Hl" and obj.name!="Pause-Hl":
|
||||
if obj.name!="Run" and obj.name!="Pause" and obj.name!="Stop" and obj.name!="Doc-cmd-colbox":
|
||||
# if obj.name!="Run" and obj.name!="Pause" and obj.name!="Run-Hl" and obj.name!="Pause-Hl" and obj.name!="Pause-Hl":
|
||||
obj.setVisible(False,True)
|
||||
scene.objects[obj.name+'-Hl'].setVisible(True,True)
|
||||
|
||||
@ -226,7 +230,7 @@ def cmd_click(cont):
|
||||
twin_about.open()
|
||||
|
||||
# Aide
|
||||
if obj.name=="Help-cmd" :
|
||||
if obj.name=="Doc-cmd-colbox" :
|
||||
twin_doc.open()
|
||||
|
||||
###############################################################################
|
||||
@ -358,7 +362,8 @@ def manip(cont):
|
||||
width = bge.render.getWindowWidth()
|
||||
height = bge.render.getWindowHeight()
|
||||
dist_orbit_y_base=200 # Pour 1280 x 720
|
||||
radius_orbit_y_base=5
|
||||
# radius_orbit_y_base=5
|
||||
radius_orbit_y_base=0.875
|
||||
diag_base= math.sqrt(1280**2+720**2)
|
||||
diag= math.sqrt(width**2+height**2)
|
||||
dist_orbit_y = dist_orbit_y_base*(diag/diag_base)
|
||||
@ -369,16 +374,19 @@ def manip(cont):
|
||||
if dist_orbit<dist_orbit_y : # Orbit sur xz
|
||||
circle ([x0,y0,z0], radius_orbit_y_base, color_cmd)
|
||||
n=10
|
||||
pas_x=(delta_x*40*sensibilite_orbit)/n
|
||||
pas_y=(((width/2)-cont.sensors['DownM'].position[0])+((height/2)-cont.sensors['DownM'].position[1]))*0.005
|
||||
pas_z=(delta_y*40*sensibilite_orbit)/n
|
||||
# pas_x=(delta_x*40*sensibilite_orbit)/n
|
||||
pas_x=(delta_x*4*sensibilite_orbit)/n
|
||||
# pas_y=(((width/2)-cont.sensors['DownM'].position[0])+((height/2)-cont.sensors['DownM'].position[1]))*0.005
|
||||
pas_y=((((width/2)-cont.sensors['DownM'].position[0])+((height/2)-cont.sensors['DownM'].position[1]))*0.005)/10
|
||||
# pas_z=(delta_y*40*sensibilite_orbit)/n
|
||||
pas_z=(delta_y*4*sensibilite_orbit)/n
|
||||
for i in range (n):
|
||||
bge.render.drawLine([x0+pas_x*i, y0+abs(pas_y*math.sin((3.14*i)/n)), z0-pas_z*i],
|
||||
[x0+pas_x*(i+1), y0+abs(pas_y*math.sin((3.14*(i+1))/n)), z0-pas_z*(i+1)],
|
||||
[0.8, 0.619, 0.021])
|
||||
scene.objects['System'].applyRotation((delta_y*sensibilite_orbit, 0, delta_x*sensibilite_orbit), False)
|
||||
else: # Orbit sur y
|
||||
circle ([x0,y0,z0], 5, color_cmd_hl)
|
||||
circle ([x0,y0,z0], radius_orbit_y_base, color_cmd_hl)
|
||||
if abs(delta_x) >= abs(delta_y):
|
||||
scene.objects['System'].applyRotation((0, delta_x*sensibilite_orbit, 0), False)
|
||||
else:
|
||||
@ -415,8 +423,8 @@ def manip_wheel(cont):
|
||||
# Mise en route et pause du cycle
|
||||
##
|
||||
|
||||
def python_validation():
|
||||
(pylint_stdout, pylint_stderr) = lint.py_run('porcou_cmd.py --disable=C --disable=W --disable=R', return_std=True)
|
||||
def python_validation(file):
|
||||
(pylint_stdout, pylint_stderr) = lint.py_run(file+' --disable=C --disable=W --disable=R', return_std=True)
|
||||
stdout = pylint_stdout.read()
|
||||
stderr = pylint_stderr.read()
|
||||
if " error (" in stdout: # Présence d'erreur
|
||||
@ -449,10 +457,10 @@ def cycle_run ():
|
||||
if scene.objects['System']['thread_cmd']==False:
|
||||
time.sleep(0.125)
|
||||
scene.objects['System']['thread_cmd']=True
|
||||
rp_map.map_reset()
|
||||
system.system_reset()
|
||||
time.sleep(0.125)
|
||||
if python_validation():
|
||||
runpy.run_module('porcou_cmd', run_name='start') # Execution du script utilisateur
|
||||
if python_validation(scene.objects['System']['name']+'_cmd'):
|
||||
runpy.run_module(scene.objects['System']['name']+'_cmd', run_name='start') # Execution du script utilisateur
|
||||
|
||||
# Arrêt de la pause
|
||||
else:
|
||||
@ -465,7 +473,7 @@ def cycle_run ():
|
||||
|
||||
def cycle_stop ():
|
||||
scene.objects['System']['thread_cmd']=False
|
||||
porcou.system_reset()
|
||||
system.system_reset()
|
||||
|
||||
##
|
||||
# Fin naturelle du cycle
|
||||
@ -474,8 +482,8 @@ def cycle_stop ():
|
||||
def cycle_end (cont):
|
||||
if cont.sensors['End cycle'].positive:
|
||||
scene.objects['System']['run']=False
|
||||
if python_validation():
|
||||
runpy.run_module('porcou_cmd', run_name='stop') # Fin du script utilisateur
|
||||
if python_validation(scene.objects['System']['name']+'_cmd'):
|
||||
runpy.run_module(scene.objects['System']['name']+'_cmd', run_name='stop') # Fin du script utilisateur
|
||||
|
||||
# Commandes
|
||||
scene.objects['Pause'].setVisible(False,False)
|
||||
@ -483,4 +491,3 @@ def cycle_end (cont):
|
||||
scene.objects['Pause-Hl'].setVisible(False,False)
|
||||
scene.objects['Run'].setVisible(True,False)
|
||||
scene.objects['Run'].restorePhysics()
|
||||
|
||||
|
@ -4,7 +4,7 @@ import numpy as np
|
||||
|
||||
###############################################################################
|
||||
# twin_about.py
|
||||
# @title: A propos de l'environnement 3D des jumeaux numériques
|
||||
# @title: A propos de l'environnement 3D pour jumeau numérique
|
||||
# @project: Blender-EduTech
|
||||
# @lang: fr
|
||||
# @authors: Philippe Roy <philippe.roy@ac-grenoble.fr>
|
||||
|
@ -2,7 +2,7 @@ import bge # Bibliothèque Blender Game Engine (UPBGE)
|
||||
|
||||
###############################################################################
|
||||
# twin_doc.py
|
||||
# @title: Documentation de l'environnement 3D des jumeaux numériques
|
||||
# @title: Documentation de l'environnement 3D pour jumeau numérique
|
||||
# @project: Blender-EduTech
|
||||
# @lang: fr
|
||||
# @authors: Philippe Roy <philippe.roy@ac-grenoble.fr>
|
||||
|
Loading…
Reference in New Issue
Block a user