If clone is inside falloff - freeze position. PyMo
-
On 09/09/2015 at 05:39, xxxxxxxx wrote:
Hello!
Can anybody point me in the right direction to what I'm doing wrong here?
I can see how many clones are inside the falloff and access their index, but can't set/fix their position
whilst they are inside the falloff regionHere is my code so far:
__________________________
import c4d
from c4d.modules import mograph as modef main() :
md = mo.GeGetMoData(op)
if md==None: return False
cnt = md.GetCount()
marr = md.GetArray(c4d.MODATA_MATRIX)
fall = md.GetFalloffs()
carr = md.GetArray(c4d.MODATA_COLOR)
MoColAr = md.GetArray(c4d.MODATA_COLOR)
l = [] # Empty list to store falloff clones
for i in xrange(0, cnt) :
if fall == 1:
_ l2 = i_
_ l.append(l2)_
_ _
_ print "Number of clones inside fall off ", len(l)_
_ #print "Falloff cloner index values: ", l _
_ _
_ _
_ for i in xrange (len(l)) :_
_ print marr ___
_ _ marr = marr _____
_ _ _ #MoColAr = c4d.Vector(0)__
_ _ _ ___
_ _ _ md.SetArray(c4d.MODATA_Matrix, marr, True)___
_ _ _ #md.SetArray(c4d.MODATA_COLOR, MoColAr, True)___
_ _ _ ___
_ _ _ #b = "Number of clones inside falloff = " + str(len(l))___
_ _ _ #c4d.StatusSetText(b)___
_ _ _ ___
_ _ _ ___
_ _ _ return True___
_ _ __________________________________
_ _ Any help on this would be much appreciated! - Thank you in advance!__
-
On 09/09/2015 at 06:29, xxxxxxxx wrote:
Hi
Some mods and fix typos mad and seems, all work - video demoi use
marr _.off = c4d.Vector(0)_
_to freeze position
import c4d from c4d.modules import mograph as mo def main() : md = mo.GeGetMoData(op) if md==None: return False cnt = md.GetCount() marr = md.GetArray(c4d.MODATA_MATRIX) fall = md.GetFalloffs() carr = md.GetArray(c4d.MODATA_COLOR) MoColAr = md.GetArray(c4d.MODATA_COLOR) l = [] # Empty list to store falloff clones for i in xrange(0, cnt) : if fall[i] > 0: l2 = i l.append(l2) print "Number of clones inside fall off ", len(l) #print "Falloff cloner index values: ", l for i in xrange (len(l)) : print marr marr[i].off = c4d.Vector(0) md.SetArray(c4d.MODATA_MATRIX, marr, True) #MoColAr = c4d.Vector(0) md.SetArray(c4d.MODATA_MATRIX, marr, True) #md.SetArray(c4d.MODATA_COLOR, MoColAr, True) #b = "Number of clones inside falloff = " + str(len(l)) #c4d.StatusSetText(b) return True
_
-
On 09/09/2015 at 12:50, xxxxxxxx wrote:
Thanks for your help Ilya, really appreciate it!
The issue I'm having is that i want to freeze the clones in its current position.... It seems trickier than it sounds!
Appending marr.off and passing back doesn't work as the marr.off value is constantly calculated.
I'm trying tuples without any luck!Thanks again! If you have any ideas let me know!
-
On 15/09/2015 at 07:07, xxxxxxxx wrote:
Hi,
I played around with this. Here's what I came up with:
import c4d from c4d.modules import mograph as mo # two global arrays fixed = [] # stores for each clone, if it is currently fixed pos = [] # stores fixed position for each clone def main() : md = mo.GeGetMoData(op) if md==None: return False cnt = md.GetCount() marr = md.GetArray(c4d.MODATA_MATRIX) fall = md.GetFalloffs() # extend and initialize list to match number of clones, if needed if len(fixed) < cnt: for i in xrange(len(fixed), cnt) : fixed.extend([False]) pos.extend([c4d.Vector(0.0, 0.0, 0.0)]) # walk all clones for i in xrange(0, cnt) : if fall[(cnt - 1) - i] > 0.0: # NOTE: content of the falloffs array is reverse # Clone is inside falloff if fixed[i] == False: # if not yet fixed, we store the position and mark it fixed pos[i] = marr[i].off fixed[i] = True marr[i].off = pos[i] else: # Clone is outside falloff, so we release it (do not touch marr[i].off) fixed[i] = False # finally don't forget to update the MoData with our changed matrices md.SetArray(c4d.MODATA_MATRIX, marr, True) return True
Note 1: GetFalloffs() returns the results in the inverse order compared with the other MoData arrays. I'm still investigating, what's the reason for this behavior (maybe to have same behavior as good old COFFEE...). As soon as I have found out, I'll add a note to the docs.
Note 2: For simplicity I used global arrays in my example. Of course you may also store the values in the object's or effectors BaseContainer (using a valid PluginID) or you could add User Data to store the values.
Hope this helps.
-
On 15/09/2015 at 07:22, xxxxxxxx wrote:
Thank you Andreas, great work! I didn't think to include the lists outside of the main function, and haven't used .extend before. I'm going to make sure I fully understand this - but it's working great!
Thank you once again,
Simon