Create CurtainSystem gridlines

Hi all.
I’m new to Dynamo and I need some help please.
I’m trying to create a parametric curtain wall system by creating the mass in Dynamo, from a rhino 3D object, imported in Dyanmo by Rhynamo package.
I started by importing the rhino 3D file through rhynamo, and than I created a family Mass by Springs.FamilyInstance.ByGeometry, and than I created a Curtain Wall System by Mass.
I would want to create a grid layout and I use a ReAnimation package, with “CreateCurtainGrids” script…
Is the procedure correct?
Someone could suggest another solutions? Is it possible create a layout for add grid line or to create a curtain panels to adapt on family Mass surface?
Can anyone help me please. Thanks :slight_smile:


Yeah, Unfortunately, it seems like that node “Create Curtain Grids” expects a curtain wall element. You are going to need some additional nodes to do this with actual curtain systems…

Essentially, we need to:

  1. Obtain the curtain grid element from the curtain system.

  2. Add the grid line by a given point (wombat or Rhythm has this portion already).

I don’t have the nodes created yet, but I might be able to get something created in my free time this evening.


Thank u so much John, I’m going crazy and need a solution…I Know I m going to need additional nodes to solve this node, but I don’t understand how…
Let me know if you find a solution, additional nodes…
Thank you very much for your interest!

By additional nodes I mean, there are portions of the API that are not currently exposed in any other nodes. Let me try to get these published to my package, Rhythm, for your use.

Also, if you are interested. This is the specific API call that needs to be implemented.


it would be a good solution…

thank u so much! :))

Yeah, let me try to get it published in Rhythm by the end of the week

1 Like

Ok, perfect!
Let me know if you can do this.
Thank you :))

I used CurtainGrid.ByWallElement and CurtainGrid.AddGridLineByPoint togeather and workd fine for me…!
might be a good option to consider until @john_pierson publish his package…!

Thanks for the mention @saju_autodesk.

The problem with this node is it does not take a curtain system as an element.

Gave me a bit of an idea.

The CurtainSystem has a property giving the CurtainGrids. However, these are not exactly what you’d expect. Instead they’re more like the panels in the CS. From which you can then obtain CurtainCells, and from there the surrounding loop curves. Though this is Autodesk.Revit.DB.Curve elements of which you cannot really work correctly inside Dynamo (they don’t convert to Geometry objects readily). Was a bit of a work around for me, but:

In that the Py.RvtCurveToGeomCurve is effectively performing the following Python script:

def XYZtoPoint (xyz):
    	return Autodesk.DesignScript.Geometry.Point.ByCoordinates(xyz.X, xyz.Y, xyz.Z)

def XYZtoVector (xyz):
	return Autodesk.DesignScript.Geometry.Vector.ByCoordinates(xyz.X, xyz.Y, xyz.Z)

def RvtCurveToGoemCurve(elem):
	if hasattr(elem, 'ControlPoints'):
		return Autodesk.DesignScript.Geometry.NurbsCurve.ByPoints ([XYZtoPoint(xyz) for xyz in elem.ControlPoints])
	elif hasattr(elem, 'CtrPoints'):
		return Autodesk.DesignScript.Geometry.NurbsCurve.ByControlPoints ([XYZtoPoint(xyz) for xyz in elem.CtrPoints], elem.Degree)
	elif hasattr(elem, 'Center'):
		if hasattr(elem, 'Radius'):
			return Autodesk.DesignScript.Geometry.Arc.ByThreePoints(XYZtoPoint(elem.Evaluate(0.0, True)), XYZtoPoint(elem.Evaluate(0.5, True)), XYZtoPoint(elem.Evaluate(1.0, True)))
			return list()
	elif hasattr(elem, 'Direction'):
		return Autodesk.DesignScript.Geometry.Line.ByStartPointDirectionLength(XYZtoPoint(elem.Origin), XYZtoVector(elem.Direction), elem.Length)
		return list()

You’ll note the Arc is done, though I’ve omitted elliptical arcs. And of course Circles & Ellipses - they’re not be possible as the loops of a curtain panel.

Then the actual Python script doing the “real” work:

def ExtractFaces(cs):
	result = list()
	for grid in cs.CurtainGrids:
		for cell in grid.GetCurtainCells():
			for loop in cell.CurveLoops:
				result.append(Autodesk.DesignScript.Geometry.Surface.ByPatch(Autodesk.DesignScript.Geometry.PolyCurve.ByJoinedCurves([RvtCurveToGoemCurve(elem) for elem in loop])))
	return Autodesk.DesignScript.Geometry.PolySurface.ByJoinedSurfaces(result)

The special node (Py.List.MapEachNonList) just recursively goes through a list applying a python function to each item which is not a list. I prefer doing this instead of wondering about on strange inputs - i.e. the result gets structured in the same arrangement as the input:

Inputs = UnwrapElement(IN[0])
Func = IN[1]

def mapLists(item, func):
	if hasattr(item, '__getitem__'):
		result = list()
		for i in item:
			result.append(mapLists(i, func))
		return result
			return func(item)
			return list()

OUT = mapLists(Inputs, Func)

Though this is just extracting the surfaces of the CurtainSystem, and it actually fails when there are grids on those surfaces (since for some or other reason these come in as lines going past the edges of the system.


This is amazing!!
Was it published? I couldn’t find it.

Yeah, @john_pierson, are you done yet? :wink:

Let me push an update today. :slight_smile: I have had a few other things going on, and wanted to make sure the next update was a good one. :slight_smile:


@Greg_McDowell @andresmontemayor

The nodes are in the latest version. Kick the tires around and let me know if they help out. :slight_smile:

Thanks, John.

Unrelated to OP but how are people keeping track of package updates? Seems I only know about them if I stumble across them online.

1 Like

Unfortunately, this is a pretty difficult process. I think there are some fixes in the future but nothing now. I am actually working on something on the side to help as well, but it’s far from ready.

For now I see updates on twitter.



Thanks so much! I just tried it out but I don’t know if I’m doing something wrong or not.
In the previous release, the “CurtainGrid.AddGridLineByPoint” would allow me to add multiple lines at the same time and apparently now I can only add one at a time?

My file is inserting a grid line where it finds a reference plane.

Might change the lacing to longest for now and I will release a fix in the