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