[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

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

Messagepar joel275 » 25 Avr 2018 07:29

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. 
Pièces jointes
Solides V2.odt
(27.42 Kio) Téléchargé 7 fois
Dernière édition par joel275 le 15 Mai 2018 13:33, édité 3 fois.
OpenOffice 4.1.2 LibreOffice 5-4-6 Windows 8.1
joel275
PassiOOnné
PassiOOnné
 
Message(s) : 679
Inscrit le : 10 Jan 2009 09:05

Re: [Python]affichage solides et patron

Messagepar Hubert Lambert » 25 Avr 2018 13:50

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.
AOOo 4.1.2 sur Win7
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
Hubert Lambert
InconditiOOnnel
InconditiOOnnel
 
Message(s) : 835
Inscrit le : 06 Avr 2016 08:26

Re: [Python]affichage solides et patron

Messagepar Jurassic Pork » 27 Avr 2018 06:33

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
LibreOffice 5.x sous windows et linux
Avatar de l’utilisateur
Jurassic Pork
Membre hOOnoraire
Membre hOOnoraire
 
Message(s) : 122
Inscrit le : 09 Août 2017 23:15

Re: [Python]affichage solides et patron

Messagepar Hubert Lambert » 27 Avr 2018 07:43

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.
Pièces jointes
Solides.odt
Version "no Wait" :)
(26.58 Kio) Téléchargé 13 fois
AOOo 4.1.2 sur Win7
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
Hubert Lambert
InconditiOOnnel
InconditiOOnnel
 
Message(s) : 835
Inscrit le : 06 Avr 2016 08:26

Re: [Python]affichage solides et patron

Messagepar joel275 » 15 Mai 2018 13:33

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.
OpenOffice 4.1.2 LibreOffice 5-4-6 Windows 8.1
joel275
PassiOOnné
PassiOOnné
 
Message(s) : 679
Inscrit le : 10 Jan 2009 09:05

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

Messagepar Hubert Lambert » 15 Mai 2018 20:56

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.2 sur Win7
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
Hubert Lambert
InconditiOOnnel
InconditiOOnnel
 
Message(s) : 835
Inscrit le : 06 Avr 2016 08:26

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

Messagepar joel275 » 19 Mai 2018 06:58

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
OpenOffice 4.1.2 LibreOffice 5-4-6 Windows 8.1
joel275
PassiOOnné
PassiOOnné
 
Message(s) : 679
Inscrit le : 10 Jan 2009 09:05


Retour vers Projets

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 1 invité