Page 1 sur 1

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

MessagePublié: 25 Avr 2018 07:29
par joel275
Bonjour,

suite au commentaire de Jurassik Pork ici: https://forum.openoffice.org/fr/forum/viewtopic.php?f=8&t=57515#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. 

Re: [Python]affichage solides et patron

MessagePublié: 25 Avr 2018 13:50
par Hubert Lambert
Bonjour,

Ceci devrait régler le problème :
Code : Tout sélectionner   AgrandirRéduire
   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   AgrandirRéduire
   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   AgrandirRéduire
      return (tuple(coor),)

Et bravo pour ce magnifique exercice de style :wink: .

Cordialement.

Re: [Python]affichage solides et patron

MessagePublié: 27 Avr 2018 06:33
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   AgrandirRéduire
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

Re: [Python]affichage solides et patron

MessagePublié: 27 Avr 2018 07:43
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   AgrandirRéduire
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   AgrandirRéduire
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(* event.X/source.Size.Width) + 1
    i 
= [-1, 1] [event.< 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.

Re: [Python]affichage solides et patron

MessagePublié: 15 Mai 2018 13:33
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.

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

MessagePublié: 15 Mai 2018 20:56
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 :) .

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

MessagePublié: 19 Mai 2018 06:58
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