Animer des pièces dessinés avec Freecad

Forum destiné aux questions et discussions en français
Forum rules
Be nice to others! Read the FreeCAD code of conduct!
User avatar
flachyjoe
Veteran
Posts: 1891
Joined: Sat Mar 31, 2012 12:00 pm
Location: Limoges, France

Re: Animer des pièces dessinés avec Freecad

Post by flachyjoe »

Salut,
une solution pour stopper la boucle :

Code: Select all

# -*- coding: utf-8 -*-
#la ligne ci dessus permet d'avoir des accents dans le fichier

import time
def ouvrir():
   i=0
   while (i < 90):
      i=i+1
      p.Placement = App.Placement(App.Vector(0,0,0), App.Rotation(App.Vector(0,1,0),i), App.Vector(0,0,0)) # modifie le Placement de p (Rotation Axe Z)
      Gui.updateGui()   # met l’écran graphique a jour

def fermer():
   i=90
   while (i >0):
      i=i-1
      p.Placement = App.Placement(App.Vector(0,0,0), App.Rotation(App.Vector(0,1,0),i), App.Vector(0,0,0)) # modifie le Placement de p (Rotation Axe Z)
      Gui.updateGui()   # met l’écran graphique a jour


from PySide import QtGui	#on charge les outils qu'il faut
dial = QtGui.QProgressDialog(u"Animation en cours...", u"Stopper",0,0)	#Définition d'une boite de message
dial.setModal(True)	#En faire un message bloquant (pas d'utilisation de FreeCAD pendant ce temps)
dial.show()	#Afficher le message

animer=True
while(animer):
   p = FreeCAD.ActiveDocument.getObjectsByLabel("portail")[0]    # on travaille sur p qui représente les données de "portail"
   ouvrir()
   time.sleep(2) # Attendre 2s
   fermer()
   time.sleep(2) # Attendre 2s
   QtGui.qApp.processEvents()		#Laisser le gestionnaire graphique faire son boulot
   animer= not dial.wasCanceled()	#Vérifier l'appui sur le bouton
- Flachy Joe -
Image
jbe
Posts: 368
Joined: Sun Nov 10, 2013 4:18 pm
Location: France, Châteauroux

Re: Animer des pièces dessinés avec Freecad

Post by jbe »

Bien, maintenant et avec votre aide, je sais faire tourner des pièces avec python. Il y aura sans doute encore des choses à découvrir, mais pour l'instant je bloque sous autre chose.

J'essaie de faire une translation d'une pièce, mais pas moyen.

Quelqu’un sait il comment faire ?
fran6t
Posts: 354
Joined: Tue Jul 15, 2014 9:29 am
Location: Montauban
Contact:

Re: Animer des pièces dessinés avec Freecad

Post by fran6t »

C'est le meme principe mais cette fois-ci tu agis sur l'axe de la translation ici j'ai mis la variable i a la place de la valeur y ainsi
ma piece bouge sur l'axe y

Code: Select all

FreeCAD.getDocument("_0_assemblage_total").getObject("refine002").Placement = App.Placement(App.Vector(0,0,i),App.Rotation(App.Vector(0,0,1),0)) 
jbe
Posts: 368
Joined: Sun Nov 10, 2013 4:18 pm
Location: France, Châteauroux

Re: Animer des pièces dessinés avec Freecad

Post by jbe »

Merci, je vais essayer.
jbe
Posts: 368
Joined: Sun Nov 10, 2013 4:18 pm
Location: France, Châteauroux

Re: Animer des pièces dessinés avec Freecad

Post by jbe »

Cela marche nickel.
Je n'ai plus qu'à dessiner les pièces autour du portail, et surtout la crémaillère et le moto réducteur qui entraîne tout ceci.

Après il faudra essayer de tester la collision entre 2 pièces. J'ai vue ceci sur le forum Freecad aux US.
jbe
Posts: 368
Joined: Sun Nov 10, 2013 4:18 pm
Location: France, Châteauroux

Re: Animer des pièces dessinés avec Freecad

Post by jbe »

Les premiers résultats, un portail qui s'ouvre, reste ouvert pendant deux secondes, puis se ferme, et reste fermé pendant 2 secondes.
J'ai détaillé au maximum le programme.
A régler :
Le portail, ne tourne pas autour de l'axe qui est prévu, mais autour d'une arrête du poteau.
Il faudrait pouvoir déplacer l'axe de rotation Z en x, et y.

Le prochain, un portail à crémaillère. Cela va être plus difficile.

ET MERCI A TOUT CEUX QUI M'ONT AIDE.
Assemblage portail.fcstd
(17.05 KiB) Downloaded 78 times

Code: Select all

import math, time, Part
# -*- coding: utf-8 -*-
#la ligne ci dessus permet d'avoir des accents dans le fichier

def ouvrir():
   i=0
   common = p.Shape.common(car.Shape ) # common fait l'intersection forme des pièces, ici la butée avant et le portail
   while not(common.Volume)>0.0:# tant que me portail n'est pas ouvert
      i=i+0.5 # incrémente de 0.5 degré l'angle pour ouvrir la barrière.
      p.Placement = App.Placement(App.Vector(0,0,0), App.Rotation(App.Vector(0,1,0),i), App.Vector(0,0,0)) # modifie le Placement de p (Rotation Axe Z)
      Gui.updateGui() #Met l'écran graphique à jour
      common = p.Shape.common( car.Shape ) # refait common fait l'intersection forme des pièces, ici la butée avant et le portail avres le nouveau de déplacementde 0.5 degré.

def fermer():
   i=110
   common = p.Shape.common(cav.Shape ) # common fait l'intersection forme des pièces, ici la butée avant et le portail
   while not(common.Volume)>0.0:
         i=i-0.5 # Décrémente la variable de 1/10, donc a chaque passag dans la boucle While, la barrière tourne 1/10 de degré.
         p.Placement = App.Placement(App.Vector(0,0,0), App.Rotation(App.Vector(0,1,0),i), App.Vector(0,0,0)) # modifie le Placement de p (Rotation Axe Y)
         Gui.updateGui()   #Met l'écran graphique à jour
         common = p.Shape.common(cav.Shape ) # refait common fait l'intersection forme des pièces, ici la butée avant et le portail avres le nouveau de déplacementde 0.5 degré.
 
from PySide import QtGui   #on charge les outils qu'il faut
dial = QtGui.QProgressDialog(u"Animation en cours...", u"Stopper",0,0)   #Definition d'une boite de message
dial.setModal(True)   #En faire un message bloquant (pas d'utilisation de FreeCAD pendant ce temps)
dial.show()   #Afficher le message

p = FreeCAD.ActiveDocument.getObjectsByLabel("portail_01")[0]    # on travaille sur p qui represente les données de "portail"
cav = FreeCAD.ActiveDocument.getObjectsByLabel("capteur_avant_01")[0]    # on travaille sur le capteur avant
car = FreeCAD.ActiveDocument.getObjectsByLabel("capteur_arriere_01")[0]    # on travaille sur le capteur arrière

animer=True
while(animer):
	ouvrir()# appel la fonction ouvrir
	time.sleep(2) # Attendre 2s
	fermer() # appel la fonction fermer
	time.sleep(2) # Attendre 2s
	QtGui.qApp.processEvents()      #Laisser le gestionnaire graphique faire son boulot
	animer= not dial.wasCanceled()   #Vérifier l'appui sur le bouton
Last edited by jbe on Wed Nov 11, 2015 10:58 am, edited 1 time in total.
mario52
Veteran
Posts: 4696
Joined: Wed May 16, 2012 2:13 pm

Re: Animer des pièces dessinés avec Freecad

Post by mario52 »

Bonjour
Beau travail

une petite remarque:
pour le code que vous mettez en ligne utilisez la balise "Code" sur la barre d'outils juste au dessus de la fenêtre vous cliquez sur le bouton et mettez votre code entre les deux balises ou collez votre code sélectionnez le et cliquez sur le bouton "Code"

sinon, vous perdez toutes les indentations et la macro est fausse (comme dans votre post, il a fallu recréer les indentations)

ce code doit toujours être la première ligne

Code: Select all

# -*- coding: utf-8 -*-
et ici une macro pour faire tourner deux engrenages de JMG l'adresse de la discussion et démonstration est dans le code
rien de compliqué pour vous !

Code: Select all

# animation de deux engrenages
# http://forum.freecadweb.org/viewtopic.php?f=14&t=8017#p65819

from PySide import QtCore

i=0
def update():
    global i
    App.getDocument("Unnamed").Pad001.Placement=App.Placement(App.Vector(0,127.5,0),App.Rotation(App.Vector(0,0,1),-i),App.Vector(0,0,0))
    App.getDocument("Unnamed").Pad.Placement=App.Placement(App.Vector(0,0,0),App.Rotation(App.Vector(0,0,1),i*(74.0/28.0)),App.Vector(0,0,0))
    i += 0.01
timer = QtCore.QTimer()
timer.timeout.connect( update )
timer.start( 1 )
mario
Maybe you need a special feature, go into Macros_recipes and Code_snippets, Topological_data_scripting.
My macros on Gist.github here complete macros Wiki and forum.
jbe
Posts: 368
Joined: Sun Nov 10, 2013 4:18 pm
Location: France, Châteauroux

Re: Animer des pièces dessinés avec Freecad

Post by jbe »

Peut t on changer en python dans FreeCAD, la couleur d'une DEL (c'est pour simuler les LED dans un phare) ?
Je n'ai pas encore trouver.
mario52
Veteran
Posts: 4696
Joined: Wed May 16, 2012 2:13 pm

Re: Animer des pièces dessinés avec Freecad

Post by mario52 »

Bonjour

Code: Select all

def led( couleur):
    if couleur == 0:
        FreeCAD.ActiveDocument.getObjectsByLabel("Cylindre")[0].ViewObject.ShapeColor = (0.0000,1.0000,0.0000)
    else:
        FreeCAD.ActiveDocument.getObjectsByLabel("Cylindre")[0].ViewObject.ShapeColor = (1.0000,0.0000,0.0000)
l'appel se fait par:

led(0) ou led(1)

pour la couleur: 1 = maximum (255)

pour avoir du vert foncé num 127 il faut faire:
127.0 / 255.0 = 0.4980392156862745 et coller ce nombre

Code: Select all

FreeCAD.ActiveDocument.getObjectsByLabel("Cylindre")[0].ViewObject.ShapeColor = (0.0000,0.4980,0.0000)
ou

Code: Select all

FreeCAD.ActiveDocument.getObjectsByLabel("Cylindre")[0].ViewObject.ShapeColor = (0.0000, 127.0/255.0, 0.0000)
mario
Maybe you need a special feature, go into Macros_recipes and Code_snippets, Topological_data_scripting.
My macros on Gist.github here complete macros Wiki and forum.
jbe
Posts: 368
Joined: Sun Nov 10, 2013 4:18 pm
Location: France, Châteauroux

Re: Animer des pièces dessinés avec Freecad

Post by jbe »

Merci Mario52, je vais étudier tout ceci.
Pour l'instant il faut que je finisse la modélisation de mon phare.

Remarque :
Pour l'ouverture et la fermeture du portail cela fonctionne très bien.
Post Reply