n°54
Disposer aléatoirement les objets d'une scène Rhino
Rhino3D, Python
24 nov 2025

Après-avant application de la fonction d'aléatoire

Script Python Rhino pour déplacer, retourner et modifier l'échelle d'une série d'objets aléatoirement pour simuler une disposition naturelle. Equivalent d'un "scatter" en un clic et avec une série d'objet déjà présents sur la scène. La fonction est compatible avec les objets VRScene.

#! python 3

import rhinoscriptsyntax as rs
import random

objects = rs.GetObjects("Select objects to randomize")

if objects:
    #options
    varianceMoveX = rs.GetReal("Move variance in X", 0)
    varianceMoveY = rs.GetReal("Move variance in Y", 0)
    varianceMoveZ = rs.GetReal("Move variance in Z", 0)
    varianceRotate = rs.GetReal("Rotate variance (Z vector) in degrees", 0, 0, 360)
    varianceScale = rs.GetReal("Scale 3D variance in percentage", 0, 0, 100)
    scaleFromBottom = rs.GetString("Scale base point located at the bottom of the object ?", "Yes", ["Yes", "No"])

    variables = [varianceMoveX, varianceMoveY, varianceMoveZ, varianceRotate, varianceScale, scaleFromBottom]
    all_variables_not_none = all(v is not None for v in variables)

    if all_variables_not_none:
        rs.EnableRedraw(False) #disables preview

        for obj in objects:
            valueMoveX = random.uniform(-1,1) * varianceMoveX
            valueMoveY = random.uniform(-1,1) * varianceMoveY
            valueMoveZ = random.uniform(-1,1) * varianceMoveZ
            valueRotate = random.uniform(-1,1) * varianceRotate
            valueScale = (random.uniform(-1,1) * (varianceScale/100)) + 1

            if valueMoveX !=0 or valueMoveY !=0 or valueMoveZ !=0:
                rs.MoveObject(obj, rs.CreateVector(valueMoveX, valueMoveY, valueMoveZ))

            bbox = rs.BoundingBox(obj, None, True)
            bboxCentroid = rs.PointDivide(rs.PointAdd(bbox[1], bbox[7]), 2.0)
            bboxCentroidBottom = rs.PointDivide(rs.PointAdd(bbox[1], bbox[3]), 2.0)

            centroid = bboxCentroid
            if scaleFromBottom == "Yes":
                centroid = bboxCentroidBottom

            if bbox:
                if valueRotate != 0:
                    rs.RotateObject(obj, centroid, valueRotate)
                if valueScale != 1:
                    rs.ScaleObject(obj, centroid, (valueScale, valueScale, valueScale))
            else:
                print("Could not create bounding box for one object, rotate and scale will not be performed")

        rs.EnableRedraw(True) #reactivates preview
    else:
        print("Error while defining parameters")
else:
    print("No object selected")


Fonctionnalité intégrée à la dernière version de Jester (0.0.5).


c. héraud-louisadat

architecte & développeur
67200 Strasbourg
heraud-arobase-laponies-point-fr

*1992, Strasbourg.

Diplômé d'état en 2016 de l'ENSA Paris-Malaquais et de la RWTH Aachen et habilité à maîtrise d'oeuvre en nom propre (HMONP) en 2019, j'ai travaillé pour diverses agences d'architecture à Paris et Berlin puis fait de la recherche en histoire de l'art sur l'architecture Heimatschutz. J'ai fondé l'agence Atkinson-Héraud Architectes en 2023 avec Isabelle Atkinson-Evans. Je développe également des applications pour le Web et la 3D.

Amis, famille et blogroll : Anaïs Héraud-Louisadat, Héraud–Baumann, Till Baumann, Antoine Le Dreff, Station Zéro, BALT.

alsace europe