Macro et propriété d'un object.

Forum destiné aux questions et discussions en français
Forum rules
Be nice to others! Read the FreeCAD code of conduct!
Post Reply
User avatar
FaDa3D
Posts: 857
Joined: Tue Aug 08, 2017 8:21 am
Location: Savoie France

Macro et propriété d'un object.

Post by FaDa3D »

Bonjour à tous,
Comment introduire la propriété d'un object dans une macro ? Je ne sais pas faire.
Exemple dans le modèle joint comment introduire la propriété Fusion.Placement.Rotation.Angle dans la macro jointe, gracieusement mise à notre disposition par flachyjoe ?

Merci d'avance.

Code: Select all

###
# AnimSinus.FCMacro pour objet créer avec Part
# Macro pour créer une animation sinusoïdale par pilotage d'une propriété d'un objet.
# par flachyjoe <https://forum.freecadweb.org/memberlist.php?mode=viewprofile&u=984>
###

from math import *

## Configuration de l'animation

ctrtName	="alpha"	#Nom de la contrainte à animer
ctrtUnit	="rad"		#Unité des valeurs ci-dessous
ctrtMin		=-9.2/180*pi		#Valeur minimale de la contrainte
ctrtMax		=9.2*pi/180	#Valeur maximale de la contrainte
ctrtDelta	=pi/180/2		#Valeur du pas
animFreq	=10#Frequence (maximale) de l'animation
animLoop	=True		#L'animation se déroule tant que le bouton de la boite de dialogue n'a pas été cliqué
animFlipFlop	=True		#Anime en aller-retour (de ctrtMin à ctrtMax puis de ctrtMax à ctrtMin avec un pas de -ctrtDelta)
save		=False		#Execute UNE boucle d'animation en enregistrant les images résultantes
saveAsGIF	=True		#Converti la succession de Jpeg en une animation GIF (requière ImageMagick)
gifSize		="400x300"	#Dimensions maximales du GIF
savePrefix	="AnimSinus"		#Entête de nom des fichiers Jpeg / du fichier GIF /!\ écrase sans avertissement /!\
saveDir		="/tmp/"	#Répertoire d'enregistrement des images/de l'animation

## Fin de la configuration

from time import sleep

doc=App.ActiveDocument
driverObj=None
driverId=None
for obj in doc.Objects:
	if hasattr(obj, 'Constraints') :
		try :
			driverId = obj.getIndexByName(ctrtName)
			driverObj = obj
			break
		except LookupError :
			pass

if driverId is None:
	raise LookupError("Aucune contrainte nommée %s n'a été trouvée" % ctrtName)

#Preparation boite de dialogue
from PySide import QtGui
mb = QtGui.QMessageBox()
mb.setIcon(mb.Icon.Warning)
mb.setText("Animation en cours")
mb.setWindowTitle("Macro Anim Sinus pour sémaphore")
mb.setModal(False)
mb.setStandardButtons(mb.StandardButton.Close)

run = True
userTerminate=False

def terminate(btn):
	global run, userTerminate
	run = False
	userTerminate=True

mb.buttonClicked.connect(terminate)
mb.show()

Msg("Lancement de l'animation\r\n")

#Animation
view=Gui.activeView()
moitie=False
idx=0
alpha = ctrtMin
while run:
	driverObj.setDatum(driverId, App.Units.Quantity(str(alpha)+ctrtUnit))
	doc.recompute()
	FreeCADGui.updateGui()

	if save:
		view.saveImage(saveDir + savePrefix + '_{:03d}'.format(idx) +'.jpg')
		idx+=1

	sleep(1./animFreq)

	if alpha+ctrtDelta>ctrtMax or (animFlipFlop and alpha+ctrtDelta<ctrtMin):
		if animFlipFlop:
			ctrtDelta= -ctrtDelta
			if moitie and (save or not animLoop):
				run=False	#fin de l'anim, on a fait un tour
			moitie=True
		else:
			alpha=ctrtMin
			if save or not animLoop:
				run=False	#fin de l'anim, on a fait un tour
	alpha += ctrtDelta

Msg("Fin de l'animation\r\n")

