Wang, Q., dos Santos, K. R., & Beyer, K. Geometric planning for masonry wall construction with natural stones using discrete convolution. Engineering Structures
@article{Wang_2025,
title={Geometric planning for masonry wall construction with natural stones using discrete convolution}, volume={329},
ISSN={0141-0296},
url={http://dx.doi.org/10.1016/j.engstruct.2025.119695},
DOI={10.1016/j.engstruct.2025.119695},
journal={Engineering Structures},
publisher={Elsevier BV},
author={Wang, Qianqing and dos Santos, Ketson R.M. and Beyer, Katrin},
year={2025},
month=apr,
pages={119695} }👉 A 2D version of the generator is able to generate dense and stable stacked stones given pixelized shapes 2D stacking.
🤖 The generator has been used as geometric planner for a real wall construction work using robots robot wall.
💡 The convention of the packing space is that the X direction is the Height direction.
💡 Make sure the scale of the input stone meshes matches the order of magnitude of the wall’s dimensions.
Some pre-generated stone walls can be found here 👉 zenodo.
Tested on Ubuntu 20.04.6 LTS.
python -m venv ./venv/
source ./venv/bin/activatepip install -r requirements.txtpython main.py --dataID 19 --stoneRep available_stones --stoneIni stone_python prerotate_stones_flat.py --dataID 19
python main.py --dataID 19 --stoneRep available_stones_rot --stoneIni Spython prerotate_stones_flat.py --dataID 19
python main.py --dataID 19 --stoneRep available_stones_rot --stoneIni S --nPose 4The input (stone meshes) are triangular suface meshes in .obj format stored in ./data/example*/[stoneRep]/.
The output files are :
-
stone with id m placed in iteration n in its resulting position represented in triangular mesh: wall_1_iteration[n]_valid_refined_[m]_best_pose_random_sequence.obj
-
stone with id m placed in iteration n in its resulting position represented in voxel: wall_1_iteration[n]_valid_voxel_[m]_best_pose_random_sequence.ply
-
Failured placement at iteration n will generate stone meshes in their initial position: wall_1_iteration[n]_invalid_stone_[m]_best_pose_random_sequence.ply
- wallDimX/Y/Z
Switching the size of the bounding box of the packing space for generating stone walls of different sizes.
- wallMaxX
Using a mask as top boundary of the packing space such that stones cannot be placed higher than this limit. This is useful if you want to enforce a layer-wise packing.
- nPose
Number of candidate poses to evaluate per stone. Candidate poses are generated by uniformly rotating the stone around the x-axis from 0 to 360 degrees.
- seq
The sequence of stones provided to the algorithm can be random or sorted by volume from largest to smallest.
The script prerotate_stones_flat.py rotates stone meshes such that the shortest dimension of the stone is aligned with the X direction of the packing space, the other two main dimensions of the stone are aligned with the Y and Z directions of the packing space.
Triangular meshes can be visualized using Meshlab.
./main.py [OPTIONS]
OPTIONS:
--dataID INT The ID of the dataset in ../data/example[dataID]
--wallDimX INT The dimension of the wall in X direction (default: 70)
--wallDimY INT The dimension of the wall in Y direction (default: 70)
--wallDimZ INT The dimension of the wall in Z direction (default: 40)
--wallMaxX INT The maximum packing height in X direction (default: None)
--stoneRep TEXT The folder name of the stone representation
(default:available_stones_rot)
--stoneIni TEXT The prefix of the stone file names (default: S)
--nPose INI Number of candidate poses to evaluate per stone (default: 1)
--seq TEXT:random/volume The sequence of stone placement: random or volume (default: random)
For questions and feedback, please contact:
Qianqing Wang at Earthquake Engineering and Structural Dynamics (EESD)
📧 Email: [qianqing.wang@epfl.ch]
