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?
whaaaaaaat
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?
whaaaaaaat
@vanman ,
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
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
But it should be getting one of these two views, whichever the reference callout is in
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 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
Bugger that for a joke, hope you are properly on the mend.
@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
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
I was hoping you’d give this a go! 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?
#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()