if save and saveAsGIF and not userTerminate:
	mb.setText("Conversion en GIF… patientez.")
	mb.setDisabled(True)
	FreeCADGui.updateGui()

	import subprocess
	params = ['convert', '-resize', gifSize, saveDir + savePrefix + '*.jpg', saveDir + savePrefix + '.gif']
	try:
		log=subprocess.check_output(params)
	except FileNotFoundError:
		Err("La conversion en GIF nécessite ImageMagick.\r\n")
	except subprocess.CalledProcessError:
		Err("Une erreur est survenue lors de la conversion en GIF.\r\n")
	else:
		#Supression des images Jpg
		import os
		import glob
		fileList = glob.glob(saveDir + savePrefix + '*.jpg')
		for filePath in fileList:
		    try:
		        os.remove(filePath)
		    except:
		        Err("Erreur à la supression de : ", filePath)

mb.close()
Attachments
MacroPropriété.FCStd
(23.15 KiB) Downloaded 9 times
Fada de 3D.
Linux Mint
openBrain
Veteran
Posts: 9034
Joined: Fri Nov 09, 2018 5:38 pm
Contact:

Re: Macro et propriété d'un object.

Post by openBrain »

Si je comprends bien la macro, elle marche avec les contraintes nommées dans les esquisses uniquement.
Donc le plus simple pour l'exploiter, c'est de créer un sketch bidon, lui mettre juste une ligne avec une contrainte de longueur (nommée), puis d'attacher la propriété voulue (l'angle dans ton cas) à cette contrainte.
Ensuite la macro devrait roulée.
User avatar
FaDa3D
Posts: 857
Joined: Tue Aug 08, 2017 8:21 am
Location: Savoie France

Re: Macro et propriété d'un object.

Post by FaDa3D »

Bonjour,
A openbrain : merci d'avoir répondu.

Je connais le principe du sketch maître et l'ai utilisé avec cette macro d'animation. Mais puriste (un peu trop peut-être ) je veux utiliser les propriétés de placement de l'objet moteur directement dans une macro d'animation similaire à celle ci-devant. Ensuite je transmet les modification de positions aux autres objet liés mécaniquement par expressions numériques, par sketch maître si trop compliqué par expressions numériques, voir par spreadsheet (si la redondance cyclique en laisse le choix).

Voilà, c'est peut-être un caprice :twisted: mais ça me semble plus logique qu'un sketch maître chapeau pilotant le tout.

Merci
Fada de 3D.
Linux Mint
openBrain
Veteran
Posts: 9034
Joined: Fri Nov 09, 2018 5:38 pm
Contact:

Re: Macro et propriété d'un object.

Post by openBrain »

Ce n'est pas un sketch maître que je te propose, mais juste de "hacker" ton fichier pour que la macro puisse tourner telle quelle. ;)
User avatar
flachyjoe
Veteran
Posts: 1869
Joined: Sat Mar 31, 2012 12:00 pm
Location: Limoges, France

Re: Macro et propriété d'un object.

Post by flachyjoe »

Salut,
il y a moyen de modifier la macro pour qu'elle agisse sur une propriété plutôt que sur une contrainte, regarde les lignes appelant driverObj et le bloc qui suit la ligne ## Fin de la configuration.
- Flachy Joe -
Image
User avatar
FaDa3D
Posts: 857
Joined: Tue Aug 08, 2017 8:21 am
Location: Savoie France

Re: Macro et propriété d'un object.

Post by FaDa3D »

Bonjour,
openBrain wrote: Wed Sep 28, 2022 10:26 am
Ce n'est pas un sketch maître que je te propose, mais juste de "hacker" ton fichier pour que la macro puisse tourner telle quelle. ;)
Oui, ok, accordé, le mot "maître" est de trop.
Au schéma : la macro pilote une contrainte d'un sketch qui pilote une propriété d'un objet, je cherche à construire le schéma : une macro pilote une propriété d'un objet qui éventuellement pilote une contrainte d'un sketch.

Mais c'est pas grave si je n'y arrive pas, je me contenterais du premier schéma.

Merci en tout cas.
Fada de 3D.
Linux Mint
User avatar
FaDa3D
Posts: 857
Joined: Tue Aug 08, 2017 8:21 am
Location: Savoie France

Re: Macro et propriété d'un object.

Post by FaDa3D »

Salut,
flachyjoe wrote: Wed Sep 28, 2022 4:02 pm il y a moyen de modifier la macro pour qu'elle agisse sur une propriété plutôt que sur une contrainte, regarde les lignes appelant driverObj et le bloc qui suit la ligne ## Fin de la configuration.
Merci flachyjoe. C'est bien sur ces lignes que j'essaie de comprendre le language depuis deux jours, mais toutes mes tentatives de modification ont échoué. Je ne connais pas le language Python pour FreeCAD.

Ca ne fait rien, j'utiliserai le schéma de commande proposé par openBrain.

Merci.
Fada de 3D.
Linux Mint
Post Reply