Normale d'une Face

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
User avatar
GlouGlou
Posts: 2309
Joined: Sun Apr 05, 2015 9:02 am
Location: La Rochelle, France

Re: Normale d'une Face

Postby GlouGlou » Fri Jul 24, 2020 8:38 pm

mario52 wrote:
Fri Jul 24, 2020 8:24 pm
avec Macro_WorkFeatures
oui, de mémoire c'était çà. Mais la macro workfeature est en python2, et l'atelier workfeature semble abandonné.
User avatar
GlouGlou
Posts: 2309
Joined: Sun Apr 05, 2015 9:02 am
Location: La Rochelle, France

Re: Normale d'une Face

Postby GlouGlou » Fri Jul 24, 2020 8:41 pm

flachyjoe wrote:
Fri Jul 24, 2020 7:42 pm
Cadeau :lol:
exactement çà. j'essayerais de modifier cette macro ce WE. ;)
Gandouzi Ghayth
Posts: 39
Joined: Wed May 13, 2020 2:45 am

Re: Normale d'une Face

Postby Gandouzi Ghayth » Sat Jul 25, 2020 7:51 am

je veut générer des matrice d'assemblage d'un ensemble des pièces donc c'est sans la sélection des pièces
je veut changer
u=0
v=0
pour déterminer ce vecteur normale
Attachments
vect.PNG
vect.PNG (4.91 KiB) Viewed 123 times
User avatar
GlouGlou
Posts: 2309
Joined: Sun Apr 05, 2015 9:02 am
Location: La Rochelle, France

Re: Normale d'une Face

Postby GlouGlou » Sat Jul 25, 2020 3:22 pm

Help.
Comment passer f à la fonction execute ?

Code: Select all

from __future__ import division
import FreeCAD, Part
from FreeCAD import Base

class Normal:
   def __init__(self, obj):
   
      obj.addProperty("App::PropertyFloat","Lenght","Parameters","Lenght of the edge").Lenght = 1.0
      
      obj.Proxy = self

   def onChanged(self, obj, prop):
      if prop == "L":
        self.execute(obj)

   def execute(self, obj):
        g=f.CenterOfMass
        norm=Part.makeLine(g,g+f.normalAt(*f.Surface.parameter(g))*Lenght)
        Part.show(norm)
    
    
def MakeNormal():
   doc = FreeCAD.activeDocument()
   if doc == None:
      doc = FreeCAD.newDocument()
   
   obj=doc.addObject("Part::FeaturePython","Normal") 
   f=Gui.Selection.getSelectionEx()[0].SubObjects[0]
   Normal(obj)
   obj.ViewObject.Proxy=0
   viewObject = Gui.ActiveDocument.getObject(obj.Name)
   viewObject.DisplayMode = "Flat Lines"
  
MakeNormal()
User avatar
Chris_G
Posts: 1367
Joined: Tue Dec 31, 2013 4:10 pm
Location: France
Contact:

Re: Normale d'une Face

Postby Chris_G » Sat Jul 25, 2020 5:05 pm

Ton objet FeaturePython (Normal) doit etre lié à la face.
Donc il faut lui ajouter une propriété "PropertyLinkSub" :

Code: Select all

class Normal:
    def __init__(self, obj, face):
        ...
        obj.addProperty("App::PropertyLinkSub","Target","Parameters","Target face").Target = face
Et il faut donc initialiser le Proxy avec le lien vers cette face :

Code: Select all

f = Gui.Selection.getSelectionEx()[0]
linksub = (f.Object, (f.SubElementNames[0]))
Normal(obj, linksub)

Une chose à éviter :

Code: Select all

   def execute(self, obj):
        ...
        Part.show(norm)
Part.show() ajoute un nouvel objet dans le document, à chaque appel.
Puisque tu as déjà un objet FeaturePython, il suffit de modifier sa propriété "Shape" :

Code: Select all

   def execute(self, obj):
        ...
        obj.Shape = norm

le code complet :

Code: Select all

from __future__ import division
import FreeCAD
import Part

class Normal:
    def __init__(self, obj, face):
        obj.addProperty("App::PropertyFloat","Lenght","Parameters","Lenght of the edge").Lenght = 1.0
        obj.addProperty("App::PropertyLinkSub","Target","Parameters","Target face").Target = face
        obj.Proxy = self

    def onChanged(self, obj, prop):
        if prop == "Length":
            self.execute(obj)

    def execute(self, obj):
        f = obj.Target[0].getSubObject(obj.Target[1][0])
        g = f.CenterOfMass
        norm = Part.makeLine(g, g+f.normalAt(*f.Surface.parameter(g))*obj.Lenght)
        obj.Shape = norm

def MakeNormal():
    doc = FreeCAD.activeDocument()
    if doc == None:
        doc = FreeCAD.newDocument()
    obj = doc.addObject("Part::FeaturePython","Normal") 
    f = Gui.Selection.getSelectionEx()[0]
    linksub = (f.Object, (f.SubElementNames[0]))
    Normal(obj, linksub)
    obj.ViewObject.Proxy = 0
    viewObject = Gui.ActiveDocument.getObject(obj.Name)
    viewObject.DisplayMode = "Flat Lines"

MakeNormal()
User avatar
GlouGlou
Posts: 2309
Joined: Sun Apr 05, 2015 9:02 am
Location: La Rochelle, France

Re: Normale d'une Face

Postby GlouGlou » Sat Jul 25, 2020 5:31 pm

cool ça marche. ;) merki
... je crois qu'il me manque des bases pour programmer. :D
si tu veux tu peux intégrer ça à curveWB.
Ça peut être utile pour avoir une distance à une face ou avoir une direction perpendiculaire à la face.
User avatar
GlouGlou
Posts: 2309
Joined: Sun Apr 05, 2015 9:02 am
Location: La Rochelle, France

Re: Normale d'une Face

Postby GlouGlou » Sat Jul 25, 2020 5:44 pm

ici je m'étais galéré à trouver un segment perpendiculaire au centre de la lettre pour faire un bombé avec interpolated curve.
(extrusion d'un point au centre)
Attachments
Capture.JPG
Capture.JPG (57.89 KiB) Viewed 72 times