PDA

Voir la version complète : [Résolu] SplineObject - modifier le nombre de segments



oli_d
05/03/2008, 18h19
Bonjour à tous,

Je suis entrain d'écrire un plug pour pouvoir importer des données depuis des fichiers .shp (fichiers de ArcInfo logiciel de SIG de la maison ESRI).

Le but de ce plug est de pouvoir créer automatiquement des maquettes 3D de territoire, en générant automatiquement les volumes bâtis et la végétation à la bonne hauteur en se basant sur des modèles numériques de surface et de terrain.

Je butte sur un tout petit problème pour les bâtiments, j'ai parfois besoin de créer d'après les données du fichier shp des Splines comprenant plusieurs segments.

En lisant la doc il faut théoriquement procéder de la même manière que l'ajout de points, c'est à dire en utilisant la classe VariableChanged .

main(doc,op)
{
if(!instanceof(op,SplineObject))return;//si l'objet n'est pas une Spline on quitte

var nbSeg = op->GetSegmentCount();//on récupère le nombre de segments initial
var nbPt = op->GetPointCount();
var nbSegNew=2;

var tbl =new(array,nbSegNew); //on crée un tableau de la taille du nombre de segments
tbl[0]=2; // dans chaque case on donne le nombre de points par segments
tbl[1]=nbPt-tbl[0]; // le total des cases doit correspondre au nombre total de point de la spline


var vc = new(VariableChanged);// on crée une instance de VC
if(!vc) return FALSE;

vc->Init(nbSeg,nbSegNew);//on initialise avec le nbre de nouveaux segments

var ok = op->MultiMessage(MSG_SEGMENTS_CHANGED,vc);//on envoie le changement à l'objet et aux tags

ok= op->SetSegments(tbl);//on initialise les segments d'après notre tableau

op->Message(MSG_UPDATE);

}

Ce code ne fonctionne pas, le premier "ok" indique vrai mais pas le second .... :coup:

Si j'essaie de prendre le même principe pour ajouter des points à la spline, cela fonctionne.

Est-ce que l'un des rares adeptes du COFFEE du forum (Yann si tu m'écoutes :lol:) aurait déjà eu ce problème et aurait une solution ?

D'avance merci

PS: si cela intéresse quelqu'un j'ai déjà développé un plug qui à l'air de fonctionner et qui permet de générer des modèles de terrain d'après des données ASCII.

xs_yann
05/03/2008, 20h58
(Yann si tu m'écoutes :lol:)
Hein? on m'appelle?

J'ai testé avec l'exemple du SDK voici ce à quoi j'arrive (avec ça tu peux ajouter des segments à une spline) :


main(doc,op) {
var vc = new(VariableChanged);
var cnt = op->GetPointCount();
var tab = new(array,cnt+3); // pour ajouter 3 points
vc->Init(cnt,cnt+3);
op->MultiMessage(MSG_POINTS_CHANGED,vc);
op->SetSegments(tab);
}



A toi de rajouter les tests(iinstanceof et tous ça) :wink:
Normalement si tu entre les positions de tes points dans tab ça devrait le faire. :wink:

Bon courage,
:odile:

oli_d
05/03/2008, 22h16
Merci Yann,

Mais pour les points je n'ai aucun problème,c'est vraiment pouvoir faire des splines multisegments, et ton bout de code ne fonctionne apparemment pas. La fonction SetSegments() permet d'affecter les points aux différents segments qui doivent être créer avant (comme pour les points, tu dois d'abord modifier le nombre de points, puis tu peux les positionner)

Mais en fait je viens de me rendre compte que le principe fonctionne sur une spline où il y a déjà plusieurs segments . C'est apparemment du à un tag invisible(type n° 5675 ???) qui est présent sur les splines multisegments et pas sur les autres. Reste à trouver comment l'appliquer sur ma spline... J'explore maintenant AllocVariableTag(); il y apparemment un "Segment data tag" qui pourrait peut-être faire l'affaire.

la suite au prochain épisode ...

Majoul
05/03/2008, 23h53
Il suffit de lui attribuer un tag « SegmentTag » et ton vœux sera exaucé.




var tsegment = AllocTag(Tsegment) ;
maSpline->InsertTag(tsegment,NULL) ;

oli_d
06/03/2008, 09h33
Ca marche ! :bounce:

Merci infiniment Maître Majoul !!! :prie: