banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

#1 Wed 18 November 2009 11:20

Pierre
DesCartesPourUnMondeMeilleur
Date d'inscription: 22 Sep 2005
Messages: 1643

remplacer le Z d'un point et d'un seul sur un linéaire

Aloha

Est-il possible, si je possède l'index d'un point de linéaire de remplacer son z et le sien seulement ?

Dans mon exemple, j'ai une série de linéaires 3D pour lesquels j'ai parfois des z, sur certains points, incorrects. Je cherche à corriger ces points et seulement ceux-là. Dans ce post j'ai déterminé la méthode de détermination de ces points.

D'avance, merci,


art X I. Déclaration des Droits de l’Homme et du Citoyen 1789
La libre communication des pensées et des opinions est un des droits les plus précieux de l’Homme : tout Citoyen peut donc parler, écrire, imprimer librement, sauf à répondre de l’abus de cette liberté, dans les cas déterminés par la Loi.

Hors ligne

 

#2 Wed 18 November 2009 13:43

Pookie
Participant occasionnel
Date d'inscription: 15 May 2006
Messages: 25

Re: remplacer le Z d'un point et d'un seul sur un linéaire

Bonjour,

Pour la partie "point" un coordinatefetcher avec l'indice de votre point + 3Dforcer pour lui attribuer la valeur de z que vous souhaitez.

Pour le réintégrer dans votre ligne, je ne vois que la solution : extraire tous les points puis faire un linejoiner sur les points constituant la ligne initiale.

Bon courage,

Pookie

Hors ligne

 

#3 Wed 18 November 2009 14:27

Pierre
DesCartesPourUnMondeMeilleur
Date d'inscription: 22 Sep 2005
Messages: 1643

Re: remplacer le Z d'un point et d'un seul sur un linéaire

@Pookie Cela suppose que je connais le z, or ce n'est pas le cas.

Je pensais plutôt à quelque chose du genre :

Code:

proc ListeZ {} {

set retvalZ [list]
set num_coords [FME_Coordinates numCoords]
set listIndex 0
puts [FME_GetAttribute GID]
# Get Original Coordinates
while { $listIndex < $num_coords } {
    #initialisation de la variable de récupération d'un z
    set zverif 0
    #initialisation de i, ordre de la liste
    set z($listIndex) [FME_Coordinates getCoord z $listIndex]
    #test des valeurs de z

    #cas 1, pas de valeur idoine #cas 2, z est correct, on le met en mémoire
    if {(50 >= $z($listIndex) || 180<= $z($listIndex) )} then {
        puts $z($listIndex)
        lappend retvalZ $listIndex
        #étude de cas, existe-t'il une valeur de récupération
        #non : deuxième boucle sur les z suivants
        if {0 == $zverif } then {
                set i [expr {$listIndex + 1} ]

                puts $i 
                    while { $i < $num_coords } {
                        set z($i) [FME_Coordinates getCoord z $i]
                        if {(50 >= $z($i) || 180<= $z($i) )} then {
                             incr i 
                             } else {
                             FME_Coordinates setCoord z($listIndex) $z($i) 
                             }
                    }
                } else {
              FME_Coordinates setCoord z($listIndex) $zverif 
                }
        } else {
        set zverif  $z($listIndex) 
        } 
    #poursuite de la liste
    incr listIndex
}
#fin de la boucle
if { [llength $retvalZ] == $num_coords } then {FME_SetAttribute 2D "oui"} 
FME_SetAttribute liste_z $retvalZ
}

Cependant, setCoord n'a pas l'air de fonctionner en TCL, une idée ?

Dernière modification par Pierre (Thu 19 November 2009 09:06)


art X I. Déclaration des Droits de l’Homme et du Citoyen 1789
La libre communication des pensées et des opinions est un des droits les plus précieux de l’Homme : tout Citoyen peut donc parler, écrire, imprimer librement, sauf à répondre de l’abus de cette liberté, dans les cas déterminés par la Loi.

