Réécriture d'une macro

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

Réécriture d'une macro

Post by Ciola »

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

Re: Réécriture d'une macro

Post by openBrain »

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

Re: Réécriture d'une macro

Post by Ciola »

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 33 times
D'avance merci,

Ciola
openBrain
Veteran
Posts: 9041
Joined: Fri Nov 09, 2018 5:38 pm
Contact:

Re: Réécriture d'une macro

Post by openBrain »

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

Re: Réécriture d'une macro

Post by Ciola »

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

Re: Réécriture d'une macro

Post by Ciola »

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

Re: Réécriture d'une macro

Post by flachyjoe »

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 -
Image
User avatar
Chris_G
Veteran
Posts: 2593
Joined: Tue Dec 31, 2013 4:10 pm
Location: France
Contact:

Re: Réécriture d'une macro

Post by Chris_G »

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

Re: Réécriture d'une macro

Post by Ciola »

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
Veteran
Posts: 2593
Joined: Tue Dec 31, 2013 4:10 pm
Location: France
Contact:

Re: Réécriture d'une macro

Post by Chris_G »

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.
Post Reply