Adding a MODATA_COLOR array in my object

On 15/11/2013 at 04:06, xxxxxxxx wrote:

Hi,
i have the following code in a Python Effector(Full) and the function md.SetArray(c4d.MODATA_COLOR, clrs, True) doesn't seem to set my new colors in the array. Printing "print clrs =md.GetArray(c4d.MODATA_COLOR)" says None. So i suppose my object is missing this MODATA_COLOR array. The md.SetArray(c4d.MODATA_MATRIX, marr, True) is working ok, so the MODATA_MATRIX is preset. How can I add the MODATA_COLOR array to my md object? I ve tried with md.AddArray(40000001) and different possibilieties but doesn t seem to work. Any ideea? Thanks
Screenshot: http://imgur.com/3i9B0QM

  
import c4d  
from c4d.modules import mograph as mo  
from random import randint  
#Welcome to the world of Python  
  
def randomColor() :  
  r = randint(0,255) / 256.0    
  g = randint(0,255) / 256.0    
  b = randint(0,255) / 256.0  
  color = c4d.Vector(r*4,g*10,b*20)  
  return color  
  
  
def main() :  
  md = mo.GeGetMoData(op)  
  if md==None: return False  
    
  cnt = md.GetCount()  
  marr = md.GetArray(c4d.MODATA_MATRIX)  
  uvw = md.GetArray(c4d.MODATA_UVW)  
  print uvw  
  fall = md.GetFalloffs()  
  for i in reversed(xrange(0, cnt)) :  
      marr _._ off = marr.off+fall*100.0  
    
  print marr  
    
  clrs = md.GetArray(c4d.MODATA_COLOR)  
  print clrs  
  clrs=[]  
  for x  in reversed(xrange(0, cnt)) :  
      clrs.append(randomColor())  
  print clrs  
  print '_____'  
  print md.GetCurrentIndex()  
  print md.GetArrayDescID(0)  
  print md.GetArrayIndex(40000000)  
  print md.GetArrayID(md.GetArrayIndex(40000004))  
  print md.GetName(0)  
  print md.GetIndexName(0)  
  print '_____'  
  #print md.AddArray(40000001)  
  md.SetArray(c4d.MODATA_MATRIX, marr, True)  
  md.SetArray(c4d.MODATA_COLOR, clrs, True)  
  print md.GetArray(c4d.MODATA_COLOR)  
    
  return True _ ___

On 15/11/2013 at 07:48, xxxxxxxx wrote:

@admin : how should one use "square brackets" here ?

[ i ]

EDIT : mmm, appears to work.

On 15/11/2013 at 19:01, xxxxxxxx wrote:

You've got some errors in your for loop.
Try it like this.

    for i in reversed(xrange(0, cnt)) :  
      marr[i].off = marr[i].off+fall[0]*100

-ScottA

On 16/11/2013 at 02:44, xxxxxxxx wrote:

Thanks, Scott. But I don t want to change the position in my object, I want to change the colors. So, I ve tried to take the colors from the object with md.GetArrayc4d.MODATA_COLORS), but it gives me None. So, then I thought to apply the array to the md Object with SetArray(...,my_array_of_clrs,true), but doesnt seems to work(no array is added). So I saw another function there, md.AddArray(...) but I m not sure how to use it to push my array into the Modata Object. Any ideea? http://imgur.com/3i9B0QM

On 16/11/2013 at 06:47, xxxxxxxx wrote:

I might sound grumpy, but I am not willing anymore to read such messy code. However, here is an example on how to write the color channel for modata particles (including some random noise for the position).

import c4d
from c4d.utils import noise
from c4d.modules import mograph as mo
  
def getNoiseVector(p, uniform=False, negative=True) :
    """
    :param p        : input vector
    :param uniform  : greyscale vector
    :param negative : include negative values
    :return         : c4d.Vector
    """
    if uniform and negative:
        n = noise.SNoise(p)
        return c4d.Vector(n, n, n)
    elif uniform:
        n = noise.Noise(p)
        return c4d.Vector(n, n, n)
    elif negative:
        return c4d.Vector(noise.SNoise(c4d.Vector(p.x, p.y, p.z)),
                          noise.SNoise(c4d.Vector(p.z, p.x, p.y)),
                          noise.SNoise(c4d.Vector(p.y, p.z, p.x)))
    else:
        return c4d.Vector(noise.Noise(c4d.Vector(p.x, p.y, p.z)),
                          noise.Noise(c4d.Vector(p.z, p.x, p.y)),
                          noise.Noise(c4d.Vector(p.y, p.z, p.x)))
                          
def main() :
    md = mo.GeGetMoData(op)
    if md==None: return False
    
    # writing the matrices array with some position noise
    cnt = md.GetCount()
    marr = md.GetArray(c4d.MODATA_MATRIX)
    for i in reversed(xrange(0, cnt)) :
        marr[i].off = getNoiseVector(c4d.Vector(i,0,0)) * 200
    
    # writing the color array with some color noise
    carr = md.GetArray(c4d.MODATA_COLOR)
    for i in reversed(xrange(0, cnt)) :
        carr[i] = getNoiseVector(c4d.Vector(i,0,0), False, False)
    
    # write our data back
    md.SetArray(c4d.MODATA_COLOR, carr, False)
    md.SetArray(c4d.MODATA_MATRIX, marr, False)
    return True

The result will look something like this :

http://i.imgur.com/425FZGl.jpg

On 16/11/2013 at 11:08, xxxxxxxx wrote:

Hi, littledavid. First: my code desnt look good, I admit. But is the first code I am trying in c4d :). So, apologise. Second: your code may be beautifull, but it gives me the same error: TypeError: 'NoneType' object does not support item assignment , on line : carr = getNoiseVector(c4d.Vector(i,0,0), False, False) . So, my problem is that I can't assign an array on that carr in my specific object(is a Voxygen object ). So, I ve tried with AddArray , but I don't know to use it. So, any idea? Thanks for your effort 🙂 _

_

On 16/11/2013 at 11:24, xxxxxxxx wrote:

What is a Voxgen object ? Is it that voxelizer addon by Paul Everett ? I suppose it does act as an MoGraph generator. When for carr = md.GetArray(c4d.MODATA_COLOR) carr is None for that object, there has to be a inconsitency with that plugin i guess, as the defintion of GetArray is :

MoData.GetArray(id)[](file:///E:/Misc/SDK%20Help/C4d%20SDK%20Documentation%20Python/help/modules/c4d.modules/mograph/MoData/index.html#MoData.GetArray)

Get an array.
Parameters:| id  (int) –
The ID of the array:

MODATA_MATRIX [Matrix](file:///E:/Misc/SDK%20Help/C4d%20SDK%20Documentation%20Python/help/modules/c4d/Matrix/index.html#c4d.Matrix) Matrix of the clone.
MODATA_COLOR [Vector](file:///E:/Misc/SDK%20Help/C4d%20SDK%20Documentation%20Python/help/modules/c4d/Vector/index.html#c4d.Vector) Color of the clone.
MODATA_SIZE [Vector](file:///E:/Misc/SDK%20Help/C4d%20SDK%20Documentation%20Python/help/modules/c4d/Vector/index.html#c4d.Vector) Size of the clone.
MODATA_UVW [Vector](file:///E:/Misc/SDK%20Help/C4d%20SDK%20Documentation%20Python/help/modules/c4d/Vector/index.html#c4d.Vector) UV position of the clone.
MODATA_FLAGS long Flags:

_<_t_>_

> MOGENFLAG_CLONE_ON Particle is visible.
> --- ---
> MOGENFLAG_DISABLE Particle is permanently disabled.
> MOGENFLAG_BORN Particle is just generated (internal use only).
> MOGENFLAG_MODATASET The [MoData](file:///E:/Misc/SDK%20Help/C4d%20SDK%20Documentation%20Python/help/modules/c4d.modules/mograph/MoData/index.html#c4d.modules.mograph.MoData) has been set and doesn't need the input of the transform panel.
> MOGENFLAG_COLORSET The [MoData](file:///E:/Misc/SDK%20Help/C4d%20SDK%20Documentation%20Python/help/modules/c4d.modules/mograph/MoData/index.html#c4d.modules.mograph.MoData) color has been set and doesn't need to be updated.
> MOGENFLAG_TIMESET The [MoData](file:///E:/Misc/SDK%20Help/C4d%20SDK%20Documentation%20Python/help/modules/c4d.modules/mograph/MoData/index.html#c4d.modules.mograph.MoData) time has been set and doesn't need to be updated._/t>
MODATA_WEIGHT float Weight of the clone.
MODATA_CLONE float Clone Offset (picks which child of the Cloner gets cloned or the blending between those children).
MODATA_TIME float Time offset of the clone.
MODATA_LASTMAT [Matrix](file:///E:/Misc/SDK%20Help/C4d%20SDK%20Documentation%20Python/help/modules/c4d/Matrix/index.html#c4d.Matrix) Previous frame particle matrix.
MODATA_STARTMAT [Matrix](file:///E:/Misc/SDK%20Help/C4d%20SDK%20Documentation%20Python/help/modules/c4d/Matrix/index.html#c4d.Matrix) Matrix at the particle's birth.
MODATA_ALT_INDEX long Alternative index value that can be used for instance by the Step Effector when cloned over a spline with an offset.
MODATA_FALLOFF_WGT float Falloff weight.
MODATA_SPLINE_SEGMENT long The segment index, mostly used with the MoSpline (currently unused).
MODATA_GROWTH float Offset of growth for the particle on the MoSpline (currently unused)._r>
Return type: list
Returns: The array.<_<_t_>_

So you are guaranteed to get a list. It is a bit difficult to solve your problem without that plugin.

On 16/11/2013 at 11:32, xxxxxxxx wrote:

Yea, this was also my first ideea. Bad design in the plugin :). You are right, is the Voxelizer(mograph generator,like Random). So is not my fault that I don t know how to use the c4d AP I, but a plugin problem. Anyway, Ill try to add that blody array in some way...:)

On 16/11/2013 at 11:46, xxxxxxxx wrote:

Well, as i said - normally you are guaranteed to find the default arrays (even if they are bugged 
and empty like the size array). You can try to add the array manually, but i doubt that it will work 
(as you do expect the color to be processed in the viewport). The descid for the color array would 
be :

(40000001, 3, 0)  |  40000001

    md.AddArray(c4d.DescID(c4d.DescLevel(40000001), 
                           c4d.DescLevel(3), 
                           c4d.DescLevel(0)))

edit : FYI, i wouldn't call it bad design in the plugin, as paul everett is also one of the authors of MoGraph, so he most likely knowing what hes doing. It is more a documentation problem.