Sweep automatique dans un script

Forum destiné aux questions et discussions en français
Forum rules
Be nice to others! Read the FreeCAD code of conduct!
User avatar
Pascal
Posts: 71
Joined: Wed Mar 22, 2017 4:33 pm
Location: Sollies-Pont (83) Fr.

Re: Sweep automatique dans un script

Post by Pascal »

Bonjour.

En suivant les conseils de flachyjoe, j'en suis à un résultat qui est vraiment pas mal.

voilà le code : (et le fichier freecad est en P.J.).

Merci, je vais quand même regarder la macro dont tu me parles.

Code: Select all

#-*- coding: utf-8 -*-
from PySide import QtCore
import math


class Spring:
	def __init__(self,doc,obj):
		self._doc=doc
		self._obj=obj
		self._i=0
		self._j=0
		
	def step(self):
		self._i = self._i % 190
		self._j = math.sin(self._i*math.pi/180)*10 + 2
		self._i += 10
		self._obj.Pitch = self._j
		self._obj.Height = self._j
		self._doc.Clone.Placement=App.Placement(App.Vector(0,0,self._j), App.Rotation(App.Vector(0,0,1),0), App.Vector(0,0,0))
		self._doc.Clone001.Placement=App.Placement(App.Vector(0,0,self._j*2), App.Rotation(App.Vector(0,0,1),0), App.Vector(0,0,0))
		self._doc.Clone002.Placement=App.Placement(App.Vector(0,0,self._j*3), App.Rotation(App.Vector(0,0,1),0), App.Vector(0,0,0))
		self._doc.recompute()

myspring = Spring(FreeCAD.ActiveDocument, FreeCAD.ActiveDocument.getObject("Helix"))

timer = QtCore.QTimer()
timer.timeout.connect( myspring.step )
timer.start(50)

#Stoppe le timer au bout de 20s.
QtCore.QTimer().singleShot(20000, timer.stop)
Image1.jpg
Image1.jpg (115.54 KiB) Viewed 836 times
Attachments
ressort.FCStd
(28.88 KiB) Downloaded 25 times
Last edited by Pascal on Sat Mar 25, 2017 6:07 pm, edited 1 time in total.
User avatar
Pascal
Posts: 71
Joined: Wed Mar 22, 2017 4:33 pm
Location: Sollies-Pont (83) Fr.

Re: Sweep automatique dans un script

Post by Pascal »

NormandC wrote:Salut,

mario52 avait fait une macro qui ne travaille que sur une hélice, et de mémoire il me semble que c'est assez rapide. Macro Spring

Non, ça ne s'applique pas à ce que je voulais : il ne modifie que l'Helix, moi je veux que l'Helix garde son sweep pendant les mouvements. C'est là toute la subtilité et la cause du ralentissement (et le titre de ce post ;) ) !

Merci quand même.
User avatar
Pascal
Posts: 71
Joined: Wed Mar 22, 2017 4:33 pm
Location: Sollies-Pont (83) Fr.

Re: Sweep automatique dans un script

Post by Pascal »

Voilà le résultat.

Ca me semble bon.

phpBB [video]
User avatar
flachyjoe
Veteran
Posts: 1869
Joined: Sat Mar 31, 2012 12:00 pm
Location: Limoges, France

Re: Sweep automatique dans un script

Post by flachyjoe »

Salut,
avec

Code: Select all

self._doc.Clone.Placement=App.Placement(App.Vector(0,0,self._j), App.Rotation(App.Vector(0,0,1),0), App.Vector(0,0,0))
tu crées 5 objets alors qu'avec

Code: Select all

self._doc.Clone.Placement.Base.z=self._j
tu n'en crées aucun, ça ne va pas changer grand chose à ce niveau mais dans un script plus gros ça peu libérer de la RAM et accélérer le traitement.

++
- Flachy Joe -
Image
User avatar
Pascal
Posts: 71
Joined: Wed Mar 22, 2017 4:33 pm
Location: Sollies-Pont (83) Fr.

Re: Sweep automatique dans un script

Post by Pascal »

Super, Merci.

Bien sûr : tant qu'à faire, autant faire "propre" :

Code: Select all

#-*- coding: utf-8 -*-
from PySide import QtCore
import math


class Spring:
	def __init__(self,doc,obj):
		self._doc=doc
		self._obj=obj
		self._i=0
		self._j=0
		
	def step(self):
		self._i = self._i % 190
		self._j = math.sin(self._i*math.pi/180)*10 + 2
		self._i += 10
		self._obj.Pitch = self._j
		self._obj.Height = self._j
		self._doc.Clone.Placement.Base.z=self._j
		self._doc.Clone001.Placement.Base.z=self._j*2
		self._doc.Clone002.Placement.Base.z=self._j*3
		self._doc.recompute()

myspring = Spring(FreeCAD.ActiveDocument, FreeCAD.ActiveDocument.getObject("Helix"))

timer = QtCore.QTimer()
timer.timeout.connect( myspring.step )
timer.start(50)

#Stoppe le timer au bout de 20s.
QtCore.QTimer().singleShot(20000, timer.stop)

Post Reply