Views sheet number value not showing

I think it may be something to do with dependant views? But I cant get the sheet number value for this and some other views on sheets. Anyone know whats up?


image

whaaaaaaat

try this.

@vanman ,


Are you filtering correctly in my case under “views” there severial other types of elements

No luck. I notice I can report the sheet number from the viewport. Not sure how to get the views viewport though as a weird way to fix

Can you share your revit file?

“Referencing Sheet” input as ParameterName. not Sheet Number

trying to sort a file for ya. Referencing sheet is the wrong information. I want the sheet number. Which is showing in the revit parameter. Dynamos just not pulling it

I cleared out the revit file to send to you with just sheets and views but then it started reporting the sheet number with the file cleared out :crazy_face:

Sorry I think I know what’s happening! The ReferenceCalloutsView node is getting the the main view. Not the the split up dependent view the reference callout is in. Would anyone know how to fix that?

For instance its getting
image
But it should be getting one of these two views, whichever the reference callout is in
image

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

clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.Elements)

def GetOwnerView(item):
	if hasattr(item, "OwnerViewId"): return item.Document.GetElement(item.OwnerViewId)
	else: return None

items = UnwrapElement(IN[0])

if isinstance(IN[0], list): OUT = [GetOwnerView(x) for x in items]
else: OUT = GetOwnerView(items)

@Ewan_Opie simple fix by any chance? Had covid this week so only just now been feeling ok to dynamo again :sweat_smile: still need to try out your tag all views node

maybe something here

Had to add a dependent views checker. This isnt a great fix, dosnt really work with the script if its checking things in a linked or open project with element.isvisable node to get the right dependent view

I should think so, will look Monday :grinning:

Bugger that for a joke, hope you are properly on the mend.

1 Like

@vanman Try this one.

import clr
clr.AddReference("RevitAPI")

from Autodesk.Revit.DB import FilteredElementCollector,BuiltInCategory,Viewport, View

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

## Convert an instance/list to a list
def tolist(obj1):
	if hasattr(obj1,"__iter__"): return obj1
	else: return [obj1]
	
def GetOwnerView(item):
	if hasattr(item, "OwnerViewId"): return item.Document.GetElement(item.OwnerViewId)
	else: return None	
	
	## Get an Element Parameter
def getParam(element,param):
	value = []
	try:
		DB = element.GetParameters(param)
		for i in DB:
			if "Double" in str(i.StorageType): 
				# Metric Converstion
				value.append(i.AsDouble()*304.8)
			elif "Integer" in str(i.StorageType):
				value.append(i.AsInteger())
			elif "String" in str(i.StorageType):
				value.append(i.AsString())
			else:
				elemId =i.AsElementId()
				value.append(doc.GetElement(elemId))
	except:
		pass
	return value

# Get All Viewports (Views on Sheets)
doc = DocumentManager.Instance.CurrentDBDocument

viewports = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Viewports).WhereElementIsNotElementType().ToElements()

viewNames = []
viewportIds = []
views = []
viewIds = []
viewRefs = []

# Map Viewports to View Names
for viewport in viewports:
	viewId = viewport.ViewId
	v = doc.GetElement(viewId)
	views.append(v)
	viewIds.append(viewId)
	viewNames.append(v.Name)
	viewportIds.append(viewport.Id)
	
	# Construct Viewport Ref
	vpRefNum = str(getParam(v, "Detail Number")[0])
	vpRefSheet = str(getParam(v, "Sheet Number")[0])
	viewRefs.append(vpRefNum+"-"+vpRefSheet)
	
# Input views to find which sheet they are placed on
elems = tolist(UnwrapElement(IN[0]))

eOwnerSheets = []
eOwnerViews = []
eViews = []

for e in elems:
	# Check if elem is a Viewport
	if "Viewport" in str(e.GetType()):
		# Get the owner Sheet
		eOwnerSheet = GetOwnerView(e)
		eOwnerSheets.append(eOwnerSheet)
		
		# Get the associated View
		vid = e.Id
		vIndex = viewportIds.index(vid)
		refView = views[vIndex]
		eViews.append(refView)
		
		# Get the Owner View
		refViewD = str(getParam(refView, "Referencing Detail")[0])
		refViewS = str(getParam(refView, "Referencing Sheet")[0])
		find = refViewD+"-"+refViewS
		
		refOwnerIndex = viewRefs.index(find)
		refOwner = views[refOwnerIndex]
		eOwnerViews.append(refOwner)
			
		
	else:
		# Get the view name
		eName = e.Name
		# Find the same name in the mapped names/viewports lists
		eViewport = viewports[viewNames.index(eName)]
		
		# Get the owner Sheet
		eOwnerSheet = GetOwnerView(eViewport)
		eOwnerSheets.append(eOwnerSheet)
		
		# Get the associated View
		vid = e.Id
		vIndex = viewportIds.index(vid)
		refView = views[vIndex]
		eViews.append(refView)
		
		# Get the Owner View
		refViewD = str(getParam(refView, "Referencing Detail")[0])
		refViewS = str(getParam(refView, "Referencing Sheet")[0])
		find = refViewD+"-"+refViewS
		
		refOwnerIndex = viewRefs.index(find)
		refOwner = views[refOwnerIndex]
		eOwnerViews.append(refOwner)

OUT = eOwnerSheets,eOwnerViews,eViews


1 Like

wow this looks like alot of work. Thank you so much, I’m getting this error for some reason…

Warning: IronPythonEvaluator.EvaluateIronPythonScript operation failed. 
Traceback (most recent call last):
  File "<string>", line 107, in <module>
ValueError: list.index(item): item not in list

Try this and lets see which elements are erroring.

import clr
clr.AddReference("RevitAPI")

from Autodesk.Revit.DB import FilteredElementCollector,BuiltInCategory,Viewport, View

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

## Convert an instance/list to a list
def tolist(obj1):
	if hasattr(obj1,"__iter__"): return obj1
	else: return [obj1]
	
def GetOwnerView(item):
	if hasattr(item, "OwnerViewId"): return item.Document.GetElement(item.OwnerViewId)
	else: return None	
	
	## Get an Element Parameter
def getParam(element,param):
	value = []
	try:
		DB = element.GetParameters(param)
		for i in DB:
			if "Double" in str(i.StorageType): 
				# Metric Converstion
				value.append(i.AsDouble()*304.8)
			elif "Integer" in str(i.StorageType):
				value.append(i.AsInteger())
			elif "String" in str(i.StorageType):
				value.append(i.AsString())
			else:
				elemId =i.AsElementId()
				value.append(doc.GetElement(elemId))
	except:
		pass
	return value

# Get All Viewports (Views on Sheets)
doc = DocumentManager.Instance.CurrentDBDocument

viewports = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Viewports).WhereElementIsNotElementType().ToElements()

viewNames = []
viewportIds = []
views = []
viewIds = []
viewRefs = []

# Map Viewports to View Names
for viewport in viewports:
	viewId = viewport.ViewId
	v = doc.GetElement(viewId)
	views.append(v)
	viewIds.append(viewId)
	viewNames.append(v.Name)
	viewportIds.append(viewport.Id)
	
	# Construct Viewpoer Ref
	vpRefNum = str(getParam(v, "Detail Number")[0])
	vpRefSheet = str(getParam(v, "Sheet Number")[0])
	viewRefs.append(vpRefNum+"-"+vpRefSheet)
	
# Input views to find which sheet they are placed on
elems = tolist(UnwrapElement(IN[0]))

eOwnerSheets = []
eOwnerViews = []
eViews = []

errors = []

for e in elems:
	# Check if elem is a Viewport
	if "Viewport" in str(e.GetType()):
		try:
			# Get the owner Sheet
			eOwnerSheet = GetOwnerView(e)
			eOwnerSheets.append(eOwnerSheet)
			
			# Get the associated View
			vid = e.Id
			vIndex = viewportIds.index(vid)
			refView = views[vIndex]
			eViews.append(refView)
			
			# Get the Owner View
			refViewD = str(getParam(refView, "Referencing Detail")[0])
			refViewS = str(getParam(refView, "Referencing Sheet")[0])
			find = refViewD+"-"+refViewS
			
			refOwnerIndex = viewRefs.index(find)
			refOwner = views[refOwnerIndex]
			eOwnerViews.append(refOwner)
		except:
			# Add the element instead for troubleshooting
			errors.append(e)		
		
	else:
		try:
			# Get the view name
			eName = e.Name
			# Find the same name in the mapped names/viewports lists
			eViewport = viewports[viewNames.index(eName)]
			
			# Get the owner Sheet
			eOwnerSheet = GetOwnerView(eViewport)
			eOwnerSheets.append(eOwnerSheet)
			
			# Get the associated View
			vid = eViewport.Id
			vIndex = viewportIds.index(vid)
			refView = views[vIndex]
			eViews.append(refView)
			
			# Get the Owner View
			refViewD = str(getParam(refView, "Referencing Detail")[0])
			refViewS = str(getParam(refView, "Referencing Sheet")[0])
			find = refViewD+"-"+refViewS
			
			refOwnerIndex = viewRefs.index(find)
			refOwner = views[refOwnerIndex]
			eOwnerViews.append(refOwner)
		except:
			# Add the element instead for troubleshooting
			errors.append(e)	
			
OUT = eOwnerSheets,eOwnerViews,eViews,errors

I got 540 errors with this test. I can only vaguely understand what your doing in the code. But I see there’s a method to get viewports. Will this work when the element is coming from a linked view too?

Ah, are most of these were linked views?

yeah unfortunately. To find out where typical details are used in linked projects too. Could be searching through a few projects sometimes. It was working all good till dependent views got thrown into the mix with this one project

Adding references to look in link documents seems to be working, give this a go.

import clr
clr.AddReference("RevitAPI")

from Autodesk.Revit.DB import FilteredElementCollector,BuiltInCategory,Viewport, View

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

## Convert an instance/list to a list
def tolist(obj1):
	if hasattr(obj1,"__iter__"): return obj1
	else: return [obj1]
	
def GetOwnerView(item):
	if hasattr(item, "OwnerViewId"): return item.Document.GetElement(item.OwnerViewId)
	else: return None	
	
	## Get an Element Parameter
def getParam(element,param):
	value = []
	try:
		DB = element.GetParameters(param)
		for i in DB:
			if "Double" in str(i.StorageType): 
				# Metric Converstion
				value.append(i.AsDouble()*304.8)
			elif "Integer" in str(i.StorageType):
				value.append(i.AsInteger())
			elif "String" in str(i.StorageType):
				value.append(i.AsString())
			else:
				elemId =i.AsElementId()
				value.append(doc.GetElement(elemId))
	except:
		pass
	return value

# Get All Viewports (Views on Sheets)
doc = DocumentManager.Instance.CurrentDBDocument

# Allow for link docs
linkInst = tolist(IN[1])

LviewNames = []
LviewportIds = []
Lviews = []
LviewIds = []
LviewRefs = []

for l in linkInst:

	Ldoc = l.GetLinkDocument()
	Lviewports = FilteredElementCollector(Ldoc).OfCategory(BuiltInCategory.OST_Viewports).WhereElementIsNotElementType().ToElements()
	
	# Map Viewports to View Names
	for Lviewport in Lviewports:
		LviewId = Lviewport.ViewId
		Lv = Ldoc.GetElement(LviewId)
		Lviews.append(Lv)
		LviewIds.append(LviewId)
		LviewNames.append(Lv.Name)
		LviewportIds.append(Lviewport.Id)
	
		# Construct Viewpoer Ref
		LvpRefNum = str(getParam(Lv, "Detail Number")[0])
		LvpRefSheet = str(getParam(Lv, "Sheet Number")[0])
		LviewRefs.append(LvpRefNum+"-"+LvpRefSheet)

viewports = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Viewports).WhereElementIsNotElementType().ToElements()

viewNames = []
viewportIds = []
views = []
viewIds = []
viewRefs = []

# Map Viewports to View Names
for viewport in viewports:
	viewId = viewport.ViewId
	v = doc.GetElement(viewId)
	views.append(v)
	viewIds.append(viewId)
	viewNames.append(v.Name)
	viewportIds.append(viewport.Id)
	
	# Construct Viewpoer Ref
	vpRefNum = str(getParam(v, "Detail Number")[0])
	vpRefSheet = str(getParam(v, "Sheet Number")[0])
	viewRefs.append(vpRefNum+"-"+vpRefSheet)


# Input views to find which sheet they are placed on
elems = tolist(UnwrapElement(IN[0]))

eOwnerSheets = []
eOwnerViews = []
eViews = []

for e in elems:
	try:
	# Find view in current document
		# Check if elem is a Viewport
		if "Viewport" in str(e.GetType()):
			# Get the owner Sheet
			eOwnerSheet = GetOwnerView(e)
			eOwnerSheets.append(eOwnerSheet)
			
			# Get the associated View
			vid = e.Id
			vIndex = viewportIds.index(vid)
			refView = views[vIndex]
			eViews.append(refView)
			
			# Get the Owner View
			refViewD = str(getParam(refView, "Referencing Detail")[0])
			refViewS = str(getParam(refView, "Referencing Sheet")[0])
			find = refViewD+"-"+refViewS
			
			refOwnerIndex = viewRefs.index(find)
			refOwner = views[refOwnerIndex]
			eOwnerViews.append(refOwner)
				
			
		else:
			# Get the view name
			eName = e.Name
			# Find the same name in the mapped names/viewports lists
			eViewport = viewports[viewNames.index(eName)]
			
			# Get the owner Sheet
			eOwnerSheet = GetOwnerView(eViewport)
			eOwnerSheets.append(eOwnerSheet)
			
			# Get the associated View
			vid = eViewport.Id
			vIndex = viewportIds.index(vid)
			refView = views[vIndex]
			eViews.append(refView)
			
			# Get the Owner View
			refViewD = str(getParam(refView, "Referencing Detail")[0])
			refViewS = str(getParam(refView, "Referencing Sheet")[0])
			find = refViewD+"-"+refViewS
			
			refOwnerIndex = viewRefs.index(find)
			refOwner = views[refOwnerIndex]
			eOwnerViews.append(refOwner)
	except:
		# Try to find view in link docs
		# Check if elem is a Viewport
		if "Viewport" in str(e.GetType()):
			# Get the owner Sheet
			eOwnerSheet = GetOwnerView(e)
			eOwnerSheets.append(eOwnerSheet)
			
			# Get the associated View
			Lvid = e.Id
			LvIndex = LviewportIds.index(Lvid)
			LrefView = Lviews[LvIndex]
			eViews.append(LrefView)
			
			# Get the Owner View
			LrefViewD = str(getParam(LrefView, "Referencing Detail")[0])
			LrefViewS = str(getParam(LrefView, "Referencing Sheet")[0])
			Lfind = LrefViewD+"-"+LrefViewS
			
			LrefOwnerIndex = LviewRefs.index(Lfind)
			LrefOwner = Lviews[LrefOwnerIndex]
			eOwnerViews.append(LrefOwner)
				
			
		else:
			# Get the view name
			eName = e.Name
			# Find the same name in the mapped names/viewports lists
			eViewport = Lviewports[LviewNames.index(eName)]
			
			# Get the owner Sheet
			eOwnerSheet = GetOwnerView(eViewport)
			eOwnerSheets.append(eOwnerSheet)
			
			# Get the associated View
			Lvid = eViewport.Id
			LvIndex = LviewportIds.index(Lvid)
			LrefView = Lviews[LvIndex]
			eViews.append(LrefView)
			
			# Get the Owner View
			LrefViewD = str(getParam(LrefView, "Referencing Detail")[0])
			LrefViewS = str(getParam(LrefView, "Referencing Sheet")[0])
			Lfind = LrefViewD+"-"+LrefViewS
			
			LrefOwnerIndex = LviewRefs.index(Lfind)
			LrefOwner = Lviews[LrefOwnerIndex]
			eOwnerViews.append(LrefOwner)
			
		
OUT = eOwnerSheets,eOwnerViews,eViews

1 Like

I was hoping you’d give this a go! :slight_smile: I was trying but failing with Genius Loki/clockwork code. Sometimes people didn’t have a project linked in so I used this node that got all links and open documents for them to pick from. So the other projects come through as below. Not sure if there’s a node to get the link instance from something if its just another open document? Or would it be an easy fix?



The code I was trying with which worked for get callouts…

#Part of script from Clockwork
inputdoc = UnwrapElement(IN[0])
if inputdoc == None:
	doc = DocumentManager.Instance.CurrentDBDocument
elif isinstance (inputdoc, RevitLinkInstance) :
	doc = inputdoc.GetLinkDocument()
elif isinstance (inputdoc, Document) :
	doc = inputdoc
else: doc = None

If you already have a list of LinkDocuments in the project then this part of the code can be adjusted, as this was just converting and loaded LinkInstances to Doc format. Change to the below.

# Allow for link docs
linkDocs = tolist(IN[1])

LviewNames = []
LviewportIds = []
Lviews = []
LviewIds = []
LviewRefs = []

for Ldoc in linkDocs:

	Lviewports = FilteredElementCollector(Ldoc).OfCategory(BuiltInCategory.OST_Viewports).WhereElementIsNotElementType().ToElements()