[Résolu][Python]affichage solides et patron

Discussions sur les projets et applications développés en liaison avec une suite bureautique libre.

Modérateur : Vilains modOOs

joel275
InconditiOOnnel
InconditiOOnnel
Messages : 839
Inscription : 10 janv. 2009 09:05

[Résolu][Python]affichage solides et patron

Message par joel275 »

Bonjour,

suite au commentaire de Jurassik Pork ici: https://forum.openoffice.org/fr/forum/v ... 15#p311720, mon projet avance pas mal, du moins quand le script Python est dans "Mes macros", mais je bloque méchamment sur l'appel d'une toute petite routine en basic quand le tout est stocké dans "Mes documents".
Je précise:
--> ce script permet d'afficher des solides "classiques", de les faire tourner selon 3 axes et d'en faire développer le patron quand c'est possible. On doit pouvoir faire afficher n'importe quel solide convexe moyennant quelques ajouts.
--> pour l'affichage correct de l'animation, je n'ai pas trouvé d'autre solution que de faire appel à la fonction "Wait(temporisation)" du basic :shock:
--> la routine qui crée le problème s'appelle: appelBasic

L'ensemble, une fois transféré dans "mes macros" (y compris la sub Tempo en basic), fonctionne correctement. Le script étant assez long, je le mets dans le document joint.

Je souhaite pouvoir diffuser ce script (qui ne sert à rien mais dont le rendu est joli :D) dans un document pour rendre transparent son utilisation.
Si quelqu'un a une idée soit pour se passer de cette :fou: routine en basic soit pour l'appeler, je l'en remercierai mille fois (au moins).

A plus.
 Ajout : a-y-est! c'est pas parfait, ça marche (grâce à Hubert Lambert) mais ça sert toujours à rien. Je mets la nouvelle version à la place de la précédente.
Attention: ne fonctionne qu'avec LibreOffice. 
Pièces jointes
Solides V2.odt
(27.42 Kio) Téléchargé 203 fois
Dernière modification par joel275 le 15 mai 2018 14:33, modifié 3 fois.
A jour de LibreOffice et de Ubuntu
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 09:26

Re: [Python]affichage solides et patron

Message par Hubert Lambert »

Bonjour,

Ceci devrait régler le problème :

Code : Tout sélectionner

	def appelBasic(self, nom, arg = ('',), location = 'application'):
		nom = ['JDMath.Outils.' + nom, 'Standard.Module1.' + nom][location == 'document']
		if location == "document":
			scriptPro = self.doc.ScriptProvider
		else:
			mspf = self.sm.createInstanceWithContext("com.sun.star.script.provider.MasterScriptProviderFactory", self.ct)
			scriptPro = mspf.createScriptProvider("")
		xScript = scriptPro.getScript("vnd.sun.star.script:{}?language=Basic&location={}".format(nom, location))
		return xScript.invoke(arg, (), ())
ou

Code : Tout sélectionner

	def appelBasic(self, nom, arg = ('',), location = 'application'):
		nom = ['JDMath.Outils.' + nom, 'Standard.Module1.' + nom][location == 'document']
		uri = "vnd.sun.star.script:{}?language=Basic&location={}".format(nom, location)
		mspf = self.ct.getByName("/singletons/com.sun.star.script.provider.theMasterScriptProviderFactory")
		if location == "document":
			location = "vnd.sun.star.tdoc:/{}".format(self.doc.RuntimeUID)
		scriptPro = mspf.createScriptProvider(location)
		xScript = scriptPro.getScript(uri)
		return xScript.invoke(arg, (), ())
3 petites choses :
- il ne faut pas non plus oublier, lorsque tu incorpores le tout dans le document, de modifier aussi les macros associées aux contrôles de dialogue (qui pointent toutes vers "mes Macros")... ou alors opter pour cette solution :) ;
- j'ai désactivé l'appel à la macro Tempo par curiosité, sans voir aucune différence ;
- tu peux modifier la ligne 243 comme ceci pour que le code fonctionne aussi sous OpenOffice :

Code : Tout sélectionner

		return (tuple(coor),)
Et bravo pour ce magnifique exercice de style :wink: .

Cordialement.
AOOo 4.1.7 sur Win10
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Avatar de l’utilisateur
Jurassic Pork
PassiOOnné
PassiOOnné
Messages : 620
Inscription : 10 août 2017 00:15

Re: [Python]affichage solides et patron

Message par Jurassic Pork »

hello,
pourquoi au lieu d'utiliser le Wait pour faire une tempo , n'utilises-tu pas le sleep du python :

Code : Tout sélectionner

