Dessiner une Trochoïde

Forum destiné aux questions et discussions en français
Forum rules
Be nice to others! Read the FreeCAD code of conduct!
Versingétorix22
Posts: 28
Joined: Mon Nov 23, 2020 1:36 pm

Dessiner une Trochoïde

Post by Versingétorix22 »

Bonjour,

Est ce possible de dessiner une trochoïde avec FreeCAD ?

C'est le dessin qui est tout en haut de cette page :
https://mathcurve.com/courbes2d/trochoid/trochoid.shtml

Il faut pouvoir entrer les formules qui sont dans l'encart rose de cette même page
User avatar
FaDa3D
Posts: 873
Joined: Tue Aug 08, 2017 8:21 am
Location: Savoie France

Re: Dessiner une Trochoïde

Post by FaDa3D »

Bonsoir,
Avec la macro 3D_Parametric_Curves à installer par Addon ça devrait pouvoir se faire.
Fada de 3D.
Linux Mint
User avatar
Vincent B
Veteran
Posts: 4734
Joined: Sun Apr 05, 2015 9:02 am
Location: La Rochelle, France

Re: Dessiner une Trochoïde

Post by Vincent B »

comme çà
Attachments
Capture.JPG
Capture.JPG (44.29 KiB) Viewed 1112 times
Versingétorix22
Posts: 28
Joined: Mon Nov 23, 2020 1:36 pm

Re: Dessiner une Trochoïde

Post by Versingétorix22 »

Merci,

Par contre j'ai un message d'erreur dès que je l'ouvre :

10:01:12 Traceback (most recent call last):
10:01:12 File "C:/Users/yvesl/AppData/Roaming/FreeCAD/Macro/3D_Parametric_Curve.FCMacro", line 127, in polyState
10:01:12 self.op2.setCheckState(QtCore.Qt.Unchecked)
10:01:12 AttributeError: 'ParamCurv' object has no attribute 'op2'
marcroParametricCurve.jpg
marcroParametricCurve.jpg (100.43 KiB) Viewed 1064 times
User avatar
Vincent B
Veteran
Posts: 4734
Joined: Sun Apr 05, 2015 9:02 am
Location: La Rochelle, France

Re: Dessiner une Trochoïde

Post by Vincent B »

Si tu as encore des soucis, j'ai adapté la macro pour en faire un objet modifiable.

Code: Select all

from __future__ import division
import FreeCAD, Part, Draft
from FreeCAD import Base
from math import *


class MathCurve:
   def __init__(self, obj):
      
      obj.addProperty("App::PropertyString","a","Parameters","Set a parameter a(t)").a = "1"
      obj.addProperty("App::PropertyString","b","Parameters","Set b parameter b(a,t)").b = "0"
      obj.addProperty("App::PropertyString","c","Parameters","Set c parameter c(a,b,t)").c = "0"
      obj.addProperty("App::PropertyString","X","Parameters","X expression X(a,b,c,t)").X = "t"
      obj.addProperty("App::PropertyString","Y","Parameters","Y expression Y(a,b,c,t)").Y = "a*sin(t)"
      obj.addProperty("App::PropertyString","Z","Parameters","Z expression Z(a,b,c,t)").Z = "0"
           
      obj.addProperty("App::PropertyFloat","start","Curve","Start t").start = 0
      obj.addProperty("App::PropertyFloat","end","Curve","End t").end = 6.283185
      obj.addProperty("App::PropertyFloat","interval","Curve","Interval dt").interval = 0.1
      obj.addProperty("App::PropertyBool","createFace","Curve","Wheter to create a face or not").createFace = False
      obj.addProperty("App::PropertyBool","close","Curve","close the curve or not").close = False
      
      obj.Proxy = self

   def onChanged(self, obj, prop):
      if prop == "a" or prop == "b" or prop == "c" or prop == "X" or prop == "Y"or prop == "Z" or prop == "start" or prop == "end" or prop == "interval" or prop == "createFace" or prop == "close":
        self.execute(obj)

   def execute(self, obj):
      fa = obj.a
      fb = obj.b
      fc = obj.c
      fx = obj.X
      fy = obj.Y
      fz = obj.Z
      
      x0 = 0
      y0 = 0
      z0 = 0
      kx = 1
      ky = 1
      kz = 1
      
      s = obj.start
      e = obj.end 
      dt = obj.interval
      nbpts = int((e-s)/dt) +1
     
      matriz = []
      t = s
           
      if x1!=0 and x2!=0:
        
        xmin = ymin = zmin = 0
        xmax = ymax = zmax = 0
        
        for i in range(nbpts):
            try:
                value="a"
                a=eval(fa)
                value="b"
                b=eval(fb)
                value="c"
                c=eval(fc)
                value="x"
                x=eval(fx)
                value="y"
                y=eval(fy)
                value="z"
                z=eval(fz)
            
            except ZeroDivisionError:
                print("Error division by zero in calculus of "+value+"() for t="+str(t)+" !")
            except:
                print("Error in the formula of "+value+"() !")

            if x<xmin:
                xmin=x
            if x>xmax:
                xmax=x
            if y<ymin:
                ymin=y
            if y>ymax:
                ymax=y
            if z<zmin:
                zmin=z
            if z>zmax:
                zmax=z
             
            t+=dt

                
        try:
            kx = (x2-x1)/(xmax-xmin)
        except:
            kx = 1
        try:
            ky = (y2-y1)/(ymax-ymin)
        except:
            ky = 1
        try:
            kz= (z2-z1)/(zmax-zmin)
        except:
            kz = 1
            
        
        
        print (kx, ky, kz)
         
         
      t = s
      for i in range(nbpts):
      
        try:
            value="a"
            a=eval(fa)
            value="b"
            b=eval(fb)
            value="c"
            c=eval(fc)
            value="x"
            x=kx*eval(fx)+x1
            value="y"
            y=ky*eval(fy)+y1
            value="z"
            z=kz*eval(fz)+z1
            
        except ZeroDivisionError:
            print("Error division by zero in calculus of "+value+"() for t="+str(t)+" !")
        except:
            print("Error in the formula of "+value+"() !")
       
        #print(i,x,y,z)
        matriz.append(FreeCAD.Vector(x,y,z))
        t+=dt
      
      curve = Part.BSplineCurve(matriz)
      if obj.close == True:
         curve.setPeriodic()
      if obj.createFace == True:
         sh = Part.Face(Part.Wire(curve.toShape()))
      else:
         sh = curve.toShape()
      sh.Placement = obj.Placement
      obj.Shape = sh

