Fonctionnement erratique d'une macro

Forum destiné aux questions et discussions en français
Forum rules
Be nice to others! Read the FreeCAD code of conduct!
Post Reply
Ciola
Posts: 39
Joined: Sat May 01, 2021 5:47 pm

Fonctionnement erratique d'une macro

Post by Ciola »

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
Veteran
Posts: 1791
Joined: Wed Sep 28, 2011 10:39 am
Location: Toulouse, France
Contact:

Re: Fonctionnement erratique d'une macro

Post by rockn »

On peut savoir ce qui ne fonctionne pas ? Quel est le résultat attendu, quel sont les comportements anormal que tu observes ?
Formations - Assistance - Développement : https://freecad-france.com
Ciola
Posts: 39
Joined: Sat May 01, 2021 5:47 pm

Re: Fonctionnement erratique d'une macro

Post by Ciola »

(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
Veteran
Posts: 9034
Joined: Fri Nov 09, 2018 5:38 pm
Contact:

Re: Fonctionnement erratique d'une macro

Post by openBrain »

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

Re: Fonctionnement erratique d'une macro

Post by Ciola »

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
Veteran
Posts: 1869
Joined: Sat Mar 31, 2012 12:00 pm
Location: Limoges, France

Re: Fonctionnement erratique d'une macro

Post by flachyjoe »

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

Re: Fonctionnement erratique d'une macro

Post by Ciola »

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
Veteran
Posts: 9034
Joined: Fri Nov 09, 2018 5:38 pm
Contact:

Re: Fonctionnement erratique d'une macro

Post by openBrain »

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

Re: Fonctionnement erratique d'une macro

Post by Ciola »

Bonjour,
Je savais que ce n'était pas une bonne idée de passer par les noms pour récupérer les objets mais comme c'est ma première macro, mon premier but était que ça fonctionne dans un premier temps.
Maintenant que c'est le cas, je vais regarder de plus près toutes mes récupérations d'objets pour ne pas avoir de problèmes avec le système de nommage automatique.
Merci pour ton aide,

Ciola
Post Reply