THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 02/08/2011 at 03:37, xxxxxxxx wrote:
I'm trying to access the particle data of a standard emitter. I can get the BaseContainer etc. of the Tparticle tag just fine, the GetDataCount() gives me the correct number of entries. However, every entry in the array that is being returned from GetData() is of type None and empty. What's going on?
On 26/12/2011 at 14:10, xxxxxxxx wrote:
I'd be happy to know how as well how to get the particle positions of a Standard Emitter.
The SDK looks very sparse and I can't get my head around it.
On 27/12/2011 at 15:02, xxxxxxxx wrote:
AFAIK. Particle positions are stored in the object. Not the invisible particle tag.
So based on that. It seems like the first thing we have to do is get at the particle object first. And that's where I'm stuck with it.
I don't know how to convert the "BaseObject" type emitter to a "ParticleObject" type with python.
This is a simple example using C++:
//Basic particle object example
BaseObject *obj = doc->GetActiveObject();
if(!obj) return FALSE;
if(obj->GetType()==Oparticle) //If the active object is an emitter
ParticleObject *po = (ParticleObject* )obj; //Assign it to a particle type variable "po"
ParticleTag *pt = (ParticleTag* )obj->GetTag(Tparticle); //The invisible tag that stores the particles
LONG pcnt = po->GetParticleCount(); //Get the number of particles
LONG life = po->GetLifetime();
Particle *pc = (Particle* )pt->GetLowlevelDataAddressW();
Vector pos = pc->off; //Get the first particle's position
const Particle *p1 = NULL;
p1 = po->GetParticleR(pt,1); //Get the second particle in the array of particles
Vector p1pos = p1->off; //Get the second particle's position
const Particle *p10 = NULL;
p10 = po->GetParticleR(pt,10); //Get the 11th particle in the array of particles
Vector p10pos = p10->off; //Get the 11th particle's position
Everything works in this C++ example because it's getting the particle data from the ParticleObject.
I have no clue how to do the same thing with python. Because I don't know how to get at the ParticleObject with it.
All we seem to have access to is the BaseObject emitter object in python.
On 27/12/2011 at 17:02, xxxxxxxx wrote:
Thanks Scott. I think I need a more Pythonesqe nudge to understand I'm afraid
My efforts all end in a "cannot create 'c4d.module.particles.Particle' instances" error.
On 27/12/2011 at 19:49, xxxxxxxx wrote:
^ Yeah..That one got me too.
I can get you a bit closer:
import c4d.modules.particles as ptcl
def main() :
bp = ptcl.BaseParticle
po = ptcl.Particle
#pmat = ptcl.CalcParticleMatrix(po) #<--Can't figure this one out yet
But I still can't get at the specific particle position data yet.
I wonder if Maxon support is off this week for the holidays?
Usually Yannick would pop in by now.
On 28/12/2011 at 02:46, xxxxxxxx wrote:
First, I'm afraid ParticleObject class is not wrapped by the Python API.
But I think we should be able to get the particles positions with the particle tag like done in the C++ example:
from c4d.modules import particles
def main() :
if op.GetType() == c4d.Oparticle:
pt = op.GetTag(c4d.Tparticle)
buffer = pt.GetLowlevelDataAddressW()
for part in buffer:
Remember that GetLowlevelDataAddressW() returns a ByteSeq buffer and the items are strings.
I ran the code but got '-'. I need some help on using the standard particles emitter .
On 28/12/2011 at 13:54, xxxxxxxx wrote:
Thanks for looking into it Yannick.
Would mean a lot to get it sorted.
On 28/12/2011 at 15:44, xxxxxxxx wrote:
Meanwhile for my purposes I can use brute force cache
as I only need the positions. Just need to have my
generator later in the OM to get the cache.
space = 0
pcm = myGeneratorObject.GetMg()
scpoints = 
if lobj.CheckType(c4d.Oparticle) and lobj.GetDown() and lobj.GetCache() : # Standard Particle Emitter with child
lobjm = lobj.GetMg()
cobj = lobj.GetCache()
gchilds = cobj.GetChildren()
for i in gchilds:
sppoint = ~pcm*lobjm*i.GetAbsPos() if space == 0 else i.GetAbsPos()
On 28/12/2011 at 18:52, xxxxxxxx wrote:
Good find Lennart.
I knew the particles were stored in the emitter object. But I never would have guessed that we would need to use something like: Emitter.GetCache().GetChildren() to access them.
If the "Show Objects" option on the standard emitter is on. We can get their positions using those functions:
#Note: "Show objects" must be enabled on the emitter
def main() :
ptclpositions =  #List to hold the particle positions
emitter = doc.SearchObject("Emitter") #The particle emitter
if emitter.CheckType(c4d.Oparticle) and emitter.GetDown() and emitter.GetCache() : #Standard Particle Emitter with child
emittercache = emitter.GetCache()
particles = emittercache.GetChildren()
for particle in particles:
pos = particle.GetAbsPos() #Get the position of each particle
ptclpositions.append(pos) #Add it to the list "particlepos"
print ptclpositions #The list with the particle positions in it