Paramétrisation du nom du système

This commit is contained in:
Philippe Roy 2022-12-13 02:42:31 +01:00
parent 4ad306a158
commit 8df093059d
7 changed files with 109 additions and 66 deletions

View File

@ -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

View File

@ -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
###############################################################################

View File

@ -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

39
twin.py
View File

@ -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()

View File

@ -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>

View File

@ -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>