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()