Fonctionnement erratique d'une macro

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
Ciola
Posts: 8
Joined: Sat May 01, 2021 5:47 pm

Fonctionnement erratique d'une macro

Postby Ciola » Tue May 04, 2021 4:34 am

Bonjour tout le monde,
J'ai fait ma première macro et elle fonctionne un coup de temps en temps.
Est-ce que c'est normal?

Code: Select all

# -*- coding: utf-8 -*-

import FreeCAD
import Part
import PartGui
from FreeCAD import Base
import Sketcher
import BOPTools.SplitFeatures
import CompoundTools

def maCourbe():
	#import FreeCAD
	#import Sketcher
	### Begin command Sketcher_NewSketch
	monDoc.addObject('Sketcher::SketchObject', 'Sketch')
	monDoc.Sketch.Placement = App.Placement(App.Vector(0.000000, 0.000000, 0.000000), App.Rotation(0.000000, 0.000000, 0.000000, 1.000000))
	monDoc.Sketch.MapMode = "Deactivated"

	monDoc.getObject('Sketch').addGeometry(Part.Circle(App.Vector(-9.228558,-0.078137,0),App.Vector(0,0,1),10),True)
	monDoc.getObject('Sketch').addConstraint(Sketcher.Constraint('PointOnObject',0,3,-1)) 
	monDoc.getObject('Sketch').addGeometry(Part.Circle(App.Vector(-6.489166,6.165127,0),App.Vector(0,0,1),10),True)
	monDoc.getObject('Sketch').addConstraint(Sketcher.Constraint('Weight',0,1.000000)) 
	monDoc.getObject('Sketch').addConstraint(Sketcher.Constraint('Equal',0,1)) 
	monDoc.getObject('Sketch').addGeometry(Part.Circle(App.Vector(6.379598,7.057021,0),App.Vector(0,0,1),10),True)
	monDoc.getObject('Sketch').addConstraint(Sketcher.Constraint('Equal',0,2)) 
	monDoc.getObject('Sketch').addGeometry(Part.Circle(App.Vector(20.713623,-0.014430,0),App.Vector(0,0,1),10),True)
	monDoc.getObject('Sketch').addConstraint(Sketcher.Constraint('Equal',0,3)) 
	monDoc.getObject('Sketch').addConstraint(Sketcher.Constraint('PointOnObject',3,3,-1)) 
	monDoc.getObject('Sketch').addGeometry(Part.BSplineCurve([App.Vector(-9.22856,-0.0781365),App.Vector(-6.48917,6.16513),App.Vector(6.3796,7.05702),App.Vector(20.7136,-0.01443)],None,None,False,3,None,False),False)
	conList = []
	conList.append(Sketcher.Constraint('InternalAlignment:Sketcher::BSplineControlPoint',0,3,4,0))
	conList.append(Sketcher.Constraint('InternalAlignment:Sketcher::BSplineControlPoint',1,3,4,1))
	conList.append(Sketcher.Constraint('InternalAlignment:Sketcher::BSplineControlPoint',2,3,4,2))
	conList.append(Sketcher.Constraint('InternalAlignment:Sketcher::BSplineControlPoint',3,3,4,3))
	#print(conList)
	monDoc.getObject('Sketch').addConstraint(conList)
	monDoc.getObject('Sketch').exposeInternalGeometry(4)
	App.ActiveDocument.recompute()
	monDoc.recompute()

def surfacedeRevolution():
	#import FreeCAD
	#import Part
	#Gui.runCommand('Part_Revolve',0)
	monDoc.addObject("Part::Revolution","Surface")
	maSurface=monDoc.getObject("Surface")
	maSurface.Source = monDoc.Sketch
	maSurface.Axis = (1.000000000000000,0.000000000000000,0.000000000000000)
	maSurface.Base = (0.000000000000000,0.000000000000000,0.000000000000000)
	maSurface.Angle = 360.000000000000000
	maSurface.Solid = False
	maSurface.AxisLink = None
	maSurface.Symmetric = False
	FreeCADGui.ActiveDocument.Sketch.Visibility = False
	monDoc.recompute()

