Idée : Contrôler FreeCAD avec PureData

Forum destiné aux questions et discussions en français
Forum rules
Règles du forum et informations utiles.

VEUILLEZ LIRE CECI AVANT DE DEMANDER DE L'AIDE
User avatar
flachyjoe
Veteran
Posts: 1855
Joined: Sat Mar 31, 2012 12:00 pm
Location: Limoges, France

Idée : Contrôler FreeCAD avec PureData

Post by flachyjoe »

Salut,
si quelqu'un ici à entendu parler de PureData, il connaît la puissance du bouzin.
Pour les autres
wikipedia wrote:Pure Data (en abrégé pd) est un logiciel de programmation graphique pour la création musicale et multimédia en temps réel. Il permet également de gérer des signaux entrants dans l'ordinateur (signaux de capteurs ou événements réseau par exemple) et de gérer des signaux sortants (par des protocoles de réseau ou protocoles électroniques pour le pilotage de matériels divers). Ce logiciel permet un suivi de partition.
L'idée est donc de récupérer des messages sortant de PureData pour les utiliser dans FreeCad, cette petite macro fait exactement ça :

Code: Select all

#############################
FreeCAD PureData Message Server
             flachyjoe 2020
#############################

# User Part #

ADDRESS = 'localhost'
PORT = 8888

#What to do with PD message
def pdMsgProcessor(words):
	doc = App.ActiveDocument
	if not doc:
		return
	objs = doc.findObjects(Name=words[0])
	if not objs:
		Err("Unknow object %s" % words[0])
	else:
		obj=objs[0]
		obj.Placement.Base.x = float(words[1])
		obj.Placement.Base.y = float(words[2])


#############
# System Part #
import select
import socket

run = True
userTerminate=False

def terminate(btn):
	global run, userTerminate
	run = False
	userTerminate = btn is not None

def pdMsgListProcessor(msgList):
	for msg in msgList:
		#remove trailing semicolon
		msg = msg[:-2]
		#split words
		words = msg.split(' ')
		if words[0] == 'close':
			terminate(None)
		else:
			pdMsgProcessor(words)

#Prepare dialog
from PySide import QtGui
mb = QtGui.QMessageBox()
mb.setIcon(mb.Icon.Warning)
mb.setText("Wait for PureData connection...")
mb.setWindowTitle("PureData connection")
mb.setModal(False)
mb.setStandardButtons(mb.StandardButton.Close)
mb.buttonClicked.connect(terminate)
mb.show()

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
try:
	server_socket.bind((ADDRESS, PORT))
	server_socket.listen(5)

	Msg("PDServer : Listening on port %i" % PORT)
	
	read_list = [server_socket]
	readBuffer = ""
	while run:
		FreeCADGui.updateGui()
		readable, writable, errored = select.select(read_list, [], [],0.1)
		for s in readable:
			if s is server_socket:
				client_socket, address = server_socket.accept()
				read_list.append(client_socket)
				Msg("PDServer : Connection from %s:%s" % address)
				mb.setText("Connected with PureData")
			else:
				data = s.recv(1024)
				if data:
					readBuffer += data.decode('utf8')
					msgList = readBuffer.splitlines(True)
					#is last line complete ?
					lastLine = msgList[-1]
					readBuffer = ""
					if not lastLine[-2:] == "\r\n":
						msgList =  msgList[:-1]
						readBuffer = lastLine
					pdMsgListProcessor(msgList)
				else:
					s.close()
					read_list.remove(s)
except:
	Err("PDServer : %s\r\n" % sys.exc_info()[1])
finally:
	try:
		server_socket.shutdown(socket.SHUT_RDWR)
	except OSError:
		pass
server_socket.close()
mb.close()
Avec un document comportant un objet Box et ce "patch" PureData, on obtient une animation simpliste où la boite se déplace sur l'axe X selon un sin(t) :
Capture d’écran_2020-10-18_23-36-50.png
Capture d’écran_2020-10-18_23-36-50.png (18.62 KiB) Viewed 3974 times
NB : comme ça utilise un protocole TCP/IP, le contrôleur PureData peut être sur un autre ordinateur que le FreeCAD contrôlé, voir dans un autre pays…
- Flachy Joe -
Image
User avatar
-alex-
Veteran
Posts: 1849
Joined: Wed Feb 13, 2019 9:42 pm
Location: France

Re: Idée : Contrôler FreeCAD avec PureData

Post by -alex- »

flachyjoe wrote: Sun Oct 18, 2020 9:40 pm Salut,
si quelqu'un ici à entendu parler de PureData,....comme ça utilise un protocole TCP/IP, le contrôleur PureData peut être sur un autre ordinateur que le FreeCAD contrôlé, voir dans un autre pays…
Connaissais pas, merci pour l'info.
Et quelle serait les applications que tu as en tête par exemple?
Faire tourner FreeCAD sur une grosse machine et y accéder à distance sur un terminal plus léger ?
Avoir un fonctionnement de type cloud avec FreeCAD sur serveur et accès partagé pour plusieurs clients simultanés y accédant via des "requêtes Puredata" et une interface graphique sur navigateur? (Il me semble qu'il y a un projet sur le forum pour lancer FreeCAD via un navigateur)
Aide à distance ? (Manquerai le retour graphique là non?)
User avatar
Vincent B
Veteran
Posts: 4711
Joined: Sun Apr 05, 2015 9:02 am
Location: La Rochelle, France

Re: Idée : Contrôler FreeCAD avec PureData

Post by Vincent B »

je crois qu'il a dans la tête contrôler des paramètres en entrée pour les injecter dans freecad pour de l'animation. :D
User avatar
-alex-
Veteran
Posts: 1849
Joined: Wed Feb 13, 2019 9:42 pm
Location: France

Re: Idée : Contrôler FreeCAD avec PureData

Post by -alex- »

Ah d'accord, bon ben je suis curieux de quelques détails supplémentaires sur la chose ;)
User avatar
flachyjoe
Veteran
Posts: 1855
Joined: Sat Mar 31, 2012 12:00 pm
Location: Limoges, France

Re: Idée : Contrôler FreeCAD avec PureData

Post by flachyjoe »

GlouGlou wrote: Mon Oct 19, 2020 8:27 pm je crois qu'il a dans la tête contrôler des paramètres en entrée pour les injecter dans freecad pour de l'animation. :D
-alex- wrote: Mon Oct 19, 2020 8:47 pm Ah d'accord, bon ben je suis curieux de quelques détails supplémentaires sur la chose ;)
Ça peut aussi être utilisé pour faire de la "modélisation procédurale", comme ce superbe sablier. :shock: En mettant un micro en entrée on pourrait faire un mug au son de sa voix, la classe :lol:
Capture d’écran_2020-10-19_23-41-40.png
Capture d’écran_2020-10-19_23-41-40.png (16.06 KiB) Viewed 3865 times
Capture d’écran_2020-10-19_23-43-25.png
Capture d’écran_2020-10-19_23-43-25.png (32.67 KiB) Viewed 3865 times

Code: Select all

def pdMsgProcessor(words):
	doc = App.ActiveDocument
	if not doc:
		return
	crcl = doc.addObject("Part::Circle","Circle")
	crcl.Radius= float(words[0])+10.5
	crcl.Angle0=0.00
	crcl.Angle1=360.00
	crcl.Placement=App.Base.Placement(App.Base.Vector(0.00,0.00, float(words[1])),App.Base.Rotation(0.00,0.00,0.00,1.00))
	crcl.Label='Cercle'
- Flachy Joe -
Image
User avatar
flachyjoe
Veteran
Posts: 1855
Joined: Sat Mar 31, 2012 12:00 pm
Location: Limoges, France

Re: Idée : Contrôler FreeCAD avec PureData

Post by flachyjoe »

En fait j'ai été inspiré par Grasshopper (j'ai par exemple eu l'occasion d'utiliser Grasshopper pour piloter un robot 6 axes), on peut imaginer passer des objets FreeCAD à PureData (sous forme de représentation texte), leur faire subir différentes opérations et les renvoyer à FreeCAD.

Il y a un peu de boulot pour arriver au niveau de Grasshopper mais en utilisant PureData ça évite déjà d'avoir à gérer la partie programmation graphique.
- Flachy Joe -
Image
User avatar
Vincent B
Veteran
Posts: 4711
Joined: Sun Apr 05, 2015 9:02 am
Location: La Rochelle, France

Re: Idée : Contrôler FreeCAD avec PureData

Post by Vincent B »

Il me semble que Microelly2 avait commencé à faire un atelier similaire avec Pyflow. Malheureusement il est absent sur le forum depuis quelques mois.
https://forum.freecadweb.org/viewtopic.php?f=8&t=36299
User avatar
flachyjoe
Veteran
Posts: 1855
Joined: Sat Mar 31, 2012 12:00 pm
Location: Limoges, France

Re: Idée : Contrôler FreeCAD avec PureData

Post by flachyjoe »

GlouGlou wrote: Tue Oct 20, 2020 5:50 pm Il me semble que Microelly2 avait commencé à faire un atelier similaire avec Pyflow.
Malheureusement PyFlow n'est pas compatible python >=3.8 qui est la version actuelle.
Mon avis est qu'il vaut mieux se baser sur un système reconnu (pure-data à 30 ans de développement et une vraie communauté) même si ça oblige à du fonctionnement bas-niveau. C'est à dire qu'on ne va pas pouvoir partager des objets directement et il faut se taper la création de l'interfaçage mais ce n'est pas pour me déplaire (mon code n'est plus en ligne mais j'ai écris en Gambas une machine virtuelle Forth…).

J'ai créer un thread dans le forum anglais : https://forum.freecadweb.org/viewtopic.php?f=24&t=51429
Et un dépôt github pour récupérer les fichiers : https://github.com/FlachyJoe/FCPD
- Flachy Joe -
Image
User avatar
flachyjoe
Veteran
Posts: 1855
Joined: Sat Mar 31, 2012 12:00 pm
Location: Limoges, France

Re: Idée : Contrôler FreeCAD avec PureData

Post by flachyjoe »

Salut,
pour info j'ai avancé sur le projet et poussé des gros changements sur le git.

Coté python c'est plus facile d'utilisation avec la création de l'objet PureDataServer qui redirige les messages venus de PD vers la fonction qu'on veux en filtrant sur le premier mot du message.
Coté PD, l'exemple ci-dessous montre l'accès et la modification du positionnement d'un objet, avec une animation en aller/retour.
sample-animate.png
sample-animate.png (75.85 KiB) Viewed 3587 times
- Flachy Joe -
Image
User avatar
flachyjoe
Veteran
Posts: 1855
Joined: Sat Mar 31, 2012 12:00 pm
Location: Limoges, France

Re: Idée : Contrôler FreeCAD avec PureData

Post by flachyjoe »

Et voila un aperçu de bidule en fonctionnement :
Image
- Flachy Joe -
Image
Post Reply