Hors ligne

 

#4 Thu 19 November 2009 09:20

Pookie
Participant occasionnel
Date d'inscription: 15 May 2006
Messages: 25

Re: remplacer le Z d'un point et d'un seul sur un linéaire

Je ne connais pas le TCL mais j'ai l'impression que vous ne garder pas en mémoire le point ou le z est incorrect et que vous affectez la valeur de z correct au point qui possède ce z correct et non pas au point "dégénéré".

En affectant à une variable j le numéro du point incorrect et en faisant quelque chose du style
set j(z)=i(z) ca ne serait pas mieux ?

Une petite piste en esperant que des connaisseurs vous aideront un peu mieux...

Edit :
je n'avais pas vu votre maj, donc comme prévu je vais laisser faire les spécialistes TCL wink

Pookie

Dernière modification par Pookie (Thu 19 November 2009 09:22)

Hors ligne

 

#5 Fri 18 December 2009 11:21

Pierre
DesCartesPourUnMondeMeilleur
Date d'inscription: 22 Sep 2005
Messages: 1643

Re: remplacer le Z d'un point et d'un seul sur un linéaire

Aloha
Alors j'ai opté pour une autre méthode : récupérer l'index du z fautif, puis faire un vertexsnipper, et repasser en boucle.
Donc voilà le début de mon code :

Code:

proc ListeZ {} {
 
set retvalZ [list]
set num_coords [FME_Coordinates numCoords]
set listIndex 0
set verif 0
set compo [FME_GetAttribute fme_feature_type]
puts "---------------debut------------------------"
 
# Get Original Coordinates
 

while {($listIndex < $num_coords) && ($verif == 0)} {
 #initialisation de la variable de récupération d'un z
 set z($listIndex) [FME_Coordinates getCoord z $listIndex]
 set borne_inf [expr {50 >= $z($listIndex) ? {inférieure à 50} : {supérieure à 50}}]
 set borne_sup [expr {180 <= $z($listIndex) ? {inférieure à 180} : {supérieure à 180}}]
 #test des valeurs de z
  if {(50 >= $z($listIndex)) && (180 <= $z($listIndex))} then {incr listIndex
  } else { 
   puts "composant : $compo"
   puts "GID de l'objet testé négatif : [FME_GetAttribute GID]" ;
   puts "z du point problématique : $z($listIndex)" ;
   puts "borne inf franchie : $borne_inf"
   puts "borne sup franchie : $borne_sup"
   set retvalZ $listIndex;
   set verif 1 ;
   puts $verif ;
   break }
 }
puts "index de fin de segment : $retvalZ"
puts "------------------fin----------------------------"
}

Mais j'obtiens le résultat suivant :

Code:

---------------debut------------------------
composant : A_REIMS.C_VCRETA
GID de l'objet testé négatif : 3473
z du point problématique : 87.56
borne inf franchie : supérieure à 50
borne sup franchie : inférieure à 180
1
index de fin de segment : 0
------------------fin----------------------------

Comment un z à 0 peut-il être testé comme étant supérieur à 180 ??? [edit]Cette erreur est corrigée

Pourquoi me sort-il ce point alors que le z est dans la fourchette tolérée ?

Quelqu'un voit-il ma faute de frappe, mon erreur syntaxique, ... ?
D'avance, merci

Dernière modification par Pierre (Fri 18 December 2009 11:27)


art X I. Déclaration des Droits de l’Homme et du Citoyen 1789
La libre communication des pensées et des opinions est un des droits les plus précieux de l’Homme : tout Citoyen peut donc parler, écrire, imprimer librement, sauf à répondre de l’abus de cette liberté, dans les cas déterminés par la Loi.

Hors ligne

 

#6 Fri 18 December 2009 12:42

Pierre Dolez
Participant assidu
Lieu: Proville
Date d'inscription: 14 Aug 2008
Messages: 518
Site web

Re: remplacer le Z d'un point et d'un seul sur un linéaire

Bonjour,

Je ne connais pas ce langage-ci, mais le logique doit être la même.

La boucle while tourne tant que $listeIndex est inférieur à numcoord
or listeIndex n'est pas initialisé (peut-être à 0 par défaut ?)

Je ne comprend pas très bien cette ligne
set z($listIndex) [FME_Coordinates getCoord z $listIndex]
Celà sous-entendrait que z est un tableau ?? Par contre, s'il y avait
set z [FME_Coordinates getCoord z $listIndex] , là le comprendrais "z est la valeur de rang $listeIndex"

Ou alors il faudrait initialiser z(...) avant le début de la boucle, mais là je ne connais pas la syntaxe des tableaux (listes)

if {(50 >= $z($listIndex)) && (180 <= $z($listIndex))} then {incr listIndex } etc..
Qand je compare une variable à une valeur j'ecris d'abord la varieble, puis la valeur. C'est la même chose. Donc, j'écrirais cette ligne comme ceci
if {($z > 50 ) && ($z <180 )} then {incr $listIndex}  etc
Pour moi lisIndex est un compteur, donc devrait avoir un $, mais encore une fois histoire se syntaxe.

Cordialement.

Dernière modification par Pierre Dolez (Fri 18 December 2009 12:44)

Hors ligne

 

#7 Fri 18 December 2009 13:37

Pierre
DesCartesPourUnMondeMeilleur
Date d'inscription: 22 Sep 2005
Messages: 1643

Re: remplacer le Z d'un point et d'un seul sur un linéaire

Bonjour Pierre,
Effectivement

Code:

proc ListeZ {} {

set retvalZ [list]
set num_coords [FME_Coordinates numCoords]
set listIndex 0
set verif 0
set compo [FME_GetAttribute fme_feature_type]
puts "---------------debut------------------------"

# Get Original Coordinates


while {($listIndex < $num_coords) && ($verif == 0)} {
    #initialisation de la variable de récupération d'un z
    set z [FME_Coordinates getCoord z $listIndex]
    set borne_inf [expr {50 >= $z ? {inférieure à 50} : {supérieure à 50}}]
    set borne_sup [expr {180 <= $z ? {supérieure à 180} : {inférieure à 180}}]
    #test des valeurs de z
        if {(50 >= $z) && (180 <= $z)} then {incr listIndex
        } else { 
            puts "composant : $compo"
            puts "GID de l'objet testé négatif : [FME_GetAttribute GID]" ;
            puts "z du point problématique : $z" ;
            puts "borne inf franchie : $borne_inf"
            puts "borne sup franchie : $borne_sup"
            set retvalZ $listIndex;
            set verif 1 ;
            puts $verif ;
            break }
    }
puts "index de fin de segment : $retvalZ"
puts "------------------fin----------------------------"
}

est un peu plus propre, mais j'ai toujours ce résultat

Code:

---------------debut------------------------
composant : A_REIMS.C_VCRETA
GID de l'objet testé négatif : 3515
z du point problématique : 103.825
borne inf franchie : supérieure à 50
borne sup franchie : inférieure à 180
1
index de fin de segment : 0
------------------fin----------------------------

J'initialise pourtant mon z à chaque listindex.
Par contre je ne suis pas sûr pour l'incrément.


art X I. Déclaration des Droits de l’Homme et du Citoyen 1789
La libre communication des pensées et des opinions est un des droits les plus précieux de l’Homme : tout Citoyen peut donc parler, écrire, imprimer librement, sauf à répondre de l’abus de cette liberté, dans les cas déterminés par la Loi.

Hors ligne

 

#8 Fri 18 December 2009 13:54

Sylvie
Membre
Date d'inscription: 5 Sep 2005
Messages: 3066

Re: remplacer le Z d'un point et d'un seul sur un linéaire

Ton résultat te sort toujours le dernier z de la liste, qu'il soit OK ou pas, non ?

