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.

Sweep automatique dans un script

Post by Pascal »

Bonjour à tous

Je débute dans Freecad. Jusqu'à présent j'arrive à me débrouiller, mais je butte sur un petit ennui : je voudrai simuler le mouvement d'un ressort dans un script.
Pour faire le ressort, je fais simplement un Helix, puis je fais le sweep d'un sketch le long de cet Helix.
Tout ma va très bien, mais par script je ne sais pas comment rafraichir le sweep lorsque je change les paramètres de l'Helix. (Gui.updateGui ne s'applique pas à la situation).

Merci

Voilà le script :

Code: Select all

from PySide import QtCore

i=0
timer = QtCore.QTimer()

def myspring():
	global i
	i += 1	
	i = i % 10
	FreeCAD.getDocument("Unnamed").getObject("Helix").Pitch = i + 2
	FreeCAD.getDocument("Unnamed").getObject("Helix").Height = (i+2) * 4
	Gui.updateGui()
	return		

timer.timeout.connect( myspring )
timer.start(100)
spring.jpg
spring.jpg (102 KiB) Viewed 1506 times
--
OS: Windows 10
Word size of OS: 64-bit
Word size of FreeCAD: 64-bit
Version: 0.16.6706 (Git)
Build type: Release
Branch: releases/FreeCAD-0-16
Hash: f86a4e411ff7848dea98d7242f43b7774bee8fa0
Python version: 2.7.8
Qt version: 4.8.7
Coin version: 4.0.0a
OCC version: 6.8.0.oce-0.17
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,

Code: Select all

Gui.updateGui()
ne fait que rafraîchir l'affichage, ça ne met pas à jour le modèle, pour ça il faut utiliser

Code: Select all

FreeCAD.ActiveDocument.recompute()
Bons rebonds !
- 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 »

Merci flachyjoe

Effectivement, ça fonctionne. C'est par contre très lent. Y aurait il une autre façon qui me permette de créer un ressort, puis de l'animer (par exemple le convertir en objet puis le déformer ?)
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 »

Tu peux faire un Draft_Clone de ton Part_Sweep et modifier la propriété Scale.Z
La section du fil va se déformer aussi mais si c'est juste pour de la visualisation ça doit pas être gênant.
- 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 »

Oui, sympa, mais malheureusement ça reste très lent.

Arrête moi si je me trompe : le clone reste lié à son modèle d'origine, donc je suis obligé de garder dans le document l'Helix, le sweep et le sketch.

Lorsque je modifie le scale du clone, je dois refaire le "FreeCAD.activeDocument().recompute()", et je pense que le programme recalcule l'ensemble des éléments (même invisibles) et que ça freine l'animation.

Je voudrais essayer de "recomputer" seulement le clone, pour essayer... Dans la doc, sur la page http://free-cad.sourceforge.net/SrcDocu ... bject.html cela semble possible, mais hors de portée pour moi, aux vues de mes connaissances.
App::DocumentObjectExecReturn * recompute (void) recompute only this object
Saurais-tu comment faire pour opérer un recompute seulement sur un objet ?

Merci.


Voilà ce que j'avais essayé (avec un recompute complet)

Code: Select all

from PySide import QtCore
from __future__ import division

i=0
timer = QtCore.QTimer()

def myspring():
	global i
	i += 1	
	i = i % 20
	FreeCAD.getDocument("ressort").getObject("Clone").Scale = (1.00, 1.00, (i / 20) + 1)
	FreeCAD.activeDocument().recompute()
	return	

timer.timeout.connect( myspring )
timer.start(50)
Attachments
ressort.FCStd
(35.16 KiB) Downloaded 26 times
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 »

Tu peux stocker des objets pour ne pas avoir à appeler des fonctions FreeCAD à chaque pas :

Code: Select all

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

class Springer:
	def __init__(self,doc,obj):
		self._doc=doc
		self._obj=obj
		self._i=0
		
	def step(self):
		self._i += 1   
		self._i = self._i % 20
		self._obj.Scale.z=(self._i / 20.) + 1.
		self._doc.recompute()

myspring = Springer(FreeCAD.ActiveDocument, FreeCAD.ActiveDocument.getObject("Clone"))

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

#Stop le timer au bout de 10s.
QtCore.QTimer().singleShot(10000, timer.stop)
- 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 »

Merci, à défaut d'être plus rapide, c'est plus propre.

Concernant mon dernier message, je pense faire fausse route :

[*] a priori, un doc.recompute ne "recompute" que les objets qui ont été modifiés, donc il ne devrait pas être trop gené par la partie helix, sweep qui ont permis de créer le clone. https://www.freecadweb.org/wiki/Std_Refresh
[*] Je pense que la doc que j'ai mentionnée précédemment est la doc des développeurs de freecad... :?
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 »

Ça mouline sur une section ronde mais ça marche très bien sur une section rectangulaire (avec laquelle j'avais fait mes tests). Si ça se trouve c'est plus rapide d'étendre un seul tour et de le cloner que d'étendre les 3 tours, faut essayer.
- 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 »

Bonjour

Ha oui, c'est assez net avec une section autre que ronde. J'ai commencé à tester avec plusieurs clones empilés, mais du coup je dois aussi changer leur position à mesur qu'ils grandissent.

Je te remercie pour ton aide, je vais peaufiner dans cette direction.

Pascal
User avatar
NormandC
Veteran
Posts: 18587
Joined: Sat Feb 06, 2010 9:52 pm
Location: Québec, Canada

Re: Sweep automatique dans un script

Post by NormandC »

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