Réécriture 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: 15
Joined: Sat May 01, 2021 5:47 pm

Réécriture d'une macro

Postby Ciola » Tue May 04, 2021 2:16 am

Bonjour tout le monde,
Bien que je sois débutant en FreeCAD, d'habitude j'arrive à transformer l'enregistrement des macro en code propre mais là je ne vois pas comment faire.
Quelqu'un aurait-il une suggestion?
D'avance merci,
Ciola

Code: Select all

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

import FreeCAD
import MeshFlatteningCommand

# Gui.runCommand('Std_DlgMacroRecord',0)
# Gui.Selection.addSelection('Sans_nom','Surface001','Face1',1.50694,4.68611,-1.03005)
Gui.runCommand('MeshPart_CreateFlatFace',0)
openBrain
Posts: 5791
Joined: Fri Nov 09, 2018 5:38 pm

Re: Réécriture d'une macro

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

Salut. Et tu veux faire quoi ?
Ciola
Posts: 15
Joined: Sat May 01, 2021 5:47 pm

Re: Réécriture d'une macro

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

Bonjour et merci pour l'attention portée à ma question.
Je veux automatiser la mise à plat de toutes les surfaces pour fabriquer un patron de mon dirigeable.
cf.
enveloppe1.FCStd
(221.47 KiB) Downloaded 8 times
D'avance merci,

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

Re: Réécriture d'une macro

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

Euh...j'attendais quelque chose d'un peu plus détaillé concernant spécifiquement problème avec les lignes que tu as mis dans le post original. :)
Ciola
Posts: 15
Joined: Sat May 01, 2021 5:47 pm

Re: Réécriture d'une macro

Postby Ciola » Mon May 10, 2021 3:33 am

Bonjour,
Mon problème est que je n'arrive pas à trouver de la doc pour transformer les deux lignes en code (que j'ai mis dans mon premier post) pour obtenir la mise à plat de toutes mes surfaces.

Code: Select all

import MeshFlatteningCommand
surfaces = monDoc.findObjects("Surface::GeomFillSurface")
for surface in surfaces:
	#MeshFlatteningCommand.CreateFlatFace()
	#Gui.runCommand('MeshPart_CreateFlatFace',0)
	monDoc.addObject("Mesh::CreateFlatFace", "Patron")
D'ailleurs, si tu pouvais m'indiquer un lien pour avoir l'API clairement documentée. ce serait super car pour l'instant je vais sur https://freecad.github.io/API/index.html mais je n'arrive pas à trouver ce que je cherche.

D'avance merci,

Ciola
Ciola
Posts: 15
Joined: Sat May 01, 2021 5:47 pm

Re: Réécriture d'une macro

Postby Ciola » Mon May 10, 2021 4:25 am

Bonjour,
Je viens de faire :

Code: Select all

for surface in surfaces:
	Gui.Selection.addSelection(monDoc.Name,surface.Name,'Face1')
	Gui.runCommand('MeshPart_CreateFlatFace',0)
Ça fonctionne mais j'aimerais savoir si le code est propre ou s'il vaudrait mieux faire autrement.
En effet, j'aimerais pouvoir avoir accès aux nouvelles flatFace ainsi créées.
D'avance merci,

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

Re: Réécriture d'une macro

Postby flachyjoe » Mon May 10, 2021 12:14 pm

Salut,
Ciola wrote: Mon May 10, 2021 3:33 am si tu pouvais m'indiquer un lien pour avoir l'API clairement documentée
la documentation des API est en cours d'amélioration, cf https://forum.freecadweb.org/viewtopic.php?f=10&t=57670
Si des volontaires se présentent, je me sentirai moins seul… ;)
- 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
User avatar
Chris_G
Posts: 1739
Joined: Tue Dec 31, 2013 4:10 pm
Location: France
Contact:

Re: Réécriture d'une macro

Postby Chris_G » Mon May 10, 2021 12:51 pm

Ciola wrote: Mon May 10, 2021 4:25 am

Code: Select all

for surface in surfaces:
	Gui.Selection.addSelection(monDoc.Name,surface.Name,'Face1')
	Gui.runCommand('MeshPart_CreateFlatFace',0)
Ça fonctionne mais j'aimerais savoir si le code est propre ou s'il vaudrait mieux faire autrement.
En effet, j'aimerais pouvoir avoir accès aux nouvelles flatFace ainsi créées.
D'avance merci,

Ciola
Disons que les 2 commandes dans la boucle sont exactement équivalentes à des clics de souris dans l'interface.
Si tu veux descendre au niveau de détail en-dessous, la commande MeshPart_CreateFlatFace est définie ici : MeshPart_CreateFlatFace
Donc en mixant les 2, ta boucle précedente devient (mais j'ai pas testé) :

Code: Select all

import numpy as np
import flatmesh
flat_faces = []
for surface in surfaces:
    shape = surface.toNurbs()
    face = shape.Faces[0]
    nurbs = face.Surface
    nurbs.setUNotPeriodic()
    nurbs.setVNotPeriodic()
    bs = nurbs.toBSpline(1, "C0", "C0", 3, 3, 10)
    face = bs.toShape()
    face.tessellate(0.01)
    flattener = flatmesh.FaceUnwrapper(face)
    flattener.findFlatNodes(5, 0.99)
    poles = flattener.interpolateFlatFace(face)
    num_u_poles = len(bs.getPoles())
    num_v_poles = len(bs.getPoles()[0])
    i = 0
    for u in range(num_u_poles):
        for v in range(num_v_poles):
            bs.setPole(u + 1, v + 1, App.Vector(poles[i]))
            i += 1
    flat_faces.append(bs.toShape())
Ciola
Posts: 15
Joined: Sat May 01, 2021 5:47 pm

Re: Réécriture d'une macro

Postby Ciola » Mon May 10, 2021 3:25 pm

Merci Chris_G pour ta réponse mais pour l'instant j'aurais aimé me situer à un niveau proche de l'interface utilisateur mais avec cependant un peu plus de contrôle concernant la possibilité d'avoir des références claires sur mes objets créés sans passer par la recherches des noms créés automatiquement par FreeCAD.
Est-ce possible?

Ciola

PS : Si j'ai bien compris, le code que tu propose est à peu près (sans la boucle sur surfaces) celui qui est appelé quand je clique sur "UnWrap face" dans l'atelier Mesh Design. Est-ce exact?
User avatar
Chris_G
Posts: 1739
Joined: Tue Dec 31, 2013 4:10 pm
Location: France
Contact:

Re: Réécriture d'une macro

Postby Chris_G » Mon May 10, 2021 4:33 pm

Oui, sauf que le code proposé plus haut ne crée pas d'objets FreeCAD, mais stocke les faces applaties dans une liste (flat_faces).
Si tu veux créer des objets FreeCAD, tu peux ajouter le code suivant, à la suite de l'autre:

Code: Select all

i = 1
objects = []
for face in flat_faces:
    o = FreeCAD.ActiveDocument.addObject("Part::Feature", "FlatFace_{}".format(i))
    o.Shape = face
    objects.append(o)
    i += 1

FreeCAD.ActiveDocument.recompute()
À la fin de ce code, la liste objects contient les références souhaitées.