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 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 smile

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 sad  Ca arrive...mais je corrige smile
Il manque juste un Fetch (comme d'hab) smile 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' sad

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...  cool
(fou comme ça peut mobiliser un cerveau la programmation...)

Hors ligne

 

Pied de page des forums

Powered by FluxBB