[Résolu][Python]Apso et dialogue

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
joel275
InconditiOOnnel
InconditiOOnnel
Messages : 839
Inscription : 10 janv. 2009 09:05

[Résolu][Python]Apso et dialogue

Message 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.
Pièces jointes
Solides - test.odt
(16.56 Kio) Téléchargé 155 fois
Dernière modification par joel275 le 24 avr. 2018 16:03, modifié 1 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]Apso et dialogue

Message 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.
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
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 09:26

Re: [Python]Apso et dialogue

Message 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.
Pièces jointes
apso_v1.1.3.oxt
(33.11 Kio) Téléchargé 130 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]Apso et dialogue

Message 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.
A jour de LibreOffice et de Ubuntu
Avatar de l’utilisateur
Jurassic Pork
PassiOOnné
PassiOOnné
Messages : 623
Inscription : 10 août 2017 00:15

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

Message 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
Pièces jointes
Solides - test.odt
(18.6 Kio) Téléchargé 130 fois
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
joel275
InconditiOOnnel
InconditiOOnnel
Messages : 839
Inscription : 10 janv. 2009 09:05

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

Message par joel275 »

Bonjour,

merci pour ta contribution. Je poursuis dans la section Projets: https://forum.openoffice.org/fr/forum/v ... 23#p311723

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: [Python]Apso et dialogue

Message 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

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()
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)
Répondre