Python get wall references for dimensions

Hi, I’m trying to get all of the reference points across a set of walls, intersected by a Ray, in order to create a dimension.

So far I’ve referenced the walls intersected by the ray:

	refIntersector = ReferenceIntersector(wallFilter, FindReferenceTarget.Edge, view3D)
	referenceWithContext = refIntersector.Find( XYZ(-100,0,0) , XYZ(100,0,0))
	refArray = ReferenceArray()
	for ref in referenceWithContext:
		refArray.Append(ref.GetReference())

The problem is I can’t figure out how to extract or delve deeper into the references themselves. I assume the References are Edges, but I get errors when trying to get their Endpoints, or the coordinates of the XYZ being returned, for example I can get the XYZ by using GlobalPoint, but I can’t get the coordinates or the XYZ object because it “is not callable”.

for r in refArray:
	p = r.GlobalPoint()
	print(p)

In the end my goal is to get the edge references in order to create dimensions. It seems simple enough but I think I made it more complex than it has to be.

Any ideas on how to tackle this?

Hi did you manage to “delve deeper into the references”? Im trying to get references from modelcurves instead of walls and append them to a referenceArray to create a new dimension , but ive failed to do so. Would you happen to know , how could I extract references from revit modelcurves? Thanks

Hi,
I think in the end I used iteration on the faces of the walls, figuring out their direction normal and extracting face.Reference into the reference array.

also when collecting the wall geometry I used:

options.ComputeReferences = True

I guess you can also use the LocationCurve for the wall and extract the reference from there.
Does that help?

Hi , thanks for your answer!

I wanted to get the modelcurves references since I have several intersecting walls that are not being annotated by my current dynamo python block. Would you happen to know how to get the references from intersecting walls ? and how to anotate not just the external face of the wall but also the interior one? Here is what Ive writte so far:

import sys
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import *

clr.AddReference('RevitNodes')
import Revit
clr.ImportExtensions(Revit.GeometryConversion)
clr.ImportExtensions(Revit.Elements)

clr.AddReference("RevitServices") 
import RevitServices 
from RevitServices.Persistence import DocumentManager 
from RevitServices.Transactions import TransactionManager 


line = UnwrapElement(IN[0]).GeometryCurve
#line=IN[0]
walls=UnwrapElement(IN[1])
doc = DocumentManager.Instance.CurrentDBDocument 

def parallel(v1, v2):
    #gets two vectors and check if parallel
    return v1.CrossProduct(v2).IsAlmostEqualTo(XYZ(0, 0, 0))

opt=Options()
opt.ComputeReferences = True
opt.IncludeNonVisibleObjects = True
opt.View = doc.ActiveView
faces_arr=[]


def delete_dimensions():
	dimensions=FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Dimensions).WhereElementIsNotElementType().ToElements()
	for dimension in dimensions:
		TransactionManager.Instance.EnsureInTransaction(doc)
		doc.Delete(dimension.Id)
		TransactionManager.Instance.TransactionTaskDone()
	

def create_dimensions():
	delete_dimensions()
	walls_2=FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Walls).WhereElementIsNotElementType().ToElements()
	all_lines=[]
	for wall in walls_2:
		elements_ref=ReferenceArray()
		ln=wall.Location.Curve.CreateOffset(2,XYZ(0,0,1))
		
		all_lines.append(ln)
		for ref in wall.get_Geometry(opt):
			if isinstance(ref,Solid):
				for face in ref.Faces:
					if parallel(face.FaceNormal, ln.GetEndPoint(1) - ln.GetEndPoint(0)):
						elements_ref.Append(face.Reference)
					
	
		TransactionManager.Instance.EnsureInTransaction(doc)

		new_dimension=doc.Create.NewDimension(doc.ActiveView, ln, elements_ref)

		TransactionManager.Instance.TransactionTaskDone()
		
		
	return all_lines
			
			
			

OUT=create_dimensions()	

Hi,
Not sure what you mean by “intersecting walls”…?
In any case I see you’re also offsetting the location curve in the Z direction… why? Maybe that’s the issue.

I think you can create a reference to the location line for the center of the wall if it was created by centerline or somehow calculate the thickness and offset your reference line by that amount.