amha l'incrément ne devrait pas être dans le 'then' du test 'if'

Hors ligne

 

#9 Fri 18 December 2009 13:56

Pierre Dolez
Participant assidu
Lieu: Proville
Date d'inscription: 14 Aug 2008
Messages: 518
Site web

Re: remplacer le Z d'un point et d'un seul sur un linéaire

re,

        if {(50 >= $z) && (180 <= $z)} then {incr listIndex
z ne peut pas être <= à 50 ET >= 180.
Donc, l'incrémentation ne se fait jamais et le message apparait toujours.
Comme il y a un break (heureusement) on ne passe qu'une fois (sinon on boucle big_smile).

Moi, je ferais sela:
set listIndex 0
set PointFaux 0
while ( ...)
{
  set z [...]
  if (z < 50 || z > 180)
  {
      point faux
      incr PointFaux
  }
  incr listIndex
}
putx "Il y a$PointFaux"

Hors ligne

 

#10 Fri 18 December 2009 14:12

Pierre Dolez
Participant assidu
Lieu: Proville
Date d'inscription: 14 Aug 2008
Messages: 518
Site web

Re: remplacer le Z d'un point et d'un seul sur un linéaire

Bonjour Sylvie,

Non, pas le dernier, mais le premier, puisque l'incrémentation ne se fait jamais (condition jamais réalisée) et que l'exécution de l'impression de se fait qu'une fois, présence de $verif et break.

Hors ligne

 

#11 Fri 18 December 2009 17:23

Pierre
DesCartesPourUnMondeMeilleur
Date d'inscription: 22 Sep 2005
Messages: 1643

Re: remplacer le Z d'un point et d'un seul sur un linéaire

Code:

proc ListeZ {} {

set retvalZ [list]
set num_coords [FME_Coordinates numCoords]
set listIndex 0
set verif 0
set compo [FME_GetAttribute fme_feature_type]
puts "---------------debut------------------------"

# Get Original Coordinates


while {($listIndex < $num_coords) && ($verif == 0)} {
    #initialisation de la variable de récupération d'un z
    set pointfaux 0
    set z [FME_Coordinates getCoord z $listIndex]
    set borne_inf [expr {50 >= $z ? {inférieure à 50} : {supérieure à 50}}]
    set borne_sup [expr {180 <= $z ? {supérieure à 180} : {inférieure à 180}}]
    #test des valeurs de z
        if {$z <= 50 || $z >= 180} then {
            puts "composant : $compo"
            puts "GID de l'objet testé négatif : [FME_GetAttribute GID]" ;
            puts "z du point problématique : $z" ;
            puts "borne inf franchie : $borne_inf"
            puts "borne sup franchie : $borne_sup"
            set retvalZ $listIndex;
            set verif 1 ;
            puts $verif ;
            incr pointfaux
            break } else { incr $listIndex}
    }
puts "index de fin de segment : $retvalZ"
puts "------------------fin----------------------------"
}

Bon je ne sais pas ce que j'ai loupé sur les intervalles, mais maintenant ça fonctionne. Je n'ai plus de point avec un z correct qui sort en debug.
Merci à tous. Jusqu'au prochain épisode...


art X I. Déclaration des Droits de l’Homme et du Citoyen 1789
La libre communication des pensées et des opinions est un des droits les plus précieux de l’Homme : tout Citoyen peut donc parler, écrire, imprimer librement, sauf à répondre de l’abus de cette liberté, dans les cas déterminés par la Loi.

Hors ligne

 

#12 Fri 18 December 2009 18:11

Pierre Dolez
Participant assidu
Lieu: Proville
Date d'inscription: 14 Aug 2008
Messages: 518
Site web

Re: remplacer le Z d'un point et d'un seul sur un linéaire

Après relecture, je n'avais pas vu le début du code, donc ce qui concerne les initialisations est bon, donc ne pas tenir compte des annotations à ce sujet. (Sauf $pointfaux qui doit être initialisé avant)


J'ai modifié le code

set listIndex 0  # doivent être faits avant la boucle
set pointfaux 0
while {$listIndex < $num_coords} {
    #initialisation de la variable de récupération d'un z
    set z [FME_Coordinates getCoord z $listIndex]
    set borne_inf [expr {50 >= $z ? {inférieure à 50} : {supérieure à 50}}]
    set borne_sup [expr {180 <= $z ? {supérieure à 180} : {inférieure à 180}}]
    #test des valeurs de z
        if {$z <= 50 || $z >= 180} then {
            puts "composant : $compo"      # c'est quoi $compo  ?
            puts "GID de l'objet testé négatif : [FME_GetAttribute GID]" ;
            puts "z du point problématique : $z" ;
            puts "borne inf franchie : $borne_inf"
            puts "borne sup franchie : $borne_sup"
#            set retvalZ $listIndex;  ne sert à rien
#            set verif 1 ;  inutile
#            puts $verif ;
            incr pointfaux
#            break  sinon on s'arrête au premier point faux trouvé
        }    #    il ne faut pas faire de else cad si le point est bon, on ne fait rien       else {
        incr $listIndex    #  L'incrémentation doit être faite dans tous les cas  }
    }
#puts "index de fin de segment : $retvalZ" 
puts "Nombre de points faux  : $pointfaux" 
puts "------------------fin----------------------------"
}

