PDA

Voir la version complète : python et spline help



paspas
16/11/2011, 14h35
salut

encore moi :icon_mrgreen:

je voudrait récupéré les coordonnées d'un point d'une spline paramétrique ( attention un point quelconque de la spline par un point )

avant en coffee il fallait utiliser "Getobjectspline" ( si mes souvenir son bon ) pour "convertir" cette spline paramétrique en spline et ainsi pouvoir récupéré sa longueur ou les coordonnées d'un point situer à 30 % par exemple .

en fouillant je pense que ce se trouve en python dans la partie "C4d.utils.splinelenghdata" mais j'arrive pas a voir comment ca s'utilise :icon_pleure: :icon_pleure:

si une bonne âme passe par ici et m'aider ( j'ai vraiment du mal avec la doc et son utilisation )
un petit exemple me ferrait du bien pour comprendre mais toute aide serra la bienvenue avidement


paspas qui vous remercie

valkaari
16/11/2011, 14h58
J'ai pas vraiment testé mais j'ai pas souvenir d'avoir galéré comme un fou avec le C++

essayes de voir avec

GetSplinePoint(t[, segment=0])
Get the spline point at a position along the given segment.
Parameters:
t (float) – The position 0.0<=t<=1.0 along the segment.
segment (int) – The segment
Return type:
Vector
Returns:
The spline point


Pour la longueur de la spline, faut l'initialiser peut être ?

paspas
16/11/2011, 15h45
hello et encore merci


voici ce que me dit la console python


AttributeError: 'c4d.BaseObject' object has no attribute 'GetSplinePoint'

je sais je suis une buse en python :icon_pleure:

paspas


ps je pense que ce code ne marche pas avec les splines paramétriques ( expérience en coffee)

valkaari
16/11/2011, 17h18
après une petite recherche sur le forum plugincafé
http://www.plugincafe.com/forum/forum_posts.asp?TID=5860

Il faut du coup passer par le cache de l'objet on dirait. (j'ai pas tout spécialement compris non plus ^^)

si tu mets une DU sur un python generator ce bout de code permet de changer la position du cube sur la spline qui se trouve en enfant.
(c'est clair comme de l'eau de roche)



import c4d
from c4d.utils import SplineHelp
#Welcome to the world of Python


def main():
cube = c4d.BaseObject(c4d.Ocube)
spline = op.GetDown()
if not spline.CheckType(c4d.Ospline):
globals()["spline"] = spline.GetCache()
shelp = SplineHelp()
shelp.InitSpline(spline)
pos = shelp.GetPosition(op[c4d.ID_USERDATA,1])
cube.SetRelPos(pos)
return cube



edit : le IF est juste là pour vérifier si c'est PAS un objetspline, sinon il prends la spline directement, il faut un autre test (comme sur le lien du forum que j'ai donné) pour vérifier si c'est ni un objet spline, ni une fois le cache récupéré un objet spline. Dans ce cas, faut se barrer vite avant de tout planter ^^

oli_d
22/11/2011, 19h51
J'avais pas suivi mais si jamais la fonction BaseList2D.GetRealSpline() peut également être ton amie.
Le code de Val revu avec cette fonction(pour un générateur avec n'importe quel type de spline en enfant:


import c4d
from c4d.utils import SplineHelp
#Welcome to the world of Python


def main():
if op.GetDown():
spline = op.GetDown().GetRealSpline()
if spline:
cube = c4d.BaseObject(c4d.Ocube)
shelp = SplineHelp()
shelp.InitSpline(spline)
pos = shelp.GetPosition(op[c4d.ID_USERDATA,1])
cube.SetRelPos(pos)
return cube

paspas
22/11/2011, 20h42
merci merci grâce a vous deux je progresse :)

oli - j'ai effectivement utilise cette fonction pour récupéré la position de ma spline (cette méthode était également dans un des lien de valkirie)



(voire application dans le calendrier de l'avent )

merci encore

valkaari
23/11/2011, 00h18
bon faut passer par le spline help

Autant ce code sur un tag python (donc sur une spline ou une primitive spline) fonctionne bien sous R12, autant sour R13 il mets une erreur sur le nombre de segment.


import c4d

from c4d import utils

from c4d.utils import SplineHelp, SplineLengthData



def main():

obj = op.GetObject()

rs = obj.GetRealSpline()

if rs is None:

print 'Not a Spline'

return False



sdata = SplineLengthData()

sdata.Init(rs,0)

pos = rs.GetSplinePoint(0.5,0)

sdata.Free()

print pos

paspas
23/11/2011, 09h51
oli en R12

il me donne


AttributeError: 'c4d.SplineObject' object has no attribute 'GetPosition'



paspas

oli_d
23/11/2011, 14h56
Je viens de tester en r12 mon code fonctionne, cela doit bien être l'objet SplineHelp qui doit appeler la méthode GetPoint() pas le SplineObject