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

    Boundingbox Size of Point selection

    Scheduled Pinned Locked Moved PYTHON Development
    9 Posts 0 Posters 725 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 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?

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

        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])
        
        1 Reply Last reply Reply Quote 0
        • H Offline
          Helper
          last edited by

          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
          
          1 Reply Last reply Reply Quote 0
          • H Offline
            Helper
            last edited by

            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.

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

              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.

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

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

                I guess you are right😂

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

                  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
                    
                  
                  
                  1 Reply Last reply Reply Quote 0
                  • H Offline
                    Helper
                    last edited by

                    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?

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

                      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.

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