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é ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Fri 01 July 2011 15:12

cladonne
Juste Inscrit !
Date d'inscription: 26 Oct 2010
Messages: 2

MapBasic 10.X : Rotation de nombreux objets

Bonjour,

Bien qu'ayant déjà manipulé la fenêtre MapBasic pour réaliser certains scripts je débute dans MapBasic et certains détails de la réalisation d'un programme fonctionnel m'échappe.

Je possède une table avec de nombreux objets (environ 200 000) qui ont besoin d'être chacun pivoté de 45° en utilisant comme point d'ancrage leur propres centroïdes. L'opération est simple pour un objet mais les limites de la fenêtre mapbasic m'oblige à réaliser une boucle.

Ma table comprend les coordonnées des centroïdes de chaque polygone dans des colonnes "Longitude" et "Latitude".

Voici le code de mon petit programme, la compilation est ok, mais lors de l'exécution la table s'ouvre, devient "modifiable" mais point de rotation! Le problème vient certainement de la fonction "rotation" mais je suis incapable de dénicher l'erreur!

include "C:\Program Files (x86)\MapInfo\MapBasic\Mapbasic.def"

declare sub main
declare function rotation as object

sub main
open table "C:\test\surf_ajout_buf.TAB" as buf
map from buf
Set map Layer buf Editable On
end sub

Function rotation as object
Dim i as Smallint
For i = 1 to tableinfo(buf,TABLE_INFO_NROWS)
fetch rec i from buf
rotation = RotateAtPoint(obj, 45, CreatePoint(Longitude,Latitude))
next
end Function

Merci d'avance

Hors ligne

 

#2 Fri 01 July 2011 16:13

Spacejo
Membre
Lieu: Nancy
Date d'inscription: 17 Aug 2008
Messages: 2511

Re: MapBasic 10.X : Rotation de nombreux objets

Bonjour et bienvenue,

Le but de la manoeuvre est de développer un .mbx ou de faire une rotation de tes objets?
Je m'explique --> la FMB (bien que bridée avec les boubles) on peut quand même résoudre ton problème grâce à un générateur de script (scriptgen en l'occurence) mais il faudra travailler au coup par coup car elle est aussi bridée au nombre de lignes (200 000 c'est beaucoup).
Faire une recherche sur le forum avec "scriptgen" ou "générateur de script" sur le forum.
Voilà le lien pour ce Log (version portable) --> Voir Post#3 --> http://www.forumsig.org/showthread.php? … =scriptgen
Maintenant pour le développement d'un .mbx as tu regardé le Reference Guide MapBasic --> http://www.pbinsight.com/support/produc … o-mapbasic
En espérant que celà t'aide
A+
Joël

Hors ligne

 

#3 Fri 01 July 2011 16:25

Richard Lohier
Participant occasionnel
Lieu: Le perray en yvelines
Date d'inscription: 13 Nov 2006
Messages: 28

Re: MapBasic 10.X : Rotation de nombreux objets

Bonjour,

Il semble que la fonction ne soit tout simplement pas appelée dans votre code ; puis quelque retouches de code et ca marche. Suggestion :

Code:

Include "C:\Program Files (x86)\MapInfo\MapBasic\Mapbasic.def"

Declare Sub Main
Declare Function Rotation(byval ObjetAPivoter£ as object, Byval Longitude# as Float, Byval Latitude# as Float) as object

Sub Main
  Open table "C:\test\surf_ajout_buf.TAB" as buf
'Set map Layer buf Editable On
  Update buff set obj = Rotation(obj, Longitude, Latitude)
  Map from buf
End Sub

Function Rotation(byval ObjetAPivoter£ as Object, Byval Longitude# as Float, Byval Latitude# as Float) as Object
' Dim i as Smallint
' For i = 1 to tableinfo(buf,TABLE_INFO_NROWS)
'fetch rec i from buf
  Rotation = RotateAtPoint(ObjetAPivoter£, 45, CreatePoint(Longitude#, Latitude#))
'next
End Function

Hors ligne

 

#4 Fri 01 July 2011 17:36

cladonne
Juste Inscrit !
Date d'inscription: 26 Oct 2010
Messages: 2

Re: MapBasic 10.X : Rotation de nombreux objets

Merci!

Pour le passage par des scripts sans boucle la limite de la fenetre mapbasic est de 800 lignes, limite pour les 200 000 objets... mais merci pour l'idée.



Sinon pour le mbx, après quelques modifications mineures cela fonctionne parfaitement.
En effet je viens de comprendre ma principale erreur, la fonction n'était pas appelé dans le "sub main"


Pour mieux comprendre j'ai quelques questions :

Pourquoi le £ après ObjetAPivoter?
et pourquoi ne pas mettre "obj" tout simplement sans définir ObjetAPivoter?
Pourquoi le # après longitude et latitude dans la fonction?
Et si "l'update" de la table renvoi à la fonction pourquoi avoir rajouté après "rotation" le (obj, Longitude, Latitude)? En théorie la longitude et la latitude sont utilisées que dans la boucle, non?

Désolé pour ces questions qui peuvent paraître bateau...

Hors ligne

 

#5 Mon 04 July 2011 10:12

Richard Lohier
Participant occasionnel
Lieu: Le perray en yvelines
Date d'inscription: 13 Nov 2006
Messages: 28

Re: MapBasic 10.X : Rotation de nombreux objets

cladonne a écrit:

Pour mieux comprendre j'ai quelques questions :
Pourquoi le £ après ObjetAPivoter?
...
Pourquoi le # après longitude et latitude dans la fonction?


Ce  n'est pas obligatoire, c'est une convention personnelle que j'utilise pour repérer les variables dans le code.

cladonne a écrit:

et pourquoi ne pas mettre "obj" tout simplement sans définir ObjetAPivoter?


Obj correspond à l'objet dans la table, il n'est pas directement manipulable. Il faut passer par une variable si on veut utiliser une fonction personnalisée pour modifier l'objet.

cladonne a écrit:

Et si "l'update" de la table renvoi à la fonction pourquoi avoir rajouté après "rotation" le (obj, Longitude, Latitude)? En théorie la longitude et la latitude sont utilisées que dans la boucle, non?


Ce sont des paramètres de la fonction personnaliséee, il est obligatoire de les adresser. La fonction personnalisée utilise les fonctions RotateAtPoint qui à besoin de deux objets et d'un angle, et CreatePoint, qui a besoin d'une latitude et d'une longitude.
=> Il n'y a plus de boucle dans le nouveau code, elle est remplacé par l'Update.
D'ailleur avec un peu de recule tout ce code pourrait être contenu en une seule ligne, sans passer par une fonction personnalisée :
 

Code:

Update buff set obj = RotateAtPoint(Obj, 45, CreatePoint(Longitude, Latitude))
cladonne a écrit:

Désolé pour ces questions qui peuvent paraître bateau...


Pas de problèmes, on à tous débuté.

Dernière modification par Richard Lohier (Mon 04 July 2011 14:51)

Hors ligne

 

Pied de page des forums

Powered by FluxBB