As i am Working to duplicate existing assembly schedule view. I want to create assembly schedule view to be duplicated .For this I need to generate list from already created assembly view list.is there any solution which have input as assembly instance and output as views under assembly instance.
Hi,
As I understand your question you are looking for something like this.
To get the owner of the schedule and than duplicate that view.
import clr
import sys
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
clr.AddReference("RevitAPI")
clr.AddReference("RevitAPIUI")
import Autodesk
from Autodesk.Revit.DB import *
from Autodesk.Revit.UI import *
doc = DocumentManager.Instance.CurrentDBDocument
# Place your code below this line
if(isinstance(IN[0],list)):
schedules = UnwrapElement(IN[0])
else:
schedules = [UnwrapElement(IN[0])]
ids = []
assemblies = []
assemlby_schedules = []
for schedule in schedules:
owner_assembly_id = schedule.AssociatedAssemblyInstanceId
if(str(owner_assembly_id) != "-1"):
assemblies.append(doc.GetElement(owner_assembly_id))
ids.append(owner_assembly_id)
assemlby_schedules.append(schedule)
# Assign your output to the OUT variable.
OUT = assemblies, ids, assemlby_schedules
Hope it helps.
Thank you @Josip.Komadina for helping me. As you given this above script I tried in my model. But it gives me all list of assembly instance .I am not able to identify which assembly instance shedule view is it. I am not able to sort views according to assembly.
This is my out put snip
It would be beneficial if you provide solution as per Below mentioned Screenshot.
No problem.
Than we just put assemblies as the input and run through all the views and schedules.
This should do the trick now.
Edit : Code works but needs cleanup
import clr
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
clr.AddReference("RevitAPI")
import Autodesk
from Autodesk.Revit.DB import *
doc = DocumentManager.Instance.CurrentDBDocument
if(isinstance(IN[0],list)):
assemblies = UnwrapElement(IN[0])
else:
assemblies = [UnwrapElement(IN[0])]
all_views = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Views).WhereElementIsNotElementType().ToElements()
all_schedules = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Schedules).WhereElementIsNotElementType().ToElements()
assembly_views_all = []
for assembly in assemblies:
assembly_views = []
assembly_views.append(assembly)
#views loop
for view in all_views:
owner_assembly_id = view.AssociatedAssemblyInstanceId
if(str(owner_assembly_id) =="-1"):
continue
elif(str(owner_assembly_id) == str(assembly.Id)):
assembly_views.append(view)
#schedule loop
for schedule in all_schedules:
owner_assembly_id = schedule.AssociatedAssemblyInstanceId
if(str(owner_assembly_id) =="-1"):
continue
elif(str(owner_assembly_id) == str(assembly.Id)):
assembly_views.append(schedule)
assembly_views_all.append(assembly_views)
# Assign your output to the OUT variable.
OUT = assembly_views_all
Thank You so much @Josip.Komadina as you provided python script it works very smoothly I can get proper views for that. Is it possible to to get list of respective assembly sheets list? If possible please share python script…
That was a fast solution,
This should be the cleaner one with views, schedules and sheets.
import clr
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
clr.AddReference("RevitAPI")
import Autodesk
from Autodesk.Revit.DB import *
doc = DocumentManager.Instance.CurrentDBDocument
def GetAssemblyComponents(assem, elems, ele_list):
for elem in elems:
owner_assembly_id = elem.AssociatedAssemblyInstanceId
if(str(owner_assembly_id) =="-1"):
continue
elif(str(owner_assembly_id) == str(assem.Id)):
ele_list.append(elem)
if(isinstance(IN[0],list)):
assemblies = UnwrapElement(IN[0])
else:
assemblies = [UnwrapElement(IN[0])]
all_views = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Views).WhereElementIsNotElementType().ToElements()
all_schedules = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Schedules).WhereElementIsNotElementType().ToElements()
all_sheets = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Sheets).WhereElementIsNotElementType().ToElements()
assembly_views_all = []
for assembly in assemblies:
assembly_views = []
assembly_views.append(assembly)
if IN[1]:
GetAssemblyComponents(assembly,all_views,assembly_views)
if IN[2]:
GetAssemblyComponents(assembly,all_schedules,assembly_views)
if IN[3]:
GetAssemblyComponents(assembly,all_sheets,assembly_views)
assembly_views_all.append(assembly_views)
# Assign your output to the OUT variable.
OUT = assembly_views_all
Hello @Josip.Komadina Thank you for your solution.It get properly works.I can seperate out sheets as I requested.
But I have another issue ahead that I am not able to place these views on sheets… As I shown in snip
Is there any otherway to place views on respective view