IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Des petits points ou croix sur un graphe


Sujet :

WinDev

  1. #21
    Membre chevronné Avatar de laurent30s
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 881
    Points : 1 771
    Points
    1 771
    Par défaut
    L'utilisation d'un axe secondaire complique considérable la tache...

    Le problème vient que la fonction grInfoPoint() n'utilise pas le numéro de série passé en paramètre pour savoir si la série concerne l'axe principal ou secondaire.
    Du coup les valeurs retournées sont erronée puisqu'elles retournent des valeur par rapport à l'axe principal, à tort...

    C'est un problème qu'il faudrait faire remonter à PC-Soft pour qu'ils le corrigent dans une prochaine version

    En attendant ça va être compliqué de contourner ce problème...
    Bon dev
    Laurent

    - C’est génial.
    - Non c’est bizarre.
    - Justement quand c’est simple y’a des milliers de réponses et quand c’est bizarre y’en a aucune.

  2. #22
    Membre chevronné Avatar de laurent30s
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 881
    Points : 1 771
    Points
    1 771
    Par défaut
    J'ai pensé à 2 méthodes pour pouvoir positionner des marques sur une courbe sur un axe secondaire.

    1ère méthode :
    La plus facile ajouter une série à partir des données de la série sur l'axe secondaire que l'on converti par rapport à l'échelle de l'axe principal.
    On change la couleur de traçage de cette série en utilisant la couleur de fond du graphe ou de la fenêtre. Comme ça elle est invisible.
    Il suffit de placer les marque par rapport à cette série et tout naturellement elles se poseront sur la série sur l'axe secondaire... rusé...

    Exemple de code (la procédure Point_sur_serie() ne change pas)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    nNb_valeur est un entier = 5
     
    // Définit les axes Y principal et secondaire
    nAxeYMin est un entier = 0
    nAxeYMax est un entier = 25
    nAxeYMinSec est un entier = 0
    nAxeYMaxSec est un entier = 250
     
    // Calcule le coef de conversion d'échelle
    xCoef est un numérique = (nAxeYMax - nAxeYMin) / (nAxeYMaxSec - nAxeYMinSec)
     
    // Modifie la graduation des axes Y principal et secondaire 
    grOrigine(GRF_SansNom1,nAxeYMin,nAxeYMax,grOrdonnée)
    grOrigine(GRF_SansNom1,nAxeYMinSec,nAxeYMaxSec,grOrdonnéeSecondaire)
    grDessine(GRF_SansNom1)
     
    // Ajoute une série cachée (même couleur de fond) pour convertir les donnée de la courbe sur l'axe secondaire
    POUR i = 1 _A_ 5
    	grAjouteDonnée(GRF_SansNom1,3,i,GRF_SansNom1[2,i] * xCoef)
    FIN
    grCouleurSérie(GRF_SansNom1,3,FEN_SansNom1..CouleurFond)
     
    // pour l'affichage dans un champ graphe
    Point_sur_serie("GRF_SansNom1","GRF_SansNom1",1,nNb_valeur,"Cercle",5,BleuClair,BleuClair,"")
    Point_sur_serie("GRF_SansNom1","GRF_SansNom1",3,nNb_valeur,"Cercle",5,RougeClair,RougeClair,"")
    2ème méthode :
    Beaucoup plus compliquée, on va calculer l'équation de conversion en pixel entre les 2 échelles.
    Cette équation est de la forme : a + b.x
    ou a = marge haute en pixel (les coordonnées sur les graphes partent du coin haut gauche, il s'agit de la distance en pixel entre le haut du champ graphe et le haut de l'échelle, zone du titre)
    et b = le coefficient de conversion entre les échelles

    J'ai préféré faire une 2ème procédure spécifique pour les série sur axe secondaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    PROCEDURE Point_sur_serie_axe_secondaire(sNom_Graphe,sNom_Champ_Destination,nNo_Serie,nNb_valeur,sType_Point,nPoint_Taille,nPoint_Couleur_fond,nPoint_Couleur_Trait,sNom_Image,nAxeYMinSec,nAxeYMaxSec,nNo_Serie_principale)
    i est un entier
    nPoint_x, nPoint_y sont des entiers
    nAxeYMin est un entier = {sNom_Champ_Destination}..AxeYMin
    nAxeYMax est un entier = {sNom_Champ_Destination}..AxeYMax
     
    // détermine les valeur mini et maxi de la série sur l'axe Y principal
    nSP_Mini est un entier = 1
    xSPV_Mini est un numérique = {sNom_Champ_Destination}[nNo_Serie_principale,1]
    nSP_Maxi est un entier = 1
    xSPV_Maxi est un numérique = {sNom_Champ_Destination}[nNo_Serie_principale,1]
    POUR i = 2 _A_ nNb_valeur
    	SI {sNom_Champ_Destination}[nNo_Serie_principale,i] < xSPV_Mini ALORS
    		nSP_Mini  = i
    		xSPV_Mini = {sNom_Champ_Destination}[nNo_Serie_principale,i]
    	FIN
    	SI {sNom_Champ_Destination}[nNo_Serie_principale,i] < xSPV_Mini ALORS
    		nSP_Maxi  = i
    		xSPV_Maxi = {sNom_Champ_Destination}[nNo_Serie_principale,i]
    	FIN	
    FIN
    // coordonnée Y des points mini et maxi de la série principale 
    nPoint_SP_x_Mini est un entier = grInfoPoint(""+sNom_Graphe+"",grYCoordinate,nNo_Serie_principale,nSP_Mini)
    nPoint_SP_x_Maxi est un entier = grInfoPoint(""+sNom_Graphe+"",grYCoordinate,nNo_Serie_principale,nSP_Maxi)
     
    // calcul de la marge haute et du coef de conversion
    xCoef est un numérique = (nPoint_SP_x_Maxi - nPoint_SP_x_Mini) / (xSPV_Maxi - xSPV_Mini)
    nMarge_Haut est un entier = nPoint_SP_x_Maxi + (nAxeYMax - xSPV_Maxi) * xCoef
    xCoef = xCoef * (nAxeYMax - nAxeYMin) / (nAxeYMaxSec - nAxeYMinSec)
     
    // pour le type de point "Triangle"
    nPoint_Hauteur est un entier = Racine(Puissance(nPoint_Taille,2)-Puissance(nPoint_Taille/2,2))
     
    // pour le type de point "Image"
    nLargeur_image est un entier
    nHauteur_image est un entier
    SI sNom_Image <> "" ALORS
    	nLargeur_image = {sNom_Image}..Largeur
    	nHauteur_image = {sNom_Image}..Hauteur
    FIN
     
    dDébutDessin({sNom_Champ_Destination},dSurGraphe)
     
    POUR i = 1 _A_ nNb_valeur
    	nPoint_x = grInfoPoint(""+sNom_Graphe+"",grXCoordinate,nNo_Serie,i)
    	nPoint_y = nMarge_Haut - (nAxeYMaxSec - {sNom_Champ_Destination}[nNo_Serie,i]) * xCoef
     
    	SELON Majuscule(sType_Point)
    		CAS "CERCLE"
    			dCercle(nPoint_x-(nPoint_Taille/2),nPoint_y-(nPoint_Taille/2),nPoint_x+(nPoint_Taille/2),nPoint_y+(nPoint_Taille/2),nPoint_Couleur_fond,nPoint_Couleur_Trait)
    		CAS "TRIANGLE"
    			dPolygone(3,nPoint_x-(nPoint_Taille/2),nPoint_y+(nPoint_Hauteur/2),nPoint_x+(nPoint_Taille/2),nPoint_y+(nPoint_Hauteur/2),nPoint_x,nPoint_y-(nPoint_Hauteur/2),nPoint_Couleur_fond,nPoint_Couleur_Trait)
    		CAS "CARRE"
    			dRectangle(nPoint_x-(nPoint_Taille/2),nPoint_y-(nPoint_Taille/2),nPoint_x+(nPoint_Taille/2),nPoint_y+(nPoint_Taille/2),nPoint_Couleur_fond,nPoint_Couleur_Trait)
    		CAS "IMAGE"
    			dCopieImage({sNom_Image},{sNom_Graphe},copieImage,0,0,nLargeur_image,nHauteur_image,nPoint_x-(nLargeur_image/2),nPoint_y-(nHauteur_image/2),nLargeur_image,nHauteur_image)
    	FIN
    FIN
    SI sNom_Image <> "" ALORS
    	grDessine({sNom_Champ_Destination})
    Le code pour l'appel des procédures
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    nNb_valeur est un entier = 5
     
    // Echelles des axes Y principal et secondaire
    nAxeYMin est un entier = 0
    nAxeYMax est un entier = 25
    nAxeYMinSec est un entier = 0
    nAxeYMaxSec est un entier = 250
    grOrigine(GRF_SansNom1,nAxeYMin,nAxeYMax,grOrdonnée)
    grOrigine(GRF_SansNom1,nAxeYMinSec,nAxeYMaxSec,grOrdonnéeSecondaire)
    grDessine(GRF_SansNom1)
     
    // pour l'affichage dans un champ graphe les points sur une série axe principal
    Point_sur_serie("GRF_SansNom1","GRF_SansNom1",1,nNb_valeur,"Cercle",5,BleuClair,BleuClair,"")
    // pour l'affichage dans un champ graphe les points sur une série axe secondaire (le dernier paramètre "1" est le numéro d'une série qui est sur l'axe principal)
    Point_sur_serie_axe_secondaire("GRF_SansNom1","GRF_SansNom1",2,nNb_valeur,"Cercle",5,RougeClair,RougeClair,"",nAxeYMinSec,nAxeYMaxSec,1)
    Dans les 2 méthodes pour pouvoir calculer la conversion d'échelle il faut connaître les valeurs mini/maxi des 2 échelles.
    On peut récupérer les valeurs mini/maxi de l'axe principal avec les propriétés ..AxeYMin et ..AxeYMax
    Cela n'existe pas pour l'axe secondaire... dommage...
    Du coup pour être sûr de leurs valeurs, il vaut mieux les déterminer soit même... (ça vaut pour les échelles principales et secondaires)

    A noter que grInfoPoint() retourne les coordonnées par rapport à l'axe principal même si la série est sur l'axe secondaire d'où le problème...
    Bon dev
    Laurent

    - C’est génial.
    - Non c’est bizarre.
    - Justement quand c’est simple y’a des milliers de réponses et quand c’est bizarre y’en a aucune.

  3. #23
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    Salut Laurent30s,

    alors moi assez rapidement j'étais parti sur la deuxième solution, simplement en calculant un rapport entre les valeurs max de ma série sur ordonnée principale, et la valeur max de ma série sur ordonnée secondaire.

    et je transmettais ce rapport à la procédure Point_sur_serie qui affichait les points aux bonnes coordonnées

    Mais c'est très vite devenu ingérable quand il y a plusieurs séries sur un axe et sur l'autre. Donc j'ai abandonné l'idée de mettre des points sur mes graphes. D'autant que j'offre la possibilité de choisir le type de graphe dans une liste alors quand il s'agit d'histogramme ou de camemberts, les points n'ont plus lieu d'être.

    En revanche, ta 1ère méthode est une sacrée ruse de sioux, même si comme je l'ai dit, j'abandonne l'idée de redessiner des points par dessus les courbes, j'avoues que c'est vraiment très malin !

    Par contre je rencontre déjà des problèmes d'affichages à force de rafraîchir le graphe en jouant sur les filtres (critères de recherche, période du graphe, désactivation ou activation de telle ou telle série, changement du type de graphe), il n'est pas rare que l'image scintille, le graphe s'affiche et disparait en une fraction de seconde, ou parfois au bout de plusieurs régénérations le fond du graphe devient noir. Je précise que la génération du graphe est faite dans une procédure threadée, qui peut être interrompue et relancée à tout moment par l'utilisateur au fur et à mesure qu'il modifie ses critères. Et ça je pense qu'il n'aime pas trop les grDessine enchainés
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  4. #24
    Membre chevronné Avatar de laurent30s
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 881
    Points : 1 771
    Points
    1 771
    Par défaut
    Citation Envoyé par bvadam Voir le message
    En revanche, ta 1ère méthode est une sacrée ruse de sioux...
    Leci wowikyucan lena wacinsni na wicaka un

    C'est du sioux, ça veut dire : Quand les rayons du soleil projette l'ombre de l'arbre en direction de la pie qui chante les points se posent sur la courbe...
    Bon dev
    Laurent

    - C’est génial.
    - Non c’est bizarre.
    - Justement quand c’est simple y’a des milliers de réponses et quand c’est bizarre y’en a aucune.

Discussions similaires

  1. Petit point d'exclamation sur icone projet
    Par argoet dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 06/05/2015, 10h57
  2. [WD18] Curseur en croix sur un graphe boursier
    Par philippe30 dans le forum WinDev
    Réponses: 6
    Dernier message: 26/02/2015, 16h12
  3. supprimer des petits points
    Par totofe49 dans le forum Langage
    Réponses: 2
    Dernier message: 21/03/2011, 16h33
  4. Réponses: 3
    Dernier message: 09/04/2008, 14h24
  5. Compléter une ligne avec des petits points "à la word"
    Par polemoss dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 22/05/2007, 11h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo