Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Recent
    • Tags
    • Users
    • Login

    get bounding box from clones [SOLVED]

    Scheduled Pinned Locked Moved PYTHON Development
    9 Posts 0 Posters 757 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H Offline
      Helper
      last edited by

      On 01/04/2015 at 09:11, xxxxxxxx wrote:

      MODATA_SIZE is alway none and MODATA_MATRIX give me the relative scale of an object. my plan is to use the original dimension of the spreaded object do do something with a python effector

      1 Reply Last reply Reply Quote 0
      • H Offline
        Helper
        last edited by

        On 02/04/2015 at 06:56, xxxxxxxx wrote:

        Hello,

        can you give us some code and some more information on what are you trying to do? What exactly is your question?

        Best wishes,
        Sebastian

        1 Reply Last reply Reply Quote 0
        • H Offline
          Helper
          last edited by

          On 02/04/2015 at 09:41, xxxxxxxx wrote:

          i got an simple python effector who is able to check nearby clones and disable them if they are to closes to each other. simple to avoid double trees on surfaces. now i want to implement a feature which is able to check the radius of a tree before removing the other clones. now i just using the MODATA_MATRIX and compare the distance from each clone with a .GetLengt()

          1 Reply Last reply Reply Quote 0
          • H Offline
            Helper
            last edited by

            On 07/04/2015 at 01:24, xxxxxxxx wrote:

            Hello,

            what "trees" are you talking about?

            You can get the bounding box dimensions of an object with GetRad(). The clones are based on child objects of the generator object. This generator object is accessible via GetGenerator() or simply using gen. You could then calculate the child index based on the MODATA_CLONE array.

            Best wishes,
            Sebastian

            1 Reply Last reply Reply Quote 0
            • H Offline
              Helper
              last edited by

              On 07/04/2015 at 16:25, xxxxxxxx wrote:

              Distance Effektor need a INT input and a static string

              import c4d
              from c4d.modules import mograph as mo
              from c4d import Vector 
              #Welcome to the world of Python
                
                
              def main() :
                  
                  md = mo.GeGetMoData(op)
                  distance = op[c4d.ID_USERDATA,1]
                  killcount = 0
                  if op[c4d.ID_USERDATA,1]:
                      
                      if md==None: return False
                      
                      cnt = md.GetCount()
                      marr = md.GetArray(c4d.MODATA_MATRIX)
                      coll = md.GetArray(c4d.MODATA_COLOR)
                      
                      clone_offset = md.GetArray(c4d.MODATA_CLONE)
                      
                      clone_source = gen.GetDown()
                      clone_source_arr = []
                      
                      while clone_source != None:
                          
                          clone_source_arr.append(clone_source)
                          clone_source = clone_source.GetNext()
                      
                     
                      
                      clone_source_count = len(clone_source_arr)
                      visible = md.GetArray(c4d.MODATA_FLAGS)
                      
                      divider = 1 / float(clone_source_count)
                      
                      
                      offset_threshold = []
                      for k in range (0, clone_source_count) :
                          
                          offset_threshold.append(divider*k)
                      offset_threshold.append(1.0)
                      clone_source_count_minus = clone_source_count - 1
                      
                      
                      
                      for i in (xrange(0, cnt)) :
                         
                          if visible[i] == 1:
                              
                              ### detect clone source:
                              
                              for k in range(0, clone_source_count) :
                                  
                                  if k == 0:
                                      
                                      if clone_offset[i] < offset_threshold[k+1]:
                                          #print str(k) + "=k == 0      " + str(clone_offset[i]) + " < " + str( offset_threshold[k+1]) + str(clone_source_arr[k])
                                          radius = clone_source_arr[k].GetRad()
                                          coll[i] = c4d.Vector(0,0,1)
                                          break;
                                  elif k > 0 and k != clone_source_count_minus:
                                      
                                      if (clone_offset[i] > offset_threshold[k]) and (clone_offset[i] < offset_threshold[k+1]) :
                                          #print str(k) + "=k > 0 !& "+ str(clone_source_count) + "   " +  str(clone_offset[i]) + " > " + str( offset_threshold[k]) + "   and   " +  str(clone_offset[i]) + " < " + str( offset_threshold[k+1]) + str(clone_source_arr[k])
                                          coll[i] = c4d.Vector(0,1,0)
                                          radius = clone_source_arr[k].GetRad()
                                          break;
                                  
                                  elif k == clone_source_count_minus:
                                      
                                      
                                      if clone_offset[i] > offset_threshold[k-1]:
                                          #print str(k) + "=k =="+ str(clone_source_count_minus) + "   " +  str(clone_offset[i]) + " > " + str( offset_threshold[k]) + "   and   " +  str(clone_offset[i]) + " < " + str( offset_threshold[k+1]) + str(clone_source_arr[k])    
                                          coll[i] = c4d.Vector(1,0,0)
                                          radius = clone_source_arr[k].GetRad()
                                          break;
                                 
                              for j in (xrange(0, cnt)) :                
                                  if marr[i] != marr[j]:
                                      
                                      dist = (marr[i].off - marr[j].off).GetLength() 
                                      dist =  dist - radius.x 
                                                 
                                      if dist < distance:                    
                                          
                                          visible[j] = 0
                                          killcount += 1
                              
                      md.SetArray(c4d.MODATA_FLAGS, visible, True)
                      md.SetArray(c4d.MODATA_COLOR, coll, True)
                      
                
                  return True
              
              1 Reply Last reply Reply Quote 0
              • H Offline
                Helper
                last edited by

                On 08/04/2015 at 01:10, xxxxxxxx wrote:

                Hello,

                what exactly is your question please?

                Best wishes,
                Sebastian

                1 Reply Last reply Reply Quote 0
                • H Offline
                  Helper
                  last edited by

                  On 08/04/2015 at 09:14, xxxxxxxx wrote:

                  at first the detection of the right clone seems to me quite complicated. is there a way to do this without this strange for loops ?

                  at second:

                  the effector works fine but self collision between clones with the same source object seems to ignoring the distance threshold.

                  1 Reply Last reply Reply Quote 0
                  • H Offline
                    Helper
                    last edited by

                    On 09/04/2015 at 08:23, xxxxxxxx wrote:

                    Hello,

                    I don't really understand what you did in your code but I guess you could calculate the child index from clone_offset and then simply access your clone_source_arr array.

                    For questions no longer related to this thread's original topic please open a new thread. Thanks.

                    Best wishes,
                    Sebastian

                    1 Reply Last reply Reply Quote 0
                    • H Offline
                      Helper
                      last edited by

                      On 13/04/2015 at 04:57, xxxxxxxx wrote:

                      this is what the

                      if clone_offset _ < offset_threshold[k+1]: stuff does

                      solved

                      1 Reply Last reply Reply Quote 0
                      • First post
                        Last post