liens entres paramètres.

Forum destiné aux questions et discussions en français
Forum rules
Be nice to others! Read the FreeCAD code of conduct!
Post Reply
nicotuf
Posts: 14
Joined: Mon Jul 20, 2009 1:51 pm

liens entres paramètres.

Post by nicotuf »

Salut à tous,

Une des fonctionnalités que je trouve très utile, dans les gros systèmes de CAO, c'est la possibilité de lier les paramètres entre eux par des équations.

Dans le premier code ci-dessous je voulais créer un lien entre deux paramètres d'une même "class" d'objet paramétré. Mais le lien n'est pas maintenu après l’exécution du script.

Dans le second code ci-dessous le lien est bien maintenu, mais en créant une deuxième "class" d'objet. D’où un problème si on veut multiplier les objets liés.

Est-ce qu'il y aurait d'autres solutions ? Notamment : lié les paramètres une fois les objets créés sans passer par des scripts...

En tous cas bravo aux développeurs, Freecad devient vraiment un outils de plus en plus intéressant.

Nicolas

Code: Select all

# -*- coding:Utf-8 -*-
import FreeCAD, FreeCADGui, Part, Draft, math, MeshPart, Mesh, Drawing
from PyQt4 import QtGui,QtCore
from FreeCAD import Base
App=FreeCAD
Gui=FreeCADGui

class Boite:
	def __init__(self, obj):
		obj.addProperty("App::PropertyLength","L1","Boite","L1").L1=40.0
		obj.addProperty("App::PropertyLength","L2","Boite","L2").L2=40.0
		obj.addProperty("App::PropertyLength","Epaisseur","Boite","Epaisseur").Epaisseur=10.0
		obj.addProperty("App::PropertyLength","PosX","Boite","PosX").PosX=0.0
		obj.addProperty("App::PropertyLength","PosY","Boite","PosY").PosY=0.0
		obj.addProperty("App::PropertyLength","PosZ","Boite","PosZ").PosZ=0.0
		obj.Proxy = self
	def execute(self, fp):
		P1=Base.Vector(fp.PosX,fp.PosY,fp.PosZ)
		S1=Part.makeBox(fp.L1,fp.L2,fp.Epaisseur,P1)
		fp.Shape=S1
if FreeCAD.ActiveDocument==None:
	FreeCAD.newDocument("Boites")
boite1=FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Boite1")
Boite(boite1)
boite1.ViewObject.Proxy=0
boite2=FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Boite2")
Boite(boite2)
boite2.L1=boite1.Epaisseur
boite2.Epaisseur=3*boite1.Epaisseur
boite2.PosX=boite1.L1
boite2.ViewObject.Proxy=0
App.ActiveDocument.recompute()
Gui.SendMsgToActiveView("ViewFit")

Code: Select all

# -*- coding:Utf-8 -*-
import FreeCAD, FreeCADGui, Part, Draft, math, MeshPart, Mesh, Drawing
from PyQt4 import QtGui,QtCore
from FreeCAD import Base
App=FreeCAD
Gui=FreeCADGui

class BoiteA:
	def __init__(self, obj):
		obj.addProperty("App::PropertyLength","L1","Boite","L1").L1=40.0
		obj.addProperty("App::PropertyLength","L2","Boite","L2").L2=40.0
		obj.addProperty("App::PropertyLength","Epaisseur","Boite","Epaisseur").Epaisseur=10.0
		obj.addProperty("App::PropertyLength","PosX","Boite","PosX").PosX=0.0
		obj.addProperty("App::PropertyLength","PosY","Boite","PosY").PosY=0.0
		obj.addProperty("App::PropertyLength","PosZ","Boite","PosZ").PosZ=0.0
		obj.Proxy = self
	def execute(self, fp):
		P1=Base.Vector(fp.PosX,fp.PosY,fp.PosZ)
		S1=Part.makeBox(fp.L1,fp.L2,fp.Epaisseur,P1)
		fp.Shape=S1
		
class BoiteB:
	def __init__(self, obj):
		obj.addProperty("App::PropertyLink","Source" ,"CalpinageFace","Source shape").Source=None
		obj.Proxy = self
	def execute(self, fp):
		P1=Base.Vector(fp.Source.L1,fp.Source.PosY,fp.Source.PosZ)
		S1=Part.makeBox(fp.Source.Epaisseur,fp.Source.L2,3*fp.Source.Epaisseur,P1)
		fp.Shape=S1
		

if FreeCAD.ActiveDocument==None:
	FreeCAD.newDocument("Boites")
boite1=FreeCAD.ActiveDocument.addObject("Part::FeaturePython","BoiteA")
BoiteA(boite1)
boite1.ViewObject.Proxy=0
boite2=FreeCAD.ActiveDocument.addObject("Part::FeaturePython","BoiteB")
BoiteB(boite2)
boite2.Source=boite1
boite2.ViewObject.Proxy=0
App.ActiveDocument.recompute()
Gui.SendMsgToActiveView("ViewFit")
nicotuf
Posts: 14
Joined: Mon Jul 20, 2009 1:51 pm

Re: liens entres paramètres.

Post by nicotuf »

Devant l'avalanche de réponse j'imagine que mon post était peut-être (même surement) incompréhensible... Désolé :oops:
Je vais essayer d'être plus claire. Dans la macro ci-dessous, j'ai illustrer ce que j'ai finalement réussi à faire. La fonction utilise les objets sélectionnés pour recréer des objets qui restent liés. (J'ai tout copier sur la fonction Wall.py du module Archi de Yorik !!)

Et donc question subsidiaire sur les paramètres : ( Je n'ai pas vu de discussion sur le sujet en anglais (vu mon niveau j'ai largement pu passer à coté) donc désolé si ça fait doublon)
On arrive à créer des objets paramétrés très puissant grâce à des scripts (c'est déjà très bien et par certains côtés peut-être même déjà plus puissant que ce que l'on peut faire avec les systèmes de CAO commerciales), mais je ne vois pas comment lier les paramètres entre des objets existants (la fonction "tables de paramètres" pour ceux qui connaissent Catia, Solidworks ou Inventor).
Est-ce que cette fonction est dans les tuyaux ou est-ce qu'il existe déjà des commandes python ?

Voilà j’espère avoir été plus claire !! :?

Cordialement,

Nicolas,


Code: Select all

# -*- coding:Utf-8 -*-

#from os import *
import FreeCAD, FreeCADGui, Part, Draft, math, MeshPart, Mesh, Drawing, Component
import AtelierNicoTools
from PyQt4 import QtGui,QtCore
from FreeCAD import Base
App=FreeCAD
Gui=FreeCADGui

##################################
# Défnition Class :

def makeExtract(basesel=None,NoFace=None,NoEdge=None,NoVertex=None,name=None):
	if NoFace:
		name="Extraction Face"
	if NoEdge:
		name="Extraction Edge"
	if NoVertex:
		name="Extraction Vertex"
	obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython",name)
	Extract(obj)
	ViewProviderWall(obj.ViewObject)
	if basesel:
		obj.Base = basesel
	if NoFace:
		obj.NoFace = NoFace
	if NoEdge:
		obj.NoEdge = NoEdge
	if NoVertex:
		obj.NoVertex = NoVertex
	if obj.Base: obj.Base.ViewObject.hide()
	return obj

class Extract(Component.Component):
	"The Extract object"
	def __init__(self,obj):
		Component.Component.__init__(self,obj)
		self.Type = "Exraction"
		obj.addProperty("App::PropertyInteger","NoFace","Base","Numero Face")
		obj.addProperty("App::PropertyInteger","NoEdge","Base","Numero Edge")
		obj.addProperty("App::PropertyInteger","NoVertex","Base","Numero Vertex")
	def execute(self,obj):
		self.createGeometry(obj)
	def onChanged(self,obj,prop):
		if prop in ["Base","NoFace","NoEdge","NoVertex"]:
			self.createGeometry(obj)
	def createGeometry(self,obj):
		if obj.Base:
			if obj.Base.isDerivedFrom("Part::Feature"):
				base=obj.Base.Shape.copy()
				if obj.NoFace:
					base=base.Faces[obj.NoFace-1]
				elif obj.NoEdge:
					base=base.Edges[obj.NoEdge-1]
				elif obj.NoVertex:
					base=base.Vertexes[obj.NoVertex-1]
				obj.Shape = base
       
class ViewProviderWall(Component.ViewProviderComponent):
    "A View Provider for the Wall object"
    def __init__(self,vobj):
        Component.ViewProviderComponent.__init__(self,vobj)
    def getIcon(self):
		return """
			/* XPM */
			static char * Extraction Elements_xpm[] = {
			"16 16 9 1",
			" 	c None",
			".	c #047503",
			"+	c #009E0E",
			"@	c #338498",
			"#	c #4D8D6A",
			"$	c #0ABC00",
			"%	c #46A65C",
			"&	c #6A9AA5",
			"*	c #46ADC9",
			"                ",
			"                ",
			"                ",
			"    &&&&&&      ",
			"  @@&&***&&&#.  ",
			"  ****@&#%+$$$  ",
			"  *****&%$$$$$  ",
			"  *****&%$$$$$  ",
			"  *****&%$$$$$  ",
			"  *****&%$$$$$  ",
			"  *****&%$$$$$  ",
			"  *****&%$$$$$  ",
			"    @@@&%$++.   ",
			"                ",
			"                ",
			"                "};
		"""

sel=Gui.Selection.getSelectionEx()
if sel:
	FreeCAD.ActiveDocument.openTransaction("Extraction")
	for elts in sel:
		obj=elts.Object
		subname=elts.SubElementNames[:]
		for name in subname:
			if name[0:4]=="Face":
				noFace=int(name[4:7])
				makeExtract(obj,noFace)
			if name[0:4]=="Edge":
				noEdge=int(name[4:7])
				makeExtract(obj,None,noEdge)
			if name[0:6]=="Vertex":
				noVertex=int(name[6:9])
				makeExtract(obj,None,None,noVertex)
	FreeCAD.ActiveDocument.commitTransaction()
User avatar
NormandC
Veteran
Posts: 18589
Joined: Sat Feb 06, 2010 9:52 pm
Location: Québec, Canada

Re: liens entres paramètres.

Post by NormandC »

Bonjour Nicolas,

Ne t'inquiète pas, ta question était claire. C'est que la section francophone des forums est malheureusement très peu active, et Yorik est le seul développeur de FreeCAD à comprendre le français. Il n'a peut-être pas remarqué ton message.

Pour ma part je ne t'avais pas répondu, parce que n'ayant pas de réponse (je suis nul en programmation Python :oops: ). Mais il me semble que les liens entre équations pour contrôler les paramètres ne sont pas encore supportés (Yorik pourra confirmer ou non). Cependant c'est certainement planifié.
Post Reply