def MakeMathCurve():
    doc = FreeCAD.activeDocument()
    if doc == None:
        doc = FreeCAD.newDocument()
    obj=doc.addObject("Part::FeaturePython","Math3DCurve") 
    
    global x1, y1, z1, x2, y2, z2
   
    try:
        SelPt1 = FreeCADGui.Selection.getSelectionEx()[0].SubObjects[0]
        SelPt2= FreeCADGui.Selection.getSelectionEx()[0].SubObjects[1]

        x1 = SelPt1.X
        y1 = SelPt1.Y
        z1 = SelPt1.Z
        x2 = SelPt2.X
        y2 = SelPt2.Y
        z2 = SelPt2.Z

    except:
        x1 = 0
        y1 = 0
        z1 = 0
        x2 = 0
        y2 = 0
        z2 = 0
        obj.addExtension("Part::AttachExtensionPython","obj")

    MathCurve(obj)
    obj.ViewObject.Proxy=0
    viewObject = Gui.ActiveDocument.getObject(obj.Name)
    viewObject.DisplayMode = "Flat Lines"
   

               
MakeMathCurve()
Last edited by Vincent B on Thu Nov 26, 2020 7:38 pm, edited 2 times in total.
openBrain
Veteran
Posts: 9041
Joined: Fri Nov 09, 2018 5:38 pm
Contact:

Re: Dessiner une Trochoïde

Post by openBrain »

GlouGlou wrote: Thu Nov 26, 2020 6:30 pm Si tu as encore des soucis, j'ai adapté la macro pour en faire un objet modifiable.
:+1:
Par contre il y a un

Code: Select all

[quote][/quote]
qui traine dans ton code tout au début et tout à la fin. ;)
User avatar
Vincent B
Veteran
Posts: 4734
Joined: Sun Apr 05, 2015 9:02 am
Location: La Rochelle, France

Re: Dessiner une Trochoïde

Post by Vincent B »

mauvais clic quelque part. :D
c'est corrigé.
Versingétorix22
Posts: 28
Joined: Mon Nov 23, 2020 1:36 pm

Re: Dessiner une Trochoïde

Post by Versingétorix22 »

Merci, ça marche bien maintenant

Par contre, dans X(a,b,c ,t) je n'arrive pas à entrer la formule a-b*cos(t)

Idem dans C , je n'arrive pas à entrer la formule : a*t-b*sin(t)

Edit : je n'ai pas la fenêtre "paramétrique curve" qui s'affiche non plus, c'est normal?
enfin pas comme sur la copie d'écran ci dessus

D'après ce que je vois, la macro est paramétrée autrement que dans le poste ci-dessus
User avatar
FaDa3D
Posts: 873
Joined: Tue Aug 08, 2017 8:21 am
Location: Savoie France

Re: Dessiner une Trochoïde

Post by FaDa3D »

Bonjour,
Versingétorix22 wrote: Wed Dec 02, 2020 10:08 pm je n'ai pas la fenêtre "paramétrique curve" qui s'affiche non plus, c'est normal?
enfin pas comme sur la copie d'écran ci dessus
D'après ce que je vois, la macro est paramétrée autrement que dans le poste ci-dessus
L'entré des formules se fait dans la vue combinée aprés avoir sélectionner MathCurve dans l'arborescence.
Versingétorix22 wrote: Wed Dec 02, 2020 10:08 pm Par contre, dans X(a,b,c ,t) je n'arrive pas à entrer la formule a-b*cos(t)
Idem dans C , je n'arrive pas à entrer la formule : a*t-b*sin(t)
Peut-être fait-tu la même erreur que moi au début.
Il ne faut pas entrer l'expression a*t-b*sin(t) (par exemple) dans l'éditeur de formule de FreeCAD. Ne pas se servir du bouton f(x), l'écrire directement dans le champ de la vue combinée.
Attachments
Capture du 2020-12-03 13-27-14.png
Capture du 2020-12-03 13-27-14.png (28.56 KiB) Viewed 855 times
DemoTrochoïde.FCStd
(13.12 KiB) Downloaded 30 times
Fada de 3D.
Linux Mint
User avatar
papyblaise
Veteran
Posts: 8000
Joined: Thu Jun 13, 2019 4:28 pm
Location: France

Re: Dessiner une Trochoïde

Post by papyblaise »

J'ai failli oublier de signaler qu'on peut pas le placer au scrabble : ya pas de ï :lol:
Post Reply