import time
time.sleep(0.100) 
et pourquoi n'utilises-tu pas pour tes boutons les macros qui se trouvent dans ton document ?

Ami calmant, J.P
LibreOffice 7.6.2.1 et OpenOffice 4.1.15 sous windows 11
LibreOffice 24.2.0 et OpenOffice 4.1.15 sous Ubuntu 20.04
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 09:26

Re: [Python]affichage solides et patron

Message par Hubert Lambert »

joel275 a écrit :Si quelqu'un a une idée soit pour se passer de cette :fou: routine en basic
Je me suis souvenu que j'avais rencontré un problème similaire avec un dialogue non modal, résolu en utilisant un processus parallèle ("Thread"). Cela marche pour la routine "Patron", mais pas malheureusement pas pour la routine "affiche" :

Code : Tout sélectionner

from threading import Thread
def Patron(*oEvt):
    t = Thread(target=_patron, args=(oEvt,))
    t.start()

def _patron(oEvt):
    """creée le patron du solide à l'ouverture totale"""
    [...]
Cette routine "affiche" est appelée par plusieurs fonctions et n'est pas simple à déboguer...
Jurassic Pork a écrit :pourquoi au lieu d'utiliser le Wait pour faire une tempo , n'utilises-tu pas le sleep du python
Apparemment ça ne règle pas le problème. L'instruction basic Wait semble faire plus que simplement pauser l'exécution d'une macro... :?:
 Ajout : 16h45 
Une solution pour se passer du Wait() dans la fonction Affiche :

Code : Tout sélectionner

from time import sleep
from threading import Thread, Lock

lock = Lock()
def Tourne_Solide(*args):
    lock.acquire()
    event = args[0]
    t = Thread(target=_tourne_Solide, args=(event,))
    t.start()

def _tourne_Solide(event):
    """fait tourner le solide autour d'un des trois axes avec boîte de dialogue"""
    global solide
    source = event.Source
    L = int(3 * event.X/source.Size.Width) + 1
    i = [-1, 1] [event.Y < source.Size.Height/2]
    ang = i*pi/24
    while lock.locked():
        solide.tourne(ang, L)    # tourne sommets et vecteurs normaux
        sleep(0.01)

def Arret(*oEvt):
    lock.release()
Cordialement.
Pièces jointes
Solides.odt
Version "no Wait" :)
(26.58 Kio) Téléchargé 200 fois
AOOo 4.1.7 sur Win10
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
joel275
InconditiOOnnel
InconditiOOnnel
Messages : 839
Inscription : 10 janv. 2009 09:05

Re: [Python]affichage solides et patron

Message par joel275 »

Bonjour,

merci pour ces réponses efficaces et désolé pour mon retour tardif: j'étais en week-end loin d'internet...
J'ai un peu de boulot pour comprendre un tant soit peu tout cela. Je pense opter(au moins le temps que j'aborde et comprenne un peu le multi-threading) pour l'appel de la fonction basic incorporée au document.
Quelques jours pour mettre de l'ordre dans le code, le nettoyer des parties devenues inutiles et je mettrai en ligne le résultat et passerai le projet en résolu.

A plus.
A jour de LibreOffice et de Ubuntu
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 09:26

Re: [Résolu][Python]affichage solides et patron

Message par Hubert Lambert »

Waouh ! Franchement bluffant !
Félicitations pour cette magnifique application.
J'ai essayé de jeter un oeil sur ton code dans l'espoir de le rendre utilisable aussi sous OpenOffice (ce qui ne doit pas être sorcier en principe), mais je me suis perdu dans le dédale des fonctions, la tête m'en tourne encore :) .
AOOo 4.1.7 sur Win10
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
joel275
InconditiOOnnel
InconditiOOnnel
Messages : 839
Inscription : 10 janv. 2009 09:05

Re: [Résolu][Python]affichage solides et patron

Message par joel275 »

Bonjour,
Hubert Lambert a écrit :Waouh ! Franchement bluffant !
merci...mais le patron du cöne n'est pas totalement satisfaisant et je rajouterai (un de ces jours) une représentation de la Terre et la possibilité pour l'utilisateur de donner les coordonnées des sommets de son propre solide convexe.
Hubert Lambert a écrit :je me suis perdu dans le dédale des fonctions
moi qui croyait avoir sérieusement commenté et ordonné le code... :D
Hubert Lambert a écrit :le rendre utilisable aussi sous OpenOffice
est-ce bien utile vu les 3 téléchargements réalisés à ce jour?

A plus
A jour de LibreOffice et de Ubuntu
Répondre