[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 !

[Résolu][Python]Apso et dialogue

Messagepar joel275 » 03 Avr 2018 08:35

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é 20 fois
Dernière édition par joel275 le 24 Avr 2018 15:03, édité 1 fois.
OpenOffice 4.1.2 LibreOffice 5-4-6 Windows 8.1
joel275
PassiOOnné
PassiOOnné
 
Message(s) : 686
Inscrit le : 10 Jan 2009 09:05

Re: [Python]Apso et dialogue

Messagepar Hubert Lambert » 23 Avr 2018 21:00

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.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) : 865
Inscrit le : 06 Avr 2016 08:26

Re: [Python]Apso et dialogue

Messagepar Hubert Lambert » 24 Avr 2018 13:27

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é 14 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) : 865
Inscrit le : 06 Avr 2016 08:26

Re: [Python]Apso et dialogue

Messagepar joel275 » 24 Avr 2018 14:43

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

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

Messagepar Jurassic Pork » 25 Avr 2018 06:31

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

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

Messagepar joel275 » 25 Avr 2018 07:36

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

Re: [Python]Apso et dialogue

Messagepar Hubert Lambert » 25 Avr 2018 12:55

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()
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) : 865
Inscrit le : 06 Avr 2016 08:26


Retour vers Macros et API

Qui est en ligne ?

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