Les principe de base est que les initialisation de compteur doivent être faites avant d'entrer dans la boucle.
De même, l'incrémentation du compteur de points examinés listIndex doit être faite dans tous les cas, donc hors d'une condition if-then-else.

Question syntaxe
1- la condition d'exécution du while ne doit-elle pas être entre parenthèse au lieu d'entre accolades? idem pour ca condition du if
2- ne devrait-il pas y avoir un point-virgule au bout de chaque lignes? Si l'interpréteur les met par défaut, il est vivement conseillé de les mettre effectivement.
3- le dollard qui précède une variable manque à mon avis, à certains endroits.

Un conseil,  si num_coords esr trop grand, remplaçez le par 50 par exemple, et imprimez toutes les valeurs z, qu'elles soient bonnes ou fausses, par exemple
    else {
      puts("z correct  $z  ($listIindex)"); }
Naturellement ces impressions seront supprimées au final.

Hors ligne

 

#13 Fri 18 December 2009 18:48

Pierre
DesCartesPourUnMondeMeilleur
Date d'inscription: 22 Sep 2005
Messages: 1643

Re: remplacer le Z d'un point et d'un seul sur un linéaire

Non Pierre. Pour la commande While, la syntaxe est bonne : cf. http://www.tcl.tk/man/tcl8.4/TclCmd/while.htm
Encore merci pour ce brainstorming pré week endien.


art X I. Déclaration des Droits de l’Homme et du Citoyen 1789
La libre communication des pensées et des opinions est un des droits les plus précieux de l’Homme : tout Citoyen peut donc parler, écrire, imprimer librement, sauf à répondre de l’abus de cette liberté, dans les cas déterminés par la Loi.

Hors ligne

 

#14 Fri 18 December 2009 19:03

Pierre Dolez
Participant assidu
Lieu: Proville
Date d'inscription: 14 Aug 2008
Messages: 518
Site web

Re: remplacer le Z d'un point et d'un seul sur un linéaire

Oui effectivement.
J'ai regardé, pour une boucle for, la syntaxe est du même type
for {init} {test} {incrément}
{
  exécution
}

Alors qu'en C, PHP, la syntaxe est
for (init, text, incrément)
{
  exécution;
}

C'est à dire que les virgules et point-virgules sont très utilisés.
Un bloc est encadré par ds accolades.

Il faudra que je m'y mette (peut-être)

Bon week-end

Hors ligne

 

Pied de page des forums

Powered by FluxBB