Bricks wall with bricks family

Hi colleagues/friends.

I’m a Civil Engineering student and BIM lover, I’m very close to deciding the theme of my course conclusion project and I’m thinking of making it about optimization of structural masonry.

I did some courses on Udemy and YouTube but I still don’t have enough skills to create the routines that I want.

I would like to swap a random wall from Revit, including openings like doors and windows, for another wall formed by blocks of previously created families.

I thought on use the curve through the characteristics of the wall as length but this way the blocks would go through the openings.

Anyone worked with something similar before or has an idea of how to start this routine?

If you do a search on this forum an type in “brick” or “bricks” you can learn how other people did it.

1 Like

I read the related topics, but I did not enter anything that could help me, since practically all of them deal with how to arrange the blocks on a wall without fixing moorings or openings. I would be very happy if you know of any topic that addresses this subject to refer me. Please mention me in it for me to check.

I apologize for the average English, I’m Brazilian.

Maybe you can try the Get.Creative node


which package is this node?

The result I show is shown in the photo

1 Like

What way would you do it Revit?
Regarding the block size?
Maybe Refinery?

1 Like

I think this is in the Will-Power or Mind-Set package. :wink:



I created families for each type of brick with reference at one point. That way I can insert in revit based on those points . But I don’t know a way to generate points on the wall considering its openings.

This is going to be a slow model.

Why not use adaptive components in a repeater pattern for this? Likely faster, easier, and would have the advantage of being parametric too.

1 Like

@JacobSmall I thought so, because there are some criteria to be met when modulating structural masonry. Still, could you exemplify your thinking for me? Please

1 Like


@JacobSmall The content is very interesting, but is it possible to create surfaces based on the walls of a model in the dynamo?

Use element.geometry to obtain wall solid geometry, then obtain the faces of that solid. From here you can use a method to get the face you need - the easiest way to do this would be to filter for the face of largest area, which is nearly always going to be a side face.

You could take the wall location curve, translate it by the course height and intersect it with the wall to find the brick paths. These can be used to place families, I’d suggest a line based array.

Hope that helps - my advice is to begin trying it step by step and you’ll then have more context in your queries on the forums after. As you can probably see, people have been a bit sarcastic in previous replies…

1 Like

@Vikram_Subbaiah Hello, note in other posts that you’ve done something like that. Would you help me?

A start, will need to be refined…

bricks.rvt (2.2 MB) Brick.rfa (356 KB) bricks.dyn (14.1 KB)

(You should be able to build with nodes if required by referring to the script below)

wf = List.FirstItem(srf);
p01 = wf.PointAtParameter(([0,0,1,1]),([0,1,1,0]));
p02 = List.SortByKey(p01,p01.Z)["sorted list"];
p = List.GroupByKey(p02,Math.Round(p02.Z))["groups"];

//Brick width and height
bw = 400;
bh = 150;
bd = 200;

//Wall width and height
ww = Math.Round(p[0][0].DistanceTo(p[0][1]));
wh = Math.Round(p[1][0].Z - p[0][0].Z);

//Direction (start to end)
wd = Vector.ByTwoPoints(p[0][0],p[0][1]);

//Brick Course Lines
bcl1 = Line.ByStartPointEndPoint(p[0][0],p[0][1]);
bcl2 = bcl1.Translate(Vector.ZAxis(),(bh/2)..(wh-(bh/2));
bcl3 = wf<1>.Intersect(bcl2);
bcl4 = List.Transpose([bcl3.StartPoint,bcl3.EndPoint]);

//Brick Course1 Points
bc01 = (p[0][0].Translate(Vector.ZAxis(),bh/2)).Translate(wd,;
bc02 = bc01.Translate(Vector.ZAxis(),(0..(wh-(bh/2))..(bh*2))<1>);
bc03 = List.FilterByBoolMask(bc02,bc02.DoesIntersect(wf<1>))["in"];

//Brick Course2 Points
bc11 = (p[0][0].Translate(Vector.ZAxis(),bh*1.5)).Translate(wd,bw/;
bc12 = bc11.Translate(Vector.ZAxis(),(0..(wh-(bh/2))..(bh*2))<1>);
bc13 = List.FilterByBoolMask(bc12,bc12.DoesIntersect(wf<1>))["in"];

bc31 = List.Flatten(List.Transpose([bc03,bc13]),1);
bc32 = List.Flatten(List.AddItemToFront(bcl4<1>,bc31<1>)<1>,-1);
bc33 = bcl2.ParameterAtPoint(bc32);
bc34 = Point.PruneDuplicates(List.SortByKey(bc32<1>,bc33<1>)["sorted list"],0.1);

bc41 = List.DropItems(List.Sublists(bc34<1>,0..1,1)<1>,-1);
bc42 = List.FirstItem(bc41<1><2>).DistanceTo(List.LastItem(bc41<1><2>));

bwdt = Math.Round(List.FilterByBoolMask(bc42,(bc42 <= bw))["in"],1);
bpsn = List.FilterByBoolMask(List.FirstItem(bc41<1><2>),(bc42 <= bw))["in"].Translate(wd,bwdt/2);
brtn = wf.NormalAtParameter(0.1,0.1).Normalized().AngleAboutAxis(Vector.YAxis(),Vector.ZAxis());

//Place in Revit
bjnt = 25;
bfml = FamilyType.ByName("Brick").SetParameterByName(["width","height"],[bd,bh-bjnt]);
bfm1 = FamilyInstance.ByPoint(bfml[1],bpsn).SetRotation(brtn).SetParameterByName("length",bwdt-bjnt);

Thank you! It is very close to what I want! I will study it! I really am very grateful to you!

1 Like