Wall location curve

Is it possible to return the various location curves of a Revit wall based? For example I want the FinishedFaceExterior curve regardless of what the Location Line parameter is set to, e.g Wall center line. It seems like a pretty straightforward request but there doesn’t seem to be any node that can do this. Clockwork has a node ‘WallOcationLine.FinishedFaceExterior’ but I can’t work out how to use it as there are no inputs.

image

I believe that node mostly provides the appropriate value to set the location line unfortunately.

That being said, I really think we can build something that does this using other methods. (Location Line>translate the thickness of materials each direction)

Is there any way to modify the Area Rules? These seem hard wired into Revit but that seems to do what is required. Just not sure how to access it and/or modify it.

The ‘Element.GetLocation’ node seems to return the center line regardless of the Location Line parameter value which isn’t very helpful.

I believe it is the centerline in most (all? I haven’t checked curtain walls or stacked walls) cases. Getting the thickness of the total wall and offsetting by 1/2 of that value and -1/2 of that value should get faces. Had it working on one of my many ‘hmmm what if’ tests but don’t recall how far I got.

@john_pierson, I didn’t try to find any other face or core lines though. I may play this weekend or on a lunch break though. I’ll post anything good.

I discussed the pain points of creating area boundaries with a coworker recently. Have a few ideas I want to test out, likely next week, and will post back anything good if I remember.

1 Like

@john_pierson

I have this working in that I can get all the external lines using the offset method. I can then extend these (a nominal length) at either end so that they intersect. But the issue is then trying to fillet these together or to do a batch intersection. This would return a series of points which you could then use to create a new polyline. But Dynamo doesn’t seem to have a batch intersection function that return points (?). Might need to be done with Python recursively.

Another way to look at it is to get the solid geometry of the walls (and external doors), create a solid union, and intersect it with a plane. Filter the 2 resulting perimeter curves by area to get the exterior perimeter polycurve. But then you potentially have lots of little curves in the polyline as described here:

I really think we can build something that does this using other methods

This seems to work also - with the help of BattleBIM and Archi-Lab Grimshaw:


Note: wall joins were disabled in this case…

1 Like

Geometry.Intersect

However your points will be duplicated as a result. Prune duplicates would then be required (getting every other won’t work as some walls will have three points). Finally you would have to figure out how to get the in the right order if you need a polyline.

What is the end goal once you have the polyline?

I’ve mentioned this in a previous post, but this workflow will soon be streamlined with one, very efficient node!

2 Likes

@JacobSmall

Gometry.Intersect and Geometry.IntersectAll returns lines not points. Or am I missing something?

Worked it out - lacing needs to be set to cross product. It will then return lines and points. Flatten and use list.Filter

2 Likes

If it’s all lines, you could try the LineLoopMerge node:

4 Likes

Alternatively, it is possible to get finish, core, center and core center boundaries from rooms…

1 Like

@john_pierson

Two Clockwork nodes, an Archilab node, and a single code block to get interior, exterior, interior core face, and exterior core face from a wall. If anyone wants to include it in a package feel free.

get wall faces.dyn (12.3 KB)

{wallcurves,direction,walltypes,Widths,cores};
/* get the distance from wall location (centerline) to the
exterior face of wall*/
distance =
	walltypes.GetParameterValueByName("Width")/2;
//get the curves at the exterior face
ExtFaceCurves =
	wallcurves.Translate(direction,distance);

/*Get the number of indicies which need to be dropped*/

ExtDrop =
	-(List.Count(cores<1L>)
		-
	IndexOf(cores<1L>, true));

/* Drop the widths which are not outside the core to get the
width from the exterior face to exterior face of the core */

ExtFaceToExtCore =
	Math.Sum(
		List.DropItems(
			Widths@@-2<1L>,
			ExtDrop<1L>
		)
	);

/* Drop the widths which are not inside the core to get the
width from the exterior face to interior face of the core */

IntDrop =
	-IndexOf(
		List.Reverse(
			cores<1L>
		)@-2<1>,
		true
	);
/* Drop the widths which are not inside the core to get the
width from the exterior face to interior face of the core */
ExtFacetoIntCore =
	Math.Sum(
		List.DropItems(
			Widths@@-2<1L>,
			(IntDrop<1L>)
		)
	);

// OffsetExterior Face to Exterior of Core
ExtCore =
	ExtFaceCurves.Translate(
		Vector.Reverse(direction),
		ExtFaceToExtCore
	);


// OffsetExterior Face to Interior of Core
IntCore =
	ExtFaceCurves.Translate(
		Vector.Reverse(direction),
		ExtFacetoIntCore
	);

//Get total wall width
TotalWidth =
	walltypes.GetParameterValueByName("Width");

/*Get interior face of wall by offsetting the
exterior face by the total width*/
IntFace =
	ExtFaceCurves.Translate(
		Vector.Reverse(direction),
		TotalWidth
	);

Just used it in combination with a Springs.LineLoop.Merge to generate floors which align with the exterior core face in a few heartbeats. Why anyone would ever do the one billion click method when there are tools like this out there is beyond me.

10 Likes

Could you help me how could I get this package “Walllocationline.FinishFaceExterior” ?

It is in the Clockwork package

1 Like