Skip to main content

Generate random rooms

Use GeometryDefinitionGenerator to generate room geometry definitions with randomized dimensions. You can generate shoebox, angled shoebox, L-shaped, T-shaped, and U-shaped rooms.

See Create rooms for details on manual programmatic room generation and the parameters associated with each room type. See Simulating many rooms when you want a complete dataset-generation tutorial that combines room generation with furniture, sources, receivers, materials, simulations, and results.

The examples below use a project named "Random room generation example". Run the following setup before you generate rooms:

from treble_tsdk import treble

# This example requires SDK credentials configured in the default location.
tsdk = treble.TSDK()
project = tsdk.get_or_create_project("Random room generation example")

Basic examples

Generate shoebox rooms

Use create_random_shoebox_rooms() to generate shoebox room geometry definitions with randomized width, depth, and height:

shoebox_room_defs = treble.GeometryDefinitionGenerator.create_random_shoebox_rooms(
n_rooms=20,
x_range=(2, 5),
y_range=(2, 5),
z_range=(2, 3),
join_wall_layers=False,
)

Generate L-shaped rooms

Use create_random_L_shaped_rooms() to generate L-shaped room geometry definitions. The side ranges control the randomized dimensions of the L-shaped floor plan:

l_shaped_room_defs = treble.GeometryDefinitionGenerator.create_random_L_shaped_rooms(
n_rooms=20,
a_side_range=(2, 4),
b_side_range=(2, 4),
c_side_range=(2, 3),
d_side_range=(2, 3),
height_range=(2, 3),
join_wall_layers=False,
)

Generate T-shaped rooms

Use create_random_T_shaped_rooms() to generate T-shaped room geometry definitions:

t_shaped_room_defs = treble.GeometryDefinitionGenerator.create_random_T_shaped_rooms(
n_rooms=20,
a_side_range=(1.5, 3),
b_side_range=(2, 4),
c_side_range=(1.5, 3),
d_side_range=(1.5, 3),
height_range=(2, 3),
join_wall_layers=False,
)

Generate U-shaped rooms

Use create_random_U_shaped_rooms() to generate U-shaped room geometry definitions:

u_shaped_room_defs = treble.GeometryDefinitionGenerator.create_random_U_shaped_rooms(
n_rooms=20,
a_side_range=(1.5, 3),
b_side_range=(1.5, 3),
c_side_range=(1.5, 3),
d_side_range=(1.5, 3),
height_range=(2, 3),
join_wall_layers=False,
)

Generate angled shoebox rooms

Use create_random_angled_shoebox_rooms() to generate angled shoebox room geometry definitions. The angle ranges control the randomized side-wall angles:

angled_shoebox_room_defs = treble.GeometryDefinitionGenerator.create_random_angled_shoebox_rooms(
n_rooms=20,
base_side_range=(2, 5),
depth_range=(2, 4),
left_angle_range=(75, 105),
right_angle_range=(75, 105),
height_range=(2, 3),
join_wall_layers=False,
)

Add generated rooms to a project

Use project.add_models_bulk() to add each generated room geometry definition to the project:

generated_room_defs = {
"Shoebox": shoebox_room_defs,
"L": l_shaped_room_defs,
"T": t_shaped_room_defs,
"U": u_shaped_room_defs,
"Angled": angled_shoebox_room_defs,
}

model_upload_infos = [
treble.ModelUploadInfo(f"{room_type}{idx}", room_def)
for room_type, room_defs in generated_room_defs.items()
for idx, room_def in enumerate(room_defs)
]
generated_models = project.add_models_bulk(model_upload_infos=model_upload_infos)

The returned room models can then be used in simulation definitions.

Advanced examples

Add random furniture

Define the furniture objects, allowed rotations, and minimum distances before you upload the room models:

# A ComponentAnglePool specifies which orientations a geometry component can use.
whole_angles = treble.ComponentAnglePool([0, 90, 180, 270])
half_angles = treble.ComponentAnglePool([0, 45, 90, 135, 180, 225, 270, 315])

placements = [
# Request two tables from the geometry component library.
treble.GeometryComponentPlacement(
components=tsdk.geometry_component_library.query(group="table"),
preferred_count=2,
rotation_settings=whole_angles,
min_dist_from_objects=0.25,
min_dist_from_walls=0.25,
),
# Request two chairs from the geometry component library.
treble.GeometryComponentPlacement(
components=tsdk.geometry_component_library.query(group="chair"),
preferred_count=2,
rotation_settings=half_angles,
min_dist_from_objects=0.25,
min_dist_from_walls=0.25,
),
# Request one sofa from the geometry component library.
treble.GeometryComponentPlacement(
components=tsdk.geometry_component_library.query(group="sofa"),
preferred_count=1,
rotation_settings=whole_angles,
min_dist_from_objects=0.25,
min_dist_from_walls=0.25,
),
# Request two generated boxes with a larger clearance.
treble.GeometryComponentPlacement(
components=treble.GeometryComponentGenerator.create_box(
treble.BoundingBox.from_points(-0.5, 0.5, -0.5, 0.5, 0, 1)
),
preferred_count=2,
min_dist_from_objects=0.5,
min_dist_from_walls=0.5,
),
# Request five smaller generated boxes.
treble.GeometryComponentPlacement(
components=treble.GeometryComponentGenerator.create_box(
treble.BoundingBox.from_points(-0.1, 0.1, -0.1, 0.1, 0, 0.2)
),
preferred_count=5,
min_dist_from_objects=0.02,
),
]

Use populate_with_geometry_components() when you want each generated room model to include randomly placed furniture. After populating each generated room geometry definition, upload the furnished room models to the project using project.add_models_bulk():

furnished_model_upload_infos = []

for room_type, room_defs in generated_room_defs.items():
for idx, room_def in enumerate(room_defs):
room_def.populate_with_geometry_components(
components=placements,
selection_algorithm=treble.ComponentSelectionAlgorithm.random,
)
furnished_model_upload_infos.append(treble.ModelUploadInfo(f"{room_type}{idx}_furnished", room_def))

furnished_models = project.add_models_bulk(model_upload_infos=furnished_model_upload_infos)
furnished_models[0].plot()