PDA

Voir la version complète : Créer un objet polygonal



César Vonc
26/12/2011, 11h26
Bonjour,

Pour ceux qui chercheraient à créer un objet polygonal à partir d'un tableau de coordonnées, en COFFEE, voici un petit script tout simple qui s'en occupera :


main(doc,op)
{
var objet = AllocObject(Opolygon);

var nbPts = 6; // Nombre de points
var nbPolys = 3; // Nombre de polygones
var posPts = new(array, nbPts); // Coordonnées des points
var maillage = new(array, nbPolys*4); // Connexion des polygones

posPts[0] = vector(0, 0, 0);
posPts[1] = vector(200, 0, 0);
posPts[2] = vector(200, 0, 200);
posPts[3] = vector(0, 0, 200);
posPts[4] = vector(200, 100, 0);
posPts[5] = vector(200, 100, 200);

// Polygone 0
maillage[0] = 0; // Point A du polygone n / 4
maillage[1] = 1; // Point B du polygone (n-1) / 4
maillage[2] = 2; // Point C du polygone (n-2) / 4
maillage[3] = 3; // Point D du polygone (n-3) / 4

// Polygone 1
maillage[4] = 1;
maillage[5] = 2;
maillage[6] = 5;
maillage[7] = 4;

// Polygone 2
maillage[8] = 3;
maillage[9] = 2;
maillage[10] = 5;
maillage[11] = 5;

var vc = new(VariableChanged); if (!vc) return FALSE;
vc->Init(0, nbPts);
objet->MultiMessage(MSG_POINTS_CHANGED, vc);
objet->SetPoints(posPts);

var vc2 = new(VariableChanged); if (!vc2) return FALSE;
vc2->Init(0, nbPolys);
objet->MultiMessage(MSG_POLYGONS_CHANGED, vc2);
objet->SetPolygons(maillage);

objet#ID_BASELIST_NAME = "Objet";
doc->InsertObject(objet, NULL, NULL);
objet->Message(MSG_UPDATE);
doc->SetActiveObject(objet);
CallCommand(14023); // Aligner les normales
}Notez cependant l'utilisation de SetPoints au lieu de SetPoint, le second permettant de modifier un point précis :
SetPoints(posPts);
SetPoint(i, posPts[i]);

De même pour les polygones.

César Vonc
01/02/2012, 12h33
Et la même chose, mais en Python :


import c4d

def main():
objet = c4d.BaseObject(c4d.Opolygon)

points = [c4d.Vector(0, 0, 0), # Coordonnées des points
c4d.Vector(200, 0, 0),
c4d.Vector(200, 0, 200),
c4d.Vector(0, 0, 200),
c4d.Vector(200, 100, 0),
c4d.Vector(200, 100, 200)]

polys = [c4d.CPolygon(0, 1, 2, 3), # Points ABCD du polygone
c4d.CPolygon(1, 2, 5, 4),
c4d.CPolygon(3, 2, 5, 5)]

nbPts = len(points) # Nombre de points
nbPolys = len(polys) # Nombre de polygones

objet.ResizeObject(nbPts, nbPolys)

objet.SetAllPoints(points)

for p in range(nbPolys):
objet.SetPolygon(p, polys[p])

objet.Message(c4d.MSG_UPDATE)
doc.InsertObject(objet)
c4d.EventAdd()

if __name__=='__main__':
main()On regrettera juste l'absence d'un SetAllPolygons() qui oblige à passer par une boucle avec SetPolygon(), mais je pense qu'une évolution à ce niveau ne tardera pas.

Autrement, le script Python est plus léger et plus clair qu'en Coffee.


PS : Je n'ai pas trouvé autre chose que points = [None]*nbPts pour créer un tableau vide d'une certaine longueur, est-ce bien propre ou y a-t-il une autre méthode ?

oli_d
01/02/2012, 18h01
En python les tableaux s'appelle des listes et tu n'as pas besoin de définir le nombre avant (c'est un vrai bonheur par rapport au COFFEE) :

Exemple :

lst=[]
lst.append(123)
lst.append(456)
print lstPlus de détails ici : http://python.developpez.com/faq/?page=Liste

César Vonc
02/02/2012, 10h57
D'accord, c'est bien ce qui me semblait.

J'ai édité en conséquence, en remplissant la liste directement dans sa déclaration, tant qu'à faire.