PYTHON collecting schedules NOT on sheets for pyREvit

So working on a pythonic way to get schedules NOT on sheets. there is Collecting Legends and Schedules not on Sheets but that uses nodes, and I am trying to work backwards to a tool I can use in PyREvit.

I have this:
image

which proves this works:

b=[1,3,5,6,7,8]
a=[1,2,3]

c=[element for i, element in enumerate(b) if element not in a]
OUT=c

But when I do this:

The VSH_OFF Isn’t returning the difference
(The 2nd #VSH_OFF line is with out the ‘i’ - is this an enumerator for the list position as it steps?)

##Insipred from 
##https://forum.dynamobim.com/t/collecting-legends-and-schedules-not-on-sheets/20538/2
##Apsis0215 R Allen 2022-09-28 CPy3
import clr

clr.AddReference("RevitServices")
from RevitServices.Persistence import DocumentManager
doc = DocumentManager.Instance.CurrentDBDocument        ##Current Document

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

#clr.AddReference("RevitAPI")
from Autodesk.Revit.DB import FilteredElementCollector,ScheduleSheetInstance,ViewSchedule

PlacedSchedules = FilteredElementCollector(doc).OfClass(ScheduleSheetInstance).WhereElementIsNotElementType().ToElements()
PlacedSchedulesID=[ VID.Id.IntegerValue  for VID in PlacedSchedules]

AllSchedules = FilteredElementCollector(doc).OfClass(ViewSchedule).WhereElementIsNotElementType().ToElements()
AllSchedulesID =[ VID.Id.IntegerValue  for VID in AllSchedules]

##https://stackoverflow.com/questions/33577790/exclude-items-from-list-of-lists-python
##VSH_OFF should be all elements NOT matching 
VSH_OFF=[element for i, element in enumerate(AllSchedulesID) if element not in PlacedSchedulesID]
#VSH_OFF=[element for element in AllSchedulesID if element not in PlacedSchedulesID]

#vsh_ON=[]

HostSheets = [doc.GetElement(VID.get_OwnerViewId())  for VID in PlacedSchedules] ##Get host sheet for each schedsheet

#for vsh in AllSchedulesID:
#    if vsh in PlacedSchedulesIDs:
#        vsh_ON.append(vsh)
#    else:
#        VSH_OFF.append(vsh)

OUT=PlacedSchedulesID,AllSchedulesID,VSH_OFF ##PlacedSchedulesIDs,AllSchedulesID 

Tried a couple of ways now - but no dice- any suggestions?

and is CPy3 going to work in PyRevit?(Anyone know yet?)

Pyrevit supports CPython3 if you add this to the top of your py file:

#!python3

Also try getting the schedule’s type Id instead. This should work I think…

# Made by Gavin Crump
# Free for use
# BIM Guru, www.bimguru.com.au

# Boilerplate text
import clr

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

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

# Current doc/app/ui
doc = DocumentManager.Instance.CurrentDBDocument

# Define list/unwrap list functions
schedTypes = FilteredElementCollector(doc).OfClass(ViewSchedule).ToElements()

schedInsts = FilteredElementCollector(doc).OfClass(ScheduleSheetInstance).ToElements()

instIds = [s.ScheduleId for s in schedInsts]

unused = []

for s in schedTypes:
	if s.Id not in instIds:
		unused.append(s)

# Preparing output to Dynamo
OUT = unused
4 Likes

Soo cool ! Thanks!

1 Like

@GavinCrump that was not the solution to the original question whis is:

The Proof of concept works but the List in list doesn’t purge like it should.

I can write a DEF to do it - would would prefer the pythonic way of managing the list!

Is this a #pythonBug or is my syntax off somewhere I am not seeing?

##Insipred from 
##https://forum.dynamobim.com/t/collecting-legends-and-schedules-not-on-sheets/20538/2
##Apsis0215 R Allen 2022-09-28 CPy3
import clr

clr.AddReference("RevitServices")
from RevitServices.Persistence import DocumentManager
doc = DocumentManager.Instance.CurrentDBDocument        ##Current Document

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

#clr.AddReference("RevitAPI")
from Autodesk.Revit.DB import FilteredElementCollector,ScheduleSheetInstance,ViewSchedule

PlacedSchedules = FilteredElementCollector(doc).OfClass(ScheduleSheetInstance).WhereElementIsNotElementType().ToElements()
PlacedSchedulesID=[VID.ScheduleId for VID in PlacedSchedules]

AllSchedules = FilteredElementCollector(doc).OfClass(ViewSchedule).WhereElementIsNotElementType().ToElements()
AllSchedulesID =[VID.Id for VID in AllSchedules]

##https://stackoverflow.com/questions/33577790/exclude-items-from-list-of-lists-python
##VSH_OFF should be all elements NOT matching 
VSH_OFF=[sched for sched in AllSchedulesID if sched not in PlacedSchedulesID]
#VSH_OFF=[element for element in AllSchedulesID if element not in PlacedSchedulesID]

#vsh_ON=[]

HostSheets = [doc.GetElement(VID.get_OwnerViewId())  for VID in PlacedSchedules] ##Get host sheet for each schedsheet

#for vsh in AllSchedulesID:
#    if vsh in PlacedSchedulesIDs:
#        vsh_ON.append(vsh)
#    else:
#        VSH_OFF.append(vsh)

OUT=PlacedSchedulesID,AllSchedulesID,VSH_OFF ##PlacedSchedulesIDs,AllSchedulesID

That worked! Still trying to find where I am “off” : ) Working through it now : )

