diff --git a/jumeau.py b/jumeau.py new file mode 100644 index 0000000..6b8f41b --- /dev/null +++ b/jumeau.py @@ -0,0 +1,788 @@ +import bge # Blender Game Engine (UPBGE) +import bpy # Blender +import webbrowser +import math +import xml.etree.ElementTree as ET # Creating/parsing XML file + +import cine_doc # Documentation +import cine_about # About + +############################################################################### +# cine.py +# @title: Bibliothèque générale du player 3D d'analyse de cinématique +# @project: Blender-EduTech +# @lang: fr +# @authors: Philippe Roy +# @copyright: Copyright (C) 2020-2022 Philippe Roy +# @license: GNU GPL +# +# Ce player 3D est un environnement léger et spécifique pour la colorisation des solides d'un mécanisme en mouvement. +# Il sert principalement pour l'apprentissage de la détection des classes d'équivalence d'un mécanisme afin de pouvoir faire sa modélisation cinématique. +# +############################################################################### + +# UPBGE scene +eevee = bpy.context.scene.eevee +scene = bge.logic.getCurrentScene() +# print("Objets de la scene : ", scene.objects) + +# Config file +cine_config = ET.parse('cine_config.xml') +cine_config_tree = cine_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_rep_enabled = [0.8, 0.8, 0.8, 1] # Blanc +color_rep_disabled = [0, 0, 0, 1] # Noir + +# Constantes +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 + +############################################################################### +# Gestion du clavier +############################################################################### + +# Mode : Orbit(0) par défaut, Pan(1) avec Shift, Zoom (2) avec Ctrl, Eclaté (1) avec Shift +def keyboard(cont): + obj = scene.objects['Mecanism'] + keyboard = bge.logic.keyboard + + # Touche ESC + if JUST_ACTIVATED in keyboard.inputs[bge.events.ESCKEY].queue: + + # Maj du fichier de config (screen size : data/config/screen/width-> [0][0].text) + screen_width = bge.render.getWindowWidth() + screen_height = bge.render.getWindowHeight() + cine_config_tree[0][0].text=str(screen_width) + cine_config_tree[0][1].text=str(screen_height) + buffer_xml = ET.tostring(cine_config_tree) + with open("cine_config.xml", "wb") as f: + f.write(buffer_xml) + + # Sortir + bge.logic.endGame() + + # Shift -> mode 1 : Pan (clic milieu) ou Eclaté (clic gauche) + if JUST_ACTIVATED in keyboard.inputs[bge.events.LEFTSHIFTKEY].queue: + obj['manip_mode']=1 + if JUST_ACTIVATED in keyboard.inputs[bge.events.RIGHTSHIFTKEY].queue: + obj['manip_mode']=1 + + # Ctrl -> mode 2 : Zoom (clic milieu) + if JUST_ACTIVATED in keyboard.inputs[bge.events.LEFTCTRLKEY].queue: + obj['manip_mode']=2 + if JUST_ACTIVATED in keyboard.inputs[bge.events.RIGHTCTRLKEY].queue: + obj['manip_mode']=2 + + # Pas de modificateur -> mode 0 : Orbit (clic milieu) + if JUST_RELEASED in keyboard.inputs[bge.events.LEFTSHIFTKEY].queue: + obj['manip_mode']=0 + if JUST_RELEASED in keyboard.inputs[bge.events.RIGHTSHIFTKEY].queue: + obj['manip_mode']=0 + if JUST_RELEASED in keyboard.inputs[bge.events.LEFTCTRLKEY].queue: + obj['manip_mode']=0 + if JUST_RELEASED in keyboard.inputs[bge.events.RIGHTCTRLKEY].queue: + obj['manip_mode']=0 + + # Touche Home -> Reset de la vue + if JUST_ACTIVATED in keyboard.inputs[bge.events.HOMEKEY].queue: + manip_reset() + + # Touche Space -> Play et Pause + if JUST_ACTIVATED in keyboard.inputs[bge.events.SPACEKEY].queue: + if scene.objects['Mecanism']['anim'] == True: + anim_pause() + scene.objects['Pause'].setVisible(False,False) + scene.objects['Play'].setVisible(True,False) + else: + anim_play() + scene.objects['Play'].setVisible(False,False) + scene.objects['Pause'].setVisible(True,False) + + # Touche H -> Cacher l'objet (hide) + if JUST_ACTIVATED in keyboard.inputs[bge.events.HKEY].queue: + color_num(8) + + # Touche de 1 à 8 -> Couleur de 1 à 8 + if JUST_ACTIVATED in keyboard.inputs[bge.events.ONEKEY].queue or JUST_ACTIVATED in keyboard.inputs[bge.events.PAD1].queue: + color_num(1) + if JUST_ACTIVATED in keyboard.inputs[bge.events.TWOKEY].queue or JUST_ACTIVATED in keyboard.inputs[bge.events.PAD2].queue: + color_num(2) + if JUST_ACTIVATED in keyboard.inputs[bge.events.THREEKEY].queue or JUST_ACTIVATED in keyboard.inputs[bge.events.PAD3].queue: + color_num(3) + if JUST_ACTIVATED in keyboard.inputs[bge.events.FOURKEY].queue or JUST_ACTIVATED in keyboard.inputs[bge.events.PAD4].queue: + color_num(4) + if JUST_ACTIVATED in keyboard.inputs[bge.events.FIVEKEY].queue or JUST_ACTIVATED in keyboard.inputs[bge.events.PAD5].queue: + color_num(5) + if JUST_ACTIVATED in keyboard.inputs[bge.events.SIXKEY].queue or JUST_ACTIVATED in keyboard.inputs[bge.events.PAD6].queue: + color_num(6) + if JUST_ACTIVATED in keyboard.inputs[bge.events.SEVENKEY].queue or JUST_ACTIVATED in keyboard.inputs[bge.events.PAD7].queue: + color_num(7) + if JUST_ACTIVATED in keyboard.inputs[bge.events.EIGHTKEY].queue or JUST_ACTIVATED in keyboard.inputs[bge.events.PAD8].queue: + color_num(8) + +############################################################################### +# Commandes +############################################################################### + +## +# Initialisation des commandes +## + +def cmd_init(): + # Fichier de config (screen size : data/config/screen/width-> [0][0].text, height-> [0][1].text) + bge.render.setWindowSize(int(cine_config_tree[0][0].text),int(cine_config_tree[0][1].text)) + scene.objects['Play-Hl'].setVisible(False,False) + scene.objects['Pause-Hl'].setVisible(False,False) + scene.objects['Reset-colors-Hl'].setVisible(False,False) + scene.objects['Reset-view-Hl'].setVisible(False,False) + scene.objects['Help-cmd-Hl'].setVisible(False,False) + scene.objects['About-cmd-Hl'].setVisible(False,False) + for i in range (1, 9): + scene.objects['Color-'+str(i)+"-Hl"].setVisible(False,False) + +## +# Highlight des commandes +## + +def cmd_hl(cont): + obj = cont.owner + + # Activation + if cont.sensors['MO'].status == JUST_ACTIVATED and scene.objects['Mecanism']['manip_mode']==0: + if obj.name!="Play" and obj.name!="Pause" and obj.name!="Play-Hl" and obj.name!="Pause-Hl": + obj.setVisible(False,True) + scene.objects[obj.name+'-Hl'].setVisible(True,True) + # obj.color = color_cmd_hl + + # Play et pause + if obj.name=="Pause" or obj.name=="Play": + if scene.objects['Mecanism']['anim'] == True: + scene.objects['Pause'].setVisible(False,False) + scene.objects['Pause-Hl'].setVisible(True,False) + else: + scene.objects['Play'].setVisible(False,False) + scene.objects['Play-Hl'].setVisible(True,False) + + # Désactivation + if cont.sensors['MO'].status == JUST_RELEASED and scene.objects['Mecanism']['manip_mode']==0: + if obj.name!="Play" and obj.name!="Pause" and obj.name!="Play-Hl" and obj.name!="Pause-Hl": + scene.objects[obj.name+'-Hl'].setVisible(False,True) + obj.setVisible(True,True) + + # Play et pause + if obj.name=="Pause" or obj.name=="Play": + if scene.objects['Mecanism']['anim'] == True: + scene.objects['Pause-Hl'].setVisible(False,False) + scene.objects['Pause'].setVisible(True,False) + else: + scene.objects['Play-Hl'].setVisible(False,False) + scene.objects['Play'].setVisible(True,False) + +## +# Click sur les commandes +## + +def cmd_click(cont): + obj = cont.owner + if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive and scene.objects['Mecanism']['manip_mode']==0: + + # Play et pause + if obj.name=="Pause" or obj.name=="Run": + # Pause + if scene.objects['Mecanism']['anim'] == True: + anim_pause() + scene.objects['Pause'].setVisible(False,False) + scene.objects['Pause-Hl'].setVisible(False,False) + scene.objects['Play-Hl'].setVisible(True,False) + else: + # Play + anim_play() + scene.objects['Play'].setVisible(False,False) + scene.objects['Play-Hl'].setVisible(False,False) + scene.objects['Pause-Hl'].setVisible(True,False) + + # Reset-colors + if obj.name=="Reset-colors" : + color_reset() + + # Reset-view + if obj.name=="Reset-view" : + manip_reset() + + # About + if obj.name=="About-cmd" : + if scene.objects['Mecanism']['anim'] == True: # Rendu meilleur en pause + scene.objects['About']['anim']= True + anim_pause() + else: + scene.objects['About']['anim'] = False + cine_about.open() + + # Aide + if obj.name=="Help-cmd" : + if scene.objects['Mecanism']['anim'] == True: # Rendu meilleur en pause + scene.objects['Doc']['anim']= True + anim_pause() + else: + scene.objects['Doc']['anim'] = False + cine_doc.open() + +############################################################################### +# Animation +############################################################################### + +# Initialisation de l'animation -> Play +def anim_init(): + start = 1 + end = 250 + layer = 0 + priority = 1 + blendin = 1.0 + mode = bge.logic.KX_ACTION_MODE_LOOP + layerWeight = 0.0 + ipoFlags = 0 + speed = 1.0 + for objet in scene.objects['Mecanism']['objects_anim'] : + scene.objects[objet].playAction(objet+'-Action', start, end, layer, priority, blendin, mode, layerWeight, ipoFlags, speed) + scene.objects['Play'].setVisible(False,False) + scene.objects['Pause'].setVisible(True,False) + scene.objects['Mecanism']['anim'] = True + +# Animation en pause (bas niveau) +def anim_pause(): + layer = 0 + for objet in scene.objects['Mecanism']['objects_anim'] : + scene.objects['Mecanism']['anim_frame'] = scene.objects[objet].getActionFrame(layer) + scene.objects[objet].stopAction(layer) + scene.objects['Mecanism']['anim'] = False + +# Animation en pseudo-pause +# Play d'une frame pour remettre les pièces en place (après-éclatement) +def anim_play1frame(): + start = scene.objects['Mecanism']['anim_frame'] + end = scene.objects['Mecanism']['anim_frame']+1 + layer = 0 + priority = 1 + blendin = 1.0 + mode = bge.logic.KX_ACTION_MODE_PLAY + layerWeight = 0.0 + ipoFlags = 0 + speed = 1.0 + for objet in scene.objects['Mecanism']['objects_anim'] : + scene.objects[objet].playAction(objet+'-Action', start, end, layer, priority, blendin, mode, layerWeight, ipoFlags, speed) + scene.objects['Mecanism']['anim_frame'] = end + +# Reprise de l'animation (bas niveau) +def anim_play(): + start = scene.objects['Mecanism']['anim_frame'] + end = 250 + layer = 0 + priority = 1 + blendin = 1.0 + mode = bge.logic.KX_ACTION_MODE_PLAY + layerWeight = 0.0 + ipoFlags = 0 + speed = 1.0 + for objet in scene.objects['Mecanism']['objects_anim'] : + scene.objects[objet].playAction(objet+'-Action', start, end, layer, priority, blendin, mode, layerWeight, ipoFlags, speed) + scene.objects['Mecanism']['anim'] = True + +# Play en continu +def anim_boucle(cont): + if scene.objects['Mecanism']['anim'] == True and scene.objects[scene.objects['Mecanism']['objects_anim'][0]].isPlayingAction(0) == False: + start = 1 + end = 250 + layer = 0 + priority = 1 + blendin = 1.0 + mode = bge.logic.KX_ACTION_MODE_LOOP + layerWeight = 0.0 + ipoFlags = 0 + speed = 1.0 + for objet in scene.objects['Mecanism']['objects_anim'] : + scene.objects[objet].playAction(objet+'-Action', start, end, layer, priority, blendin, mode, layerWeight, ipoFlags, speed) + +############################################################################### +# Manipulation du mécanisme +############################################################################### + +## +# Dessiner une cercle (bas niveau) +## + +def circle (center, radius, color): + ang = 0 + ang_step = 0.1 + while ang< 2 * math.pi: + x0 = center[0]+float(radius*math.cos(ang)*0.95) + y0 = center[1] + z0 = center[2]+float(radius*math.sin(ang)) + x1 = center[0]+float(radius*math.cos(ang+ang_step)*0.95) + y1 = center[1] + z1 = center[2]+float(radius*math.sin(ang+ang_step)) + bge.render.drawLine([x0,y0,z0],[x1,y1,z1],color) + ang += ang_step + +# def circle (center, radius, color): +# ang = 0 +# ang_step = 0.1 +# ang_cam = (25.1 * 2 * math.pi)*(1/360) +# while ang< 2 * math.pi: +# x0 = center[0]+float(radius*math.cos(ang)) +# y0 = center[1] +float(radius*math.sin(ang_cam)*math.cos(ang)) +# z0 = center[2]+float(radius*math.sin(ang) - y0*math.tan(ang_cam)) +# x1 = center[0]+float(radius*math.cos(ang+ang_step)) +# y1 = center[1] +float(radius*math.sin(ang_cam)*math.cos(ang+ang_step)) +# z1 = center[2]+float(radius*math.sin(ang+ang_step) - y1*math.tan(ang_cam)) +# bge.render.drawLine([x0,y0,z0],[x1,y1,z1],color) +# ang += ang_step + + +## +# Initialisation de la vue 3D +## + +# def manip_init(cont): +def manip_init(): + + # Configuration du moteur de rendu + eevee.use_eevee_smaa = True + + # Fenêtres + scene.objects['About'].setVisible(False,True) + scene.objects['Doc'].setVisible(False,True) + + # Mémorisation de la position des composants + for objet in scene.objects['Mecanism']['objects'] : + scene.objects[objet]['init_lx']=scene.objects[objet].worldPosition.x + scene.objects[objet]['init_ly']=scene.objects[objet].worldPosition.y + scene.objects[objet]['init_lz']=scene.objects[objet].worldPosition.z + + if 'init_rx' in scene.objects[objet]: + scene.objects[objet]['init_rx'] = scene.objects[objet].worldOrientation.to_euler().x + if 'init_ry' in scene.objects[objet]: + scene.objects[objet]['init_ry'] = scene.objects[objet].worldOrientation.to_euler().y + if 'init_rz' in scene.objects[objet]: + scene.objects[objet]['init_rz'] = scene.objects[objet].worldOrientation.to_euler().z + + # Mémorisation de la position de la caméra + scene.objects['Camera']['init_lx']=scene.objects['Camera'].worldPosition.x + scene.objects['Camera']['init_ly']=scene.objects['Camera'].worldPosition.y + scene.objects['Camera']['init_lz']=scene.objects['Camera'].worldPosition.z + + # Mémorisation de la position du modèle + scene.objects['Mecanism']['init_lx']=scene.objects['Mecanism'].worldPosition.x + scene.objects['Mecanism']['init_ly']=scene.objects['Mecanism'].worldPosition.y + scene.objects['Mecanism']['init_lz']=scene.objects['Mecanism'].worldPosition.z + scene.objects['Mecanism']['init_rx']=scene.objects['Mecanism'].worldOrientation.to_euler().x + scene.objects['Mecanism']['init_ry']=scene.objects['Mecanism'].worldOrientation.to_euler().y + scene.objects['Mecanism']['init_rz']=scene.objects['Mecanism'].worldOrientation.to_euler().z + +## +# Atteindre une orientation (bas niveau) +## + +def applyRotationTo(obj, rx=None, ry=None, rz=None): + 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), True) + if rx-obj.worldOrientation.to_euler().x > rres: + obj.applyRotation((rres, 0, 0), True) + # 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), True) + if ry-obj.worldOrientation.to_euler().y > rres: + obj.applyRotation((0, rres, 0), True) + # 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), True) + if rz-obj.worldOrientation.to_euler().z > rres: + obj.applyRotation((0, 0, rres), True) + # print ("delta z ",rz-obj.worldOrientation.to_euler().z) + +## +# Reset de la manipulation de la vue +## + +def manip_reset(): + scene.objects['Camera'].worldPosition.x = scene.objects['Camera']['init_lx'] + scene.objects['Camera'].worldPosition.y = scene.objects['Camera']['init_ly'] + scene.objects['Camera'].worldPosition.z = scene.objects['Camera']['init_lz'] + applyRotationTo(scene.objects['Mecanism'], 0, 0, 0) + scene.objects['Mecanism'].worldPosition.x = scene.objects['Mecanism']['init_lx'] + scene.objects['Mecanism'].worldPosition.y = scene.objects['Mecanism']['init_ly'] + scene.objects['Mecanism'].worldPosition.z = scene.objects['Mecanism']['init_lz'] + for objet in scene.objects['Mecanism']['objects'] : + scene.objects[objet].setVisible(True,False) + scene.objects[objet].restorePhysics() + if objet+"_Lines.GP" in scene.objects: + scene.objects[objet+"_Lines.GP"].setVisible(True,False) + + # Retour après éclatement + if scene.objects['Mecanism']['expld'] ==True: + print ("retour explod") + scene.objects['Mecanism']['expld'] = False + expld_val = scene.objects['Mecanism']['expld_val'] # Retour après éclatement avec la valeur d'éclatement + sensibilite=0.005 + objects = scene.objects['Mecanism']['objects'] + for object in objects : + ecla_x, ecla_y,ecla_z = 0,0,0 + if 'ecla_x' in scene.objects[object]: + ecla_x = scene.objects[object]['ecla_x'] + if 'ecla_y' in scene.objects[object]: + ecla_y = scene.objects[object]['ecla_y'] + if 'ecla_z' in scene.objects[object]: + ecla_z = scene.objects[object]['ecla_z'] + scene.objects[object].applyMovement((-expld_val*sensibilite*ecla_x, -expld_val*sensibilite*ecla_y , -expld_val*sensibilite*ecla_z), False) + scene.objects['Mecanism']['expld_val'] = 0.00 + if scene.objects['Mecanism']['anim'] == False: # Play d'une frame + anim_play1frame() + +## +# Position de départ pour la manipulation de la vue +## + +def manip_start(cont): + obj = cont.owner + obj['click_x']=cont.sensors['ClickM'].position[0] + obj['click_y']=cont.sensors['ClickM'].position[1] + +## +# Manipulation du modèle ou de la caméra +## + +def manip(cont): + obj = cont.owner + sensibilite_orbit=0.0005 + sensibilite_pan=0.005 + sensibilite_zoom=0.01 + delta_x=cont.sensors['DownM'].position[0]-obj['click_x'] + delta_y=cont.sensors['DownM'].position[1]-obj['click_y'] + + # Orbit + if obj['manip_mode']==0: + x0 = scene.objects['Orbit'].worldPosition.x + y0 =scene.objects['Orbit'].worldPosition.y + z0 =scene.objects['Orbit'].worldPosition.z + width = bge.render.getWindowWidth() + height = bge.render.getWindowHeight() + dist_orbit_y_base=200 # Pour 1280 x 720 + radius_orbit_y_base=5 + 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) + radius_orbit_y=radius_orbit_y_base*(diag/diag_base) + dist_orbit = math.sqrt(((width/2)-obj['click_x'])**2+((height/2)-obj['click_y'])**2) + if obj['click_y']> height/2 : + dist_orbit = dist_orbit+((math.sqrt(((height/2)-obj['click_y'])**2)/175)*25) # Correction des Y sous le centre ? + if dist_orbit= abs(delta_y): + scene.objects['Mecanism'].applyRotation((0, delta_x*sensibilite_orbit, 0), False) + else: + scene.objects['Mecanism'].applyRotation((0, delta_y*sensibilite_orbit, 0), False) + + + # FIXME : Détecter le sens (trigo ou horaire) + # print ("cont.sensors['DownM'].position[0]", cont.sensors['DownM'].position[0]) + # print ("cont.sensors['DownM'].position[1]", cont.sensors['DownM'].position[1]) + # print ("delta_x", delta_x) + # print ("delta_y", delta_y) + # # if delta_x != 0 and delta_y != 0: + # # print ("delta :", math.sqrt(abs(delta_x*delta_y))*sensibilite_orbit*(delta_x/abs(delta_x))*(delta_y/abs(delta_y))) + # # scene.objects['Mecanism'].applyRotation((0, math.sqrt(abs(delta_x*delta_y))*sensibilite_orbit*(delta_x/abs(delta_x))*(delta_y/abs(delta_y)), 0), False) + # # elif delta_y != 0: + # # print ("delta :", math.sqrt(abs(delta_x*delta_y))*sensibilite_orbit*(delta_y/abs(delta_y))) + # # scene.objects['Mecanism'].applyRotation((0, math.sqrt(abs(delta_x*delta_y))*sensibilite_orbit*(delta_y/abs(delta_y)), 0), False) + # # elif delta_x != 0: + # # print ("delta :", math.sqrt(abs(delta_x*delta_y))*sensibilite_orbit*(delta_x/abs(delta_x))) + # # scene.objects['Mecanism'].applyRotation((0, math.sqrt(abs(delta_x*delta_y))*sensibilite_orbit*(delta_x/abs(delta_x)), 0), False) + # if abs(delta_x) >= abs(delta_y): + # scene.objects['Mecanism'].applyRotation((0, delta_x*sensibilite_orbit, 0), False) + # # if cont.sensors['DownM'].position[1] > height /2: + # # scene.objects['Mecanism'].applyRotation((0, delta_x*sensibilite_orbit, 0), False) + # # else: + # # scene.objects['Mecanism'].applyRotation((0, -delta_x*sensibilite_orbit, 0), False) + # else: + # scene.objects['Mecanism'].applyRotation((0, delta_y*sensibilite_orbit, 0), False) + # # if cont.sensors['DownM'].position[0] > width /2: + # # scene.objects['Mecanism'].applyRotation((0, delta_y*sensibilite_orbit, 0), False) + # # else: + # # scene.objects['Mecanism'].applyRotation((0, -delta_y*sensibilite_orbit, 0), False) + + # Pan + if obj['manip_mode']==1: # Shift + scene.objects['Mecanism'].applyMovement((delta_x*sensibilite_pan, -delta_y*sensibilite_pan, -delta_y*sensibilite_pan), False) + # scene.objects['Camera'].applyMovement((delta_x*-sensibilite_pan, delta_y*sensibilite_pan, 0), True) + + # Zoom + if obj['manip_mode']==2: # Ctrl + scene.objects['Camera'].applyMovement((0, 0, (delta_x+delta_y)*sensibilite_zoom), True) + scene.objects['Camera'].applyMovement((0, 0, (delta_x+delta_y)*sensibilite_zoom), True) + +## +# Zoom +## + +def manip_wheel(cont): + obj = cont.owner + sensibilite_wheel = 20 + if cont.sensors['WheelUp'].positive: + scene.objects['Camera'].applyMovement((0, 0, -sensibilite_wheel), True) + if cont.sensors['WheelDown'].positive: + scene.objects['Camera'].applyMovement((0, 0, sensibilite_wheel), True) + +############################################################################### +# Eclaté +############################################################################### + +# Position de départ pour l'éclatement de la vue +def expld_start(cont): + if scene.objects['Mecanism']['manip_mode']==1: + obj = cont.owner + obj['click_x']=cont.sensors['Click'].position[0] + obj['click_y']=cont.sensors['Click'].position[1] + +# Déplacement des composants en vue eclatée +def expld(cont): + obj = cont.owner + sensibilite=0.005 + delta=(cont.sensors['Down'].position[0]-obj['click_x'])+(cont.sensors['Down'].position[1]-obj['click_y']) + objects = scene.objects['Mecanism']['objects'] + if obj['manip_mode']==1: # Shift + scene.objects['Mecanism']['expld'] =True + scene.objects['Mecanism']['expld_val'] =scene.objects['Mecanism']['expld_val']+delta + + # Déplacement dans le repère du mécanisme + x_axis = scene.objects['Mecanism'].orientation.col[0] + y_axis = scene.objects['Mecanism'].orientation.col[1] + z_axis = scene.objects['Mecanism'].orientation.col[2] + for object in objects : + ecla_x, ecla_y,ecla_z = 0,0,0 + if 'ecla_x' in scene.objects[object]: + ecla_x = scene.objects[object]['ecla_x'] + if 'ecla_y' in scene.objects[object]: + ecla_y = scene.objects[object]['ecla_y'] + if 'ecla_z' in scene.objects[object]: + ecla_z = scene.objects[object]['ecla_z'] + scene.objects[object].applyMovement((delta*sensibilite*ecla_x*x_axis[0], delta*sensibilite*ecla_x*x_axis[1] , delta*sensibilite*ecla_x*x_axis[2]), False) + scene.objects[object].applyMovement((delta*sensibilite*ecla_y*y_axis[0], delta*sensibilite*ecla_y*y_axis[1] , delta*sensibilite*ecla_y*y_axis[2]), False) + scene.objects[object].applyMovement((delta*sensibilite*ecla_z*z_axis[0], delta*sensibilite*ecla_z*z_axis[1] , delta*sensibilite*ecla_z*z_axis[2]), False) + +############################################################################### +# Couleur +############################################################################### + +# Reset des couleurs du mécanisme +def color_reset(): + colors_dict = scene.objects['Mecanism']['colors_dict'] + for object in scene.objects['Mecanism']['objects'] : + scene.objects[object].color = colors_dict[scene.objects['Mecanism']['objects_dict'][object][2]] + scene.objects['Nomenclature-'+str(scene.objects['Mecanism']['objects_dict'][object][0])].color = colors_dict[scene.objects['Mecanism']['objects_dict'][object][2]] + scene.objects['Nomenclature-'+str(scene.objects['Mecanism']['objects_dict'][object][0])+'-Hl'].color = colors_dict[scene.objects['Mecanism']['objects_dict'][object][2]] + +# Sélection couleur dans la palette avec son numéro de couleur (bas niveau) +def color_num(num): + for i in range (1, 9): + scene.objects['Color-'+str(i)].worldScale=[0.125, 0.125, 0.125] + scene.objects['Color-'+str(i)+"-Hl"].worldScale=[0.125, 0.125, 0.125] + scene.objects['Color-'+str(num)].worldScale=[0.156, 0.156, 0.156] + scene.objects['Color-'+str(num)+'-Hl'].worldScale=[0.156, 0.156, 0.156] + scene.objects['Colors']['color_current']=num + +# Clic sur la palette +def color_click(cont): + obj = cont.owner + if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive and scene.objects['Mecanism']['manip_mode']==0: + color_num(int(obj.name[6])) + +# Highlight de la palette +def color_hl(cont): + if cont.sensors['MO'].positive and scene.objects['Mecanism']['manip_mode']==0: + hitObject = cont.sensors['MO'].hitObject + if hitObject is not None and "-Hl" not in hitObject .name: + hitObject.setVisible(False,True) + scene.objects[hitObject.name+'-Hl'].setVisible(True,True) + # obj.color = color_cmd_hl + if cont.sensors['MO'].status == JUST_RELEASED: + for i in range (1, 9): + scene.objects['Color-'+str(i)].setVisible(True,True) + scene.objects['Color-'+str(i)+"-Hl"].setVisible(False,True) + +# Colorisation de la pièce +def color_object(cont): + if cont.sensors['Click'].positive and scene.objects['Mecanism']['manip_mode']==0: + hitObject = cont.sensors['MO'].hitObject + if hitObject is not None and hitObject.visible: + color_select = scene.objects['Colors']['color_current'] + if color_select != 0 and color_select != 8: + colors = scene.objects['Mecanism']['colors'] + hitObject.color = colors[color_select-1][1] + scene.objects['Nomenclature-'+str(scene.objects['Mecanism']['objects_dict'][hitObject.name][0])].color = colors[color_select-1][1] + scene.objects['Nomenclature-'+str(scene.objects['Mecanism']['objects_dict'][hitObject.name][0])+'-Hl'].color = colors[color_select-1][1] + if color_select == 8: # Couleur transparente -> disparition + hitObject.setVisible(False,False) + hitObject.suspendPhysics (True) + if hitObject.name+"_Lines.GP" in scene.objects: + scene.objects[hitObject.name+"_Lines.GP"].setVisible(False,False) + +############################################################################### +# Objets +############################################################################### + +# Initialisation du mécanisme +def objects_init(): + + objects = scene.objects['Mecanism']['objects'] + objects_dict = scene.objects['Mecanism']['objects_dict'] + colors_dict = scene.objects['Mecanism']['colors_dict'] + + i=1 + for object in objects: + + # Couleurs + scene.objects[object].color = colors_dict[objects_dict[object][2]] + + # Nomenclature + scene.objects['Nomenclature-'+str(i)]['Text'] = objects_dict[object][1] + scene.objects['Nomenclature-'+str(i)]['Object'] = objects[i-1] + scene.objects['Nomenclature-'+str(i)].color = colors_dict[objects_dict[object][2]] + scene.objects['Nomenclature-'+str(i)+'-Hl'].setVisible(False,False) + scene.objects['Nomenclature-'+str(i)+'-Hl']['Text'] = objects_dict[object][1] + scene.objects['Nomenclature-'+str(i)+'-Hl'].color = colors_dict[objects_dict[object][2]] + scene.objects['Nomenclature-'+str(i)+'-Ot']['Text'] = objects_dict[object][1] + scene.objects['Nomenclature-'+str(i)+'-Ot2']['Text'] = objects_dict[object][1] + scene.objects['Nomenclature-'+str(i)+'-Ot2'].setVisible(False,False) + + # Repères + if len(objects_dict[object][3])>0: + scene.objects['Rep-'+str(i)]['Object'] = objects[i-1] + scene.objects['Rep-'+str(i)].color = color_rep_disabled + scene.objects['Rep-'+str(i)+'-Hl'].setVisible(False,False) + for j in range (len (objects_dict[object][3])): + scene.objects[objects_dict[object][3][j]].setVisible(False,True) + + i +=1 + +# Highlight de la pièce dans la nomenclature +def object_hl(cont): + if cont.sensors['MO'].status == JUST_ACTIVATED and scene.objects['Mecanism']['manip_mode']==0: + hitObject = cont.sensors['MO'].hitObject + if hitObject is not None and hitObject.visible: + scene.objects['Nomenclature-'+str(scene.objects['Mecanism']['objects_dict'][hitObject.name][0])].setVisible(False,False) + scene.objects['Nomenclature-'+str(scene.objects['Mecanism']['objects_dict'][hitObject.name][0])+'-Hl'].setVisible(True,False) + scene.objects['Nomenclature-'+str(scene.objects['Mecanism']['objects_dict'][hitObject.name][0])+'-Ot2'].setVisible(True,False) + if cont.sensors['MO'].status == JUST_RELEASED: + for objet in scene.objects['Mecanism']['objects'] : + scene.objects['Nomenclature-'+str(scene.objects['Mecanism']['objects_dict'][objet][0])].setVisible(True,False) + scene.objects['Nomenclature-'+str(scene.objects['Mecanism']['objects_dict'][objet][0])+'-Hl'].setVisible(False,False) + scene.objects['Nomenclature-'+str(scene.objects['Mecanism']['objects_dict'][objet][0])+'-Ot2'].setVisible(False,False) + +############################################################################### +# Nomenclature +############################################################################### + +# Clic sur la nomenclature +def nom_click(cont): + name=cont.owner.name[:-7] + obj = scene.objects[name] + if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive and scene.objects['Mecanism']['manip_mode']==0: + color_select = scene.objects['Colors']['color_current'] + + # Colorisation de la pièce par la nomenclature + if color_select != 0 and color_select != 8: + colors = scene.objects['Mecanism']['colors'] + obj.color = colors[color_select-1][1] + scene.objects[name+'-Hl'].color = colors[color_select-1][1] + scene.objects[obj['Object']].color = colors[color_select-1][1] + if scene.objects[obj['Object']].visible==False: + scene.objects[obj['Object']].setVisible(True,False) + scene.objects[obj['Object']].restorePhysics() + if obj['Object']+"_Lines.GP" in scene.objects: + scene.objects[obj['Object']+"_Lines.GP"].setVisible(True,False) + + # Couleur transparente -> disparition / apparition + if color_select == 8: + if scene.objects[obj['Object']].visible==True: + scene.objects[obj['Object']].setVisible(False,False) + scene.objects[obj['Object']].suspendPhysics (True) + if obj['Object']+"_Lines.GP" in scene.objects: + scene.objects[obj['Object']+"_Lines.GP"].setVisible(False,False) + else: + scene.objects[obj['Object']].setVisible(True,False) + scene.objects[obj['Object']].restorePhysics() + if obj['Object']+"_Lines.GP" in scene.objects: + scene.objects[obj['Object']+"_Lines.GP"].setVisible(True,False) + +# Highlight de la nomenclature +def nom_hl(cont): + name=cont.owner.name[:-7] + obj = scene.objects[name] + if cont.sensors['MO'].status == JUST_ACTIVATED and scene.objects['Mecanism']['manip_mode']==0: + obj.setVisible(False,False) + scene.objects[name+'-Hl'].setVisible(True,False) + scene.objects[name+'-Ot2'].setVisible(True,False) + if cont.sensors['MO'].status == JUST_RELEASED and scene.objects['Mecanism']['manip_mode']==0: + obj.setVisible(True,False) + scene.objects[name+'-Hl'].setVisible(False,False) + scene.objects[name+'-Ot2'].setVisible(False,False) + +############################################################################### +# Repères +############################################################################### + +# Click sur un repère +def rep_click(cont): + name=cont.owner.name[:-7] + obj = scene.objects[name] + if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive and scene.objects['Mecanism']['manip_mode']==0: + objects_dict = scene.objects['Mecanism']['objects_dict'] + if obj['enabled']: + for i in range (len (objects_dict[obj['Object']][3])): + scene.objects[objects_dict[obj['Object']][3][i]].setVisible(False,True) + obj.color = color_rep_disabled + obj['enabled']=False + else: + for i in range (len (objects_dict[obj['Object']][3])): + scene.objects[objects_dict[obj['Object']][3][i]].setVisible(True,True) + obj.color = color_rep_enabled + obj['enabled']=True + +# Highlight sur un repère +def rep_hl(cont): + name=cont.owner.name[:-7] + obj = scene.objects[name] + if cont.sensors['MO'].status == JUST_ACTIVATED and scene.objects['Mecanism']['manip_mode']==0: + obj.setVisible(False,False) + scene.objects[name+'-Hl'].setVisible(True,False) + if cont.sensors['MO'].status == JUST_RELEASED and scene.objects['Mecanism']['manip_mode']==0: + obj.setVisible(True,False) + scene.objects[name+'-Hl'].setVisible(False,False) diff --git a/jumeau_about.py b/jumeau_about.py new file mode 100644 index 0000000..0f01c9d --- /dev/null +++ b/jumeau_about.py @@ -0,0 +1,239 @@ +import bge # Bibliothèque Blender Game Engine (UPBGE) +import webbrowser +import numpy as np + +############################################################################### +# cine_about.py +# @title: A propos du player 3D d'analyse de cinématique +# @project: Blender-EduTech +# @lang: fr +# @authors: Philippe Roy +# @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 + +# 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 + +## +# Ouverture +## + +def open(): + scene.active_camera = scene.objects["Camera-About"] + scene.objects['About_close'].color= color_link + scene.objects['About_screen-up'].color= color_link + scene.objects['About_screen-down'].color= color_link + scene.objects['About_screen']['Text']= "Taille écran : "+str(bge.render.getWindowWidth()) +" x "+str(bge.render.getWindowHeight()) + + scene.objects['About_link-git'].color= color_link + scene.objects['About_link-git']['Text'] = "Dépôt des sources" # Pas de ô dans Blender + scene.objects['About_link-gpl'].color= color_link + scene.objects['About_link-upbge'].color= color_link + + scene.objects['About'].setVisible(True,True) + + # Boutons < et > ("640x360", "960x540", "1280x720", "1920x1080") + if bge.render.getWindowWidth() <=640: + scene.objects['About_screen-down'].setVisible(False,True) + scene.objects['About_screen-down-colbox'].suspendPhysics (True) + else: + scene.objects['About_screen-down'].setVisible(True,True) + scene.objects['About_screen-down-colbox'].restorePhysics() + if bge.render.getWindowWidth() >= 1920: + scene.objects['About_screen-up'].setVisible(False,True) + scene.objects['About_screen-up-colbox'].suspendPhysics (True) + else: + scene.objects['About_screen-up'].setVisible(True,True) + scene.objects['About_screen-up-colbox'].restorePhysics() + +def close(cont): + if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive : + if scene.objects['About']['anim'] == True: + start = scene.objects['Mecanism']['anim_frame'] + end = 250 + layer = 0 + priority = 1 + blendin = 1.0 + mode = bge.logic.KX_ACTION_MODE_PLAY + layerWeight = 0.0 + ipoFlags = 0 + speed = 1.0 + for objet in scene.objects['Mecanism']['objects_anim'] : + scene.objects[objet].playAction(objet+'-Action', start, end, layer, priority, blendin, mode, layerWeight, ipoFlags, speed) + scene.objects['Mecanism']['anim'] = True + scene.objects['About']['anim'] == False + scene.active_camera = scene.objects["Camera"] + scene.objects['About'].setVisible(False,True) + +## +# Highlight +## + +def hl(cont): + if cont.sensors['MO'].status == JUST_ACTIVATED: + obj = cont.owner + name=obj.name[:-7] + scene.objects[name].color = color_link_hl + + if cont.sensors['MO'].status == JUST_RELEASED: + obj = cont.owner + name=obj.name[:-7] + scene.objects[name].color = color_link + +## +# Liens +## + +def link(cont): + if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive : + obj = cont.owner + name=obj.name[:-7] + link={ + 'About_link-git' : 'https://gitlab.com/blender-edutech/kinematic_player', + 'About_link-gpl' : 'https://www.gnu.org/licenses/gpl-3.0.html', + 'About_link-upbge' : 'https://www.upbge.org'} + webbrowser.open(link [name]) + +## +# Configuration de l'écran +## + +def get_near_pos(array,value): + array = np.asarray(array) + idx = (np.abs(array-value)).argmin() + return idx + + +# def about_screen_up(cont): +# if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive : +# screen_width_mode=[640, 960, 1280, 1920] +# screen_height_mode=[360, 540, 720,1080] +# screen_mode_txt=["640x360", "960x540", "1280x720", "1920x1080"] +# i = get_near_pos(screen_width_mode, bge.render.getWindowWidth()) +# if i>=0 and i<3 : +# screen_width=screen_width_mode[i+1] +# screen_height=screen_height_mode[i+1] +# scene.objects['About_screen']['Text']= "SCREEN SIZE : "+str(screen_width) +" x "+str(screen_height) +# bge.render.setWindowSize(screen_width,screen_height) + +# # Boutons < et > +# if screen_width <=640: +# scene.objects['About_screen-down'].setVisible(False,True) +# scene.objects['About_screen-down-colbox'].suspendPhysics (True) +# else: +# scene.objects['About_screen-down'].setVisible(True,True) +# scene.objects['About_screen-down-colbox'].restorePhysics() +# if screen_width >= 1920: +# scene.objects['About_screen-up'].setVisible(False,True) +# scene.objects['About_screen-up-colbox'].suspendPhysics (True) +# else: +# scene.objects['About_screen-up'].setVisible(True,True) +# scene.objects['About_screen-up-colbox'].restorePhysics() + +# # Maj du fichier de config (screen size : data/config/screen/width-> [0][3][0].text) +# rp_config_tree[0][3][0].text=str(screen_width) +# rp_config_tree[0][3][1].text=str(screen_height) +# buffer_xml = ET.tostring(rp_config_tree) +# with open("rp_config.xml", "wb") as f: +# f.write(buffer_xml) + +# Taille de l'écran + +def screen_up(cont): + if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive : + screen_width_mode=[640, 960, 1280, 1920] + screen_height_mode=[360, 540, 720,1080] + screen_mode_txt=["640x360", "960x540", "1280x720", "1920x1080"] + i = get_near_pos(screen_width_mode, bge.render.getWindowWidth()) + if i>=0 and i<3 : + screen_width=screen_width_mode[i+1] + screen_height=screen_height_mode[i+1] + scene.objects['About_screen']['Text']= "Taille écran : "+str(screen_width) +" x "+str(screen_height) + bge.render.setWindowSize(screen_width,screen_height) + + # Boutons < et > + if screen_width <=640: + scene.objects['About_screen-down'].setVisible(False,True) + scene.objects['About_screen-down-colbox'].suspendPhysics (True) + else: + scene.objects['About_screen-down'].setVisible(True,True) + scene.objects['About_screen-down-colbox'].restorePhysics() + if screen_width >= 1920: + scene.objects['About_screen-up'].setVisible(False,True) + scene.objects['About_screen-up-colbox'].suspendPhysics (True) + else: + scene.objects['About_screen-up'].setVisible(True,True) + scene.objects['About_screen-up-colbox'].restorePhysics() + + +# def about_screen_down(cont): +# if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive : +# screen_width_mode=[640, 960, 1280, 1920] +# screen_height_mode=[360, 540, 720,1080] +# screen_mode_txt=["640x360", "960x540", "1280x720", "1920x1080"] +# i = get_near_pos(screen_width_mode, bge.render.getWindowWidth()) +# if i>0 and i<=3 : +# screen_width=screen_width_mode[i-1] +# screen_height=screen_height_mode[i-1] +# scene.objects['About_screen']['Text']= "SCREEN SIZE : "+str(screen_width) +" x "+str(screen_height) +# bge.render.setWindowSize(screen_width,screen_height) + +# # Boutons < et > +# if screen_width <=640: +# scene.objects['About_screen-down'].setVisible(False,True) +# scene.objects['About_screen-down-colbox'].suspendPhysics (True) +# else: +# scene.objects['About_screen-down'].setVisible(True,True) +# scene.objects['About_screen-down-colbox'].restorePhysics() +# if screen_width >= 1920: +# scene.objects['About_screen-up'].setVisible(False,True) +# scene.objects['About_screen-up-colbox'].suspendPhysics (True) +# else: +# scene.objects['About_screen-up'].setVisible(True,True) +# scene.objects['About_screen-up-colbox'].restorePhysics() + +# # Maj du fichier de config (screen size : data/config/screen/width-> [0][3][0].text) +# rp_config_tree[0][3][0].text=str(screen_width) +# rp_config_tree[0][3][1].text=str(screen_height) +# buffer_xml = ET.tostring(rp_config_tree) +# with open("rp_config.xml", "wb") as f: +# f.write(buffer_xml) + +# Taille de l'écran - +def screen_down(cont): + if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive : + screen_width_mode=[640, 960, 1280, 1920] + screen_height_mode=[360, 540, 720,1080] + screen_mode_txt=["640x360", "960x540", "1280x720", "1920x1080"] + i = get_near_pos(screen_width_mode, bge.render.getWindowWidth()) + if i>0 and i<=3 : + screen_width=screen_width_mode[i-1] + screen_height=screen_height_mode[i-1] + scene.objects['About_screen']['Text']= "Taille écran : "+str(screen_width) +" x "+str(screen_height) + bge.render.setWindowSize(screen_width,screen_height) + + # Boutons < et > + if screen_width <=640: + scene.objects['About_screen-down'].setVisible(False,True) + scene.objects['About_screen-down-colbox'].suspendPhysics (True) + else: + scene.objects['About_screen-down'].setVisible(True,True) + scene.objects['About_screen-down-colbox'].restorePhysics() + if screen_width >= 1920: + scene.objects['About_screen-up'].setVisible(False,True) + scene.objects['About_screen-up-colbox'].suspendPhysics (True) + else: + scene.objects['About_screen-up'].setVisible(True,True) + scene.objects['About_screen-up-colbox'].restorePhysics() + diff --git a/jumeau_config.xml b/jumeau_config.xml new file mode 100644 index 0000000..0dd1a39 --- /dev/null +++ b/jumeau_config.xml @@ -0,0 +1,6 @@ + + + 1280 + 720 + + \ No newline at end of file diff --git a/jumeau_doc.py b/jumeau_doc.py new file mode 100644 index 0000000..ef96fe1 --- /dev/null +++ b/jumeau_doc.py @@ -0,0 +1,68 @@ +import bge # Bibliothèque Blender Game Engine (UPBGE) + +############################################################################### +# jumeau_doc.py +# @title: Documentation du jumeau numérique +# @project: Blender-EduTech +# @lang: fr +# @authors: Philippe Roy +# @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 + +# 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 + +## +# Ouverture +## + +def open(): + scene.active_camera = scene.objects["Camera-Doc"] + scene.objects['Doc_close'].color= color_link + scene.objects['Doc'].setVisible(True,True) + +def close(cont): + if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive : + if scene.objects['Doc']['anim'] == True: + start = scene.objects['Mecanism']['anim_frame'] + end = 250 + layer = 0 + priority = 1 + blendin = 1.0 + mode = bge.logic.KX_ACTION_MODE_PLAY + layerWeight = 0.0 + ipoFlags = 0 + speed = 1.0 + for objet in scene.objects['Mecanism']['objects_anim'] : + scene.objects[objet].playAction(objet+'-Action', start, end, layer, priority, blendin, mode, layerWeight, ipoFlags, speed) + scene.objects['Mecanism']['anim'] = True + scene.objects['Doc']['anim'] == False + scene.active_camera = scene.objects["Camera"] + scene.objects['Doc'].setVisible(False,True) + +## +# Highlight +## + +def hl(cont): + if cont.sensors['MO'].status == JUST_ACTIVATED: + obj = cont.owner + name=obj.name[:-7] + scene.objects[name].color = color_link_hl + + if cont.sensors['MO'].status == JUST_RELEASED: + obj = cont.owner + name=obj.name[:-7] + scene.objects[name].color = color_link diff --git a/portail_coulissant/jumeau.py b/portail_coulissant/jumeau.py new file mode 120000 index 0000000..0ac0b7a --- /dev/null +++ b/portail_coulissant/jumeau.py @@ -0,0 +1 @@ +/home/phroy/Bureau/seriousgames/blender-edutech/git/digital_twin/jumeau.py \ No newline at end of file diff --git a/portail_coulissant/jumeau_about.py b/portail_coulissant/jumeau_about.py new file mode 120000 index 0000000..67bf6c7 --- /dev/null +++ b/portail_coulissant/jumeau_about.py @@ -0,0 +1 @@ +/home/phroy/Bureau/seriousgames/blender-edutech/git/digital_twin/jumeau_about.py \ No newline at end of file diff --git a/portail_coulissant/jumeau_config.xml b/portail_coulissant/jumeau_config.xml new file mode 120000 index 0000000..ebdcd29 --- /dev/null +++ b/portail_coulissant/jumeau_config.xml @@ -0,0 +1 @@ +/home/phroy/Bureau/seriousgames/blender-edutech/git/digital_twin/jumeau_config.xml \ No newline at end of file diff --git a/portail_coulissant/jumeau_doc.py b/portail_coulissant/jumeau_doc.py new file mode 120000 index 0000000..373b2c5 --- /dev/null +++ b/portail_coulissant/jumeau_doc.py @@ -0,0 +1 @@ +/home/phroy/Bureau/seriousgames/blender-edutech/git/digital_twin/jumeau_doc.py \ No newline at end of file diff --git a/portail_coulissant/portail_coulissant-12.blend b/portail_coulissant/portail_coulissant-12.blend new file mode 100644 index 0000000..6a5f4f6 Binary files /dev/null and b/portail_coulissant/portail_coulissant-12.blend differ diff --git a/simul_doc.py b/simul_doc.py index fc31dd9..ef96fe1 100644 --- a/simul_doc.py +++ b/simul_doc.py @@ -1,8 +1,8 @@ import bge # Bibliothèque Blender Game Engine (UPBGE) ############################################################################### -# cine_doc.py -# @title: Documentation du player 3D d'analyse de cinématique +# jumeau_doc.py +# @title: Documentation du jumeau numérique # @project: Blender-EduTech # @lang: fr # @authors: Philippe Roy