Page 1 sur 1

[Résolu][Python]Apso et dialogue

MessagePublié: 03 Avr 2018 08:35
par joel275
Bonjour,

je profite de ce sujet pour remercier tous ceux qui ont participé à cette extension :bravo:

Toutefois, je joins un fichier test qui montre un dysfonctionnement de son lanceur. Tout (enfin j'espère) est expliqué dans le doc.

A plus.

Re: [Python]Apso et dialogue

MessagePublié: 23 Avr 2018 21:00
par Hubert Lambert
Bonjour Joël,

Désolé de répondre si tardivement, je suis passé totalement à côté de ton message.
J'ai jeté un rapide coup d'oeil, sans bien comprendre ce qui se passe. Apparemment, ce serait lié à l'utilisation d'une variable globale.
J'essaierai de regarder cela plus attentivement demain soir.
Cordialement.

Re: [Python]Apso et dialogue

MessagePublié: 24 Avr 2018 13:27
par Hubert Lambert
Merci d'avoir signalé ce problème, dont je n'ai pas sans mal identifié la cause : APSO utilise une instance d'un objet "PythonScriptProvider" différente de celle du programme.
Cela n'affecte pas l'exécution des macros... sauf dans le cas d'utilisation de variables "globales" (usage rarissime en python). Lorsqu'une macro est exécutée par APSO, ces variables sont initiées par "son" PythonScriptProvider, et restent donc inconnues de celui du programme. Or, à la modification de la sélection d'une opacité dans le second dialogue, c'est le programme (et non plus APSO) qui exécute la commande, provoquant une erreur puisque aucune variable globale nommée "solide" n'existe.

J'ai créé une version d'APSO provisoire, qui utilise cette fois l'objet "PythonScriptProvider" instancié par le programme. Je dois encore la tester plus sérieusement, mais je la propose néanmoins ci-dessous pour une première épreuve "live" :wink: .
Cordialement.

Re: [Python]Apso et dialogue

MessagePublié: 24 Avr 2018 14:43
par joel275
Bonjour Hubert,

merci pour ce retour, il n'y avait pas d'urgence vu que je peux toujours lancer le script à partir d'un bouton ou de LOo/AOo. Cependant, je vais utiliser cette dernière version.
J'ai bien compris que Python ne "favorisait" pas l'usage de variables globales (risque évident de les modifier par inadvertance en cours de programme), mais je ne vois pas comment s'en passer dans une routine appelée non pas par le programme principal mais par un évènement :?:

A plus.

Re: [Résolu][Python]Apso et dialogue

MessagePublié: 25 Avr 2018 06:31
par Jurassic Pork
hello joel,
je ne sais pas si ton projet est expérimental ou si tu comptes aller plus loin, j'ai ajouté quelques améliorations (en pièce jointe) à ce que tu nous proposais dans ton document writer :
1 - Effacement de la figure tracée avant d'en tracer une nouvelle.
2 - Centrage de la figure.
3 - Positionnement des boîtes de dialogues.
Voici ce que cela donne avec LibreOffice 5.4 sous Windows 10 (cliquer sur l'image pour voir l'animation) :
Figures.gif


Ami calmant, JP

Re: [Résolu][Python]Apso et dialogue

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

merci pour ta contribution. Je poursuis dans la section Projets: https://forum.openoffice.org/fr/forum/viewtopic.php?f=26&t=57722&p=311723#p311723

A plus.

Re: [Python]Apso et dialogue

MessagePublié: 25 Avr 2018 12:55
par Hubert Lambert
joel275 a écrit:je ne vois pas comment s'en passer dans une routine appelée non pas par le programme principal mais par un évènement :?:

Il "suffit" de gérer les événements soi-même, ainsi tu peux passer ce que tu veux (l'objet solide en l'occurrence) à la construction du listener ;) .
Pour l'objet gdoc c'est plus facile, puisqu'il est chaque fois possible de la passer en argument.
Exemple (supprimer d'abord l'événement défini pour le contrôle LbOpacite) :
Code : Tout sélectionner   AgrandirRéduire
import unohelper
from  com.sun.star.awt import XItemListener
class ItemListener(unohelper.Base, XItemListener):
    def __init__(self, solide):
        self.solide = solide
    def disposing(self, source):
        pass
    def itemStateChanged(self, event):
        self.solide.opacite  = [100, 20, 0][event.Selected]
        for x in self.solide.faces:
            x[1].FillTransparence = self.solide.opacite

def MisePlaceSolide(*oEvt):
    """entrée du programme"""
    gdoc = XSCRIPTCONTEXT.getDocument()

    maBoite =  loadDialog("Standard","ChoixSolide", "document", gdoc)
    if maBoite.execute() == CANCEL:
        return
    NoSolide = maBoite.getControl('LbSolide').SelectedItemPos
    A = [ [1,1,1], [-1,-1,1], [1,-1,-1], [-1,1,-1] ]    # pour cube, tétraèdre, octaèdre, icosaèdre et dodécaèdre
    B = A +  [ [1,-1,1], [-1,1,1], [1,1,-1], [-1,-1,-1] ]
    a,   b =   1.618033989,     (1, 0.618033988)[NoSolide == 4]
    T = [ [0,a,b], [0,a,-b], [0,-a,b], [0,-a,-b], [b,0,a], [b,0,-a], [-b,0,a], [-b,0,-a], [a,b,0], [a,-b,0], [-a,b,0], [-a,-b,0] ]
    dico = {0: ('cube', B), 1: ('tétraèdre', A), 2: ('octaèdre', A), 3: ('icosaèdre', T), 4: ('dodécaèdre', T + B)}
    faces = trouveFaces(dico[NoSolide] [1] )   
    solide = Solide(dico[NoSolide], faces)
    solide.affiche(gdoc)
    maBoite.dispose()

    maBoite = loadDialog("Standard","TourneSolide", "document", gdoc)
    liste = maBoite.getControl("LbOpacite")
    itemlistener = ItemListener(solide)
    liste.addItemListener(itemlistener)
    maBoite.execute()
    maBoite.dispose()