Objet "virtuel" pour lier des priopriétés d'autres objets?

Forum destiné aux questions et discussions en français
Forum rules
Be nice to others! Read the FreeCAD code of conduct!
Post Reply
SchmilBlick
Posts: 26
Joined: Fri Jan 09, 2015 8:31 pm
Location: France

Objet "virtuel" pour lier des priopriétés d'autres objets?

Post by SchmilBlick »

Bonsoir,

J'aimerais créer un objet générique qui permettrait d'avoir dans ses propriétés:
- des entrées qui seraient l'expression python d'autres propriétés d'objets
- et au moins une propriété de sortie qui serait une formule des ces entrées à affecter à la propriété d'un autre objet.
La propriété de cet objet dépendrait donc de celles de plusieurs autres.

Mon idée serait de créer un "scripted-object", mais sans géométrie. Ses propriétés en entrées seraient donc celles des objets source et la propriété de sortie (ça s'appelle plus une méthode je crois, au moins en langage VBA que je connais à peu près) contendrait la formule qui calcule la propriété de mon objet cible.
L'intérêt par rapport à une macro c'est que cette propriété mettrait à jour automatiquement l'objet cible, sans relancer manuellement la macro à chaque modif.

Avant de creuser un peu plus comment le mettre en oeuvre en apprenant le code python, je voudrais savoir si dans le principe c'est faisable? Déjà s'il est possible de créer un objet sans géométrie, l'intérêt c'est de le voir dans l'arborescence, et d'autre part si la fameuse propriété de sortie n'est pas quelque chose d'irréaliste compte-tenu du fonctionnement de FreeCAD, sans que cela devienne un module à part entière.

Si ça parait faisable, je me débrouillerai, ça me donne un objectif intéressant pour apprendre le python FreeCAD, mais j'aimerais un avis d'experts svp?

Le module spreadsheet ne permet pas de mettre des formules, ce qui répondrait à mon besoin, et je ne sais d'ailleurs pas si c'est en cours dans les travaux d'amélioration.
Idem pour les travaux sur la possibilté de mettre une expression dans une propriété au lieu d'une simple valeur numérique. C'est pas pour tout de suite et je ne suis pas certain que les formules seraient faisables.

Merci d'avance pour votre éclairage!
Bonne soirée,
Matthieu
Ubuntu 16.04 LTS 64bits - FreeCAD daily-build - FreeCAD 0.17
mario52
Veteran
Posts: 4692
Joined: Wed May 16, 2012 2:13 pm

Re: Objet "virtuel" pour lier des priopriétés d'autres objet

Post by mario52 »

Bonjour et bienvenue
je ne suis pas expert mais en programmation tout est possible il suffit d'avoir l'idée et de connaître la programmation et les API puis la concrétisation suit.
SchmilBlick wrote:Idem pour les travaux sur la possibilté de mettre une expression dans une propriété au lieu d'une simple valeur numérique. C'est pas pour tout de suite et je ne suis pas certain que les formules seraient faisables.
je crois que ça avait été discuté

ici quelques liens pour débuter
Online_Help_Toc
Introduction_to_Python
Python_scripting_tutorial
Scripting_examples
et n'oubiez pas, VEUILLEZ LIRE AVANT DE DEMANDER DE L'AIDE
bon amusement

OS: Windows Vista
Word size of OS: 32-bit
Word size of FreeCAD: 32-bit
Version: 0.15.4415 (Git)
Branch: master
Hash: ab24e9df6a16db8c87aea1f7b768e70529ff8d82
Python version: 2.7.8
Qt version: 4.8.6
Coin version: 4.0.0a
OCC version: 6.7.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.
User avatar
yorik
Founder
Posts: 13664
Joined: Tue Feb 17, 2009 9:16 pm
Location: Brussels
Contact:

Re: Objet "virtuel" pour lier des priopriétés d'autres objet

Post by yorik »

Oui c'est tout-à-fait faisable... Tu peux créer un objet paramétrique, sans géométrie, qui possède par exemple quelques propriétés PropertyLink, qui servent à créer une relation avec d'autres objets... De là, tu peux faire ce que tu veux, par exemple lire la valeur de certaines propriétés d'un objet, et modifier d'autres...

Le wiki contient pas mal de documentation (le Powerusers hub surtout), il y a aussi de nombreux exemples dans le répertoire src/Mod/TemplatePyMod du code source de FreeCAD
SchmilBlick
Posts: 26
Joined: Fri Jan 09, 2015 8:31 pm
Location: France

Re: Objet "virtuel" pour lier des priopriétés d'autres objet

Post by SchmilBlick »

Ah merci pour vos réponses! (je n'avais pas vérifié l'activation des notifications de réponses)
Je vais approfondir la question donc.

Oui, oui Mario :) , j'ai bien lu qu'il fallait mettre les infos sur sa config, pour le moment j'ai pas de questions sur un cas précis, mais si j'oublie j'aurai droit de me faire gronder ;) .

Hier j'ai testé déjà avec une macro. Avec les 4 planches d'une boite, la première planche définit hauteur, longueur et épaisseur et la 2ème planche la largeur de la boite. Ensuite cela se met à jour avec la macro. Je vais tenter de transformer le code pour en faire des objets en creusant les pistes que vous m'avez données.

Ci-dessous mon cas d'école:
Image

Et le code:

Code: Select all

import FreeCAD

MonDoc = "LienParametriqueObjets"

def Link1_ObjDest_ObjSrc(NomObjDest, NomObjSrc):
	# Objects list
	ObjDest = App.getDocument(MonDoc).getObject(NomObjDest)
	ObjSrc = App.getDocument(MonDoc).getObject(NomObjSrc)

	# Target object ObjDest properties links
	ObjDest.Width = ObjSrc.Width
	ObjDest.Height = ObjSrc.Height

	# ObjDest placement relative to ObjSrc
	mPosition = App.Vector(ObjDest.Width,ObjSrc.Width,0)
	mRotation = App.Rotation(App.Vector(0,0,1),90)
	mCenter = App.Vector(0,0,1)

	# ObjDest absolute placement applying the same placement of ObjSrc
	mPlacement = App.Placement(mPosition,mRotation,mCenter)
	mPlacement = ObjSrc.Placement.multiply(mPlacement)
	ObjDest.Placement = mPlacement

def Link2_ObjDest_ObjSrc(NomObjDest, NomObjSrc):
	# Objects list
	ObjDest = App.getDocument(MonDoc).getObject(NomObjDest)
	ObjSrc = App.getDocument(MonDoc).getObject(NomObjSrc)

	# Target object ObjDest properties links
	ObjDest.Width = ObjSrc.Width
	ObjDest.Height = ObjSrc.Height

	# ObjDest placement relative to ObjSrc
	mPosition = App.Vector(ObjSrc.Length,ObjDest.Width,0)
	mRotation = App.Rotation(App.Vector(0,0,1),90)
	mCenter = App.Vector(0,0,1)

	# ObjDest absolute placement applying the same placement of ObjSrc
	mPlacement = App.Placement(mPosition,mRotation,mCenter)
	mPlacement = ObjSrc.Placement.multiply(mPlacement)
	ObjDest.Placement = mPlacement

def Link3_ObjDest_ObjSrc(NomObjDest, NomObjSrc1,NomObjSrc2):
	# Objects list
	ObjDest = App.getDocument(MonDoc).getObject(NomObjDest)
	ObjSrc1 = App.getDocument(MonDoc).getObject(NomObjSrc1)
	ObjSrc2 = App.getDocument(MonDoc).getObject(NomObjSrc2)

	# Target object ObjDest properties links
	ObjDest.Width = ObjSrc1.Width
	ObjDest.Height = ObjSrc1.Height
	ObjDest.Length = ObjSrc1.Length

	# ObjDest placement relative to ObjSrc
	mPosition = App.Vector(0,ObjSrc1.Width + ObjSrc2.Length,0)
	mRotation = App.Rotation(App.Vector(0,0,1),0)
	mCenter = App.Vector(0,0,1)

	# ObjDest absolute placement applying the same placement of ObjSrc
	mPlacement = App.Placement(mPosition,mRotation,mCenter)
	mPlacement = ObjSrc1.Placement.multiply(mPlacement)
	ObjDest.Placement = mPlacement

Link1_ObjDest_ObjSrc("Box001","Box")
Link2_ObjDest_ObjSrc("Box002","Box")
Link3_ObjDest_ObjSrc("Box003","Box","Box001")
Attachments
LienParametriqueObjets.FCStd
(5.99 KiB) Downloaded 25 times
Ubuntu 16.04 LTS 64bits - FreeCAD daily-build - FreeCAD 0.17
Post Reply