def mesPlans(position,longueur, largeur,j):
	#import FreeCAD
	#import Part
	#import Part,PartGui
	for i in range(j):
		toto="Plane"+str(i)
		monDoc.addObject("Part::Plane", toto)
		#monPlan=monDoc.Plane1
		monPlan=monDoc.getObject(toto)
		monPlan.Length=longueur
		monPlan.Width=largeur
		angle = 360/j
		monPlan.Placement=App.Placement(App.Vector(position,0.00,0.00),App.Rotation(App.Vector(1.00,0.00,0.00),angle*i))
		#monPlan.Label='Plan'
	monDoc.recompute()
  


def slice():
	#import BOPTools.SplitFeatures
    #Bizarement, le fait de charger l'atelier Part avant BOPTools résoud le problème de chargement de SplitFeatures
    Gui.activateWorkbench("PartWorkbench")
    f = BOPTools.SplitFeatures.makeSlice(name='Slice')
    f.Base = monDoc.Surface
    #f.Tools = [monDoc.Plane0, monDoc.Plane1, monDoc.Plane2, monDoc.Plane3, monDoc.Plane4, monDoc.Plane5, monDoc.Plane6, monDoc.Plane7]
    f.Tools = monDoc.findObjects("Part::Plane")
    f.Mode = 'Split'
    f.Proxy.execute(f)
    f.purgeTouched()
    for obj in f.ViewObject.Proxy.claimChildren():
        obj.ViewObject.hide()
    #Explode.explodeCompound(...)
    CompoundTools.Explode.explodeCompound(f)
    f.ViewObject.hide()
    monDoc.recompute()

#import Surface
def pseudoPlan():
 # Pour l'instant, c'est la seule façon que j'ai trouvée pour récuppérer les bords des bordures.
 # Gui.Selection.addSelection('Sans_nom','Slice_child1','Edge1',-4.45208,0.255546,0.786489)
    bordures = monDoc.getObjectsByLabel("Exploded Slice")[0].Group
    for i in range(len(bordures)):
       surf = monDoc.addObject("Surface::GeomFillSurface", "Surface")
       surf.BoundaryList = [(bordures[i-1], "Edge1"), (bordures[i], "Edge1")]
       #Je ne sais pas comment changer le type de remplissage Stretch, coons, et curved
       
    monDoc.recompute()

def miseAplat():
	import FreeCAD
	import MeshFlatteningCommand
	
	Gui.Selection.addSelection('Sans_nom','Surface001','Face1',1.50694,4.68611,-1.03005)
	Gui.runCommand('MeshPart_CreateFlatFace',0)
	#App.ActiveDocument.getObjectsByLabel('Surface001')
	#Gui.runCommand('MeshPart_CreateFlatFace',0)




monDoc = FreeCAD.newDocument('Dirigeable')
#monDoc = App.ActiveDocument
#monDoc = FreeCAD.ActiveDocument
maCourbe()
surfacedeRevolution()
#print(monDoc.getObject("Surface"))
#monDoc.
mesPlans(-10,31,5.6,5)
slice()
pseudoPlan()

#monDoc.findObjects("Surface::GeomFillSurface")

D'avance merci,

Ciola
User avatar
rockn
Posts: 1745
Joined: Wed Sep 28, 2011 10:39 am
Location: Toulouse, France
Contact:

Re: Fonctionnement erratique d'une macro

Postby rockn » Tue May 04, 2021 6:36 am

On peut savoir ce qui ne fonctionne pas ? Quel est le résultat attendu, quel sont les comportements anormal que tu observes ?
Formations et tutoriels FreeCAD en Français, soutenez moi : https://www.tipeee.com/formations-freecad
Ciola
Posts: 8
Joined: Sat May 01, 2021 5:47 pm

Re: Fonctionnement erratique d'une macro

Postby Ciola » Tue May 04, 2021 10:36 am

(Re)Bonjour,
J'ai fait exprès de mettre toute la macro car je n'ai pas trouvé comment mettre d'image dans mon post. :oops:
Le résultat attendu est un ensemble de surfaces avec une seule direction de courbure (courbure de Gauss nulle) comme si l'on avait plié des tôles métalliques sur une cintreuse. Ensuite, je compte "unwraper" toutes les surfaces pour obtenir un patron afin de réaliser un dirigeable ayant la même forme que mon ensemble de départ.
Comme ma macro est "autonome", il suffit de la lancer pour voir le résultat. Elle va créer un document puis faire le reste.

