#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
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: 519
- 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: 519
- 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 ).
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: 519
- 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: 519
- 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: 519
- 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