#1 Tue 18 March 2008 13:43
- Miss T.
- Participant assidu
- Lieu: En pleine amazonie...
- Date d'inscription: 17 Oct 2005
- Messages: 294
Message d'erreur sur un ObjectNodeX
Bonjour à tous,
Je cherche à convertir un polygone en points en utilisant ses noeuds. J'utilise le code suivant:
Code:
SELECT ObjectInfo(obj, 20) FROM Table1 WHERE ROWID = 2 INTO Nbr_Pts nbr_point = Nbr_Pts.col1 Print "le cercle a " & nbr_point & " noeuds." For j = 1 to nbr_point Print "On créé le point " & j X = ObjectNodeX(Nbr_Pts.obj, 1, j) Y = ObjectNodeY(Nbr_Pts.obj, 1, j) Print "p" & j & " X: " & X & " Y: " & Y cmd_string = "Insert Into Table1 (obj) Values (CreatePoint(" & X & " , " & Y & "))" print cmd_string run command cmd_string next
(vous pouvez voir que j'ai mis des print partout pour trouver l'erreur...)
Lorsque j = 1, le point est créé mais c'est à la deuxième itération que j'ai le message d'erreur suivant: ObjectNodeX(): le Type de l'argument 1 est non valide
Pourquoi cette boucle se déroule bien lorsque j = 1 et pas les fois suivantes? J'ai vérifié Nbr_pts: il n'y a qu'un seul objet sélectionné et ce dernier est bien un polygone.
Je bloque. Je ne comprend pas pourquoi l'"argument 1" débloque à la deuxième itération.
Vous avez une explication?
Hors ligne
#2 Tue 18 March 2008 13:51
- Miss T.
- Participant assidu
- Lieu: En pleine amazonie...
- Date d'inscription: 17 Oct 2005
- Messages: 294
Re: Message d'erreur sur un ObjectNodeX
Ah, j'oubliais.
Si je tape dans la fenêtre MapBasic print ObjectNodeX(Nbr_Pts.obj, 1, 1), j'ai le même message d'erreur.
Mais si j'affiche cette table Nbr_pts soit dans une fenêtre donnée, soit dans une fenêtre carte et que je relance ma ligne de code, je n'ai plus le message d'erreur et j'ai bien la coordonnée du noeud qui s'affiche.
Mais si, depuis le code MapBasic, je lance un Map From Nbr_pts ou un Browse * From Nbr_pts, l'objectNodeX() bloque toujours à la 2e itération...
(je n'y comprend RIEN)
Hors ligne
#3 Tue 18 March 2008 14:40
- Olivier T
- Participant actif
- Date d'inscription: 31 May 2006
- Messages: 71
Re: Message d'erreur sur un ObjectNodeX
Bonjour,
Pour moi qui ne programme pas en map basic mais beaucoup en VBA
la dernière intruction doit être
NEXT J (permettant ainsi d'incrementer une par une les variables si besoin était)
Bonne journée
Hors ligne
#4 Tue 18 March 2008 15:33
- Miss T.
- Participant assidu
- Lieu: En pleine amazonie...
- Date d'inscription: 17 Oct 2005
- Messages: 294
Re: Message d'erreur sur un ObjectNodeX
la dernière instruction doit être NEXT J
En MapBasic, il ne faut pas préciser quel variable concerne la boucle For... Next. Pour des boucles imbriquées, MapBasic interprète les variables à modifier dans l'ordre où il rencontre les next.
For i = 0 to n
For j = 1 to k
....
next (sous entendu j)
next (sous entendu i)
Hors ligne
#5 Tue 18 March 2008 17:00
- Cartosig
- Participant assidu
- Date d'inscription: 16 Oct 2006
- Messages: 222
Re: Message d'erreur sur un ObjectNodeX
Par acquis de conscience je pose quand même la question : votre table Nbr_pts a combien de lignes (ie + de 1) au moment ou vous executez le premier Select into ... ?
Dernière modification par Cartosig (Tue 18 March 2008 17:00)
Hors ligne
#6 Tue 18 March 2008 17:58
- Gérard parcoli
- Participant actif
- Date d'inscription: 9 Jan 2007
- Messages: 95
Re: Message d'erreur sur un ObjectNodeX
Bonjour...
pas d'explication,
Curieusement, ca fonctionne si la création des points se fait dans une autre table que la table d'origine...
Hors ligne
#7 Tue 18 March 2008 18:19
- Miss T.
- Participant assidu
- Lieu: En pleine amazonie...
- Date d'inscription: 17 Oct 2005
- Messages: 294
Re: Message d'erreur sur un ObjectNodeX
Par acquis de conscience je pose quand même la question : votre table Nbr_pts a combien de lignes (ie + de 1) au moment ou vous executez le premier Select into ... ?
Ma table initiale ("Table1") possède à l'origine 1 point + un cercle convertit en polygone. Ce dernier étant forcément en 2e position (rowid = 2), je ne sélectionne que celui-ci pour en extraire les noeuds.
Où voulez-vous en venir?
Curieusement, ça fonctionne si la création des points se fait dans une autre table que la table d'origine
Peut-on les créer dans une table temporaire? (afin de les ajouter à la table Table1 une fois tous les points créés)
Hors ligne
#8 Tue 18 March 2008 19:53
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: Message d'erreur sur un ObjectNodeX
Quand vous créez le premier point, il se place au dessus du polygone (logique interne de MapInfo)
Donc la fois suivante le rowid=2 concerne un point...
Mieux vaudrait utiliser un Nbr_Pts.ID...plus stable que RowId
Hors ligne
#9 Thu 20 March 2008 00:18
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: Message d'erreur sur un ObjectNodeX
Bon, j'ai dit une bêtise Ca arrive...mais je corrige
Il manque juste un Fetch (comme d'hab) et ce code fonctionne (corrections en gras et j'enlève les "print"
Le set coordsys pour être tranquille et le to nbr_point-1 pour éviter le doublon noeud départ = noeud arrivée
(et on peut même faire l'économie de cmd_string !!)
set coordsys table Table1
SELECT ObjectInfo(obj, 20) FROM Table1 WHERE ROWID = 2 INTO Nbr_Pts
nbr_point = Nbr_Pts.col1
For j = 1 to nbr_point-1
Fetch first from Nbr_Pts
X = ObjectNodeX(Nbr_Pts.obj,1, j)
Y = ObjectNodeY(Nbr_Pts.obj,1, j)
Insert Into Table1 (obj) Values (CreatePoint(X,Y))
next
ps: on ne peut pas mettre en gras dans 'code'...alors j'ai mis 'quote'
Hors ligne
#10 Thu 27 March 2008 18:37
- Miss T.
- Participant assidu
- Lieu: En pleine amazonie...
- Date d'inscription: 17 Oct 2005
- Messages: 294
Re: Message d'erreur sur un ObjectNodeX
Merci Maurice, c'était bien la bonne réponse.
Désolée d'avoir tardé à te répondre... Mais tu le sais, c'est toi le boss...
(fou comme ça peut mobiliser un cerveau la programmation...)
Hors ligne