Ciola
openBrain
Posts: 5749
Joined: Fri Nov 09, 2018 5:38 pm

Re: Fonctionnement erratique d'une macro

Postby openBrain » Thu May 06, 2021 1:26 pm

Ta macro ne marche qu'une fois à cause de ça

Code: Select all

monDoc.Sketch
et ça

Code: Select all

monDoc.getObject('Sketch')
(tu as le même problème avec le plan, et peut-être ailleurs -- pas regarder --).
Ce que tu dois faire c'est

Code: Select all

monSketch = monDoc.addObject('Sketcher::SketchObject', 'Sketch')
, et ensuite tu utilises 'monSketch' pour référencer l'esquisse dans la suite de la macro. Même principe pour le plan et tout le reste.
Ciola
Posts: 8
Joined: Sat May 01, 2021 5:47 pm

Re: Fonctionnement erratique d'une macro

Postby Ciola » Thu May 06, 2021 7:17 pm

Bonjour et merci pour la réponse mais je fais

Code: Select all

monDoc.addObject('Sketcher::SketchObject', 'Sketch')
au tout début de ma fonction "maCourbe".

Ciola
User avatar
flachyjoe
Posts: 879
Joined: Sat Mar 31, 2012 12:00 pm
Location: Limoges, France

Re: Fonctionnement erratique d'une macro

Postby flachyjoe » Thu May 06, 2021 7:41 pm

Ciola wrote:
Thu May 06, 2021 7:17 pm
Bonjour et merci pour la réponse mais je fais
monDoc.addObject('Sketcher::SketchObject', 'Sketch')
au tout début de ma fonction "maCourbe".
Oui mais tu ne récupères pas le résultat, ce que te dit openBrain c'est d’utiliser le retour de cette fonction pour initialiser la variable monSketch.
- Flachy Joe -
alias FFW @ irc.freenode.net #freecad et #freecad-fr
"Puisqu’on ne peut changer la direction du vent, il faut apprendre à orienter les voiles." Anonyme
Ciola
Posts: 8
Joined: Sat May 01, 2021 5:47 pm

Re: Fonctionnement erratique d'une macro

Postby Ciola » Fri May 07, 2021 6:04 am

Ok donc si j'ai bien compris tu dis que :

Code: Select all

monDoc.addObject('Sketcher::SketchObject', 'Sketch')
monSketch = monDoc.getObject('Sketch').
n'est pas équivalent à :

Code: Select all

monSketch = monDoc.addObject('Sketcher::SketchObject', 'Sketch')
Je croyais que cela revenait au même.
En tout cas, c'est sûr que c'est mieux avec la dernière façon puisqu'on n'a pas besoin de connaitre le nom de l'objet créé.
Ce que je ne comprends pas, c'est pourquoi la macro finit par fonctionner au bout de plusieurs lancements.

Ciola
openBrain
Posts: 5749
Joined: Fri Nov 09, 2018 5:38 pm

Re: Fonctionnement erratique d'une macro

Postby openBrain » Fri May 07, 2021 8:17 am

Ciola wrote:
Fri May 07, 2021 6:04 am
Ok donc si j'ai bien compris tu dis que :

Code: Select all

monDoc.addObject('Sketcher::SketchObject', 'Sketch')
monSketch = monDoc.getObject('Sketch').
n'est pas équivalent à :

Code: Select all

monSketch = monDoc.addObject('Sketcher::SketchObject', 'Sketch')
Ce n'est effectivement pas du tout la même chose.
Cela vient du fait que le nommage dans FreeCAD doit être unique (heureusement en fait).
Donc quand tu fais

Code: Select all

monDoc.addObject('Sketcher::SketchObject', 'Sketch')
, si une esquisse 'Sketch' existe déjà, la nouvelle s'appellera 'Sketch001'. Et ensuite quand tu fais

Code: Select all

monSketch = monDoc.getObject('Sketch')
du coup tu ne récupères pas la bonne.

A noter que

Code: Select all

monDoc.Sketch
est équivalent à

Code: Select all

monDoc.getObject('Sketch')
et donc tout aussi mauvais. :)