How do I scale an object (brep) taking it's centroid as reference in RhinoCommon?

preferably with python

Hi @ivelin.peychev, below should do it, using RhinoScriptSyntax:

import rhinoscriptsyntax as rs

def DoSomething():
    
    # get the object (surface, polysurface or extrusion)
    obj_id = rs.GetObject("Brep to scale", 8+16+1073741824, True, False)
    if not obj_id: return
    
    # get area centroid and error bounds
    rc = rs.SurfaceAreaCentroid(obj_id)
    if not rc: return
    
    # the centroid and error bound
    centroid, error_bound = rc
    
    # scale 0.5 in xyz
    rs.ScaleObject(obj_id, centroid, [0.5, 0.5, 0.5], copy=False)
    
DoSomething()

or should i show the RhinoCommon equivalent ?
_
c.

1 Like

Yes, I’m currently trying to use less rhinoscriptsyntax in order to learn RhinoCommon’s api better.

Also I think about 3d brep. But I got how to find the centroid in another thread.

I’ll try to do it myself. Thanks a lot.

Call:

https://developer.rhino3d.com/5/api/RhinoCommonWin/html/M_Rhino_Geometry_GeometryBase_Transform.htm

On your brep, passing it:

https://developer.rhino3d.com/5/api/RhinoCommonWin/html/M_Rhino_Geometry_Transform_Scale_1.htm

Or:

https://developer.rhino3d.com/5/api/RhinoCommonWin/html/M_Rhino_Geometry_Transform_Scale.htm

1 Like

This is what I did

    transfIn = Rhino.Geometry.Transform.Scale(Rhino.Geometry.Plane(Rhino.Geometry.AreaMassProperties.Compute(B).Centroid,Rhino.Geometry.Vector3d.XAxis,Rhino.Geometry.Vector3d.YAxis),0.999,0.999,0.999)
    transfOut = Rhino.Geometry.Transform.Scale(Rhino.Geometry.Plane(Rhino.Geometry.AreaMassProperties.Compute(B).Centroid,Rhino.Geometry.Vector3d.XAxis,Rhino.Geometry.Vector3d.YAxis),1.001,1.001,1.001)
    BdupIn.Transform(transfIn)
    BdupOut.Transform(transfOut)

If you’re doing a uniform scaling, you don’t need the plane. Using the first overload above is simpler.

1 Like

I wondered why I need a plane there :smiley: