Boundingbox Size of Point selection



  • On 21/12/2015 at 02:34, xxxxxxxx wrote:

    Hi, I am trying to get the Size of a Pointselection...basically what obj.GetRad() is for Objectsize...but for selected Points.

    Is there an easy way?



  • On 21/12/2015 at 03:28, xxxxxxxx wrote:

    The easy way is to calculate it. :) It's simple for a given set of points. Just make sure you use a copy of
    the starting point, otherwise you'll have two times the same vector and that will lead to wrong results.

    minv = c4d.Vector(points[0])
    maxv = c4d.Vector(points[0])
    


  • On 21/12/2015 at 03:35, xxxxxxxx wrote:

    I tried this...whats not working here?

    def GetSelectionSize(op) :
      
      
        sel = op.GetPointS()
        points = [(i, point)
              for i, point in enumerate(op.GetAllPoints())
              if sel.IsSelected(i)]
      
        if not points:
          return
      
        selsizemin = min(c4d.Vector(point[1]) for point in points)
        selsizemax = max(c4d.Vector(point[1]) for point in points)
        selsize= selsizemax-selsizemin
        return selsize
    


  • On 21/12/2015 at 04:10, xxxxxxxx wrote:

    You have to find the min/max for each **component (x, y, z)  **of all points, not the min/max of all points.



  • On 21/12/2015 at 04:11, xxxxxxxx wrote:

    Also, why do you write point[1] ? That'll give you the Y component of the Vector.



  • On 21/12/2015 at 04:11, xxxxxxxx wrote:

    I guess you are right😂



  • On 21/12/2015 at 04:56, xxxxxxxx wrote:

    This Works now. I guess its more complicated than it could be ;-)

    def GetSelectionSize(op) :
      
      
        sel = op.GetPointS()
        points = [(i, point)
              for i, point in enumerate(op.GetAllPoints())
              if sel.IsSelected(i)]
      
        if not points:
          return
      
        selsizeminX = min(point[1].x for point in points)
        selsizemaxX = max(point[1].x for point in points)
        selsizeminY = min(point[1].y for point in points)
        selsizemaxY = max(point[1].y for point in points)
        selsizeminZ = min(point[1].z for point in points)
        selsizemaxZ = max(point[1].z for point in points)
      
        boundbox= c4d.Vector(selsizemaxX,selsizemaxY,selsizemaxZ)-c4d.Vector(selsizeminX,selsizeminY,selsizeminZ)
        selsize=boundbox.GetLength()
        return selsize
      
    
    


  • On 21/12/2015 at 05:00, xxxxxxxx wrote:

    Just a question, because Im instrested in: Wouldnt it be better to do all in one for-loop?



  • On 21/12/2015 at 06:05, xxxxxxxx wrote:

    I tried it out. Im not sure if its the best practice, but the results.

    import c4d  
    from datetime import datetime  
    #Welcome to the world of Python  
      
    class stopwatch() :  
        
      def __init__(self) :  
          start = datetime.now()  
            
      def start(self) :  
          self.start = datetime.now()  
          return self.start  
            
      def stop(self) :  
          return datetime.now()-self.start  
        
    def GetSelectionSize(op) :  
      
      sel = op.GetPointS()  
      points = [(i, point)for i, point in enumerate(op.GetAllPoints())if sel.IsSelected(i)]  
      
      if not points: return  
      
      selsizeminX = min(point[1].x for point in points)  
      selsizemaxX = max(point[1].x for point in points)  
      selsizeminY = min(point[1].y for point in points)  
      selsizemaxY = max(point[1].y for point in points)  
      selsizeminZ = min(point[1].z for point in points)  
      selsizemaxZ = max(point[1].z for point in points)  
      
      boundbox = c4d.Vector(selsizemaxX,selsizemaxY,selsizemaxZ)-c4d.Vector(selsizeminX,selsizeminY,selsizeminZ)  
      selsize = boundbox.GetLength()  
      return selsize  
      
    def GetSelectionSize2(obj) :  
      v_min = None  
      v_max = None  
      for i, sel in enumerate(obj.GetPointS().GetAll(obj.GetPointCount())) :  
          if sel:  
              p = obj.GetPoint(i)  
              if v_min == None: v_min = c4d.Vector(p.x, p.y, p.z)  
              if v_max == None: v_max = c4d.Vector(p.x, p.y, p.z)  
                
              v_min.x = min(v_min.x, p.x)  
              v_min.y = min(v_min.y, p.y)  
              v_min.z = min(v_min.z, p.z)  
              v_max.x = max(v_max.x, p.x)  
              v_max.y = max(v_max.y, p.y)  
              v_max.z = max(v_max.z, p.z)  
                
      boundbox = v_max - v_min  
      selsize = boundbox.GetLength()  
      return selsize  
        
        
    def main() :  
      obj = op.GetDown()  
        
      t1 = stopwatch()  
      t1.start()  
      size = GetSelectionSize(obj)  
      print t1.stop()  
      print size  
        
        
      t1 = stopwatch()  
      t1.start()  
      size = GetSelectionSize2(obj)  
        
      print t1.stop()  
      print size  
      
      return None
    

    Pointcount 600.001 and 300.000 selected:
    GetSelectionSize(obj) : 0.022sec.
    GetSelectionSize2(obj) : 0.017sec.

    Pointcount 1.500.001 and 750.000 selected:
    GetSelectionSize(obj) : 0.469sec.
    GetSelectionSize2(obj) : 0.137sec.


Log in to reply