Assembly Views list from list of already created assemblies

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
1 Like

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