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:joy:

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.