Take a look at the changed I made to this part as well. I don’t think you were getting the correct ScheduleId from the instances.

If you think about this as an expanded loop, you will see where it broke down, which is basically what @GavinCrump showed in his example now that I actually look at it.

This will wrap up to:

VSH_OFF = [s for s in schedTypes if s.Id not in instIds]

@SeanP Freaking awesome catch!

Frustrating for us- now I see now the correct:

  1. [ VID.Id.IntegerValue for VID in PlacedSchedules]

not the same as the expected Broken:

  1. [ VID.Id.IntegerValue for VID in PlacedSchedules]
    (NOTE: x.Integer value tested and moot either way)

1 Like

Pretty version cleaned up with meaningful names : )

#!python3                   ##Code pre-directive untested!
##Apsis0215 R Allen 2022-09-28 CPy3
import clr
clr.AddReference("RevitServices")
from RevitServices.Persistence import DocumentManager
doc = DocumentManager.Instance.CurrentDBDocument        ##Current Document
import Revit
from Autodesk.Revit.DB import FilteredElementCollector,ScheduleSheetInstance,ViewSchedule

PlacedSchedules = FilteredElementCollector(doc).OfClass(ScheduleSheetInstance).WhereElementIsNotElementType().ToElements()
PlacedSchedulesName = [PSS.Name for PSS in PlacedSchedules]
PlacedSchedulesID=[VID.ScheduleId for VID in PlacedSchedules]

AllSchedules = FilteredElementCollector(doc).OfClass(ViewSchedule).WhereElementIsNotElementType().ToElements()
AllSchedulesID =[VID.Id for VID in AllSchedules]

##https://stackoverflow.com/questions/33577790/exclude-items-from-list-of-lists-python
SchedNotPlaced=[element for element in AllSchedulesID if element not in PlacedSchedulesID]
SchedNotPlaced=[doc.GetElement(VSHID)  for VSHID in SchedNotPlaced]
SchedNotPlacedNames=[NPS.Name for NPS in SchedNotPlaced]


HostSheet = [doc.GetElement(VID.get_OwnerViewId())  for VID in PlacedSchedules] ##Get host sheet for each schedsheet
HostSheetsName=[HS.Name for HS in HostSheet]             ##REturn host sheet name for 

OUT=PlacedSchedulesName,HostSheetsName,SchedNotPlacedNames ##PlacedSchedulesIDs,AllSchedulesID